1 /*
2 * A test for sending delayed mutable messages.
3 */
4
5 #include <so_5/all.hpp>
6
7 #include <test/3rd_party/various_helpers/time_limited_execution.hpp>
8 #include <test/3rd_party/various_helpers/ensure.hpp>
9
10 #include <test/3rd_party/utest_helper/helper.hpp>
11
12 using namespace std;
13
14 class sobj_message_tester final : public so_5::agent_t
15 {
16 struct hello final : public so_5::message_t
17 {
18 std::string m_content;
hellosobj_message_tester::hello19 hello( std::string content ) : m_content( std::move(content) ) {}
20 };
21
22 public :
sobj_message_tester(context_t ctx)23 sobj_message_tester(context_t ctx)
24 : so_5::agent_t(std::move(ctx))
25 {
26 so_subscribe_self().event( &sobj_message_tester::on_hello );
27 }
28
29 virtual void
so_evt_start()30 so_evt_start() override
31 {
32 so_5::send_delayed< so_5::mutable_msg< hello > >(
33 *this, std::chrono::milliseconds(50), "hello" );
34 }
35
36 private :
37 const hello * m_received_ptr{ nullptr };
38
on_hello(mhood_t<so_5::mutable_msg<hello>> cmd)39 void on_hello( mhood_t< so_5::mutable_msg< hello > > cmd )
40 {
41 std::cout << "sobj: " << cmd->m_content << std::endl;
42
43 if( !m_received_ptr )
44 {
45 m_received_ptr = cmd.get();
46
47 cmd->m_content = "bye";
48 so_5::send_delayed(
49 so_direct_mbox(),
50 std::chrono::milliseconds(25),
51 std::move(cmd) );
52 }
53 else
54 {
55 ensure( m_received_ptr == cmd.get(), "expect the same message" );
56 ensure( "bye" == cmd->m_content, "expect 'bye' message" );
57
58 so_deregister_agent_coop_normally();
59 }
60 }
61 };
62
63 class user_message_tester final : public so_5::agent_t
64 {
65 struct hello final
66 {
67 std::string m_content;
hellouser_message_tester::hello68 hello( std::string content ) : m_content( std::move(content) ) {}
69 };
70
71 public :
user_message_tester(context_t ctx)72 user_message_tester(context_t ctx)
73 : so_5::agent_t(std::move(ctx))
74 {
75 so_subscribe_self().event( &user_message_tester::on_hello );
76 }
77
78 virtual void
so_evt_start()79 so_evt_start() override
80 {
81 so_5::send_delayed< so_5::mutable_msg< hello > >(
82 *this, std::chrono::milliseconds(50), "hello" );
83 }
84
85 private :
86 const hello * m_received_ptr{ nullptr };
87
on_hello(mhood_t<so_5::mutable_msg<hello>> cmd)88 void on_hello( mhood_t< so_5::mutable_msg< hello > > cmd )
89 {
90 std::cout << "user: " << cmd->m_content << std::endl;
91
92 if( !m_received_ptr )
93 {
94 m_received_ptr = cmd.get();
95
96 cmd->m_content = "bye";
97 so_5::send_delayed(
98 so_direct_mbox(),
99 std::chrono::milliseconds(25),
100 std::move(cmd) );
101 }
102 else
103 {
104 ensure( m_received_ptr == cmd.get(), "expect the same message" );
105 ensure( "bye" == cmd->m_content, "expect 'bye' message" );
106
107 so_deregister_agent_coop_normally();
108 }
109 }
110 };
111
112 int
main()113 main()
114 {
115 try
116 {
117 run_with_time_limit(
118 []() {
119 so_5::launch(
120 [&](so_5::environment_t & env) {
121 env.register_agent_as_coop(
122 env.make_agent<sobj_message_tester>());
123
124 env.register_agent_as_coop(
125 env.make_agent<user_message_tester>());
126 },
127 [](so_5::environment_params_t & params) {
128 (void)params;
129 #if 0
130 params.message_delivery_tracer( so_5::msg_tracing::std_cout_tracer() );
131 #endif
132 } );
133 },
134 5,
135 "simple agent");
136 }
137 catch(const exception & ex)
138 {
139 cerr << "Error: " << ex.what() << endl;
140 return 1;
141 }
142
143 return 0;
144 }
145
146