diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/.gitignore | 4 | ||||
-rw-r--r-- | test/CMakeLists.txt | 4 | ||||
-rw-r--r-- | test/test_msgnet.cpp (renamed from test/test_network.cpp) | 47 | ||||
-rw-r--r-- | test/test_p2p.cpp | 31 | ||||
-rw-r--r-- | test/test_p2p_stress.cpp | 24 |
5 files changed, 64 insertions, 46 deletions
diff --git a/test/.gitignore b/test/.gitignore index 592f084..57a2e9b 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -1,6 +1,8 @@ test_msg test_bits -test_network +test_msgnet +test_p2p +test_p2p_stress test_queue bench_network Makefile diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 8f31ddb..14201e9 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -26,8 +26,8 @@ target_link_libraries(test_msg salticidae_static) add_executable(test_bits test_bits.cpp) target_link_libraries(test_bits salticidae_static) -add_executable(test_network test_network.cpp) -target_link_libraries(test_network salticidae_static) +add_executable(test_msgnet test_msgnet.cpp) +target_link_libraries(test_msgnet salticidae_static) add_executable(test_p2p test_p2p.cpp) target_link_libraries(test_p2p salticidae_static) diff --git a/test/test_network.cpp b/test/test_msgnet.cpp index 6a12117..088e0ff 100644 --- a/test/test_network.cpp +++ b/test/test_msgnet.cpp @@ -86,8 +86,8 @@ struct MyNet: public MsgNetworkByteOp { name(name), peer(peer) { /* message handler could be a bound method */ - reg_handler(salticidae::generic_bind( - &MyNet::on_receive_hello, this, _1, _2)); + reg_handler( + salticidae::generic_bind(&MyNet::on_receive_hello, this, _1, _2)); reg_conn_handler([this](const ConnPool::conn_t &conn, bool connected) { if (connected) @@ -128,19 +128,12 @@ void on_receive_ack(MsgAck &&msg, const MyNet::conn_t &conn) { printf("[%s] the peer knows\n", net->name.c_str()); } -salticidae::EventContext ec; -NetAddr alice_addr("127.0.0.1:12345"); -NetAddr bob_addr("127.0.0.1:12346"); - -void signal_handler(int) { - throw salticidae::SalticidaeError("got termination signal"); -} - int main() { - signal(SIGTERM, signal_handler); - signal(SIGINT, signal_handler); + salticidae::EventContext ec; + NetAddr alice_addr("127.0.0.1:12345"); + NetAddr bob_addr("127.0.0.1:12346"); - /* test two nodes */ + /* test two nodes in the same main loop */ MyNet alice(ec, "Alice", bob_addr); MyNet bob(ec, "Bob", alice_addr); @@ -148,18 +141,26 @@ int main() { alice.reg_handler(on_receive_ack); bob.reg_handler(on_receive_ack); - try { - alice.start(); - bob.start(); + /* start all threads */ + alice.start(); + bob.start(); + + /* accept incoming connections */ + alice.listen(alice_addr); + bob.listen(bob_addr); - alice.listen(alice_addr); - bob.listen(bob_addr); + /* try to connect once */ + alice.connect(bob_addr); + bob.connect(alice_addr); - /* first attempt */ - alice.connect(bob_addr); - bob.connect(alice_addr); + /* the main loop can be shutdown by ctrl-c or kill */ + auto shutdown = [&](int) {ec.stop();}; + salticidae::SigEvent ev_sigint(ec, shutdown); + salticidae::SigEvent ev_sigterm(ec, shutdown); + ev_sigint.add(SIGINT); + ev_sigterm.add(SIGTERM); - ec.dispatch(); - } catch (salticidae::SalticidaeError &e) {} + /* enter the main loop */ + ec.dispatch(); return 0; } diff --git a/test/test_p2p.cpp b/test/test_p2p.cpp index 1c37aa6..e884930 100644 --- a/test/test_p2p.cpp +++ b/test/test_p2p.cpp @@ -82,25 +82,20 @@ std::vector<NetAddr> addrs = { NetAddr("127.0.0.1:12348") }; -void signal_handler(int) { - throw salticidae::SalticidaeError("got termination signal"); -} +salticidae::EventContext ec; +MyNet net(ec, MyNet::Config().conn_timeout(5).ping_period(2)); int main(int argc, char **argv) { - signal(SIGTERM, signal_handler); - signal(SIGINT, signal_handler); - - salticidae::EventContext ec; - /* test two nodes */ - MyNet net(ec, MyNet::Config().conn_timeout(5).ping_period(2)); - - try { - int i; - net.start(); - net.listen(addrs[i = atoi(argv[1])]); - for (int j = 0; j < addrs.size(); j++) - if (i != j) net.add_peer(addrs[j]); - ec.dispatch(); - } catch (salticidae::SalticidaeError &e) {} + int i; + net.start(); + net.listen(addrs[i = atoi(argv[1])]); + for (int j = 0; j < addrs.size(); j++) + if (i != j) net.add_peer(addrs[j]); + auto shutdown = [&](int) {ec.stop();}; + salticidae::SigEvent ev_sigint(ec, shutdown); + salticidae::SigEvent ev_sigterm(ec, shutdown); + ev_sigint.add(SIGINT); + ev_sigterm.add(SIGTERM); + ec.dispatch(); return 0; } diff --git a/test/test_p2p_stress.cpp b/test/test_p2p_stress.cpp index b58bcc7..ac6168a 100644 --- a/test/test_p2p_stress.cpp +++ b/test/test_p2p_stress.cpp @@ -44,6 +44,7 @@ using salticidae::bytearray_t; using salticidae::uint256_t; using salticidae::static_pointer_cast; using salticidae::Config; +using salticidae::ThreadCall; using std::placeholders::_1; using std::placeholders::_2; @@ -159,15 +160,19 @@ int main(int argc, char **argv) { for (int i = 0; i < opt_npeers->get(); i++) addrs.push_back(NetAddr("127.0.0.1:" + std::to_string(12345 + i))); std::vector<std::thread> peers; + std::vector<salticidae::BoxObj<ThreadCall>> tcalls; + tcalls.resize(addrs.size()); + size_t i = 0; for (auto &addr: addrs) { - peers.push_back(std::thread([&, addr]() { + peers.push_back(std::thread([&, addr, i]() { EventContext ec; std::unordered_map<NetAddr, TestContext> tc; MyNet net(ec, MyNet::Config( salticidae::ConnPool::Config() .nworker(opt_nworker->get()).seg_buff_size(seg_buff_size)) .conn_timeout(5).ping_period(2)); + tcalls[i] = new ThreadCall(ec); if (!opt_no_msg->get()) install_proto(ec, net, tc, seg_buff_size); try { @@ -178,7 +183,22 @@ int main(int argc, char **argv) { ec.dispatch(); } catch (salticidae::SalticidaeError &e) {} })); + i++; } - for (auto &t: peers) t.join(); + + EventContext ec; + auto shutdown = [&](int) { + for (auto &tc: tcalls) + tc->async_call([ec=tc->get_ec()](ThreadCall::Handle &) { + ec.stop(); + }); + for (auto &t: peers) t.join(); + ec.stop(); + }; + salticidae::SigEvent ev_sigint(ec, shutdown); + salticidae::SigEvent ev_sigterm(ec, shutdown); + ev_sigint.add(SIGINT); + ev_sigterm.add(SIGTERM); + ec.dispatch(); return 0; } |