xref: /haiku/src/tests/kits/app/bmessagerunner/SetCountTester.cpp (revision 4c8e85b316c35a9161f5a1c50ad70bc91c83a76f)
1 //------------------------------------------------------------------------------
2 //	SetCountTester.cpp
3 //
4 //------------------------------------------------------------------------------
5 
6 // Standard Includes -----------------------------------------------------------
7 #include <algorithm>
8 #include <stdio.h>
9 
10 // System Includes -------------------------------------------------------------
11 #include <Application.h>
12 #include <Handler.h>
13 #include <Looper.h>
14 #include <Message.h>
15 #include <MessageRunner.h>
16 #include <Messenger.h>
17 #include <OS.h>
18 
19 // Project Includes ------------------------------------------------------------
20 #include <TestShell.h>
21 #include <TestUtils.h>
22 #include <cppunit/TestAssert.h>
23 
24 // Local Includes --------------------------------------------------------------
25 #include "MessageRunnerTestHelpers.h"
26 #include "SetCountTester.h"
27 
28 // Local Defines ---------------------------------------------------------------
29 
30 // Globals ---------------------------------------------------------------------
31 
32 //------------------------------------------------------------------------------
33 
34 
35 using namespace std;
36 
37 
38 static const char *kTesterSignature
39 	= "application/x-vnd.obos-messagerunner-setcount-test";
40 
41 static const bigtime_t kMinTimeInterval = 50000;
42 
43 // check_message_runner_info
44 static
45 void
46 check_message_runner_info(const BMessageRunner &runner, status_t error,
47 						  bigtime_t interval = 0, int32 count = 0)
48 {
49 	bigtime_t runnerInterval = 0;
50 	int32 runnerCount = 0;
51 	CHK(runner.GetInfo(&runnerInterval, &runnerCount) == error);
52 	if (error == B_OK) {
53 		CHK(runnerInterval == interval);
54 		CHK(runnerCount == count);
55 	}
56 }
57 
58 /*
59 	status_t SetCount(int32 count)
60 	@case 1			object is not properly initialized, count > 0
61 	@results		Should return B_BAD_VALUE.
62 					InitCheck() should return B_ERROR.
63 					GetInfo() should return B_BAD_VALUE.
64  */
65 void SetCountTester::SetCount1()
66 {
67 	MessageRunnerTestApp app(kTesterSignature);
68 	BMessenger target;
69 	BMessage message(MSG_RUNNER_MESSAGE);
70 	bigtime_t interval = 100000;
71 	int32 count = 0;
72 	BMessageRunner runner(target, &message, interval, count);
73 	CHK(runner.InitCheck() == B_ERROR);
74 	check_message_runner_info(runner, B_BAD_VALUE);
75 	int32 newCount = 100000;
76 	CHK(runner.SetCount(newCount) == B_BAD_VALUE);
77 	CHK(runner.InitCheck() == B_ERROR);
78 	check_message_runner_info(runner, B_BAD_VALUE);
79 }
80 
81 /*
82 	status_t SetCount(int32 count)
83 	@case 2			object was properly initialized, but has already delivered
84 					all its messages and thus became unusable, count > 0
85 	@results		Should return B_BAD_VALUE.
86 					InitCheck() should return B_OK.
87 					GetInfo() should return B_BAD_VALUE.
88  */
89 void SetCountTester::SetCount2()
90 {
91 	MessageRunnerTestApp app(kTesterSignature);
92 	BMessenger target;
93 	BMessage message(MSG_RUNNER_MESSAGE);
94 	bigtime_t interval = 50000;
95 	int32 count = 1;
96 	BMessageRunner runner(target, &message, interval, count);
97 	CHK(runner.InitCheck() == B_OK);
98 	check_message_runner_info(runner, B_OK, interval, count);
99 	snooze(count * interval + 10000);
100 	// set new count
101 	int32 newCount = 100000;
102 	CHK(runner.SetCount(newCount) == B_BAD_VALUE);
103 	CHK(runner.InitCheck() == B_OK);
104 	check_message_runner_info(runner, B_BAD_VALUE);
105 }
106 
107 /*
108 	status_t SetCount(int32 count)
109 	@case 3			object is properly initialized and has still one message
110 					to deliver, count > 0
111 	@results		Should return B_OK.
112 					InitCheck() should return B_OK.
113 					GetInfo() should return B_OK and the new count.
114 					The timer is NOT reset. count messages should arrive.
115  */
116 void SetCountTester::SetCount3()
117 {
118 	MessageRunnerTestApp app(kTesterSignature);
119 	MessageRunnerTestLooper *looper = app.TestLooper();
120 	BMessenger target(looper);
121 	BMessage message(MSG_RUNNER_MESSAGE);
122 	bigtime_t interval = 50000;
123 	int32 count = 5;
124 	BMessageRunner runner(target, &message, interval, count);
125 	bigtime_t startTime = system_time();
126 	CHK(runner.InitCheck() == B_OK);
127 	interval = max(interval, kMinTimeInterval);
128 	check_message_runner_info(runner, B_OK, interval, count);
129 	snooze((count - 1) * interval + 10000);
130 	CHK(looper->CheckMessages(startTime, interval, count - 1));
131 	CHK(app.CountReplies() == count - 1);
132 	// set new count
133 	bigtime_t newCount = 3;
134 	CHK(runner.SetCount(newCount) == B_OK);
135 	CHK(runner.InitCheck() == B_OK);
136 	check_message_runner_info(runner, B_OK, interval, newCount);
137 //	startTime += system_time();
138 	startTime += (count - 1) * interval;
139 	snooze((newCount + 1) * interval + 10000);
140 	CHK(looper->CheckMessages(count - 1, startTime, interval, newCount));
141 	CHK(app.CountReplies() == count - 1 + newCount);
142 }
143 
144 /*
145 	status_t SetCount(int32 count)
146 	@case 4			object is properly initialized and has still some messages
147 					to deliver, count > 0
148 	@results		Should return B_OK.
149 					InitCheck() should return B_OK.
150 					GetInfo() should return B_OK and the new count.
151 					The timer is NOT reset. count messages should arrive.
152  */
153 void SetCountTester::SetCount4()
154 {
155 	MessageRunnerTestApp app(kTesterSignature);
156 	MessageRunnerTestLooper *looper = app.TestLooper();
157 	BMessenger target(looper);
158 	BMessage message(MSG_RUNNER_MESSAGE);
159 	bigtime_t interval = 50000;
160 	int32 count = 5;
161 	BMessageRunner runner(target, &message, interval, count);
162 	bigtime_t startTime = system_time();
163 	CHK(runner.InitCheck() == B_OK);
164 	interval = max(interval, kMinTimeInterval);
165 	check_message_runner_info(runner, B_OK, interval, count);
166 	snooze(1 * interval + 10000);
167 	CHK(looper->CheckMessages(startTime, interval, 1));
168 	CHK(app.CountReplies() == 1);
169 	// set new count
170 	bigtime_t newCount = 3;
171 	CHK(runner.SetCount(newCount) == B_OK);
172 	CHK(runner.InitCheck() == B_OK);
173 	check_message_runner_info(runner, B_OK, interval, newCount);
174 	startTime += 1 * interval;
175 	snooze((newCount + 1) * interval + 10000);
176 	CHK(looper->CheckMessages(1, startTime, interval, newCount));
177 	CHK(app.CountReplies() == 1 + newCount);
178 }
179 
180 /*
181 	status_t SetCount(int32 count)
182 	@case 5			object is properly initialized and has still an unlimited
183 					number of messages to deliver, count > 0
184 	@results		Should return B_OK.
185 					InitCheck() should return B_OK.
186 					GetInfo() should return B_OK and the new count.
187 					The timer is NOT reset. count messages should arrive.
188  */
189 void SetCountTester::SetCount5()
190 {
191 	MessageRunnerTestApp app(kTesterSignature);
192 	MessageRunnerTestLooper *looper = app.TestLooper();
193 	BMessenger target(looper);
194 	BMessage message(MSG_RUNNER_MESSAGE);
195 	bigtime_t interval = 50000;
196 	int32 count = -1;
197 	BMessageRunner runner(target, &message, interval, count);
198 	bigtime_t startTime = system_time();
199 	CHK(runner.InitCheck() == B_OK);
200 	interval = max(interval, kMinTimeInterval);
201 	check_message_runner_info(runner, B_OK, interval, count);
202 	snooze(1 * interval + 10000);
203 	CHK(looper->CheckMessages(startTime, interval, 1));
204 	CHK(app.CountReplies() == 1);
205 	// set new count
206 	bigtime_t newCount = 3;
207 	CHK(runner.SetCount(newCount) == B_OK);
208 	CHK(runner.InitCheck() == B_OK);
209 	check_message_runner_info(runner, B_OK, interval, newCount);
210 	startTime += 1 * interval;
211 	snooze((newCount + 1) * interval + 10000);
212 	CHK(looper->CheckMessages(1, startTime, interval, newCount));
213 	CHK(app.CountReplies() == 1 + newCount);
214 }
215 
216 /*
217 	status_t SetCount(int32 count)
218 	@case 6			object is properly initialized and has still some messages
219 					to deliver, count == 0
220 	@results		Should return B_OK.
221 					InitCheck() should return B_OK.
222 					R5: GetInfo() should return B_OK and count 0!
223 						The timer is NOT reset and a message arives after the
224 						time specified by the interval!
225 					Haiku: GetInfo() should return B_BAD_VALUE.
226  */
227 void SetCountTester::SetCount6()
228 {
229 	MessageRunnerTestApp app(kTesterSignature);
230 	MessageRunnerTestLooper *looper = app.TestLooper();
231 	BMessenger target(looper);
232 	BMessage message(MSG_RUNNER_MESSAGE);
233 	bigtime_t interval = 70000;
234 	int32 count = 5;
235 	BMessageRunner runner(target, &message, interval, count);
236 	bigtime_t startTime = system_time();
237 	CHK(runner.InitCheck() == B_OK);
238 	interval = max(interval, kMinTimeInterval);
239 	check_message_runner_info(runner, B_OK, interval, count);
240 	snooze(1 * interval + 10000);
241 	CHK(looper->CheckMessages(startTime, interval, 1));
242 	CHK(app.CountReplies() == 1);
243 	// set new count
244 	bigtime_t newCount = 0;
245 	CHK(runner.SetCount(newCount) == B_OK);
246 	CHK(runner.InitCheck() == B_OK);
247 	startTime += 1 * interval;
248 #ifdef TEST_R5
249 	check_message_runner_info(runner, B_OK, interval, newCount);
250 	snooze((newCount + 1) * interval + 10000);
251 	CHK(looper->CheckMessages(1, startTime, interval, 1));
252 	CHK(app.CountReplies() == 1 + 1);
253 #else
254 	check_message_runner_info(runner, B_BAD_VALUE);
255 	snooze(1 * interval + 10000);
256 	CHK(looper->CheckMessages(1, startTime, interval, 0));
257 	CHK(app.CountReplies() == 1);
258 #endif
259 }
260 
261 /*
262 	status_t SetCount(int32 count)
263 	@case 7			object is properly initialized and has still some messages
264 					to deliver, count < 0
265 	@results		Should return B_OK.
266 					InitCheck() should return B_OK.
267 					GetInfo() should return B_OK and the new count.
268 					The timer is NOT reset. Unlimited number of messages.
269  */
270 void SetCountTester::SetCount7()
271 {
272 	MessageRunnerTestApp app(kTesterSignature);
273 	MessageRunnerTestLooper *looper = app.TestLooper();
274 	BMessenger target(looper);
275 	BMessage message(MSG_RUNNER_MESSAGE);
276 	bigtime_t interval = 70000;
277 	int32 count = 5;
278 	BMessageRunner runner(target, &message, interval, count);
279 	bigtime_t startTime = system_time();
280 	CHK(runner.InitCheck() == B_OK);
281 	interval = max(interval, kMinTimeInterval);
282 	check_message_runner_info(runner, B_OK, interval, count);
283 	snooze(1 * interval + 10000);
284 	CHK(looper->CheckMessages(startTime, interval, 1));
285 	CHK(app.CountReplies() == 1);
286 	// set new count
287 	bigtime_t newCount = -1;
288 	CHK(runner.SetCount(newCount) == B_OK);
289 	CHK(runner.InitCheck() == B_OK);
290 	check_message_runner_info(runner, B_OK, interval, newCount);
291 	startTime += 1 * interval;
292 	int32 checkCount = 5;
293 	snooze(checkCount * interval + 10000);
294 	CHK(looper->CheckMessages(1, startTime, interval, checkCount));
295 	CHK(app.CountReplies() == 1 + checkCount);
296 }
297 
298 
299 Test* SetCountTester::Suite()
300 {
301 	TestSuite* SuiteOfTests = new TestSuite;
302 
303 	ADD_TEST4(BMessageRunner, SuiteOfTests, SetCountTester, SetCount1);
304 	ADD_TEST4(BMessageRunner, SuiteOfTests, SetCountTester, SetCount2);
305 	ADD_TEST4(BMessageRunner, SuiteOfTests, SetCountTester, SetCount3);
306 	ADD_TEST4(BMessageRunner, SuiteOfTests, SetCountTester, SetCount4);
307 	ADD_TEST4(BMessageRunner, SuiteOfTests, SetCountTester, SetCount5);
308 	ADD_TEST4(BMessageRunner, SuiteOfTests, SetCountTester, SetCount6);
309 	ADD_TEST4(BMessageRunner, SuiteOfTests, SetCountTester, SetCount7);
310 
311 	return SuiteOfTests;
312 }
313 
314