From f0a98a9f25cd76280c4f66fffe35a12866ee307a Mon Sep 17 00:00:00 2001 From: Vlad Gluhovsky Date: Wed, 29 Jul 2015 15:37:48 +0200 Subject: [PATCH] web3 test complete --- test/libwhisper/shhrpc.cpp | 108 ++++++++++++++++++++++++++++++------- 1 file changed, 88 insertions(+), 20 deletions(-) diff --git a/test/libwhisper/shhrpc.cpp b/test/libwhisper/shhrpc.cpp index 66deb0601..5d619e605 100644 --- a/test/libwhisper/shhrpc.cpp +++ b/test/libwhisper/shhrpc.cpp @@ -44,18 +44,19 @@ namespace js = json_spirit; WebThreeDirect* web3; unique_ptr jsonrpcServer; unique_ptr jsonrpcClient; - -string fromAscii(string _s) { return toHex(asBytes(_s), 2, HexPrefix::Add); } +static uint16_t const web3port = 30333; struct Setup { Setup() { + dev::p2p::NodeIPEndpoint::test_allowLocal = true; + static bool setup = false; if (!setup) { setup = true; - NetworkPreferences nprefs(std::string(), 30333, false); + NetworkPreferences nprefs(std::string(), web3port, false); web3 = new WebThreeDirect("shhrpc-web3", "", WithExisting::Trust, {"eth", "shh"}, nprefs); web3->setIdealPeerCount(1); web3->ethereum()->setForceMining(false); @@ -70,13 +71,19 @@ struct Setup jsonrpcClient = unique_ptr(new WebThreeStubClient(*client)); } } + + ~Setup() + { + dev::p2p::NodeIPEndpoint::test_allowLocal = false; + } }; + BOOST_FIXTURE_TEST_SUITE(shhrpc, Setup) -BOOST_AUTO_TEST_CASE(web3face) +BOOST_AUTO_TEST_CASE(basic) { - cnote << "Testing web3 interface..."; + cnote << "Testing web3 basic functionality..."; web3->startNetwork(); unsigned const step = 10; @@ -86,9 +93,9 @@ BOOST_AUTO_TEST_CASE(web3face) BOOST_REQUIRE(web3->haveNetwork()); uint16_t const port2 = 30334; - NetworkPreferences prefs("127.0.0.1", port2, false); - string const version = "shhrpc-host2"; - Host host2(version, prefs); + NetworkPreferences prefs2("127.0.0.1", port2, false); + string const version2 = "shhrpc-host2"; + Host host2(version2, prefs2); auto whost2 = host2.registerCapability(new WhisperHost()); host2.start(); @@ -97,24 +104,24 @@ BOOST_AUTO_TEST_CASE(web3face) BOOST_REQUIRE(host2.haveNetwork()); - web3->requirePeer(host2.id(), NodeIPEndpoint(bi::address::from_string("127.0.0.1"), port2, port2)); + web3->addNode(host2.id(), NodeIPEndpoint(bi::address::from_string("127.0.0.1"), port2, port2)); for (unsigned i = 0; i < 3000 && (!web3->peerCount() || !host2.peerCount()); i += step) this_thread::sleep_for(chrono::milliseconds(step)); + BOOST_REQUIRE_EQUAL(host2.peerCount(), 1); BOOST_REQUIRE_EQUAL(web3->peerCount(), 1); - BOOST_REQUIRE_EQUAL(host2.peerCount(), 1); vector vpeers = web3->peers(); BOOST_REQUIRE(!vpeers.empty()); PeerSessionInfo const& peer = vpeers.back(); BOOST_REQUIRE_EQUAL(peer.id, host2.id()); BOOST_REQUIRE_EQUAL(peer.port, port2); - BOOST_REQUIRE_EQUAL(peer.clientVersion, version); + BOOST_REQUIRE_EQUAL(peer.clientVersion, version2); web3->stopNetwork(); - for (unsigned i = 0; i < 3000 && web3->haveNetwork(); i += step) + for (unsigned i = 0; i < 3000 && (web3->haveNetwork() || host2.haveNetwork()); i += step) this_thread::sleep_for(chrono::milliseconds(step)); BOOST_REQUIRE(!web3->peerCount()); @@ -123,14 +130,15 @@ BOOST_AUTO_TEST_CASE(web3face) BOOST_AUTO_TEST_CASE(send) { - cnote << "Testing send functionality..."; + cnote << "Testing web3 send..."; bool sent = false; bool ready = false; unsigned result = 0; unsigned const messageCount = 10; unsigned const step = 10; - uint16_t port2 = 30311; + uint16_t port2 = 30337; + Host host2("shhrpc-host2", NetworkPreferences("127.0.0.1", port2, false)); host2.setIdealPeerCount(1); auto whost2 = host2.registerCapability(new WhisperHost()); @@ -140,8 +148,8 @@ BOOST_AUTO_TEST_CASE(send) std::thread listener([&]() { setThreadName("listener"); - auto w = whost2->installWatch(BuildTopicMask("odd")); ready = true; + auto w = whost2->installWatch(BuildTopicMask("odd")); set received; for (unsigned x = 0; x < 9000 && !sent; x += step) this_thread::sleep_for(chrono::milliseconds(step)); @@ -173,11 +181,6 @@ BOOST_AUTO_TEST_CASE(send) BOOST_REQUIRE_EQUAL(host2.peerCount(), 1); BOOST_REQUIRE_EQUAL(web3->peerCount(), 1); - for (unsigned i = 0; i < 2000 && !ready; i += step) - this_thread::sleep_for(chrono::milliseconds(step)); - - BOOST_REQUIRE(ready); - KeyPair us = KeyPair::create(); for (int i = 0; i < messageCount; ++i) { @@ -193,4 +196,69 @@ BOOST_AUTO_TEST_CASE(send) BOOST_REQUIRE_EQUAL(result, 1 + 9 + 25 + 49 + 81); } +BOOST_AUTO_TEST_CASE(receive) +{ + cnote << "Testing web3 receive..."; + + bool sent = false; + bool ready = false; + unsigned result = 0; + unsigned const messageCount = 6; + unsigned const step = 10; + uint16_t port2 = 30338; + Host host2("shhrpc-host2", NetworkPreferences("127.0.0.1", port2, false)); + host2.setIdealPeerCount(1); + auto whost2 = host2.registerCapability(new WhisperHost()); + host2.start(); + web3->startNetwork(); + + std::thread listener([&]() + { + setThreadName("listener"); + ready = true; + auto w = web3->whisper()->installWatch(BuildTopicMask("odd")); + + set received; + for (unsigned x = 0; x < 9000 && !sent; x += step) + this_thread::sleep_for(chrono::milliseconds(step)); + + for (unsigned x = 0, last = 0; x < 100 && received.size() < messageCount; ++x) + { + this_thread::sleep_for(chrono::milliseconds(50)); + for (auto i: web3->whisper()->checkWatch(w)) + { + Message msg = web3->whisper()->envelope(i).open(web3->whisper()->fullTopics(w)); + last = RLP(msg.payload()).toInt(); + if (received.insert(last).second) + result += last; + } + } + }); + + for (unsigned i = 0; i < 2000 && (!host2.haveNetwork() || web3->haveNetwork()); i += step) + this_thread::sleep_for(chrono::milliseconds(step)); + + BOOST_REQUIRE(host2.haveNetwork()); + BOOST_REQUIRE(web3->haveNetwork()); + + host2.addNode(web3->id(), NodeIPEndpoint(bi::address::from_string("127.0.0.1"), web3port, web3port)); + + for (unsigned i = 0; i < 3000 && (!web3->peerCount() || !host2.peerCount()); i += step) + this_thread::sleep_for(chrono::milliseconds(step)); + + BOOST_REQUIRE_EQUAL(host2.peerCount(), 1); + BOOST_REQUIRE_EQUAL(web3->peerCount(), 1); + + KeyPair us = KeyPair::create(); + for (int i = 0; i < messageCount; ++i) + { + web3->whisper()->post(us.sec(), RLPStream().append(i * i * i).out(), BuildTopic(i)(i % 2 ? "odd" : "even"), 777000, 1); + this_thread::sleep_for(chrono::milliseconds(50)); + } + + sent = true; + listener.join(); + BOOST_REQUIRE_EQUAL(result, 1 + 27 + 125); +} + BOOST_AUTO_TEST_SUITE_END()