@@ -23,6 +23,7 @@ import (
2323 "github.com/iotaledger/hive.go/ierrors"
2424 "github.com/iotaledger/hive.go/lo"
2525 "github.com/iotaledger/hive.go/runtime/options"
26+ "github.com/iotaledger/hive.go/runtime/syncutils"
2627 "github.com/iotaledger/iota-core/pkg/protocol"
2728 "github.com/iotaledger/iota-core/pkg/testsuite/snapshotcreator"
2829 iotago "github.com/iotaledger/iota.go/v4"
@@ -72,7 +73,8 @@ type Account struct {
7273type DockerTestFramework struct {
7374 Testing * testing.T
7475
75- nodes map [string ]* Node
76+ nodes map [string ]* Node
77+ nodesLock syncutils.RWMutex
7678
7779 snapshotPath string
7880 logDirectoryPath string
@@ -129,7 +131,7 @@ func (d *DockerTestFramework) DockerComposeUp(detach ...bool) error {
129131 }
130132
131133 cmd .Env = os .Environ ()
132- for _ , node := range d .nodes {
134+ for _ , node := range d .Nodes () {
133135 cmd .Env = append (cmd .Env , fmt .Sprintf ("ISSUE_CANDIDACY_PAYLOAD_%s=%t" , node .Name , node .IssueCandidacyPayload ))
134136 }
135137
@@ -194,7 +196,11 @@ loop:
194196}
195197
196198func (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 {
198204 client , err := nodeclient .New (node .ClientURL )
199205 if err != nil {
200206 return ierrors .Wrapf (err , "failed to create node client for node %s" , node .Name )
@@ -212,7 +218,7 @@ func (d *DockerTestFramework) WaitUntilSync() error {
212218 defer fmt .Println ("Wait until the nodes are synced......done" )
213219
214220 d .Eventually (func () error {
215- for _ , node := range d .nodes {
221+ for _ , node := range d .Nodes () {
216222 for {
217223 synced , err := node .Client .Health (context .TODO ())
218224 if err != nil {
@@ -235,6 +241,9 @@ func (d *DockerTestFramework) WaitUntilSync() error {
235241}
236242
237243func (d * DockerTestFramework ) AddValidatorNode (name string , containerName string , clientURL string , accAddrBech32 string , optIssueCandidacyPayload ... bool ) {
244+ d .nodesLock .Lock ()
245+ defer d .nodesLock .Unlock ()
246+
238247 issueCandidacyPayload := true
239248 if len (optIssueCandidacyPayload ) > 0 {
240249 issueCandidacyPayload = optIssueCandidacyPayload [0 ]
@@ -250,6 +259,9 @@ func (d *DockerTestFramework) AddValidatorNode(name string, containerName string
250259}
251260
252261func (d * DockerTestFramework ) AddNode (name string , containerName string , clientURL string ) {
262+ d .nodesLock .Lock ()
263+ defer d .nodesLock .Unlock ()
264+
253265 d .nodes [name ] = & Node {
254266 Name : name ,
255267 ContainerName : containerName ,
@@ -258,6 +270,9 @@ func (d *DockerTestFramework) AddNode(name string, containerName string, clientU
258270}
259271
260272func (d * DockerTestFramework ) Nodes (names ... string ) []* Node {
273+ d .nodesLock .RLock ()
274+ defer d .nodesLock .RUnlock ()
275+
261276 if len (names ) == 0 {
262277 nodes := make ([]* Node , 0 , len (d .nodes ))
263278 for _ , node := range d .nodes {
@@ -276,6 +291,9 @@ func (d *DockerTestFramework) Nodes(names ...string) []*Node {
276291}
277292
278293func (d * DockerTestFramework ) Node (name string ) * Node {
294+ d .nodesLock .RLock ()
295+ defer d .nodesLock .RUnlock ()
296+
279297 node , exist := d .nodes [name ]
280298 require .True (d .Testing , exist )
281299
@@ -654,7 +672,7 @@ func (d *DockerTestFramework) AssertIndexerFoundry(foundryID iotago.FoundryID) {
654672
655673func (d * DockerTestFramework ) AssertValidatorExists (accountAddr * iotago.AccountAddress ) {
656674 d .Eventually (func () error {
657- for _ , node := range d .nodes {
675+ for _ , node := range d .Nodes () {
658676 _ , err := node .Client .StakingAccount (context .TODO (), accountAddr )
659677 if err != nil {
660678 return err
@@ -682,7 +700,7 @@ func (d *DockerTestFramework) AssertCommittee(expectedEpoch iotago.EpochIndex, e
682700 time .Sleep (secToWait )
683701
684702 d .Eventually (func () error {
685- for _ , node := range d .nodes {
703+ for _ , node := range d .Nodes () {
686704 resp , err := node .Client .Committee (context .TODO ())
687705 if err != nil {
688706 return err
@@ -708,7 +726,7 @@ func (d *DockerTestFramework) AssertCommittee(expectedEpoch iotago.EpochIndex, e
708726}
709727
710728func (d * DockerTestFramework ) AssertFinalizedSlot (condition func (iotago.SlotIndex ) error ) {
711- for _ , node := range d .nodes {
729+ for _ , node := range d .Nodes () {
712730 status := d .NodeStatus (node .Name )
713731
714732 err := condition (status .LatestFinalizedSlot )
@@ -769,7 +787,11 @@ func (d *DockerTestFramework) DumpContainerLogsToFiles() {
769787
770788func (d * DockerTestFramework ) GetContainersConfigs () {
771789 // 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 {
773795 cmd := fmt .Sprintf ("docker inspect --format='{{.Config.Cmd}}' %s" , node .ContainerName )
774796 containerConfigsBytes , err := exec .Command ("bash" , "-c" , cmd ).Output ()
775797 require .NoError (d .Testing , err )
0 commit comments