Skip to content
This repository has been archived by the owner on Feb 20, 2025. It is now read-only.

Commit

Permalink
adds tests
Browse files Browse the repository at this point in the history
  • Loading branch information
kjezek committed Nov 14, 2024
1 parent 56c1c80 commit 4200b1f
Show file tree
Hide file tree
Showing 4 changed files with 130 additions and 4 deletions.
2 changes: 1 addition & 1 deletion client
Submodule client updated 69 files
+5 −0 .github/workflows/test_build.yml
+6 −0 Jenkinsfile
+1 −1 Makefile
+2 −0 cmd/sonicd/app/launcher.go
+6 −1 config/config.go
+10 −0 config/flags/flags.go
+66 −12 ethapi/api.go
+126 −0 ethapi/api_test.go
+2 −11 ethapi/backend.go
+97 −0 ethapi/limit.go
+99 −0 ethapi/limit_test.go
+644 −0 ethapi/mock_backend.go
+36 −14 ethapi/tx_trace.go
+77 −62 evmcore/dummy_block.go
+2 −2 evmcore/evm.go
+9 −0 evmcore/state_processor.go
+1 −1 evmcore/tx_list_test.go
+2 −2 evmcore/tx_pool.go
+16 −12 evmcore/tx_pool_test.go
+30 −12 gossip/blockproc/evmmodule/evm.go
+1 −0 gossip/blockproc/evmmodule/evm_test.go
+10 −1 gossip/blockproc/interface.go
+15 −8 gossip/c_block_callbacks.go
+9 −0 gossip/config.go
+2 −2 gossip/dummy_tx_pool.go
+6 −5 gossip/emitter/config.go
+3 −3 gossip/emitter/emitter.go
+3 −3 gossip/emitter/ordering_test.go
+0 −8 gossip/evm_state_reader.go
+127 −0 gossip/gasprice/base_fee.go
+387 −0 gossip/gasprice/base_fee_test.go
+6 −6 gossip/gasprice/gasprice.go
+3 −5 gossip/gasprice/gasprice_test.go
+2 −2 gossip/handler.go
+2 −2 gossip/handler_fuzz.go
+3 −3 gossip/protocols/dag/dagstream/dagstreamleecher/leecher.go
+11 −11 gossip/protocols/dag/dagstream/dagstreamleecher/leecher_test.go
+20 −6 gossip/service.go
+4 −3 gossip/sync.go
+8 −7 gossip/tx_scrambler_test.go
+1 −1 integration/makegenesis/genesis.go
+5 −0 inter/block.go
+13 −0 inter/block_test.go
+43 −33 inter/event_serializer_test.go
+19 −0 inter/prevrandao.go
+58 −0 inter/prevrandao_test.go
+4 −4 opera/genesisstore/fileshash/filehash_test.go
+197 −0 tests/blob_tx_test.go
+49 −43 tests/blobbasefee_test.go
+400 −0 tests/contracts/contractcreator/contractcreator.go
+42 −0 tests/contracts/contractcreator/contractcreator.sol
+4 −0 tests/contracts/contractcreator/gen.go
+4 −0 tests/contracts/prevrandao/gen.go
+389 −0 tests/contracts/prevrandao/prevrandao.go
+16 −0 tests/contracts/prevrandao/prevrandao.sol
+5 −0 tests/contracts/selfdestruct/gen.go
+389 −0 tests/contracts/selfdestruct/selfdestruct.go
+78 −0 tests/contracts/selfdestruct/selfdestruct.sol
+576 −0 tests/contracts/selfdestruct/selfdestruct_factory.go
+186 −0 tests/initcoder_test.go
+73 −0 tests/prevrandao_test.go
+459 −0 tests/selfdestruct_test.go
+71 −0 tests/withdrawals_test.go
+1 −1 topicsdb/topicsdb_test.go
+11 −11 utils/bits/bits_test.go
+3 −4 utils/cser/binary_test.go
+1 −1 utils/fast/buffer_test.go
+1 −1 utils/num_queue_test.go
+3 −3 utils/randat/rand_at.go
9 changes: 6 additions & 3 deletions driver/docker/docker.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ type Signal string
// SigHup is the SIGHUP signal.
var SigHup Signal = "SIGHUP"
var SigKill Signal = "SIGKILL"
var SigInt Signal = "SIGINT"
var Sigterm Signal = "SIGTERM"

// Client provides means to spawn Docker containers capable of hosting
// services like the go-opera client.
Expand Down Expand Up @@ -172,7 +174,7 @@ func (c *Client) Start(config *ContainerConfig) (*Container, error) {
}

init := true
stopTimeout := int(config.ShutdownTimeout.Seconds())
//stopTimeout := int(config.ShutdownTimeout.Seconds())
resp, err := c.cli.ContainerCreate(context.Background(), &container.Config{
Image: config.ImageName,
Tty: false,
Expand All @@ -181,7 +183,7 @@ func (c *Client) Start(config *ContainerConfig) (*Container, error) {
Labels: map[string]string{
objectsLabel: "true",
},
StopTimeout: &stopTimeout,
//StopTimeout: &stopTimeout,
}, &container.HostConfig{
PortBindings: portMapping,
Mounts: mountConfig,
Expand Down Expand Up @@ -255,7 +257,8 @@ func (c *Container) Stop() error {
}
c.stopped = true
timeout := int(c.config.ShutdownTimeout.Seconds())
return c.client.cli.ContainerStop(context.Background(), c.id, container.StopOptions{Timeout: &timeout})
return c.client.cli.ContainerStop(context.Background(), c.id, container.StopOptions{
Signal: string(SigInt), Timeout: &timeout})
}

// Cleanup stops the container (unless it is already stopped) and frees any
Expand Down
64 changes: 64 additions & 0 deletions driver/network/local/local_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,11 @@
package local

import (
"bufio"
"fmt"
"strings"
"testing"
"time"

"github.com/Fantom-foundation/Norma/driver"
"go.uber.org/mock/gomock"
Expand Down Expand Up @@ -155,6 +158,67 @@ func TestLocalNetwork_CanPerformNetworkShutdown(t *testing.T) {
}
}

func TestLocalNetwork_Shutdown_Graceful(t *testing.T) {
t.Parallel()
N := 3
config := driver.NetworkConfig{NumberOfValidators: 1}

net, err := NewLocalNetwork(&config)
if err != nil {
t.Fatalf("failed to create new local network: %v", err)
}

done := make(chan bool, N)

ctrl := gomock.NewController(t)
listener := driver.NewMockNetworkListener(ctrl)
listener.EXPECT().AfterNodeCreation(gomock.Any()).DoAndReturn(func(node driver.Node) {
reader, err := node.StreamLog()
if err != nil {
t.Errorf("error: %v", err)
}
t.Cleanup(func() {
if err := reader.Close(); err != nil {
t.Errorf("cannot close: %v", err)
}
})

go func() {
scanner := bufio.NewScanner(reader)
for scanner.Scan() {
line := scanner.Text()
if strings.Contains(line, "State DB closed") {
done <- true
}
}
}()
}).Times(N)
net.RegisterListener(listener)

for i := 0; i < N; i++ {
_, err := net.CreateNode(&driver.NodeConfig{
Name: fmt.Sprintf("T-%d", i),
})
if err != nil {
t.Errorf("failed to create node: %v", err)
}
}

if err := net.Shutdown(); err != nil {
t.Errorf("failed to shut down network: %v", err)
}

// N containers must stop gracefully
for i := 0; i < N; i++ {
select {
case <-done:
// one container done successfully
case <-time.After(180 * time.Second):
t.Errorf("container did not stop gracefully")
}
}
}

func TestLocalNetwork_CanRunWithMultipleValidators(t *testing.T) {
t.Parallel()
for _, N := range []int{1, 3} {
Expand Down
59 changes: 59 additions & 0 deletions driver/node/opera_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -182,3 +182,62 @@ func TestOperaNode_MetricsExposed(t *testing.T) {
t.Errorf("monitoring API has not been available")
}
}

func TestClient_Stop_Graceful(t *testing.T) {
t.Parallel()

client, err := docker.NewClient()
if err != nil {
t.Fatalf("failed to create client: %v", err)
}
defer func() {
if err := client.Close(); err != nil {
t.Errorf("cannot close: %v", err)
}
}()

node, err := StartOperaDockerNode(client, nil, &OperaNodeConfig{
Label: "test",
NetworkConfig: &driver.NetworkConfig{NumberOfValidators: 1},
})
if err != nil {
t.Fatalf("failed to create client node: %v", err)
}
defer func() {
if err := node.Cleanup(); err != nil {
t.Errorf("cannot cleanup: %v", err)
}
}()

reader, err := node.StreamLog()
if err != nil {
t.Errorf("error: %v", err)
}
defer func() {
if err := reader.Close(); err != nil {
t.Errorf("cannot close: %v", err)
}
}()

done := make(chan bool)
go func() {
scanner := bufio.NewScanner(reader)
for scanner.Scan() {
line := scanner.Text()
if strings.Contains(line, "State DB closed") {
done <- true
}
}
}()

if err := node.Stop(); err != nil {
t.Errorf("cannot stop client node: %v", err)
}

select {
case <-done:
// container stopped gracefully
case <-time.After(180 * time.Second):
t.Errorf("container did not stop gracefully")
}
}

0 comments on commit 4200b1f

Please sign in to comment.