Electroneum
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 }
epee::net_utils::boosted_tcp_server< test_levin_protocol_handler > test_tcp_server
#define ASSERT_EQ(val1, val2)
Definition: gtest.h:1956
#define ASSERT_TRUE(condition)
Definition: gtest.h:1865
#define ASSERT_NE(val1, val2)
Definition: gtest.h:1960