Skip to content
Snippets Groups Projects
Commit 44d286ef authored by capossele's avatar capossele
Browse files

:ok_hand: changes dRNG integration test according to review

parent aa36eb3b
Branches
Tags
No related merge requests found
...@@ -3,6 +3,9 @@ ...@@ -3,6 +3,9 @@
echo "Build GoShimmer image" echo "Build GoShimmer image"
docker build -t iotaledger/goshimmer ../../. docker build -t iotaledger/goshimmer ../../.
echo "Pulling drand image"
docker pull angelocapossele/drand:latest
echo "Run integration tests" echo "Run integration tests"
docker-compose -f tester/docker-compose.yml up --abort-on-container-exit --exit-code-from tester --build docker-compose -f tester/docker-compose.yml up --abort-on-container-exit --exit-code-from tester --build
......
...@@ -69,7 +69,7 @@ func (d *DockerContainer) CreateGoShimmerEntryNode(name string, seed string) err ...@@ -69,7 +69,7 @@ func (d *DockerContainer) CreateGoShimmerEntryNode(name string, seed string) err
} }
// CreateGoShimmerPeer creates a new container with the GoShimmer peer's configuration. // CreateGoShimmerPeer creates a new container with the GoShimmer peer's configuration.
func (d *DockerContainer) CreateGoShimmerPeer(conf GoShimmerConfig) error { func (d *DockerContainer) CreateGoShimmerPeer(config GoShimmerConfig) error {
// configure GoShimmer container instance // configure GoShimmer container instance
containerConfig := &container.Config{ containerConfig := &container.Config{
Image: "iotaledger/goshimmer", Image: "iotaledger/goshimmer",
...@@ -77,24 +77,24 @@ func (d *DockerContainer) CreateGoShimmerPeer(conf GoShimmerConfig) error { ...@@ -77,24 +77,24 @@ func (d *DockerContainer) CreateGoShimmerPeer(conf GoShimmerConfig) error {
nat.Port("8080/tcp"): {}, nat.Port("8080/tcp"): {},
}, },
Cmd: strslice.StrSlice{ Cmd: strslice.StrSlice{
fmt.Sprintf("--node.disablePlugins=%s", conf.DisabledPlugins), fmt.Sprintf("--node.disablePlugins=%s", config.DisabledPlugins),
fmt.Sprintf("--node.enablePlugins=%s", func() string { fmt.Sprintf("--node.enablePlugins=%s", func() string {
if conf.Bootstrap { if config.Bootstrap {
return "Bootstrap" return "Bootstrap"
} }
return "" return ""
}()), }()),
"--webapi.bindAddress=0.0.0.0:8080", "--webapi.bindAddress=0.0.0.0:8080",
fmt.Sprintf("--autopeering.seed=%s", conf.Seed), fmt.Sprintf("--autopeering.seed=%s", config.Seed),
fmt.Sprintf("--autopeering.entryNodes=%s@%s:14626", conf.EntryNodePublicKey, conf.EntryNodeHost), fmt.Sprintf("--autopeering.entryNodes=%s@%s:14626", config.EntryNodePublicKey, config.EntryNodeHost),
fmt.Sprintf("--drng.instanceId=%d", conf.DRNGInstance), fmt.Sprintf("--drng.instanceId=%d", config.DRNGInstance),
fmt.Sprintf("--drng.threshold=%d", conf.DRNGThreshold), fmt.Sprintf("--drng.threshold=%d", config.DRNGThreshold),
fmt.Sprintf("--drng.committeeMembers=%s", conf.DRNGCommittee), fmt.Sprintf("--drng.committeeMembers=%s", config.DRNGCommittee),
fmt.Sprintf("--drng.distributedPubKey=%s", conf.DRNGDistKey), fmt.Sprintf("--drng.distributedPubKey=%s", config.DRNGDistKey),
}, },
} }
return d.CreateContainer(conf.Name, containerConfig) return d.CreateContainer(config.Name, containerConfig)
} }
// CreateDrandMember creates a new container with the drand configuration. // CreateDrandMember creates a new container with the drand configuration.
......
...@@ -19,7 +19,7 @@ type DRNGNetwork struct { ...@@ -19,7 +19,7 @@ type DRNGNetwork struct {
distKey []byte distKey []byte
} }
// newDRNGNetwork returns a Network instance, creates its underlying Docker network and adds the tester container to the network. // newDRNGNetwork returns a DRNGNetwork instance, creates its underlying Docker network and adds the tester container to the network.
func newDRNGNetwork(dockerClient *client.Client, name string, tester *DockerContainer) (*DRNGNetwork, error) { func newDRNGNetwork(dockerClient *client.Client, name string, tester *DockerContainer) (*DRNGNetwork, error) {
network, err := newNetwork(dockerClient, name, tester) network, err := newNetwork(dockerClient, name, tester)
if err != nil { if err != nil {
...@@ -34,15 +34,15 @@ func newDRNGNetwork(dockerClient *client.Client, name string, tester *DockerCont ...@@ -34,15 +34,15 @@ func newDRNGNetwork(dockerClient *client.Client, name string, tester *DockerCont
func (n *DRNGNetwork) CreatePeer(c GoShimmerConfig, publicKey hive_ed25519.PublicKey) (*Peer, error) { func (n *DRNGNetwork) CreatePeer(c GoShimmerConfig, publicKey hive_ed25519.PublicKey) (*Peer, error) {
name := n.network.namePrefix(fmt.Sprintf("%s%d", containerNameReplica, len(n.network.peers))) name := n.network.namePrefix(fmt.Sprintf("%s%d", containerNameReplica, len(n.network.peers)))
conf := c config := c
conf.Name = name config.Name = name
conf.EntryNodeHost = n.network.namePrefix(containerNameEntryNode) config.EntryNodeHost = n.network.namePrefix(containerNameEntryNode)
conf.EntryNodePublicKey = n.network.entryNodePublicKey() config.EntryNodePublicKey = n.network.entryNodePublicKey()
conf.DisabledPlugins = disabledPluginsPeer config.DisabledPlugins = disabledPluginsPeer
// create Docker container // create Docker container
container := NewDockerContainer(n.network.dockerClient) container := NewDockerContainer(n.network.dockerClient)
err := container.CreateGoShimmerPeer(conf) err := container.CreateGoShimmerPeer(config)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -126,18 +126,8 @@ func (n *DRNGNetwork) WaitForDKG() error { ...@@ -126,18 +126,8 @@ func (n *DRNGNetwork) WaitForDKG() error {
defer log.Printf("Waiting for DKG... done\n") defer log.Printf("Waiting for DKG... done\n")
for i := dkgMaxTries; i > 0; i-- { for i := dkgMaxTries; i > 0; i-- {
if dkey, err := n.members[0].Client.DistKey(n.members[0].name+":8000", false); err == nil {
//var dkey *drand.DistKeyResponse n.SetDistKey(dkey.Key)
for _, m := range n.members {
if dkey, err := m.Client.DistKey(m.name+":8000", false); err != nil {
log.Printf("request error: %v\n", err)
} else {
n.SetDistKey(dkey.Key)
}
}
if len(n.distKey) != 0 {
log.Printf("DistKey: %v", hex.EncodeToString(n.distKey)) log.Printf("DistKey: %v", hex.EncodeToString(n.distKey))
return nil return nil
} }
......
...@@ -14,7 +14,6 @@ import ( ...@@ -14,7 +14,6 @@ import (
"github.com/docker/docker/client" "github.com/docker/docker/client"
hive_ed25519 "github.com/iotaledger/hive.go/crypto/ed25519" hive_ed25519 "github.com/iotaledger/hive.go/crypto/ed25519"
"github.com/mr-tron/base58"
) )
var ( var (
...@@ -92,7 +91,7 @@ func (f *Framework) CreateNetwork(name string, peers int, minimumNeighbors int) ...@@ -92,7 +91,7 @@ func (f *Framework) CreateNetwork(name string, peers int, minimumNeighbors int)
} }
// CreateDRNGNetwork creates and returns a (Docker) Network that contains drand and `peers` GoShimmer nodes. // CreateDRNGNetwork creates and returns a (Docker) Network that contains drand and `peers` GoShimmer nodes.
func (f *Framework) CreateDRNGNetwork(name string, members, peers int) (*DRNGNetwork, error) { func (f *Framework) CreateDRNGNetwork(name string, members, peers, minimumNeighbors int) (*DRNGNetwork, error) {
drng, err := newDRNGNetwork(f.dockerClient, strings.ToLower(name), f.tester) drng, err := newDRNGNetwork(f.dockerClient, strings.ToLower(name), f.tester)
if err != nil { if err != nil {
return nil, err return nil, err
...@@ -112,7 +111,7 @@ func (f *Framework) CreateDRNGNetwork(name string, members, peers int) (*DRNGNet ...@@ -112,7 +111,7 @@ func (f *Framework) CreateDRNGNetwork(name string, members, peers int) (*DRNGNet
} }
// wait until containers are fully started // wait until containers are fully started
time.Sleep(60 * time.Second) time.Sleep(1 * time.Second)
err = drng.WaitForDKG() err = drng.WaitForDKG()
if err != nil { if err != nil {
return nil, err return nil, err
...@@ -133,11 +132,11 @@ func (f *Framework) CreateDRNGNetwork(name string, members, peers int) (*DRNGNet ...@@ -133,11 +132,11 @@ func (f *Framework) CreateDRNGNetwork(name string, members, peers int) (*DRNGNet
if drngCommittee != "" { if drngCommittee != "" {
drngCommittee += fmt.Sprintf(",") drngCommittee += fmt.Sprintf(",")
} }
drngCommittee += fmt.Sprintf("%s", base58.Encode(pubKeys[i][:])) drngCommittee += pubKeys[i].String()
} }
} }
conf := GoShimmerConfig{ config := GoShimmerConfig{
DRNGInstance: 1, DRNGInstance: 1,
DRNGThreshold: 3, DRNGThreshold: 3,
DRNGDistKey: hex.EncodeToString(drng.distKey), DRNGDistKey: hex.EncodeToString(drng.distKey),
...@@ -146,16 +145,16 @@ func (f *Framework) CreateDRNGNetwork(name string, members, peers int) (*DRNGNet ...@@ -146,16 +145,16 @@ func (f *Framework) CreateDRNGNetwork(name string, members, peers int) (*DRNGNet
// create peers/GoShimmer nodes // create peers/GoShimmer nodes
for i := 0; i < peers; i++ { for i := 0; i < peers; i++ {
conf.Bootstrap = i == 0 config.Bootstrap = i == 0
conf.Seed = base64.StdEncoding.EncodeToString(ed25519.PrivateKey(privKeys[i].Bytes()).Seed()) config.Seed = base64.StdEncoding.EncodeToString(ed25519.PrivateKey(privKeys[i].Bytes()).Seed())
if _, err = drng.CreatePeer(conf, pubKeys[i]); err != nil { if _, err = drng.CreatePeer(config, pubKeys[i]); err != nil {
return nil, err return nil, err
} }
} }
// wait until peers are fully started and connected // wait until peers are fully started and connected
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
err = drng.network.WaitForAutopeering(3) err = drng.network.WaitForAutopeering(minimumNeighbors)
if err != nil { if err != nil {
return nil, err return nil, err
} }
......
package tests package tests
import ( import (
"encoding/hex" "encoding/json"
"fmt"
"log" "log"
"sync"
"testing" "testing"
"time" "time"
"github.com/iotaledger/goshimmer/tools/integration-tests/tester/framework"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
var (
errWrongRound = fmt.Errorf("wrong round")
)
// TestDRNG checks whether drng messages are actually relayed/gossiped through the network // TestDRNG checks whether drng messages are actually relayed/gossiped through the network
// by checking the messages' existence on all nodes after a cool down. // by checking the messages' existence on all nodes after a cool down.
func TestDRNG(t *testing.T) { func TestDRNG(t *testing.T) {
drng, err := f.CreateDRNGNetwork("TestDRNG", 5, 8) var wg sync.WaitGroup
drng, err := f.CreateDRNGNetwork("TestDRNG", 5, 8, 3)
require.NoError(t, err) require.NoError(t, err)
defer drng.Shutdown() defer drng.Shutdown()
// wait for randomness generation to be started // wait for randomness generation to be started
log.Printf("Waiting for randomness generation to be started...\n") log.Printf("Waiting for randomness generation to be started...\n")
time.Sleep(100 * time.Second)
// randomness starts at round = 2
peers := len(drng.Peers()) firstRound := uint64(2)
randomnessMap := make(map[string]int) _, err = waitForRound(t, drng.Peers()[0], firstRound, 200)
require.NoError(t, err)
// check for randomness on every peer
for i := 0; i < 3; i++ { log.Printf("Waiting for randomness generation to be started... done\n")
for _, peer := range drng.Peers() {
resp, err := peer.GetRandomness() ticker := time.NewTimer(0)
require.NoError(t, err) defer ticker.Stop()
log.Println(resp)
randomnessMap[hex.EncodeToString(resp.Randomness)]++ numChecks := 3
i := 0
for {
select {
case <-ticker.C:
ticker.Reset(10 * time.Second)
// check for randomness on every peer
for _, peer := range drng.Peers() {
wg.Add(1)
go func(peer *framework.Peer) {
defer wg.Done()
s, err := waitForRound(t, peer, firstRound+uint64(i), 8)
require.NoError(t, err, peer.ID().String(), s)
t.Log(peer.ID().String(), s)
}(peer)
}
wg.Wait()
i++
if i == numChecks {
return
}
} }
// wait for the next randomness
time.Sleep(10 * time.Second)
} }
}
// check that we got at least 3 different random values func waitForRound(t *testing.T, peer *framework.Peer, round uint64, maxAttempts int) (string, error) {
require.GreaterOrEqual(t, len(randomnessMap), 3) var b []byte
for i := 0; i < maxAttempts; i++ {
// check that each random values has been received by all the peers. resp, err := peer.GetRandomness()
for _, v := range randomnessMap { require.NoError(t, err)
require.GreaterOrEqual(t, v, peers) b, _ = json.MarshalIndent(resp, "", " ")
if resp.Round == round {
return string(b), nil
}
time.Sleep(1 * time.Second)
} }
return string(b), errWrongRound
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment