@@ -20,43 +20,74 @@ import (
2020func TestSimplexMultiNodeSimple (t * testing.T ) {
2121 bb := newTestControlledBlockBuilder (t )
2222
23- var net inMemNetwork
24- net .nodes = []NodeID {{1 }, {2 }, {3 }, {4 }}
25-
26- n1 := newSimplexNode (t , 1 , & net , bb )
27- n2 := newSimplexNode (t , 2 , & net , bb )
28- n3 := newSimplexNode (t , 3 , & net , bb )
29- n4 := newSimplexNode (t , 4 , & net , bb )
23+ nodes := []NodeID {{1 }, {2 }, {3 }, {4 }}
24+ net := newInMemNetwork (t , nodes )
25+ newSimplexNode (t , nodes [0 ], net , bb , false )
26+ newSimplexNode (t , nodes [1 ], net , bb , false )
27+ newSimplexNode (t , nodes [2 ], net , bb , false )
28+ newSimplexNode (t , nodes [3 ], net , bb , false )
3029
3130 bb .triggerNewBlock ()
3231
33- instances := []* testInstance {n4 , n3 , n2 , n1 }
34-
35- for _ , n := range instances {
36- n .start ()
37- }
32+ net .startInstances ()
3833
3934 for seq := 0 ; seq < 10 ; seq ++ {
40- for _ , n := range instances {
41- n .ledger .waitForBlockCommit (uint64 (seq ))
35+ for _ , n := range net . instances {
36+ n .storage .waitForBlockCommit (uint64 (seq ))
4237 }
4338 bb .triggerNewBlock ()
4439 }
4540}
4641
47- func (t * testInstance ) start () {
42+ func (t * testNode ) start () {
4843 go t .handleMessages ()
4944 require .NoError (t .t , t .e .Start ())
5045}
5146
52- func newSimplexNode (t * testing.T , id uint8 , net * inMemNetwork , bb BlockBuilder ) * testInstance {
53- l := testutil .MakeLogger (t , int (id ))
54- storage := newInMemStorage ()
47+ func newSimplexNodeWithStorage (t * testing.T , nodeID NodeID , net * inMemNetwork , bb BlockBuilder , storage []FinalizedBlock ) * testNode {
48+ wal := newTestWAL (t )
49+ conf := defaultTestNodeEpochConfig (t , nodeID , net , wal , bb , true )
50+ for _ , data := range storage {
51+ conf .Storage .Index (data .Block , data .FCert )
52+ }
53+ e , err := NewEpoch (conf )
54+ require .NoError (t , err )
55+ ti := & testNode {
56+ wal : wal ,
57+ e : e ,
58+ t : t ,
59+ storage : conf .Storage .(* InMemStorage ),
60+ ingress : make (chan struct {
61+ msg * Message
62+ from NodeID
63+ }, 100 )}
5564
56- nodeID := NodeID {id }
65+ net .addNode (ti )
66+ return ti
67+ }
5768
69+ func newSimplexNode (t * testing.T , nodeID NodeID , net * inMemNetwork , bb BlockBuilder , replicationEnabled bool ) * testNode {
5870 wal := newTestWAL (t )
71+ conf := defaultTestNodeEpochConfig (t , nodeID , net , wal , bb , replicationEnabled )
72+ e , err := NewEpoch (conf )
73+ require .NoError (t , err )
74+ ti := & testNode {
75+ wal : wal ,
76+ e : e ,
77+ t : t ,
78+ storage : conf .Storage .(* InMemStorage ),
79+ ingress : make (chan struct {
80+ msg * Message
81+ from NodeID
82+ }, 100 )}
83+
84+ net .addNode (ti )
85+ return ti
86+ }
5987
88+ func defaultTestNodeEpochConfig (t * testing.T , nodeID NodeID , net * inMemNetwork , wal WriteAheadLog , bb BlockBuilder , replicationEnabled bool ) EpochConfig {
89+ l := testutil .MakeLogger (t , int (nodeID [0 ]))
90+ storage := newInMemStorage ()
6091 conf := EpochConfig {
6192 MaxProposalWait : DefaultMaxProposalWaitTime ,
6293 Comm : & testComm {
@@ -71,29 +102,16 @@ func newSimplexNode(t *testing.T, id uint8, net *inMemNetwork, bb BlockBuilder)
71102 Storage : storage ,
72103 BlockBuilder : bb ,
73104 SignatureAggregator : & testSignatureAggregator {},
105+ BlockDeserializer : & blockDeserializer {},
106+ QCDeserializer : & testQCDeserializer {t : t },
107+ ReplicationEnabled : replicationEnabled ,
74108 }
75-
76- e , err := NewEpoch (conf )
77- require .NoError (t , err )
78-
79- ti := & testInstance {
80- wal : wal ,
81- e : e ,
82- t : t ,
83- ledger : storage ,
84- ingress : make (chan struct {
85- msg * Message
86- from NodeID
87- }, 100 )}
88-
89- net .instances = append (net .instances , ti )
90-
91- return ti
109+ return conf
92110}
93111
94- type testInstance struct {
112+ type testNode struct {
95113 wal * testWAL
96- ledger * InMemStorage
114+ storage * InMemStorage
97115 e * Epoch
98116 ingress chan struct {
99117 msg * Message
@@ -102,13 +120,13 @@ type testInstance struct {
102120 t * testing.T
103121}
104122
105- func (t * testInstance ) HandleMessage (msg * Message , from NodeID ) error {
123+ func (t * testNode ) HandleMessage (msg * Message , from NodeID ) error {
106124 err := t .e .HandleMessage (msg , from )
107125 require .NoError (t .t , err )
108126 return err
109127}
110128
111- func (t * testInstance ) handleMessages () {
129+ func (t * testNode ) handleMessages () {
112130 for msg := range t .ingress {
113131 err := t .HandleMessage (msg .msg , msg .from )
114132 require .NoError (t .t , err )
@@ -225,10 +243,46 @@ func (c *testComm) Broadcast(msg *Message) {
225243}
226244
227245type inMemNetwork struct {
246+ t * testing.T
228247 nodes []NodeID
229- instances []* testInstance
248+ instances []* testNode
249+ }
250+
251+ // newInMemNetwork creates an in-memory network. Node IDs must be provided before
252+ // adding instances, as nodes require prior knowledge of all participants.
253+ func newInMemNetwork (t * testing.T , nodes []NodeID ) * inMemNetwork {
254+ net := & inMemNetwork {
255+ t : t ,
256+ nodes : nodes ,
257+ instances : make ([]* testNode , 0 ),
258+ }
259+ return net
260+ }
261+
262+ func (n * inMemNetwork ) addNode (node * testNode ) {
263+ allowed := false
264+ for _ , id := range n .nodes {
265+ if bytes .Equal (id , node .e .ID ) {
266+ allowed = true
267+ break
268+ }
269+ }
270+ require .True (node .t , allowed , "node must be declared before adding" )
271+ n .instances = append (n .instances , node )
272+ }
273+
274+ // startInstances starts all instances in the network.
275+ // The first one is typically the leader, so we make sure to start it last.
276+ func (n * inMemNetwork ) startInstances () {
277+ require .Equal (n .t , len (n .nodes ), len (n .instances ))
278+
279+ for i := len (n .nodes ) - 1 ; i >= 0 ; i -- {
280+ n .instances [i ].start ()
281+ }
230282}
231283
284+ // testControlledBlockBuilder is a test block builder that blocks
285+ // block building until a trigger is received
232286type testControlledBlockBuilder struct {
233287 t * testing.T
234288 control chan struct {}
0 commit comments