aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorDeterminant <ted.sybil@gmail.com>2018-11-18 16:24:30 -0500
committerDeterminant <ted.sybil@gmail.com>2018-11-18 16:24:30 -0500
commit161d969e0eabfecccd69a6b9ed2d03919cf89cb5 (patch)
tree60008191c4320a8b4c5ae31773d70f996d3548f7 /test
parent39f6d6ac46d440aa68e7b1a2f2e4eb629356af34 (diff)
improve the test programsmultiloops
Diffstat (limited to 'test')
-rw-r--r--test/.gitignore4
-rw-r--r--test/CMakeLists.txt4
-rw-r--r--test/test_msgnet.cpp (renamed from test/test_network.cpp)47
-rw-r--r--test/test_p2p.cpp31
-rw-r--r--test/test_p2p_stress.cpp24
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;
}