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