015-actor-statuses.cpp 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. //
  2. // Copyright (c) 2019-2020 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 "supervisor_test.h"
  9. #include "actor_test.h"
  10. #include "access.h"
  11. namespace r = rotor;
  12. namespace rt = r::test;
  13. struct statuses_observer_t : public r::actor_base_t {
  14. r::address_ptr_t observable_addr;
  15. r::address_ptr_t dummy_addr;
  16. r::state_t observable_status = r::state_t::UNKNOWN;
  17. r::state_t dummy_status = r::state_t::UNKNOWN;
  18. r::state_t supervisor_status = r::state_t::UNKNOWN;
  19. r::state_t self_status = r::state_t::UNKNOWN;
  20. using r::actor_base_t::actor_base_t;
  21. void configure(r::plugin::plugin_base_t &plugin) noexcept override {
  22. plugin.with_casted<r::plugin::starter_plugin_t>(
  23. [](auto &p) { p.subscribe_actor(&statuses_observer_t::on_state); });
  24. }
  25. void on_start() noexcept override {
  26. r::actor_base_t::on_start();
  27. auto &sup_addr = static_cast<r::actor_base_t *>(supervisor)->get_address();
  28. request<r::payload::state_request_t>(sup_addr, sup_addr).send(r::pt::seconds{1});
  29. request<r::payload::state_request_t>(sup_addr, dummy_addr).send(r::pt::seconds{1});
  30. request<r::payload::state_request_t>(sup_addr, observable_addr).send(r::pt::seconds{1});
  31. request<r::payload::state_request_t>(sup_addr, address).send(r::pt::seconds{1});
  32. }
  33. void request_sup_state() noexcept {
  34. auto &sup_addr = static_cast<r::actor_base_t *>(supervisor)->get_address();
  35. request<r::payload::state_request_t>(sup_addr, sup_addr).send(r::pt::seconds{1});
  36. }
  37. void on_state(r::message::state_response_t &msg) noexcept {
  38. auto &addr = msg.payload.req->payload.request_payload.subject_addr;
  39. auto &sup_addr = static_cast<r::actor_base_t *>(supervisor)->get_address();
  40. auto &state = msg.payload.res.state;
  41. if (addr == sup_addr) {
  42. supervisor_status = state;
  43. } else if (addr == address) {
  44. self_status = state;
  45. } else if (addr == dummy_addr) {
  46. dummy_status = state;
  47. } else if (addr == observable_addr) {
  48. observable_status = state;
  49. }
  50. }
  51. };
  52. TEST_CASE("statuses observer", "[actor]") {
  53. r::system_context_t system_context;
  54. auto sup = system_context.create_supervisor<rt::supervisor_test_t>().timeout(rt::default_timeout).finish();
  55. auto observer = sup->create_actor<statuses_observer_t>().timeout(rt::default_timeout).finish();
  56. auto sample_actor = sup->create_actor<rt::actor_test_t>().timeout(rt::default_timeout).finish();
  57. observer->observable_addr = sample_actor->get_address();
  58. observer->dummy_addr = sup->create_address();
  59. sup->do_process();
  60. CHECK(observer->dummy_status == r::state_t::UNKNOWN);
  61. CHECK(observer->observable_status == r::state_t::OPERATIONAL);
  62. CHECK(observer->supervisor_status == r::state_t::INITIALIZED);
  63. CHECK(observer->self_status == r::state_t::OPERATIONAL);
  64. CHECK(sup->get_state() == r::state_t::OPERATIONAL);
  65. observer->request_sup_state();
  66. sup->do_process();
  67. CHECK(observer->supervisor_status == r::state_t::OPERATIONAL);
  68. sup->do_shutdown();
  69. sup->do_process();
  70. REQUIRE(sup->get_state() == r::state_t::SHUT_DOWN);
  71. REQUIRE(sup->get_leader_queue().size() == 0);
  72. REQUIRE(sup->get_points().size() == 0);
  73. CHECK(rt::empty(sup->get_subscription()));
  74. }