gopkg.in/dedis/onet.v2@v2.0.0-20181115163211-c8f3724038a7/simulation_test.go (about)

     1  package onet
     2  
     3  import (
     4  	"errors"
     5  	"io/ioutil"
     6  	"os"
     7  	"strconv"
     8  	"strings"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/stretchr/testify/require"
    13  	"gopkg.in/dedis/onet.v2/log"
    14  )
    15  
    16  func TestSimulationBF(t *testing.T) {
    17  	sc, _, err := createBFTree(7, 2, false, []string{"test1", "test2"})
    18  	if err != nil {
    19  		t.Fatal(err)
    20  	}
    21  	addresses := []string{
    22  		"test1:2000",
    23  		"test2:2000",
    24  		"test1:2002",
    25  		"test2:2002",
    26  		"test1:2004",
    27  		"test2:2004",
    28  		"test1:2006",
    29  	}
    30  
    31  	for i, a := range sc.Roster.List {
    32  		if !strings.Contains(string(a.Address), addresses[i]) {
    33  			t.Fatal("Address", string(a.Address), "should be", addresses[i])
    34  		}
    35  	}
    36  	if !sc.Tree.IsBinary(sc.Tree.Root) {
    37  		t.Fatal("Created tree is not binary")
    38  	}
    39  
    40  	sc, _, err = createBFTree(13, 3, false, []string{"test1", "test2"})
    41  	if err != nil {
    42  		t.Fatal(err)
    43  	}
    44  	if len(sc.Tree.Root.Children) != 3 {
    45  		t.Fatal("Branching-factor 3 tree has not 3 children")
    46  	}
    47  	if !sc.Tree.IsNary(sc.Tree.Root, 3) {
    48  		t.Fatal("Created tree is not binary")
    49  	}
    50  }
    51  
    52  func TestSimulationBigTree(t *testing.T) {
    53  	if testing.Short() {
    54  		t.Skip()
    55  	}
    56  	for i := uint(4); i < 8; i++ {
    57  		_, _, err := createBFTree(1<<i-1, 2, false, []string{"test1", "test2"})
    58  		require.Nil(t, err)
    59  	}
    60  }
    61  
    62  func TestSimulationLoadSave(t *testing.T) {
    63  	sc, _, err := createBFTree(7, 2, false, []string{"127.0.0.1", "127.0.0.2"})
    64  	if err != nil {
    65  		t.Fatal(err)
    66  	}
    67  	dir, err := ioutil.TempDir("", "example")
    68  	log.ErrFatal(err)
    69  	defer os.RemoveAll(dir)
    70  	sc.Save(dir)
    71  	sc2, err := LoadSimulationConfig("Ed25519", dir, sc.Roster.List[0].Address.NetworkAddress())
    72  	if err != nil {
    73  		t.Fatal(err)
    74  	}
    75  	if !sc2[0].Tree.ID.Equal(sc.Tree.ID) {
    76  		t.Fatal("Tree-id is not correct")
    77  	}
    78  	closeAll(sc2)
    79  }
    80  
    81  func TestSimulationMultipleInstances(t *testing.T) {
    82  	sc, _, err := createBFTree(7, 2, false, []string{"127.0.0.1", "127.0.0.2"})
    83  	if err != nil {
    84  		t.Fatal(err)
    85  	}
    86  	dir, err := ioutil.TempDir("", "example")
    87  	log.ErrFatal(err)
    88  	defer os.RemoveAll(dir)
    89  	sc.Save(dir)
    90  	sc2, err := LoadSimulationConfig("Ed25519", dir, sc.Roster.List[0].Address.Host())
    91  	if err != nil {
    92  		t.Fatal(err)
    93  	}
    94  	defer closeAll(sc2)
    95  	if len(sc2) != 4 {
    96  		t.Fatal("We should have 4 local1-hosts but have", len(sc2))
    97  	}
    98  	if sc2[0].Server.ServerIdentity.ID.Equal(sc2[1].Server.ServerIdentity.ID) {
    99  		t.Fatal("Hosts are not copies")
   100  	}
   101  }
   102  
   103  func closeAll(scs []*SimulationConfig) {
   104  	for _, s := range scs {
   105  		if err := s.Server.Close(); err != nil {
   106  			log.Error("Error closing host", s.Server.ServerIdentity, err)
   107  		}
   108  
   109  		for s.Server.Router.Listening() {
   110  			log.Lvl2("Sleeping while waiting for router to be closed")
   111  			time.Sleep(20 * time.Millisecond)
   112  		}
   113  	}
   114  }
   115  
   116  func createBFTree(hosts, bf int, tls bool, addresses []string) (*SimulationConfig, *SimulationBFTree, error) {
   117  	sc := &SimulationConfig{}
   118  	sb := &SimulationBFTree{
   119  		Hosts: hosts,
   120  		BF:    bf,
   121  		Suite: "Ed25519",
   122  		TLS:   tls,
   123  	}
   124  	sb.CreateRoster(sc, addresses, 2000)
   125  	if len(sc.Roster.List) != hosts {
   126  		return nil, nil, errors.New("Didn't get correct number of entities")
   127  	}
   128  	err := sb.CreateTree(sc)
   129  	if err != nil {
   130  		return nil, nil, err
   131  	}
   132  	if !sc.Tree.IsNary(sc.Tree.Root, bf) {
   133  		return nil, nil, errors.New("Tree isn't " + strconv.Itoa(bf) + "-ary")
   134  	}
   135  
   136  	return sc, sb, nil
   137  }