monitor.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #include "testutil.hpp"
  2. #ifdef ZMQ_CPP11
  3. #include <thread>
  4. #include <mutex>
  5. #include <condition_variable>
  6. #include <functional>
  7. class mock_monitor_t : public zmq::monitor_t
  8. {
  9. public:
  10. void on_event_connect_delayed(const zmq_event_t &, const char *) ZMQ_OVERRIDE
  11. {
  12. ++connect_delayed;
  13. ++total;
  14. }
  15. void on_event_connected(const zmq_event_t &, const char *) ZMQ_OVERRIDE
  16. {
  17. ++connected;
  18. ++total;
  19. }
  20. int total{0};
  21. int connect_delayed{0};
  22. int connected{0};
  23. };
  24. #endif
  25. TEST_CASE("monitor create destroy", "[monitor]")
  26. {
  27. zmq::monitor_t monitor;
  28. }
  29. #if defined(ZMQ_CPP11)
  30. TEST_CASE("monitor move construct", "[monitor]")
  31. {
  32. zmq::context_t ctx;
  33. zmq::socket_t sock(ctx, ZMQ_DEALER);
  34. SECTION("move ctor empty") {
  35. zmq::monitor_t monitor1;
  36. zmq::monitor_t monitor2 = std::move(monitor1);
  37. }
  38. SECTION("move ctor init") {
  39. zmq::monitor_t monitor1;
  40. monitor1.init(sock, "inproc://monitor-client");
  41. zmq::monitor_t monitor2 = std::move(monitor1);
  42. }
  43. }
  44. TEST_CASE("monitor move assign", "[monitor]")
  45. {
  46. zmq::context_t ctx;
  47. zmq::socket_t sock(ctx, ZMQ_DEALER);
  48. SECTION("move assign empty") {
  49. zmq::monitor_t monitor1;
  50. zmq::monitor_t monitor2;
  51. monitor1 = std::move(monitor2);
  52. }
  53. SECTION("move assign init") {
  54. zmq::monitor_t monitor1;
  55. monitor1.init(sock, "inproc://monitor-client");
  56. zmq::monitor_t monitor2;
  57. monitor2 = std::move(monitor1);
  58. }
  59. SECTION("move assign init both") {
  60. zmq::monitor_t monitor1;
  61. monitor1.init(sock, "inproc://monitor-client");
  62. zmq::monitor_t monitor2;
  63. zmq::socket_t sock2(ctx, ZMQ_DEALER);
  64. monitor2.init(sock2, "inproc://monitor-client2");
  65. monitor2 = std::move(monitor1);
  66. }
  67. }
  68. TEST_CASE("monitor init event count", "[monitor]")
  69. {
  70. common_server_client_setup s{false};
  71. mock_monitor_t monitor;
  72. const int expected_event_count = 2;
  73. monitor.init(s.client, "inproc://foo");
  74. CHECK_FALSE(monitor.check_event(0));
  75. s.init();
  76. while (monitor.check_event(100) && monitor.total < expected_event_count) {
  77. }
  78. CHECK(monitor.connect_delayed == 1);
  79. CHECK(monitor.connected == 1);
  80. CHECK(monitor.total == expected_event_count);
  81. }
  82. TEST_CASE("monitor init abort", "[monitor]")
  83. {
  84. class mock_monitor : public mock_monitor_t
  85. {
  86. public:
  87. mock_monitor(std::function<void(void)> handle_connected) :
  88. handle_connected{std::move(handle_connected)}
  89. {
  90. }
  91. void on_event_connected(const zmq_event_t &e, const char *m) ZMQ_OVERRIDE
  92. {
  93. mock_monitor_t::on_event_connected(e, m);
  94. handle_connected();
  95. }
  96. std::function<void(void)> handle_connected;
  97. };
  98. common_server_client_setup s(false);
  99. std::mutex mutex;
  100. std::condition_variable cond_var;
  101. bool done{false};
  102. mock_monitor monitor([&]()
  103. {
  104. std::lock_guard<std::mutex> lock(mutex);
  105. done = true;
  106. cond_var.notify_one();
  107. });
  108. monitor.init(s.client, "inproc://foo");
  109. auto thread = std::thread([&monitor]
  110. {
  111. while (monitor.check_event(-1)) {
  112. }
  113. });
  114. s.init();
  115. {
  116. std::unique_lock<std::mutex> lock(mutex);
  117. CHECK(cond_var.wait_for(lock, std::chrono::seconds(1),
  118. [&done] { return done; }));
  119. }
  120. CHECK(monitor.connect_delayed == 1);
  121. CHECK(monitor.connected == 1);
  122. monitor.abort();
  123. thread.join();
  124. }
  125. #endif