supervisor_test.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #pragma once
  2. //
  3. // Copyright (c) 2019-2020 Ivan Baidakou (basiliscos) (the dot dmol at gmail dot com)
  4. //
  5. // Distributed under the MIT Software License
  6. //
  7. #include "rotor/supervisor.h"
  8. #include "actor_test.h"
  9. #include <list>
  10. namespace rotor {
  11. namespace test {
  12. extern pt::time_duration default_timeout;
  13. using interceptor_t = std::function<void(message_ptr_t &, const void *, const continuation_t &)>;
  14. struct supervisor_config_test_t : public supervisor_config_t {
  15. const void *locality = nullptr;
  16. plugin_configurer_t configurer = plugin_configurer_t{};
  17. interceptor_t interceptor = interceptor_t{};
  18. };
  19. template <typename Supervisor> struct supervisor_test_config_builder_t;
  20. struct supervisor_test_t : public supervisor_t {
  21. using timers_t = std::list<timer_handler_base_t*>;
  22. using config_t = supervisor_config_test_t;
  23. template <typename Supervisor> using config_builder_t = supervisor_test_config_builder_t<Supervisor>;
  24. supervisor_test_t(supervisor_config_test_t &config_);
  25. ~supervisor_test_t();
  26. void configure(plugin::plugin_base_t &plugin) noexcept override;
  27. virtual void do_start_timer(const pt::time_duration &interval, timer_handler_base_t& handler) noexcept override;
  28. virtual void do_cancel_timer(request_id_t timer_id) noexcept override;
  29. void do_invoke_timer(request_id_t timer_id) noexcept;
  30. request_id_t get_timer(std::size_t index) noexcept;
  31. virtual void start() noexcept override {}
  32. virtual void shutdown() noexcept override {}
  33. virtual void enqueue(rotor::message_ptr_t message) noexcept override;
  34. virtual address_ptr_t make_address() noexcept override;
  35. void intercept(message_ptr_t &message, const void *tag, const continuation_t &continuation) noexcept override;
  36. state_t &get_state() noexcept { return state; }
  37. messages_queue_t &get_leader_queue() { return get_leader().queue; }
  38. supervisor_test_t &get_leader();
  39. subscription_container_t &get_points() noexcept;
  40. subscription_t &get_subscription() noexcept { return subscription_map; }
  41. size_t get_children_count() noexcept;
  42. request_map_t &get_requests() noexcept { return request_map; }
  43. auto get_activating_plugins() noexcept { return this->activating_plugins; }
  44. auto get_deactivating_plugins() noexcept { return this->deactivating_plugins; }
  45. const void *locality;
  46. timers_t active_timers;
  47. plugin_configurer_t configurer;
  48. interceptor_t interceptor;
  49. };
  50. using supervisor_test_ptr_t = rotor::intrusive_ptr_t<supervisor_test_t>;
  51. template <typename Supervisor> struct supervisor_test_config_builder_t : supervisor_config_builder_t<Supervisor> {
  52. using builder_t = typename Supervisor::template config_builder_t<Supervisor>;
  53. using parent_t = supervisor_config_builder_t<Supervisor>;
  54. using parent_t::parent_t;
  55. builder_t &&locality(const void *locality_) && {
  56. parent_t::config.locality = locality_;
  57. return std::move(*this);
  58. }
  59. builder_t &&configurer(plugin_configurer_t&& value) && {
  60. parent_t::config.configurer = std::move(value);
  61. return std::move(*this);
  62. }
  63. builder_t &&interceptor(interceptor_t&& value) && {
  64. parent_t::config.interceptor = std::move(value);
  65. return std::move(*this);
  66. }
  67. };
  68. } // namespace test
  69. } // namespace rotor