sophiar_manager.cpp 4.6 KB

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