Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
G
Goshimmer_without_tipselection
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
COLLET Ismael
Goshimmer_without_tipselection
Commits
271be7ad
Unverified
Commit
271be7ad
authored
5 years ago
by
jonastheis
Browse files
Options
Downloads
Patches
Plain Diff
Add more tests
parent
c4e7c5c5
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
dapps/valuetransfers/packages/tipmanager/tipmanager.go
+8
-6
8 additions, 6 deletions
dapps/valuetransfers/packages/tipmanager/tipmanager.go
dapps/valuetransfers/packages/tipmanager/tipmanager_test.go
+153
-10
153 additions, 10 deletions
dapps/valuetransfers/packages/tipmanager/tipmanager_test.go
with
161 additions
and
16 deletions
dapps/valuetransfers/packages/tipmanager/tipmanager.go
+
8
−
6
View file @
271be7ad
...
...
@@ -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
{
...
...
This diff is collapsed.
Click to expand it.
dapps/valuetransfers/packages/tipmanager/tipmanager_test.go
+
153
−
10
View file @
271be7ad
...
...
@@ -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
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment