Skip to content
Snippets Groups Projects
Unverified Commit 271be7ad authored by jonastheis's avatar jonastheis
Browse files

Add more tests

parent c4e7c5c5
No related branches found
No related tags found
No related merge requests found
......@@ -76,7 +76,7 @@ type LikableBrancher interface {
// AddTip adds the given value object as a tip in the given branch.
// If the branch is liked it is also added to t.tips.
// Parents are handled depending on the relation (same or different branch).
func (t *TipManager) AddTip(valueObject *payload.Payload, b LikableBrancher) {
func (t *TipManager) AddTip(valueObject *payload.Payload, b LikableBrancher, parent1BranchID, parent2BranchID branchmanager.BranchID) {
t.mutex.Lock()
defer t.mutex.Unlock()
......@@ -94,11 +94,13 @@ func (t *TipManager) AddTip(valueObject *payload.Payload, b LikableBrancher) {
tip := newTip(objectID, branch.branchID)
branch.tips[objectID] = tip
// TODO: retrieve parents' branches
parent1branch := branch
addTipHandleParent(parent1ID, parent1branch, branch)
parent2branch := branch
addTipHandleParent(parent2ID, parent2branch, branch)
if parent1branch, ok := t.branches[parent1BranchID]; ok {
addTipHandleParent(parent1ID, parent1branch, branch)
}
if parent2branch, ok := t.branches[parent2BranchID]; ok {
addTipHandleParent(parent2ID, parent2branch, branch)
}
// add to t.tips and remove parents from t.tips if branch is liked
if branch.liked {
......
......@@ -12,6 +12,7 @@ import (
"github.com/stretchr/testify/assert"
)
// TestTipManagerSimple tests the basic functionality of the TipManager.
func TestTipManagerSimple(t *testing.T) {
tipManager := New()
......@@ -25,7 +26,7 @@ func TestTipManagerSimple(t *testing.T) {
branch1 := newMockBranch(tx.ID(), true)
valueObject := payload.New(payload.GenesisID, payload.GenesisID, tx)
branch1.addTip(valueObject)
tipManager.AddTip(valueObject, branch1)
tipManager.AddTip(valueObject, branch1, branchmanager.MasterBranchID, branchmanager.MasterBranchID)
assert.Equal(t, 1, tipManager.TipCount())
parent1, parent2 = tipManager.Tips()
......@@ -38,11 +39,11 @@ func TestTipManagerSimple(t *testing.T) {
for i := 0; i < numTips; i++ {
v := payload.New(payload.GenesisID, payload.GenesisID, createDummyTransaction())
branch1.addTip(v)
tipManager.AddTip(v, branch1)
tipManager.AddTip(v, branch1, branchmanager.MasterBranchID, branchmanager.MasterBranchID)
v = payload.New(payload.GenesisID, payload.GenesisID, createDummyTransaction())
branch2.addTip(v)
tipManager.AddTip(v, branch2)
tipManager.AddTip(v, branch2, branchmanager.MasterBranchID, branchmanager.MasterBranchID)
}
assert.Equal(t, branch1.tipCount()+branch2.tipCount(), tipManager.TipCount())
......@@ -57,11 +58,11 @@ func TestTipManagerSimple(t *testing.T) {
for i := 0; i < numTips; i++ {
v := payload.New(payload.GenesisID, payload.GenesisID, createDummyTransaction())
branch3.addTip(v)
tipManager.AddTip(v, branch3)
tipManager.AddTip(v, branch3, branchmanager.MasterBranchID, branchmanager.MasterBranchID)
v = payload.New(payload.GenesisID, payload.GenesisID, createDummyTransaction())
branch4.addTip(v)
tipManager.AddTip(v, branch4)
tipManager.AddTip(v, branch4, branchmanager.MasterBranchID, branchmanager.MasterBranchID)
}
assert.Equal(t, branch1.tipCount()+branch2.tipCount(), tipManager.TipCount())
......@@ -75,7 +76,7 @@ func TestTipManagerSimple(t *testing.T) {
removedTip2 := branch1.tip()
valueObject = payload.New(removedTip1, removedTip2, createDummyTransaction())
branch1.addTip(valueObject)
tipManager.AddTip(valueObject, branch1)
tipManager.AddTip(valueObject, branch1, branch1.ID(), branch1.ID())
assert.Equal(t, branch1.tipCount()+branch2.tipCount(), tipManager.TipCount())
_, ok := tipManager.tips.Get(removedTip1)
......@@ -97,7 +98,7 @@ func TestTipManagerSimple(t *testing.T) {
removedTip2 = branch3.tip()
valueObject = payload.New(removedTip1, removedTip2, createDummyTransaction())
branch3.addTip(valueObject)
tipManager.AddTip(valueObject, branch3)
tipManager.AddTip(valueObject, branch3, branch3.ID(), branch3.ID())
assert.Equal(t, branch1.tipCount()+branch2.tipCount(), tipManager.TipCount())
_, ok = tipManager.branches[branch3.ID()].tips[removedTip1]
......@@ -134,7 +135,7 @@ func TestTipManagerConcurrent(t *testing.T) {
wg2.Add(1)
go func() {
defer wg2.Done()
tipManager.AddTip(v, branch)
tipManager.AddTip(v, branch, branchmanager.MasterBranchID, branchmanager.MasterBranchID)
}()
}
wg2.Wait()
......@@ -143,7 +144,7 @@ func TestTipManagerConcurrent(t *testing.T) {
removedTip2 := branch.tip()
valueObject := payload.New(removedTip1, removedTip2, createDummyTransaction())
branch.addTip(valueObject)
tipManager.AddTip(valueObject, branch)
tipManager.AddTip(valueObject, branch, branch.ID(), branch.ID())
}(i)
}
wg.Wait()
......@@ -167,6 +168,141 @@ func TestTipManagerConcurrent(t *testing.T) {
assert.Equal(t, numThreads/2*numTips-numThreads/2, tipManager.TipCount())
}
// TestTipManager_OnBranchDisliked tests the behaviour when a branch is disliked.
func TestTipManager_OnBranchDisliked(t *testing.T) {
// we're assuming the following scenario for the test case
//
// \ / b3 b,\/ = branch, t,* = tip
// \*/t3
// / \
// t1 t2
// \* */ \* **/
// \ */ \* /
// b1 \/ \/ b2
//
// b1, b2, b3 liked
tipManager := New()
b1, b2, b3, t1, t2, t3 := prepareScenario(t, tipManager, true, true, true)
// add t3 is added -> t1, t2 should be removed from tipmanager.tips but still in branch's tips
assert.Equal(t, b1.tipCount()-1+b2.tipCount()-1+b3.tipCount(), tipManager.TipCount())
_, ok := tipManager.tips.Get(t1)
assert.False(t, ok)
_, ok = tipManager.tips.Get(t2)
assert.False(t, ok)
_, ok = tipManager.tips.Get(t3)
assert.True(t, ok)
for tip := range b1.tips {
_, ok = tipManager.branches[b1.ID()].tips[tip]
assert.True(t, ok)
}
for tip := range b2.tips {
_, ok = tipManager.branches[b2.ID()].tips[tip]
assert.True(t, ok)
}
// dislike b3 -> remove t3 from branchmanager.tips, add t1, t2 back again
tipManager.OnBranchDisliked(b3.ID())
assert.False(t, tipManager.branches[b3.ID()].liked)
_, ok = tipManager.branches[b3.ID()].tips[t3]
assert.True(t, ok)
assert.Equal(t, b1.tipCount()+b2.tipCount(), tipManager.TipCount())
_, ok = tipManager.tips.Get(t1)
assert.True(t, ok)
_, ok = tipManager.tips.Get(t2)
assert.True(t, ok)
_, ok = tipManager.tips.Get(t3)
assert.False(t, ok)
}
// TestTipManager_OnBranchDisliked tests the behaviour when a branch is liked.
func TestTipManager_OnBranchLiked(t *testing.T) {
// we're assuming the following scenario for the test case
//
// \ / b3 b,\/ = branch, t,* = tip
// \*/t3
// / \
// t1 t2
// \* */ \* **/
// \ */ \* /
// b1 \/ \/ b2
//
// b1 liked ; b2, b3 disliked
tipManager := New()
b1, b2, b3, t1, t2, t3 := prepareScenario(t, tipManager, true, false, false)
// make sure that only tips from b1 are in tipmanager.tips
assert.Equal(t, b1.tipCount(), tipManager.TipCount())
// like b2 -> tips from b2 should be in tipmanager.tips
tipManager.OnBranchLiked(b2.ID())
assert.True(t, tipManager.branches[b2.ID()].liked)
assert.Equal(t, b1.tipCount()+b2.tipCount(), tipManager.TipCount())
// like b3 -> remove t1,t2 from tipmanager.tips and add t3
tipManager.OnBranchLiked(b3.ID())
assert.True(t, tipManager.branches[b3.ID()].liked)
assert.Equal(t, b1.tipCount()-1+b2.tipCount()-1+b3.tipCount(), tipManager.TipCount())
_, ok := tipManager.tips.Get(t1)
assert.False(t, ok)
_, ok = tipManager.tips.Get(t2)
assert.False(t, ok)
_, ok = tipManager.tips.Get(t3)
assert.True(t, ok)
// select t1 as tip within b1 -> reference from b3->t1 should be deleted
v := payload.New(t1, b1.tip(), createDummyTransaction())
delete(b1.tips, t1)
b1.addTip(v)
tipManager.AddTip(v, b1, b1.ID(), b1.ID())
assert.Len(t, tipManager.branches[b3.ID()].entryPoints, 1)
_, ok = tipManager.branches[b3.ID()].entryPoints[t1]
assert.False(t, ok)
}
func prepareScenario(t *testing.T, tipManager *TipManager, b1Liked, b2Liked, b3Liked bool) (b1, b2, b3 *mockBranch, t1, t2, t3 payload.ID) {
b1 = newMockBranch(transaction.RandomID(), b1Liked)
b2 = newMockBranch(transaction.RandomID(), b2Liked)
b3 = newMockBranch(transaction.RandomID(), b3Liked)
// add tips to b1 and b2 first
for i := 0; i < 3; i++ {
v := payload.New(payload.GenesisID, payload.GenesisID, createDummyTransaction())
b1.addTip(v)
tipManager.AddTip(v, b1, branchmanager.MasterBranchID, branchmanager.MasterBranchID)
}
for i := 0; i < 4; i++ {
v := payload.New(payload.GenesisID, payload.GenesisID, createDummyTransaction())
b2.addTip(v)
tipManager.AddTip(v, b2, branchmanager.MasterBranchID, branchmanager.MasterBranchID)
}
// add t3 -> depending on the branch status t1 and t2 can be in tipmanager.tips
t1 = b1.tipWithoutRemove()
t2 = b2.tipWithoutRemove()
v := payload.New(t1, t2, createDummyTransaction())
t3 = v.ID()
b3.addTip(v)
tipManager.AddTip(v, b3, b1.ID(), b2.ID())
// check for references: b3->t1,t2 ; t1->b3 ; t2->b3
_, ok := tipManager.branches[b3.ID()].entryPoints[t1]
assert.True(t, ok)
_, ok = tipManager.branches[b3.ID()].entryPoints[t2]
assert.True(t, ok)
_, ok = tipManager.branches[b1.ID()].tips[t1].referencedByOtherBranches[b3.ID()]
assert.True(t, ok)
_, ok = tipManager.branches[b2.ID()].tips[t2].referencedByOtherBranches[b3.ID()]
assert.True(t, ok)
return
}
type mockBranch struct {
id branchmanager.BranchID
liked bool
......@@ -193,13 +329,20 @@ func (m *mockBranch) addTip(valueObject *payload.Payload) {
}
func (m *mockBranch) tip() payload.ID {
tip := m.tipWithoutRemove()
delete(m.tips, tip)
return tip
}
func (m *mockBranch) tipWithoutRemove() payload.ID {
var tip payload.ID
// get some element
for t := range m.tips {
tip = t
break
}
delete(m.tips, tip)
return tip
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment