diff --git a/tools/integration-tests/tester/framework/docker.go b/tools/integration-tests/tester/framework/docker.go index 2d1c08ce5e70e1e4dc05b4fba15d7b33e5b8a106..e04c9cfe6ec4a2eaa9886bd3b3b4a3297c25a724 100644 --- a/tools/integration-tests/tester/framework/docker.go +++ b/tools/integration-tests/tester/framework/docker.go @@ -160,6 +160,16 @@ func (d *DockerContainer) Stop() error { return d.client.ContainerStop(context.Background(), d.id, &duration) } +// ExitStatus returns the exit status according to the container information. +func (d *DockerContainer) ExitStatus() (int, error) { + resp, err := d.client.ContainerInspect(context.Background(), d.id) + if err != nil { + return -1, err + } + + return resp.State.ExitCode, nil +} + // Logs returns the logs of the container as io.ReadCloser. func (d *DockerContainer) Logs() (io.ReadCloser, error) { options := types.ContainerLogsOptions{ diff --git a/tools/integration-tests/tester/framework/network.go b/tools/integration-tests/tester/framework/network.go index 7b08e3a76a6f624bb919bd67d730fbb074b71be3..4094e8b6e173fd78148821645e7e1a7e3b4c911d 100644 --- a/tools/integration-tests/tester/framework/network.go +++ b/tools/integration-tests/tester/framework/network.go @@ -155,6 +155,19 @@ func (n *Network) Shutdown() error { } } + // save exit status of containers to check at end of shutdown process + exitStatus := make(map[string]int, len(n.peers)+1) + exitStatus[containerNameEntryNode], err = n.entryNode.ExitStatus() + if err != nil { + return err + } + for _, p := range n.peers { + exitStatus[p.name], err = p.ExitStatus() + if err != nil { + return err + } + } + // remove containers err = n.entryNode.Remove() if err != nil { @@ -179,6 +192,13 @@ func (n *Network) Shutdown() error { return err } + // check exit codes of containers + for name, status := range exitStatus { + if status != exitStatusSuccessful { + return fmt.Errorf("container %s exited with code %d", name, status) + } + } + return nil } diff --git a/tools/integration-tests/tester/framework/parameters.go b/tools/integration-tests/tester/framework/parameters.go index c66302800d4c238a4e2fc60b6e4efda4e5e285ef..17d8933574870f1fe2bd6cd79d59add12d67b5bf 100644 --- a/tools/integration-tests/tester/framework/parameters.go +++ b/tools/integration-tests/tester/framework/parameters.go @@ -18,6 +18,8 @@ const ( dockerLogsPrefixLen = 8 dkgMaxTries = 50 + + exitStatusSuccessful = 0 ) // GoShimmerConfig defines the config of a GoShimmer node. diff --git a/tools/integration-tests/tester/tests/common_test.go b/tools/integration-tests/tester/tests/common_test.go index 02090370af2a215649af953793d3ff36b819cbce..e52f6c89798a8b8872b01e83b3a262e3afe41dd8 100644 --- a/tools/integration-tests/tester/tests/common_test.go +++ b/tools/integration-tests/tester/tests/common_test.go @@ -19,7 +19,7 @@ func TestSynchronization(t *testing.T) { initalPeers := 4 n, err := f.CreateNetwork("common_TestSynchronization", initalPeers, 2, config) require.NoError(t, err) - defer n.Shutdown() + defer ShutdownNetwork(t, n) // wait for peers to change their state to synchronized time.Sleep(5 * time.Second) diff --git a/tools/integration-tests/tester/tests/drng_test.go b/tools/integration-tests/tester/tests/drng_test.go index 0832f04ae9553522cd09097c5964ae2c6ab4ff3d..d0c176454ff03d6dfd5c96866fc752f68365de94 100644 --- a/tools/integration-tests/tester/tests/drng_test.go +++ b/tools/integration-tests/tester/tests/drng_test.go @@ -23,7 +23,7 @@ func TestDRNG(t *testing.T) { drng, err := f.CreateDRNGNetwork("TestDRNG", 5, 8, 3) require.NoError(t, err) - defer drng.Shutdown() + defer ShutdownNetwork(t, drng) // wait for randomness generation to be started log.Printf("Waiting for randomness generation to be started...\n") diff --git a/tools/integration-tests/tester/tests/message_test.go b/tools/integration-tests/tester/tests/message_test.go index d5583988961e901637753f47aad351ad0ad51b14..a1c334f6511628b837e3444f1720453636146d5c 100644 --- a/tools/integration-tests/tester/tests/message_test.go +++ b/tools/integration-tests/tester/tests/message_test.go @@ -11,7 +11,7 @@ import ( func TestPersistence(t *testing.T) { n, err := f.CreateNetwork("message_TestPersistence", 4, 2) require.NoError(t, err) - defer n.Shutdown() + defer ShutdownNetwork(t, n) // wait for peers to change their state to synchronized time.Sleep(5 * time.Second) diff --git a/tools/integration-tests/tester/tests/testutil.go b/tools/integration-tests/tester/tests/testutil.go index 3c0bca2da6ca35f97c10681e21f9a3e4e47d82cf..845a7ca5b7a50ebcabd7aa6290f136fa2265e2cd 100644 --- a/tools/integration-tests/tester/tests/testutil.go +++ b/tools/integration-tests/tester/tests/testutil.go @@ -19,6 +19,10 @@ type DataMessageSent struct { issuerPublicKey string } +type Shutdowner interface { + Shutdown() error +} + // sendDataMessagesOnRandomPeer sends data messages on a random peer and saves the sent message to a map. func sendDataMessagesOnRandomPeer(t *testing.T, peers []*framework.Peer, numMessages int, idsMap ...map[string]DataMessageSent) map[string]DataMessageSent { var ids map[string]DataMessageSent @@ -90,3 +94,9 @@ func checkForMessageIds(t *testing.T, peers []*framework.Peer, ids map[string]Da } } } + +// ShutdownNetwork shuts down the network and reports errors. +func ShutdownNetwork(t *testing.T, n Shutdowner) { + err := n.Shutdown() + require.NoError(t, err) +}