diff options
author | gluk256 <gluk256@users.noreply.github.com> | 2017-12-21 22:17:27 +0800 |
---|---|---|
committer | Felix Lange <fjl@users.noreply.github.com> | 2017-12-21 22:17:27 +0800 |
commit | 38b1e8ee207da636d95bea760f577eca462307a6 (patch) | |
tree | 3bb47e1be937bcdbae94b55b772c8ce8422cf386 /whisper/whisperv6/peer_test.go | |
parent | b0d41e386e456cefd593db303a9f5284bf08cd07 (diff) | |
download | dexon-38b1e8ee207da636d95bea760f577eca462307a6.tar dexon-38b1e8ee207da636d95bea760f577eca462307a6.tar.gz dexon-38b1e8ee207da636d95bea760f577eca462307a6.tar.bz2 dexon-38b1e8ee207da636d95bea760f577eca462307a6.tar.lz dexon-38b1e8ee207da636d95bea760f577eca462307a6.tar.xz dexon-38b1e8ee207da636d95bea760f577eca462307a6.tar.zst dexon-38b1e8ee207da636d95bea760f577eca462307a6.zip |
whisper/whisperv6: PoW requirement (#15701)
New Whisper-level message introduced (PoW requirement),
corresponding logic added, plus some tests.
Diffstat (limited to 'whisper/whisperv6/peer_test.go')
-rw-r--r-- | whisper/whisperv6/peer_test.go | 97 |
1 files changed, 78 insertions, 19 deletions
diff --git a/whisper/whisperv6/peer_test.go b/whisper/whisperv6/peer_test.go index 39a4ab198..599a479be 100644 --- a/whisper/whisperv6/peer_test.go +++ b/whisper/whisperv6/peer_test.go @@ -88,21 +88,31 @@ var sharedKey []byte = []byte("some arbitrary data here") var sharedTopic TopicType = TopicType{0xF, 0x1, 0x2, 0} var expectedMessage []byte = []byte("per rectum ad astra") -// This test does the following: -// 1. creates a chain of whisper nodes, -// 2. installs the filters with shared (predefined) parameters, -// 3. each node sends a number of random (undecryptable) messages, -// 4. first node sends one expected (decryptable) message, -// 5. checks if each node have received and decrypted exactly one message. func TestSimulation(t *testing.T) { + // create a chain of whisper nodes, + // installs the filters with shared (predefined) parameters initialize(t) + // each node sends a number of random (undecryptable) messages for i := 0; i < NumNodes; i++ { sendMsg(t, false, i) } + // node #0 sends one expected (decryptable) message sendMsg(t, true, 0) - checkPropagation(t) + + // check if each node have received and decrypted exactly one message + checkPropagation(t, true) + + // send protocol-level messages (powRequirementCode) and check the new PoW requirement values + powReqExchange(t) + + // node #1 sends one expected (decryptable) message + sendMsg(t, true, 1) + + // check if each node (except node #0) have received and decrypted exactly one message + checkPropagation(t, false) + stopServers() } @@ -114,7 +124,7 @@ func initialize(t *testing.T) { for i := 0; i < NumNodes; i++ { var node TestNode node.shh = New(&DefaultConfig) - node.shh.SetMinimumPoW(0.00000001) + node.shh.SetMinimumPowTest(0.00000001) node.shh.Start(nil) topics := make([]TopicType, 0) topics = append(topics, sharedTopic) @@ -154,13 +164,18 @@ func initialize(t *testing.T) { }, } - err = node.server.Start() - if err != nil { - t.Fatalf("failed to start server %d.", i) - } - nodes[i] = &node } + + for i := 1; i < NumNodes; i++ { + go nodes[i].server.Start() + } + + // we need to wait until the first node actually starts + err = nodes[0].server.Start() + if err != nil { + t.Fatalf("failed to start the fisrt server.") + } } func stopServers() { @@ -174,18 +189,21 @@ func stopServers() { } } -func checkPropagation(t *testing.T) { +func checkPropagation(t *testing.T, includingNodeZero bool) { if t.Failed() { return } - const cycle = 100 - const iterations = 100 + const cycle = 50 + const iterations = 200 - for j := 0; j < iterations; j++ { - time.Sleep(cycle * time.Millisecond) + first := 0 + if !includingNodeZero { + first = 1 + } - for i := 0; i < NumNodes; i++ { + for j := 0; j < iterations; j++ { + for i := first; i < NumNodes; i++ { f := nodes[i].shh.GetFilter(nodes[i].filerId) if f == nil { t.Fatalf("failed to get filterId %s from node %d.", nodes[i].filerId, i) @@ -200,9 +218,18 @@ func checkPropagation(t *testing.T) { return } } + + time.Sleep(cycle * time.Millisecond) } t.Fatalf("Test was not complete: timeout %d seconds.", iterations*cycle/1000) + + if !includingNodeZero { + f := nodes[0].shh.GetFilter(nodes[0].filerId) + if f != nil { + t.Fatalf("node zero received a message with low PoW.") + } + } } func validateMail(t *testing.T, index int, mail []*ReceivedMessage) bool { @@ -304,3 +331,35 @@ func TestPeerBasic(t *testing.T) { t.Fatalf("failed mark with seed %d.", seed) } } + +func powReqExchange(t *testing.T) { + for i, node := range nodes { + for peer := range node.shh.peers { + if peer.powRequirement > 1000.0 { + t.Fatalf("node %d: one of the peers' pow requirement is too big (%f).", i, peer.powRequirement) + } + } + } + + const pow float64 = 7777777.0 + nodes[0].shh.SetMinimumPoW(pow) + + // wait until all the messages are delivered + time.Sleep(64 * time.Millisecond) + + cnt := 0 + for i, node := range nodes { + for peer := range node.shh.peers { + if peer.peer.ID() == discover.PubkeyID(&nodes[0].id.PublicKey) { + cnt++ + if peer.powRequirement != pow { + t.Fatalf("node %d: failed to set the new pow requirement.", i) + } + } + } + } + + if cnt == 0 { + t.Fatalf("no matching peers found.") + } +} |