Electroneum
Loading...
Searching...
No Matches
epee_boosted_tcp_server.cpp File Reference
#include <boost/chrono/chrono.hpp>
#include <boost/thread/condition_variable.hpp>
#include <boost/thread/mutex.hpp>
#include "gtest/gtest.h"
#include "include_base_utils.h"
#include "string_tools.h"
#include "net/abstract_tcp_server2.h"
Include dependency graph for epee_boosted_tcp_server.cpp:

Go to the source code of this file.

Functions

 TEST (boosted_tcp_server, worker_threads_are_exception_resistant)

Function Documentation

◆ TEST()

TEST ( boosted_tcp_server ,
worker_threads_are_exception_resistant  )

Definition at line 86 of file epee_boosted_tcp_server.cpp.

87{
88 test_tcp_server srv(epee::net_utils::e_connection_type_RPC); // RPC disables network limit for unit tests
89 ASSERT_TRUE(srv.init_server(test_server_port, test_server_host));
90
91 boost::mutex mtx;
92 boost::condition_variable cond;
93 int counter = 0;
94
95 auto counter_incrementer = [&counter, &cond, &mtx]()
96 {
97 boost::unique_lock<boost::mutex> lock(mtx);
98 ++counter;
99 if (4 <= counter)
100 {
101 cond.notify_one();
102 }
103 };
104
105 // 2 theads, but 4 exceptions
106 ASSERT_TRUE(srv.run_server(2, false));
107 ASSERT_TRUE(srv.async_call([&counter_incrementer]() { counter_incrementer(); throw std::runtime_error("test 1"); }));
108 ASSERT_TRUE(srv.async_call([&counter_incrementer]() { counter_incrementer(); throw std::string("test 2"); }));
109 ASSERT_TRUE(srv.async_call([&counter_incrementer]() { counter_incrementer(); throw "test 3"; }));
110 ASSERT_TRUE(srv.async_call([&counter_incrementer]() { counter_incrementer(); throw 4; }));
111
112 {
113 boost::unique_lock<boost::mutex> lock(mtx);
114 ASSERT_NE(boost::cv_status::timeout, cond.wait_for(lock, boost::chrono::seconds(5)));
115 ASSERT_EQ(4, counter);
116 }
117
118 // Check if threads are alive
119 counter = 0;
120 //auto counter_incrementer = [&counter]() { counter.fetch_add(1); epee::misc_utils::sleep_no_w(counter.load() * 10); };
121 ASSERT_TRUE(srv.async_call(counter_incrementer));
122 ASSERT_TRUE(srv.async_call(counter_incrementer));
123 ASSERT_TRUE(srv.async_call(counter_incrementer));
124 ASSERT_TRUE(srv.async_call(counter_incrementer));
125
126 {
127 boost::unique_lock<boost::mutex> lock(mtx);
128 ASSERT_NE(boost::cv_status::timeout, cond.wait_for(lock, boost::chrono::seconds(5)));
129 ASSERT_EQ(4, counter);
130 }
131
132 srv.send_stop_signal();
133 ASSERT_TRUE(srv.timed_wait_server_stop(5 * 1000));
134 ASSERT_TRUE(srv.deinit_server());
135}
#define ASSERT_EQ(val1, val2)
Definition gtest.h:1956
#define ASSERT_NE(val1, val2)
Definition gtest.h:1960
#define ASSERT_TRUE(condition)
Definition gtest.h:1865
epee::net_utils::boosted_tcp_server< test_levin_protocol_handler > test_tcp_server