1 /*
2  * A simple test for so_has_subscription method.
3  */
4 
5 #include <iostream>
6 #include <map>
7 #include <exception>
8 #include <stdexcept>
9 #include <cstdlib>
10 #include <thread>
11 #include <chrono>
12 
13 #include <so_5/all.hpp>
14 
15 #include <test/3rd_party/various_helpers/time_limited_execution.hpp>
16 #include <test/3rd_party/various_helpers/ensure.hpp>
17 
18 class a_test_t : public so_5::agent_t
19 {
20 	struct sig_1 : public so_5::signal_t {};
21 	struct sig_2 : public so_5::signal_t {};
22 
23 	struct msg_1 : public so_5::message_t {};
24 	struct msg_2 : public so_5::message_t {};
25 	struct msg_3 : public so_5::message_t {};
26 	struct msg_4 : public so_5::message_t {};
27 	struct msg_5 : public so_5::message_t {};
28 
29 	struct umsg_1 {};
30 	struct umsg_2 {};
31 	struct umsg_3 {};
32 	struct umsg_4 {};
33 	struct umsg_5 {};
34 	struct umsg_6 {};
35 
36 	struct ret_msg_1 : public so_5::message_t {};
37 	struct ret_msg_2 : public so_5::message_t {};
38 	struct ret_msg_3 : public so_5::message_t {};
39 	struct ret_msg_4 : public so_5::message_t {};
40 	struct ret_msg_5 : public so_5::message_t {};
41 
42 	struct ret_umsg_1 {};
43 	struct ret_umsg_2 {};
44 	struct ret_umsg_3 {};
45 	struct ret_umsg_4 {};
46 	struct ret_umsg_5 {};
47 	struct ret_umsg_6 {};
48 
49 public :
a_test_t(context_t ctx)50 	a_test_t( context_t ctx )
51 		:	so_5::agent_t( ctx )
52 	{}
53 
54 	virtual void
so_define_agent()55 	so_define_agent() override
56 	{
57 		so_subscribe_self()
58 				.event( &a_test_t::on_sig_1 )
59 				.event( &a_test_t::on_sig_2 )
60 				.event( &a_test_t::on_msg_1 )
61 				.event( &a_test_t::on_msg_2 )
62 				.event( &a_test_t::on_msg_3 )
63 				.event( &a_test_t::on_msg_4 )
64 				.event( &a_test_t::on_msg_5 )
65 				.event( &a_test_t::on_umsg_1 )
66 				.event( &a_test_t::on_umsg_2 )
67 				.event( &a_test_t::on_umsg_3 )
68 				.event( &a_test_t::on_umsg_4 )
69 				.event( &a_test_t::on_umsg_5 )
70 				.event( &a_test_t::on_umsg_6 )
71 				.event( &a_test_t::on_ret_msg_1 )
72 				.event( &a_test_t::on_ret_msg_2 )
73 				.event( &a_test_t::on_ret_msg_3 )
74 				.event( &a_test_t::on_ret_msg_4 )
75 				.event( &a_test_t::on_ret_msg_5 )
76 				.event( &a_test_t::on_ret_umsg_1 )
77 				.event( &a_test_t::on_ret_umsg_2 )
78 				.event( &a_test_t::on_ret_umsg_3 )
79 				.event( &a_test_t::on_ret_umsg_4 )
80 				.event( &a_test_t::on_ret_umsg_5 )
81 				.event( &a_test_t::on_ret_umsg_6 )
82 				;
83 
84 #define ENSURE_SUBSCRIBED(handler) \
85 ensure( so_has_subscription(so_direct_mbox(), \
86 		so_default_state(), \
87 		&a_test_t:: handler), \
88 		#handler " must be subscribed" )
89 
90 		ENSURE_SUBSCRIBED(on_sig_1);
91 		ENSURE_SUBSCRIBED(on_sig_2);
92 		ENSURE_SUBSCRIBED(on_msg_1);
93 		ENSURE_SUBSCRIBED(on_msg_2);
94 		ENSURE_SUBSCRIBED(on_msg_3);
95 		ENSURE_SUBSCRIBED(on_msg_4);
96 		ENSURE_SUBSCRIBED(on_msg_5);
97 
98 		ENSURE_SUBSCRIBED(on_umsg_1);
99 		ENSURE_SUBSCRIBED(on_umsg_2);
100 		ENSURE_SUBSCRIBED(on_umsg_3);
101 		ENSURE_SUBSCRIBED(on_umsg_4);
102 		ENSURE_SUBSCRIBED(on_umsg_5);
103 		ENSURE_SUBSCRIBED(on_umsg_6);
104 
105 		ENSURE_SUBSCRIBED(on_ret_msg_1);
106 		ENSURE_SUBSCRIBED(on_ret_msg_2);
107 		ENSURE_SUBSCRIBED(on_ret_msg_3);
108 		ENSURE_SUBSCRIBED(on_ret_msg_4);
109 		ENSURE_SUBSCRIBED(on_ret_msg_5);
110 
111 		ENSURE_SUBSCRIBED(on_ret_umsg_1);
112 		ENSURE_SUBSCRIBED(on_ret_umsg_2);
113 		ENSURE_SUBSCRIBED(on_ret_umsg_3);
114 		ENSURE_SUBSCRIBED(on_ret_umsg_4);
115 		ENSURE_SUBSCRIBED(on_ret_umsg_5);
116 		ENSURE_SUBSCRIBED(on_ret_umsg_6);
117 
118 #undef ENSURE_SUBSCRIBED
119 
120 		so_drop_subscription(
121 				so_direct_mbox(), so_default_state(), &a_test_t::on_sig_1 );
122 		so_drop_subscription(
123 				so_direct_mbox(), so_default_state(), &a_test_t::on_sig_2 );
124 
125 		so_drop_subscription(
126 				so_direct_mbox(), so_default_state(), &a_test_t::on_msg_1 );
127 		so_drop_subscription(
128 				so_direct_mbox(), so_default_state(), &a_test_t::on_msg_2 );
129 		so_drop_subscription(
130 				so_direct_mbox(), so_default_state(), &a_test_t::on_msg_3 );
131 		so_drop_subscription(
132 				so_direct_mbox(), so_default_state(), &a_test_t::on_msg_4 );
133 		so_drop_subscription(
134 				so_direct_mbox(), so_default_state(), &a_test_t::on_msg_5 );
135 
136 		so_drop_subscription(
137 				so_direct_mbox(), so_default_state(), &a_test_t::on_umsg_1 );
138 		so_drop_subscription(
139 				so_direct_mbox(), so_default_state(), &a_test_t::on_umsg_2 );
140 		so_drop_subscription(
141 				so_direct_mbox(), so_default_state(), &a_test_t::on_umsg_3 );
142 		so_drop_subscription(
143 				so_direct_mbox(), so_default_state(), &a_test_t::on_umsg_4 );
144 		so_drop_subscription(
145 				so_direct_mbox(), so_default_state(), &a_test_t::on_umsg_5 );
146 		so_drop_subscription(
147 				so_direct_mbox(), so_default_state(), &a_test_t::on_umsg_6 );
148 
149 		so_drop_subscription(
150 				so_direct_mbox(), so_default_state(), &a_test_t::on_ret_msg_1 );
151 		so_drop_subscription(
152 				so_direct_mbox(), so_default_state(), &a_test_t::on_ret_msg_2 );
153 		so_drop_subscription(
154 				so_direct_mbox(), so_default_state(), &a_test_t::on_ret_msg_3 );
155 		so_drop_subscription(
156 				so_direct_mbox(), so_default_state(), &a_test_t::on_ret_msg_4 );
157 		so_drop_subscription(
158 				so_direct_mbox(), so_default_state(), &a_test_t::on_ret_msg_5 );
159 
160 		so_drop_subscription(
161 				so_direct_mbox(), so_default_state(), &a_test_t::on_ret_umsg_1 );
162 		so_drop_subscription(
163 				so_direct_mbox(), so_default_state(), &a_test_t::on_ret_umsg_2 );
164 		so_drop_subscription(
165 				so_direct_mbox(), so_default_state(), &a_test_t::on_ret_umsg_3 );
166 		so_drop_subscription(
167 				so_direct_mbox(), so_default_state(), &a_test_t::on_ret_umsg_4 );
168 		so_drop_subscription(
169 				so_direct_mbox(), so_default_state(), &a_test_t::on_ret_umsg_5 );
170 		so_drop_subscription(
171 				so_direct_mbox(), so_default_state(), &a_test_t::on_ret_umsg_6 );
172 
173 #define ENSURE_UNSUBSCRIBED(handler) \
174 ensure( !so_has_subscription(so_direct_mbox(), \
175 		so_default_state(), \
176 		&a_test_t:: handler), \
177 		#handler " must not be subscribed" )
178 
179 		ENSURE_UNSUBSCRIBED(on_sig_1);
180 		ENSURE_UNSUBSCRIBED(on_sig_2);
181 		ENSURE_UNSUBSCRIBED(on_msg_1);
182 		ENSURE_UNSUBSCRIBED(on_msg_2);
183 		ENSURE_UNSUBSCRIBED(on_msg_3);
184 		ENSURE_UNSUBSCRIBED(on_msg_4);
185 		ENSURE_UNSUBSCRIBED(on_msg_5);
186 
187 		ENSURE_UNSUBSCRIBED(on_umsg_1);
188 		ENSURE_UNSUBSCRIBED(on_umsg_2);
189 		ENSURE_UNSUBSCRIBED(on_umsg_3);
190 		ENSURE_UNSUBSCRIBED(on_umsg_4);
191 		ENSURE_UNSUBSCRIBED(on_umsg_5);
192 		ENSURE_UNSUBSCRIBED(on_umsg_6);
193 
194 		ENSURE_UNSUBSCRIBED(on_ret_msg_1);
195 		ENSURE_UNSUBSCRIBED(on_ret_msg_2);
196 		ENSURE_UNSUBSCRIBED(on_ret_msg_3);
197 		ENSURE_UNSUBSCRIBED(on_ret_msg_4);
198 		ENSURE_UNSUBSCRIBED(on_ret_msg_5);
199 
200 		ENSURE_UNSUBSCRIBED(on_ret_umsg_1);
201 		ENSURE_UNSUBSCRIBED(on_ret_umsg_2);
202 		ENSURE_UNSUBSCRIBED(on_ret_umsg_3);
203 		ENSURE_UNSUBSCRIBED(on_ret_umsg_4);
204 		ENSURE_UNSUBSCRIBED(on_ret_umsg_5);
205 		ENSURE_UNSUBSCRIBED(on_ret_umsg_6);
206 
207 #undef ENSURE_UNSUBSCRIBED
208 	}
209 
210 	virtual void
so_evt_start()211 	so_evt_start() override
212 	{
213 		so_deregister_agent_coop_normally();
214 	}
215 
216 private:
217 	void
on_sig_1(const mhood_t<sig_1> &) const218 	on_sig_1(const mhood_t<sig_1> &) const {}
219 
220 	void
on_sig_2(mhood_t<sig_2>) const221 	on_sig_2(mhood_t<sig_2>) const {}
222 
223 	void
on_msg_1(const msg_1 &) const224 	on_msg_1(const msg_1 &) const {}
225 
226 	void
on_msg_2(const mhood_t<msg_2> &) const227 	on_msg_2(const mhood_t<msg_2> &) const {}
228 
229 	void
on_msg_3(mhood_t<msg_3>) const230 	on_msg_3(mhood_t<msg_3>) const {}
231 
232 	void
on_msg_4(mutable_mhood_t<msg_4>) const233 	on_msg_4(mutable_mhood_t<msg_4>) const {}
234 
235 	void
on_msg_5(const mutable_mhood_t<msg_5> &) const236 	on_msg_5(const mutable_mhood_t<msg_5> &) const {}
237 
238 	void
on_umsg_1(const umsg_1 &) const239 	on_umsg_1(const umsg_1 &) const {}
240 
241 	void
on_umsg_2(const mhood_t<umsg_2> &) const242 	on_umsg_2(const mhood_t<umsg_2> &) const {}
243 
244 	void
on_umsg_3(mhood_t<umsg_3>) const245 	on_umsg_3(mhood_t<umsg_3>) const {}
246 
247 	void
on_umsg_4(mutable_mhood_t<umsg_4>) const248 	on_umsg_4(mutable_mhood_t<umsg_4>) const {}
249 
250 	void
on_umsg_5(const mutable_mhood_t<umsg_5> &) const251 	on_umsg_5(const mutable_mhood_t<umsg_5> &) const {}
252 
253 	void
on_umsg_6(umsg_6) const254 	on_umsg_6(umsg_6) const {}
255 
256 	int
on_ret_msg_1(const ret_msg_1 &) const257 	on_ret_msg_1(const ret_msg_1 &) const
258 	{
259 		return 0;
260 	}
261 
262 	int
on_ret_msg_2(const mhood_t<ret_msg_2> &) const263 	on_ret_msg_2(const mhood_t<ret_msg_2> &) const
264 	{
265 		return 0;
266 	}
267 
268 	int
on_ret_msg_3(mhood_t<ret_msg_3>) const269 	on_ret_msg_3(mhood_t<ret_msg_3>) const
270 	{
271 		return 0;
272 	}
273 
274 	int
on_ret_msg_4(mutable_mhood_t<ret_msg_4>) const275 	on_ret_msg_4(mutable_mhood_t<ret_msg_4>) const
276 	{
277 		return 0;
278 	}
279 
280 	int
on_ret_msg_5(const mutable_mhood_t<ret_msg_5> &) const281 	on_ret_msg_5(const mutable_mhood_t<ret_msg_5> &) const
282 	{
283 		return 0;
284 	}
285 
286 	int
on_ret_umsg_1(const ret_umsg_1 &) const287 	on_ret_umsg_1(const ret_umsg_1 &) const
288 	{
289 		return 0;
290 	}
291 
292 	int
on_ret_umsg_2(const mhood_t<ret_umsg_2> &) const293 	on_ret_umsg_2(const mhood_t<ret_umsg_2> &) const
294 	{
295 		return 0;
296 	}
297 
298 	int
on_ret_umsg_3(mhood_t<ret_umsg_3>) const299 	on_ret_umsg_3(mhood_t<ret_umsg_3>) const
300 	{
301 		return 0;
302 	}
303 
304 	int
on_ret_umsg_4(mutable_mhood_t<ret_umsg_4>) const305 	on_ret_umsg_4(mutable_mhood_t<ret_umsg_4>) const
306 	{
307 		return 0;
308 	}
309 
310 	int
on_ret_umsg_5(const mutable_mhood_t<ret_umsg_5> &) const311 	on_ret_umsg_5(const mutable_mhood_t<ret_umsg_5> &) const
312 	{
313 		return 0;
314 	}
315 
316 	int
on_ret_umsg_6(ret_umsg_6) const317 	on_ret_umsg_6(ret_umsg_6) const
318 	{
319 		return 0;
320 	}
321 };
322 
323 int
main()324 main()
325 {
326 	try
327 	{
328 		run_with_time_limit(
329 			[]()
330 			{
331 				so_5::launch( []( so_5::environment_t & env ) {
332 						env.introduce_coop( []( so_5::coop_t & coop ) {
333 								coop.make_agent< a_test_t >();
334 							} );
335 					} );
336 			},
337 			20,
338 			"so_has_subscription test" );
339 	}
340 	catch( const std::exception & ex )
341 	{
342 		std::cerr << "Error: " << ex.what() << std::endl;
343 		return 1;
344 	}
345 
346 	return 0;
347 }
348 
349