121-wx_ping_ping.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. //
  2. // Copyright (c) 2019 Ivan Baidakou (basiliscos) (the dot dmol at gmail dot com)
  3. //
  4. // Distributed under the MIT Software License
  5. //
  6. #include "catch.hpp"
  7. #include "rotor.hpp"
  8. #include "rotor/wx.hpp"
  9. #include "supervisor_wx_test.h"
  10. #include <wx/evtloop.h>
  11. #include <wx/apptrait.h>
  12. #include <iostream>
  13. IMPLEMENT_APP_NO_MAIN(rotor::test::RotorApp)
  14. namespace r = rotor;
  15. namespace rx = rotor::wx;
  16. namespace rt = rotor::test;
  17. struct ping_t {};
  18. struct pong_t {};
  19. static std::uint32_t destroyed = 0;
  20. struct pinger_t : public r::actor_base_t {
  21. std::uint32_t ping_sent;
  22. std::uint32_t pong_received;
  23. rotor::address_ptr_t ponger_addr;
  24. explicit pinger_t(rotor::supervisor_t &sup) : r::actor_base_t{sup} { ping_sent = pong_received = 0; }
  25. ~pinger_t() { destroyed += 1; }
  26. void set_ponger_addr(const rotor::address_ptr_t &addr) { ponger_addr = addr; }
  27. void init_start() noexcept override {
  28. subscribe(&pinger_t::on_pong);
  29. r::actor_base_t::init_start();
  30. }
  31. void on_start(rotor::message_t<rotor::payload::start_actor_t> &msg) noexcept override {
  32. r::actor_base_t::on_start(msg);
  33. send<ping_t>(ponger_addr);
  34. ++ping_sent;
  35. }
  36. void on_pong(rotor::message_t<pong_t> &) noexcept {
  37. ++pong_received;
  38. supervisor.shutdown();
  39. auto loop = wxEventLoopBase::GetActive();
  40. loop->ScheduleExit();
  41. }
  42. };
  43. struct ponger_t : public r::actor_base_t {
  44. std::uint32_t pong_sent;
  45. std::uint32_t ping_received;
  46. rotor::address_ptr_t pinger_addr;
  47. explicit ponger_t(rotor::supervisor_t &sup) : rotor::actor_base_t{sup} { pong_sent = ping_received = 0; }
  48. ~ponger_t() { destroyed += 3; }
  49. void set_pinger_addr(const rotor::address_ptr_t &addr) { pinger_addr = addr; }
  50. void init_start() noexcept override {
  51. subscribe(&ponger_t::on_ping);
  52. r::actor_base_t::init_start();
  53. }
  54. void on_ping(rotor::message_t<ping_t> &) noexcept {
  55. ++ping_received;
  56. send<pong_t>(pinger_addr);
  57. ++pong_sent;
  58. }
  59. };
  60. TEST_CASE("ping/pong ", "[supervisor][wx]") {
  61. using app_t = rotor::test::RotorApp;
  62. auto app = new app_t();
  63. auto timeout = r::pt::milliseconds{10};
  64. app->CallOnInit();
  65. wxEventLoopBase *loop = app->GetTraits()->CreateEventLoop();
  66. wxEventLoopBase::SetActive(loop);
  67. rx::system_context_ptr_t system_context{new rx::system_context_wx_t(app)};
  68. wxEvtHandler handler;
  69. rx::supervisor_config_wx_t conf{timeout, &handler};
  70. auto sup = system_context->create_supervisor<rt::supervisor_wx_test_t>(conf);
  71. sup->start();
  72. auto pinger = sup->create_actor<pinger_t>(timeout);
  73. auto ponger = sup->create_actor<ponger_t>(timeout);
  74. pinger->set_ponger_addr(ponger->get_address());
  75. ponger->set_pinger_addr(pinger->get_address());
  76. sup->start();
  77. loop->Run();
  78. REQUIRE(pinger->ping_sent == 1);
  79. REQUIRE(pinger->pong_received == 1);
  80. REQUIRE(ponger->pong_sent == 1);
  81. REQUIRE(ponger->ping_received == 1);
  82. pinger.reset();
  83. ponger.reset();
  84. REQUIRE(destroyed == 4);
  85. REQUIRE(sup->get_state() == r::state_t::SHUTTED_DOWN);
  86. REQUIRE(sup->get_leader_queue().size() == 0);
  87. REQUIRE(sup->get_points().size() == 0);
  88. REQUIRE(sup->get_subscription().size() == 0);
  89. delete app;
  90. }