015-actor-statuses.cpp 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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 "supervisor_test.h"
  9. namespace r = rotor;
  10. namespace rt = r::test;
  11. struct sample_actor_t : public r::actor_base_t {
  12. using r::actor_base_t::actor_base_t;
  13. };
  14. struct statuses_observer_t : public r::actor_base_t {
  15. r::address_ptr_t observable_addr;
  16. r::address_ptr_t dummy_addr;
  17. r::state_t observable_status;
  18. r::state_t dummy_status;
  19. r::state_t supervisor_status;
  20. r::state_t self_status;
  21. // statuses_observer_t()
  22. statuses_observer_t(r::supervisor_t &supervisor_) : r::actor_base_t(supervisor_) {
  23. observable_status = dummy_status = supervisor_status = r::state_t::UNKNOWN;
  24. }
  25. void init_start() noexcept override {
  26. subscribe(&statuses_observer_t::on_state);
  27. r::actor_base_t::init_start();
  28. }
  29. void on_start(r::message_t<r::payload::start_actor_t> &msg) noexcept override {
  30. r::actor_base_t::on_start(msg);
  31. auto sup_addr = supervisor.get_address();
  32. request<r::payload::state_request_t>(sup_addr, sup_addr).send(r::pt::seconds{1});
  33. request<r::payload::state_request_t>(sup_addr, dummy_addr).send(r::pt::seconds{1});
  34. request<r::payload::state_request_t>(sup_addr, observable_addr).send(r::pt::seconds{1});
  35. request<r::payload::state_request_t>(sup_addr, address).send(r::pt::seconds{1});
  36. }
  37. void request_sup_state() noexcept {
  38. auto sup_addr = supervisor.get_address();
  39. request<r::payload::state_request_t>(sup_addr, sup_addr).send(r::pt::seconds{1});
  40. }
  41. void on_state(r::message::state_response_t &msg) noexcept {
  42. auto &addr = msg.payload.req->payload.request_payload.subject_addr;
  43. auto &state = msg.payload.res.state;
  44. if (addr == supervisor.get_address()) {
  45. supervisor_status = state;
  46. } else if (addr == get_address()) {
  47. self_status = state;
  48. } else if (addr == dummy_addr) {
  49. dummy_status = state;
  50. } else if (addr == observable_addr) {
  51. observable_status = state;
  52. }
  53. }
  54. };
  55. TEST_CASE("statuses observer", "[actor]") {
  56. r::system_context_t system_context;
  57. auto timeout = r::pt::milliseconds{1};
  58. rt::supervisor_config_test_t config(timeout, nullptr);
  59. auto sup = system_context.create_supervisor<rt::supervisor_test_t>(nullptr, config);
  60. auto observer = sup->create_actor<statuses_observer_t>(timeout);
  61. auto sample_actor = sup->create_actor<sample_actor_t>(timeout);
  62. observer->observable_addr = sample_actor->get_address();
  63. observer->dummy_addr = sup->create_address();
  64. sup->do_process();
  65. REQUIRE(observer->dummy_status == r::state_t::UNKNOWN);
  66. REQUIRE(observer->observable_status == r::state_t::OPERATIONAL);
  67. REQUIRE(observer->supervisor_status == r::state_t::INITIALIZED);
  68. REQUIRE(observer->self_status == r::state_t::OPERATIONAL);
  69. REQUIRE(sup->get_state() == r::state_t::OPERATIONAL);
  70. observer->request_sup_state();
  71. sup->do_process();
  72. REQUIRE(observer->supervisor_status == r::state_t::OPERATIONAL);
  73. sup->do_shutdown();
  74. sup->do_process();
  75. REQUIRE(sup->get_state() == r::state_t::SHUTTED_DOWN);
  76. REQUIRE(sup->get_leader_queue().size() == 0);
  77. REQUIRE(sup->get_points().size() == 0);
  78. REQUIRE(sup->get_subscription().size() == 0);
  79. }