013-observer.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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 foo_t {};
  12. struct simpleton_actor_t : public r::actor_base_t {
  13. using r::actor_base_t::actor_base_t;
  14. void init_start() noexcept override {
  15. subscribe(&simpleton_actor_t::on_foo);
  16. r::actor_base_t::init_start();
  17. }
  18. void on_start(r::message_t<r::payload::start_actor_t> &msg) noexcept override {
  19. r::actor_base_t::on_start(msg);
  20. INFO("simpleton_actor_t::on_start()")
  21. send<foo_t>(address);
  22. }
  23. void on_foo(r::message_t<foo_t> &) noexcept {
  24. INFO("simpleton_actor_t::on_foo()")
  25. ++foo_count;
  26. }
  27. std::uint32_t foo_count = 0;
  28. };
  29. struct foo_observer_t : public r::actor_base_t {
  30. using r::actor_base_t::actor_base_t;
  31. void set_simpleton(r::address_ptr_t addr) { simpleton_addr = std::move(addr); }
  32. void init_start() noexcept override {
  33. subscribe(&foo_observer_t::on_foo, simpleton_addr);
  34. r::actor_base_t::init_start();
  35. }
  36. void on_foo(r::message_t<foo_t> &) noexcept {
  37. ++foo_count;
  38. INFO("foo_observer_t::on_foo")
  39. }
  40. r::address_ptr_t simpleton_addr;
  41. std::uint32_t foo_count = 0;
  42. };
  43. TEST_CASE("obsrever", "[actor]") {
  44. r::system_context_t system_context;
  45. auto timeout = r::pt::milliseconds{1};
  46. rt::supervisor_config_test_t config(timeout, nullptr);
  47. auto sup = system_context.create_supervisor<rt::supervisor_test_t>(nullptr, config);
  48. auto simpleton = sup->create_actor<simpleton_actor_t>(timeout);
  49. auto observer = sup->create_actor<foo_observer_t>(timeout);
  50. observer->set_simpleton(simpleton->get_address());
  51. sup->do_process();
  52. REQUIRE(simpleton->foo_count == 1);
  53. REQUIRE(observer->foo_count == 1);
  54. sup->do_shutdown();
  55. sup->do_process();
  56. REQUIRE(sup->get_state() == r::state_t::SHUTTED_DOWN);
  57. REQUIRE(sup->get_leader_queue().size() == 0);
  58. REQUIRE(sup->get_points().size() == 0);
  59. REQUIRE(sup->get_subscription().size() == 0);
  60. }