@@ -23,6 +23,7 @@ import (
23
23
"github.com/iotaledger/hive.go/ierrors"
24
24
"github.com/iotaledger/hive.go/lo"
25
25
"github.com/iotaledger/hive.go/runtime/options"
26
+ "github.com/iotaledger/hive.go/runtime/syncutils"
26
27
"github.com/iotaledger/iota-core/pkg/protocol"
27
28
"github.com/iotaledger/iota-core/pkg/testsuite/snapshotcreator"
28
29
iotago "github.com/iotaledger/iota.go/v4"
@@ -72,7 +73,8 @@ type Account struct {
72
73
type DockerTestFramework struct {
73
74
Testing * testing.T
74
75
75
- nodes map [string ]* Node
76
+ nodes map [string ]* Node
77
+ nodesLock syncutils.RWMutex
76
78
77
79
snapshotPath string
78
80
logDirectoryPath string
@@ -129,7 +131,7 @@ func (d *DockerTestFramework) DockerComposeUp(detach ...bool) error {
129
131
}
130
132
131
133
cmd .Env = os .Environ ()
132
- for _ , node := range d .nodes {
134
+ for _ , node := range d .Nodes () {
133
135
cmd .Env = append (cmd .Env , fmt .Sprintf ("ISSUE_CANDIDACY_PAYLOAD_%s=%t" , node .Name , node .IssueCandidacyPayload ))
134
136
}
135
137
@@ -194,7 +196,11 @@ loop:
194
196
}
195
197
196
198
func (d * DockerTestFramework ) waitForNodesAndGetClients () error {
197
- for _ , node := range d .Nodes () {
199
+ nodes := d .Nodes ()
200
+
201
+ d .nodesLock .Lock ()
202
+ defer d .nodesLock .Unlock ()
203
+ for _ , node := range nodes {
198
204
client , err := nodeclient .New (node .ClientURL )
199
205
if err != nil {
200
206
return ierrors .Wrapf (err , "failed to create node client for node %s" , node .Name )
@@ -212,7 +218,7 @@ func (d *DockerTestFramework) WaitUntilSync() error {
212
218
defer fmt .Println ("Wait until the nodes are synced......done" )
213
219
214
220
d .Eventually (func () error {
215
- for _ , node := range d .nodes {
221
+ for _ , node := range d .Nodes () {
216
222
for {
217
223
synced , err := node .Client .Health (context .TODO ())
218
224
if err != nil {
@@ -235,6 +241,9 @@ func (d *DockerTestFramework) WaitUntilSync() error {
235
241
}
236
242
237
243
func (d * DockerTestFramework ) AddValidatorNode (name string , containerName string , clientURL string , accAddrBech32 string , optIssueCandidacyPayload ... bool ) {
244
+ d .nodesLock .Lock ()
245
+ defer d .nodesLock .Unlock ()
246
+
238
247
issueCandidacyPayload := true
239
248
if len (optIssueCandidacyPayload ) > 0 {
240
249
issueCandidacyPayload = optIssueCandidacyPayload [0 ]
@@ -250,6 +259,9 @@ func (d *DockerTestFramework) AddValidatorNode(name string, containerName string
250
259
}
251
260
252
261
func (d * DockerTestFramework ) AddNode (name string , containerName string , clientURL string ) {
262
+ d .nodesLock .Lock ()
263
+ defer d .nodesLock .Unlock ()
264
+
253
265
d .nodes [name ] = & Node {
254
266
Name : name ,
255
267
ContainerName : containerName ,
@@ -258,6 +270,9 @@ func (d *DockerTestFramework) AddNode(name string, containerName string, clientU
258
270
}
259
271
260
272
func (d * DockerTestFramework ) Nodes (names ... string ) []* Node {
273
+ d .nodesLock .RLock ()
274
+ defer d .nodesLock .RUnlock ()
275
+
261
276
if len (names ) == 0 {
262
277
nodes := make ([]* Node , 0 , len (d .nodes ))
263
278
for _ , node := range d .nodes {
@@ -276,6 +291,9 @@ func (d *DockerTestFramework) Nodes(names ...string) []*Node {
276
291
}
277
292
278
293
func (d * DockerTestFramework ) Node (name string ) * Node {
294
+ d .nodesLock .RLock ()
295
+ defer d .nodesLock .RUnlock ()
296
+
279
297
node , exist := d .nodes [name ]
280
298
require .True (d .Testing , exist )
281
299
@@ -654,7 +672,7 @@ func (d *DockerTestFramework) AssertIndexerFoundry(foundryID iotago.FoundryID) {
654
672
655
673
func (d * DockerTestFramework ) AssertValidatorExists (accountAddr * iotago.AccountAddress ) {
656
674
d .Eventually (func () error {
657
- for _ , node := range d .nodes {
675
+ for _ , node := range d .Nodes () {
658
676
_ , err := node .Client .StakingAccount (context .TODO (), accountAddr )
659
677
if err != nil {
660
678
return err
@@ -682,7 +700,7 @@ func (d *DockerTestFramework) AssertCommittee(expectedEpoch iotago.EpochIndex, e
682
700
time .Sleep (secToWait )
683
701
684
702
d .Eventually (func () error {
685
- for _ , node := range d .nodes {
703
+ for _ , node := range d .Nodes () {
686
704
resp , err := node .Client .Committee (context .TODO ())
687
705
if err != nil {
688
706
return err
@@ -708,7 +726,7 @@ func (d *DockerTestFramework) AssertCommittee(expectedEpoch iotago.EpochIndex, e
708
726
}
709
727
710
728
func (d * DockerTestFramework ) AssertFinalizedSlot (condition func (iotago.SlotIndex ) error ) {
711
- for _ , node := range d .nodes {
729
+ for _ , node := range d .Nodes () {
712
730
status := d .NodeStatus (node .Name )
713
731
714
732
err := condition (status .LatestFinalizedSlot )
@@ -769,7 +787,11 @@ func (d *DockerTestFramework) DumpContainerLogsToFiles() {
769
787
770
788
func (d * DockerTestFramework ) GetContainersConfigs () {
771
789
// get container configs
772
- for _ , node := range d .Nodes () {
790
+ nodes := d .Nodes ()
791
+
792
+ d .nodesLock .Lock ()
793
+ defer d .nodesLock .Unlock ()
794
+ for _ , node := range nodes {
773
795
cmd := fmt .Sprintf ("docker inspect --format='{{.Config.Cmd}}' %s" , node .ContainerName )
774
796
containerConfigsBytes , err := exec .Command ("bash" , "-c" , cmd ).Output ()
775
797
require .NoError (d .Testing , err )
0 commit comments