|
|
@ -70,9 +70,8 @@ var keys = []string{ |
|
|
|
"7184c1701569e3a4c4d2ddce691edd983b81e42e09196d332e1ae2f1e062cff4", |
|
|
|
"7184c1701569e3a4c4d2ddce691edd983b81e42e09196d332e1ae2f1e062cff4", |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const NumNodes = 16 // must not exceed the number of keys (32)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
type TestData struct { |
|
|
|
type TestData struct { |
|
|
|
|
|
|
|
started int |
|
|
|
counter [NumNodes]int |
|
|
|
counter [NumNodes]int |
|
|
|
mutex sync.RWMutex |
|
|
|
mutex sync.RWMutex |
|
|
|
} |
|
|
|
} |
|
|
@ -84,21 +83,29 @@ type TestNode struct { |
|
|
|
filerID string |
|
|
|
filerID string |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const NumNodes = 8 // must not exceed the number of keys (32)
|
|
|
|
|
|
|
|
|
|
|
|
var result TestData |
|
|
|
var result TestData |
|
|
|
var nodes [NumNodes]*TestNode |
|
|
|
var nodes [NumNodes]*TestNode |
|
|
|
var sharedKey = hexutil.MustDecode("0x03ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd31") |
|
|
|
var sharedKey = hexutil.MustDecode("0x03ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd31") |
|
|
|
|
|
|
|
var wrongKey = hexutil.MustDecode("0xf91156714d7ec88d3edc1c652c2181dbb3044e8771c683f3b30d33c12b986b11") |
|
|
|
var sharedTopic = TopicType{0xF, 0x1, 0x2, 0} |
|
|
|
var sharedTopic = TopicType{0xF, 0x1, 0x2, 0} |
|
|
|
var expectedMessage = []byte("per rectum ad astra") |
|
|
|
var wrongTopic = TopicType{0, 0, 0, 0} |
|
|
|
|
|
|
|
var expectedMessage = []byte("per aspera ad astra") |
|
|
|
|
|
|
|
var unexpectedMessage = []byte("per rectum ad astra") |
|
|
|
var masterBloomFilter []byte |
|
|
|
var masterBloomFilter []byte |
|
|
|
var masterPow = 0.00000001 |
|
|
|
var masterPow = 0.00000001 |
|
|
|
var round = 1 |
|
|
|
var round = 1 |
|
|
|
|
|
|
|
var debugMode = false |
|
|
|
|
|
|
|
var prevTime time.Time |
|
|
|
|
|
|
|
var cntPrev int |
|
|
|
|
|
|
|
|
|
|
|
func TestSimulation(t *testing.T) { |
|
|
|
func TestSimulation(t *testing.T) { |
|
|
|
// create a chain of whisper nodes,
|
|
|
|
// create a chain of whisper nodes,
|
|
|
|
// installs the filters with shared (predefined) parameters
|
|
|
|
// installs the filters with shared (predefined) parameters
|
|
|
|
initialize(t) |
|
|
|
initialize(t) |
|
|
|
|
|
|
|
|
|
|
|
// each node sends a number of random (undecryptable) messages
|
|
|
|
// each node sends one random (not decryptable) message
|
|
|
|
for i := 0; i < NumNodes; i++ { |
|
|
|
for i := 0; i < NumNodes; i++ { |
|
|
|
sendMsg(t, false, i) |
|
|
|
sendMsg(t, false, i) |
|
|
|
} |
|
|
|
} |
|
|
@ -115,7 +122,6 @@ func TestSimulation(t *testing.T) { |
|
|
|
|
|
|
|
|
|
|
|
// send new pow and bloom exchange messages
|
|
|
|
// send new pow and bloom exchange messages
|
|
|
|
resetParams(t) |
|
|
|
resetParams(t) |
|
|
|
round++ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// node #1 sends one expected (decryptable) message
|
|
|
|
// node #1 sends one expected (decryptable) message
|
|
|
|
sendMsg(t, true, 1) |
|
|
|
sendMsg(t, true, 1) |
|
|
@ -140,6 +146,8 @@ func resetParams(t *testing.T) { |
|
|
|
for i := 0; i < NumNodes; i++ { |
|
|
|
for i := 0; i < NumNodes; i++ { |
|
|
|
nodes[i].shh.SetBloomFilter(masterBloomFilter) |
|
|
|
nodes[i].shh.SetBloomFilter(masterBloomFilter) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
round++ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func initBloom(t *testing.T) { |
|
|
|
func initBloom(t *testing.T) { |
|
|
@ -219,15 +227,22 @@ func initialize(t *testing.T) { |
|
|
|
nodes[i] = &node |
|
|
|
nodes[i] = &node |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for i := 1; i < NumNodes; i++ { |
|
|
|
for i := 0; i < NumNodes; i++ { |
|
|
|
go nodes[i].server.Start() |
|
|
|
go startServer(t, nodes[i].server) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// we need to wait until the first node actually starts
|
|
|
|
waitForServersToStart(t) |
|
|
|
err = nodes[0].server.Start() |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func startServer(t *testing.T, s *p2p.Server) { |
|
|
|
|
|
|
|
err := s.Start() |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
t.Fatalf("failed to start the fisrt server.") |
|
|
|
t.Fatalf("failed to start the fisrt server.") |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
result.mutex.Lock() |
|
|
|
|
|
|
|
defer result.mutex.Unlock() |
|
|
|
|
|
|
|
result.started++ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func stopServers() { |
|
|
|
func stopServers() { |
|
|
@ -246,8 +261,10 @@ func checkPropagation(t *testing.T, includingNodeZero bool) { |
|
|
|
return |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const cycle = 50 |
|
|
|
prevTime = time.Now() |
|
|
|
const iterations = 200 |
|
|
|
// (cycle * iterations) should not exceed 50 seconds, since TTL=50
|
|
|
|
|
|
|
|
const cycle = 200 // time in milliseconds
|
|
|
|
|
|
|
|
const iterations = 250 |
|
|
|
|
|
|
|
|
|
|
|
first := 0 |
|
|
|
first := 0 |
|
|
|
if !includingNodeZero { |
|
|
|
if !includingNodeZero { |
|
|
@ -262,29 +279,29 @@ func checkPropagation(t *testing.T, includingNodeZero bool) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
mail := f.Retrieve() |
|
|
|
mail := f.Retrieve() |
|
|
|
if !validateMail(t, i, mail) { |
|
|
|
validateMail(t, i, mail) |
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if isTestComplete() { |
|
|
|
if isTestComplete() { |
|
|
|
|
|
|
|
checkTestStatus() |
|
|
|
return |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
checkTestStatus() |
|
|
|
time.Sleep(cycle * time.Millisecond) |
|
|
|
time.Sleep(cycle * time.Millisecond) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
t.Fatalf("Test was not complete: timeout %d seconds. nodes=%v", iterations*cycle/1000, nodes) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if !includingNodeZero { |
|
|
|
if !includingNodeZero { |
|
|
|
f := nodes[0].shh.GetFilter(nodes[0].filerID) |
|
|
|
f := nodes[0].shh.GetFilter(nodes[0].filerID) |
|
|
|
if f != nil { |
|
|
|
if f != nil { |
|
|
|
t.Fatalf("node zero received a message with low PoW.") |
|
|
|
t.Fatalf("node zero received a message with low PoW.") |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
t.Fatalf("Test was not complete (%d round): timeout %d seconds. nodes=%v", round, iterations*cycle/1000, nodes) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func validateMail(t *testing.T, index int, mail []*ReceivedMessage) bool { |
|
|
|
func validateMail(t *testing.T, index int, mail []*ReceivedMessage) { |
|
|
|
var cnt int |
|
|
|
var cnt int |
|
|
|
for _, m := range mail { |
|
|
|
for _, m := range mail { |
|
|
|
if bytes.Equal(m.Payload, expectedMessage) { |
|
|
|
if bytes.Equal(m.Payload, expectedMessage) { |
|
|
@ -294,14 +311,13 @@ func validateMail(t *testing.T, index int, mail []*ReceivedMessage) bool { |
|
|
|
|
|
|
|
|
|
|
|
if cnt == 0 { |
|
|
|
if cnt == 0 { |
|
|
|
// no messages received yet: nothing is wrong
|
|
|
|
// no messages received yet: nothing is wrong
|
|
|
|
return true |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
if cnt > 1 { |
|
|
|
if cnt > 1 { |
|
|
|
t.Fatalf("node %d received %d.", index, cnt) |
|
|
|
t.Fatalf("node %d received %d.", index, cnt) |
|
|
|
return false |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if cnt > 0 { |
|
|
|
if cnt == 1 { |
|
|
|
result.mutex.Lock() |
|
|
|
result.mutex.Lock() |
|
|
|
defer result.mutex.Unlock() |
|
|
|
defer result.mutex.Unlock() |
|
|
|
result.counter[index] += cnt |
|
|
|
result.counter[index] += cnt |
|
|
@ -309,7 +325,28 @@ func validateMail(t *testing.T, index int, mail []*ReceivedMessage) bool { |
|
|
|
t.Fatalf("node %d accumulated %d.", index, result.counter[index]) |
|
|
|
t.Fatalf("node %d accumulated %d.", index, result.counter[index]) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return true |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func checkTestStatus() { |
|
|
|
|
|
|
|
var cnt int |
|
|
|
|
|
|
|
var arr [NumNodes]int |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for i := 0; i < NumNodes; i++ { |
|
|
|
|
|
|
|
arr[i] = nodes[i].server.PeerCount() |
|
|
|
|
|
|
|
envelopes := nodes[i].shh.Envelopes() |
|
|
|
|
|
|
|
if len(envelopes) >= NumNodes { |
|
|
|
|
|
|
|
cnt++ |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if debugMode { |
|
|
|
|
|
|
|
if cntPrev != cnt { |
|
|
|
|
|
|
|
fmt.Printf(" %v \t number of nodes that have received all msgs: %d, number of peers per node: %v \n", |
|
|
|
|
|
|
|
time.Since(prevTime), cnt, arr) |
|
|
|
|
|
|
|
prevTime = time.Now() |
|
|
|
|
|
|
|
cntPrev = cnt |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func isTestComplete() bool { |
|
|
|
func isTestComplete() bool { |
|
|
@ -324,7 +361,7 @@ func isTestComplete() bool { |
|
|
|
|
|
|
|
|
|
|
|
for i := 0; i < NumNodes; i++ { |
|
|
|
for i := 0; i < NumNodes; i++ { |
|
|
|
envelopes := nodes[i].shh.Envelopes() |
|
|
|
envelopes := nodes[i].shh.Envelopes() |
|
|
|
if len(envelopes) < 2 { |
|
|
|
if len(envelopes) < NumNodes+1 { |
|
|
|
return false |
|
|
|
return false |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -339,9 +376,10 @@ func sendMsg(t *testing.T, expected bool, id int) { |
|
|
|
|
|
|
|
|
|
|
|
opt := MessageParams{KeySym: sharedKey, Topic: sharedTopic, Payload: expectedMessage, PoW: 0.00000001, WorkTime: 1} |
|
|
|
opt := MessageParams{KeySym: sharedKey, Topic: sharedTopic, Payload: expectedMessage, PoW: 0.00000001, WorkTime: 1} |
|
|
|
if !expected { |
|
|
|
if !expected { |
|
|
|
opt.KeySym[0]++ |
|
|
|
opt.KeySym = wrongKey |
|
|
|
opt.Topic[0]++ |
|
|
|
opt.Topic = wrongTopic |
|
|
|
opt.Payload = opt.Payload[1:] |
|
|
|
opt.Payload = unexpectedMessage |
|
|
|
|
|
|
|
opt.Payload[0] = byte(id) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
msg, err := NewSentMessage(&opt) |
|
|
|
msg, err := NewSentMessage(&opt) |
|
|
@ -459,3 +497,14 @@ func checkBloomFilterExchange(t *testing.T) { |
|
|
|
time.Sleep(50 * time.Millisecond) |
|
|
|
time.Sleep(50 * time.Millisecond) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func waitForServersToStart(t *testing.T) { |
|
|
|
|
|
|
|
const iterations = 200 |
|
|
|
|
|
|
|
for j := 0; j < iterations; j++ { |
|
|
|
|
|
|
|
time.Sleep(50 * time.Millisecond) |
|
|
|
|
|
|
|
if result.started == NumNodes { |
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
t.Fatalf("Failed to start all the servers, running: %d", result.started) |
|
|
|
|
|
|
|
} |
|
|
|