sophiar_manager.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #define BOOST_TEST_DYN_LINK
  2. #include "core/sophiar_manager.h"
  3. #include "core/tristate_obj.h"
  4. #include "utility/debug_utility.hpp"
  5. #include <boost/asio/co_spawn.hpp>
  6. #include <boost/asio/detached.hpp>
  7. #include <boost/asio/high_resolution_timer.hpp>
  8. #include <boost/asio/this_coro.hpp>
  9. #include <boost/asio/use_awaitable.hpp>
  10. #include <boost/test/unit_test.hpp>
  11. #include <chrono>
  12. #include <fstream>
  13. #include <iostream>
  14. using boost::asio::awaitable;
  15. using boost::asio::co_spawn;
  16. using boost::asio::detached;
  17. using boost::asio::use_awaitable;
  18. using namespace sophiar;
  19. using namespace std::chrono_literals;
  20. struct source_node_type : public tristate_obj {
  21. DEFAULT_NEW_INSTANCE(source_node_type)
  22. void load_construct_config(const nlohmann::json &config) override {
  23. BOOST_TEST(config.empty());
  24. get_manager().register_signal(this, "output", output_signal);
  25. };
  26. boost::asio::awaitable<bool> on_init(const nlohmann::json &config) override {
  27. assert(config.contains("init_value"));
  28. assert(config["init_value"].is_number());
  29. init_value = config["init_value"].get<int64_t>();
  30. co_return true;
  31. }
  32. boost::asio::awaitable<bool> on_start(const nlohmann::json &config) override {
  33. assert(config.contains("start_value"));
  34. assert(config["start_value"].is_number());
  35. start_value = config["start_value"].get<int64_t>();
  36. co_spawn(get_context(), [=]() -> awaitable<void> {
  37. co_await coro_sleep(50ms);
  38. this->output_signal.emit(init_value * start_value);
  39. }, detached);
  40. co_return true;
  41. }
  42. using output_signal_type = tiny_signal<int64_t>;
  43. output_signal_type output_signal;
  44. int64_t init_value = -1, start_value = -1;
  45. };
  46. struct proxy_node_type : public tristate_obj {
  47. DEFAULT_NEW_INSTANCE(proxy_node_type);
  48. using signal_type = tiny_signal<int64_t>;
  49. using slot_type = signal_type::slot_type;
  50. struct slot_impl_type : public slot_type {
  51. proxy_node_type *p_this = nullptr;
  52. void on_signal_received(int64_t args) override {
  53. assert(p_this != nullptr);
  54. p_this->output_signal.emit(args * p_this->init_value);
  55. }
  56. };
  57. void load_construct_config(const nlohmann::json &config) override {
  58. BOOST_TEST(config.empty());
  59. auto input_slot = new slot_impl_type();
  60. input_slot->p_this = this;
  61. get_manager().register_signal(this, "output", output_signal);
  62. get_manager().register_slot<int64_t>(this, "input", *input_slot);
  63. };
  64. boost::asio::awaitable<bool> on_init(const nlohmann::json &config) override {
  65. assert(config.contains("init_value"));
  66. assert(config["init_value"].is_number());
  67. init_value = config["init_value"].get<int64_t>();
  68. co_return true;
  69. }
  70. boost::asio::awaitable<bool> on_start(const nlohmann::json &config) override {
  71. BOOST_TEST(config.empty());
  72. co_return true;
  73. }
  74. signal_type output_signal;
  75. int64_t init_value = -1;
  76. };
  77. struct target_node_type : public tristate_obj {
  78. DEFAULT_NEW_INSTANCE(target_node_type);
  79. using signal_type = tiny_signal<int64_t>;
  80. using slot_type = signal_type::slot_type;
  81. struct slot_impl_type : public slot_type {
  82. void on_signal_received(int64_t args) override {
  83. std::cout << args << std::endl;
  84. }
  85. };
  86. void load_construct_config(const nlohmann::json &config) override {
  87. BOOST_TEST(config.empty());
  88. get_manager().register_slot<int64_t>(this, "input", *(new slot_impl_type));
  89. };
  90. boost::asio::awaitable<bool> on_init(const nlohmann::json &config) override {
  91. BOOST_TEST(config.empty());
  92. co_return true;
  93. }
  94. boost::asio::awaitable<bool> on_start(const nlohmann::json &config) override {
  95. BOOST_TEST(config.empty());
  96. co_return true;
  97. }
  98. };
  99. BOOST_AUTO_TEST_CASE(test_sophiar_manager) {
  100. spdlog::set_level(spdlog::level::trace);
  101. REGISTER_TYPE(source_node_type);
  102. REGISTER_TYPE(proxy_node_type);
  103. REGISTER_TYPE(target_node_type);
  104. std::ifstream config_file("data/sophiar_manager_config.json");
  105. BOOST_TEST(config_file.is_open());
  106. global_sophiar_manager.build_from_config(nlohmann::json::parse(config_file));
  107. co_spawn(global_context, []() -> awaitable<void> {
  108. co_await global_sophiar_manager.switch_mode("mode_a");
  109. co_await coro_sleep(100ms);
  110. co_await global_sophiar_manager.switch_mode("mode_b");
  111. co_await coro_sleep(100ms);
  112. co_await global_sophiar_manager.switch_mode("mode_a");
  113. }, detached);
  114. global_context.run();
  115. }