xref: /haiku/src/tests/kits/app/broster/GetAppInfoTester.cpp (revision 21258e2674226d6aa732321b6f8494841895af5f)
1 //------------------------------------------------------------------------------
2 //	GetAppInfoTester.cpp
3 //
4 //------------------------------------------------------------------------------
5 
6 // Standard Includes -----------------------------------------------------------
7 #include <stdio.h>
8 
9 // System Includes -------------------------------------------------------------
10 #include <Message.h>
11 #include <OS.h>
12 #include <Handler.h>
13 #include <Looper.h>
14 #include <Roster.h>
15 #include <String.h>
16 
17 // Project Includes ------------------------------------------------------------
18 #include <TestShell.h>
19 #include <TestUtils.h>
20 #include <cppunit/TestAssert.h>
21 
22 // Local Includes --------------------------------------------------------------
23 #include "AppRunner.h"
24 #include "GetAppInfoTester.h"
25 
26 // Local Defines ---------------------------------------------------------------
27 
28 // Globals ---------------------------------------------------------------------
29 
30 //------------------------------------------------------------------------------
31 
32 // check_app_info
33 static
34 bool
35 check_app_info(app_info &info, AppRunner &runner, const char *signature,
36 			   uint32 flags)
37 {
38 	team_id team = runner.Team();
39 	// get the thread
40 	thread_id thread = -1;
41 	int32 cookie = 0;
42 	thread_info threadInfo;
43 	while (get_next_thread_info(team, &cookie, &threadInfo) == B_OK) {
44 		if (thread < 0 || threadInfo.thread < thread)
45 			thread = threadInfo.thread;
46 	}
47 	// get port and ref
48 	port_id port = runner.AppLooperPort();
49 	entry_ref ref;
50 	runner.GetRef(&ref);
51 	// compare
52 //printf("check_app_info(): "
53 //"  thread:    %ld vs %ld\n"
54 //"  team:      %ld vs %ld\n"
55 //"  port:      %ld vs %ld\n"
56 //"  flags:     %lx  vs %lx\n"
57 //"  signature: `%s' vs `%s'\n", info.thread, thread, info.team, team,
58 //info.port, port, info.flags, flags, info.signature, signature);
59 //printf("  ref:       (%ld, %lld, `%s') vs (%ld, %lld, `%s')\n",
60 //info.ref.device, info.ref.directory, info.ref.name,
61 //ref.device, ref.directory, ref.name);
62 	return (info.thread == thread && info.team == team && info.port == port
63 			&& info.flags == flags && info.ref == ref
64 			&& !strncmp(info.signature, signature, B_MIME_TYPE_LENGTH));
65 }
66 
67 /*
68 	status_t GetAppInfo(const char *signature, app_info *info) const
69 	@case 1			signature is NULL or info is NULL
70 	@results		Should return B_BAD_VALUE.
71 */
72 void GetAppInfoTester::GetAppInfoTestA1()
73 {
74 	BRoster roster;
75 	app_info info;
76 	CHK(roster.GetAppInfo((const char*)NULL, NULL) == B_BAD_VALUE);
77 	CHK(roster.GetAppInfo((const char*)NULL, &info) == B_BAD_VALUE);
78 // R5: crashes when passing a NULL app_info
79 #ifndef TEST_R5
80 	CHK(roster.GetAppInfo("application/x-vnd.obos-app-run-testapp1",
81 						  NULL) == B_BAD_VALUE);
82 #endif
83 }
84 
85 /*
86 	status_t GetAppInfo(const char *signature, app_info *info) const
87 	@case 2			signature/info are not NULL, but no app with this
88 					signature is running
89 	@results		Should return B_ERROR.
90 */
91 void GetAppInfoTester::GetAppInfoTestA2()
92 {
93 	BRoster roster;
94 	app_info info;
95 	CHK(roster.GetAppInfo("application/x-vnd.obos-app-run-testapp1", &info)
96 		== B_ERROR);
97 }
98 
99 /*
100 	status_t GetAppInfo(const char *signature, app_info *info) const
101 	@case 3			signature/info are not NULL and an (two) app(s) with this
102 					signature is (are) running; quit one; quit the second one
103 	@results		Should
104 					- fill the app info with the data of one of the apps and
105 					  return B_OK;
106 					- fill the app info with the data of the second apps and
107 					  return B_OK;
108 					- return B_ERROR.
109 */
110 void GetAppInfoTester::GetAppInfoTestA3()
111 {
112 	const char *signature = "application/x-vnd.obos-app-run-testapp1";
113 	uint32 flags = B_MULTIPLE_LAUNCH | B_ARGV_ONLY;
114 	// run the remote apps
115 	AppRunner runner1(true);
116 	AppRunner runner2(true);
117 	CHK(runner1.Run("AppRunTestApp1") == B_OK);
118 	CHK(runner2.Run("AppRunTestApp1") == B_OK);
119 	// create the BRoster and perform the tests
120 	BRoster roster;
121 	app_info info1;
122 	CHK(roster.GetAppInfo(signature, &info1) == B_OK);
123 	CHK(check_app_info(info1, runner1, signature, flags)
124 		|| check_app_info(info1, runner2, signature, flags));
125 	// quit app 1
126 	runner1.WaitFor(true);
127 	app_info info2;
128 	CHK(roster.GetAppInfo(signature, &info2) == B_OK);
129 	CHK(check_app_info(info2, runner2, signature, flags));
130 	// quit app 2
131 	runner2.WaitFor(true);
132 	CHK(roster.GetAppInfo(signature, &info1) == B_ERROR);
133 }
134 
135 /*
136 	status_t GetAppInfo(entry_ref *ref, app_info *info) const
137 	@case 1			ref is NULL or info is NULL
138 	@results		Should return B_BAD_VALUE.
139 */
140 void GetAppInfoTester::GetAppInfoTestB1()
141 {
142 	BRoster roster;
143 	entry_ref ref;
144 	CHK(find_test_app("AppRunTestApp1", &ref) == B_OK);
145 	app_info info;
146 	CHK(roster.GetAppInfo((entry_ref*)NULL, NULL) == B_BAD_VALUE);
147 	CHK(roster.GetAppInfo((entry_ref*)NULL, &info) == B_BAD_VALUE);
148 // R5: crashes when passing a NULL app_info
149 #ifndef TEST_R5
150 	CHK(roster.GetAppInfo(&ref, NULL) == B_BAD_VALUE);
151 #endif
152 }
153 
154 /*
155 	status_t GetAppInfo(entry_ref *ref, app_info *info) const
156 	@case 2			ref/info are not NULL, but no app with this ref is running
157 	@results		Should return B_ERROR.
158 */
159 void GetAppInfoTester::GetAppInfoTestB2()
160 {
161 	BRoster roster;
162 	entry_ref ref;
163 	CHK(find_test_app("AppRunTestApp1", &ref) == B_OK);
164 	app_info info;
165 	CHK(roster.GetAppInfo(&ref, &info) == B_ERROR);
166 }
167 
168 /*
169 	status_t GetAppInfo(entry_ref *ref, app_info *info) const
170 	@case 3			ref/info are not NULL and an (two) app(s) with this ref
171 					is (are) running; quit one; quit the second one
172 	@results		Should
173 					- fill the app info with the data of one of the apps and
174 					  return B_OK;
175 					- fill the app info with the data of the second apps and
176 					  return B_OK;
177 					- return B_ERROR.
178 */
179 void GetAppInfoTester::GetAppInfoTestB3()
180 {
181 	const char *signature = "application/x-vnd.obos-app-run-testapp1";
182 	uint32 flags = B_MULTIPLE_LAUNCH | B_ARGV_ONLY;
183 	entry_ref ref;
184 	CHK(find_test_app("AppRunTestApp1", &ref) == B_OK);
185 	// run the remote apps
186 	AppRunner runner1(true);
187 	AppRunner runner2(true);
188 	CHK(runner1.Run("AppRunTestApp1") == B_OK);
189 	CHK(runner2.Run("AppRunTestApp1") == B_OK);
190 	// create the BRoster and perform the tests
191 	BRoster roster;
192 	app_info info1;
193 	CHK(roster.GetAppInfo(&ref, &info1) == B_OK);
194 	CHK(check_app_info(info1, runner1, signature, flags)
195 		|| check_app_info(info1, runner2, signature, flags));
196 	// quit app 1
197 	runner1.WaitFor(true);
198 	app_info info2;
199 	CHK(roster.GetAppInfo(&ref, &info2) == B_OK);
200 	CHK(check_app_info(info2, runner2, signature, flags));
201 	// quit app 2
202 	runner2.WaitFor(true);
203 	CHK(roster.GetAppInfo(&ref, &info1) == B_ERROR);
204 }
205 
206 /*
207 	status_t GetRunningAppInfo(team_id team, app_info *info) const
208 	@case 1			info is NULL
209 	@results		Should return B_BAD_VALUE.
210 */
211 void GetAppInfoTester::GetRunningAppInfoTest1()
212 {
213 // R5: crashes when passing a NULL app_info
214 #ifndef TEST_R5
215 	BRoster roster;
216 	// invalid team ID
217 	CHK(roster.GetRunningAppInfo(-1, NULL) == B_BAD_VALUE);
218 	// valid team ID
219 	AppRunner runner(true);
220 	CHK(runner.Run("AppRunTestApp1") == B_OK);
221 	CHK(roster.GetRunningAppInfo(runner.Team(), NULL) == B_BAD_VALUE);
222 	runner.WaitFor(true);
223 #endif
224 }
225 
226 /*
227 	status_t GetRunningAppInfo(team_id team, app_info *info) const
228 	@case 2			info is not NULL, but no app with the team ID is running
229 	@results		Should return B_BAD_TEAM_ID.
230 */
231 void GetAppInfoTester::GetRunningAppInfoTest2()
232 {
233 	BRoster roster;
234 	// invalid team ID
235 	app_info info;
236 #ifdef TEST_R5
237 	CHK(roster.GetRunningAppInfo(-1, &info) == B_ERROR);
238 #else
239 	CHK(roster.GetRunningAppInfo(-1, &info) == B_BAD_TEAM_ID);
240 #endif
241 	CHK(roster.GetRunningAppInfo(-2, &info) == B_BAD_TEAM_ID);
242 	// originally valid team ID -- app terminates before call
243 	AppRunner runner(true);
244 	CHK(runner.Run("AppRunTestApp1") == B_OK);
245 	team_id team = runner.Team();
246 	runner.WaitFor(true);
247 	CHK(roster.GetRunningAppInfo(team, &info) == B_BAD_TEAM_ID);
248 }
249 
250 /*
251 	status_t GetRunningAppInfo(team_id team, app_info *info) const
252 	@case 3			info is not NULL, and an app with the team ID is running
253 	@results		Should fill the app info and return B_OK.
254 */
255 void GetAppInfoTester::GetRunningAppInfoTest3()
256 {
257 	const char *signature = "application/x-vnd.obos-app-run-testapp1";
258 	uint32 flags = B_MULTIPLE_LAUNCH | B_ARGV_ONLY;
259 	// run the app
260 	AppRunner runner(true);
261 	CHK(runner.Run("AppRunTestApp1") == B_OK);
262 	// get and check the info
263 	BRoster roster;
264 	app_info info;
265 	CHK(roster.GetRunningAppInfo(runner.Team(), &info) == B_OK);
266 	CHK(check_app_info(info, runner, signature, flags));
267 	// quit the app
268 	runner.WaitFor(true);
269 }
270 
271 
272 Test* GetAppInfoTester::Suite()
273 {
274 	TestSuite* SuiteOfTests = new TestSuite;
275 
276 	ADD_TEST4(BRoster, SuiteOfTests, GetAppInfoTester, GetAppInfoTestA1);
277 	ADD_TEST4(BRoster, SuiteOfTests, GetAppInfoTester, GetAppInfoTestA2);
278 	ADD_TEST4(BRoster, SuiteOfTests, GetAppInfoTester, GetAppInfoTestA3);
279 
280 	ADD_TEST4(BRoster, SuiteOfTests, GetAppInfoTester, GetAppInfoTestB1);
281 	ADD_TEST4(BRoster, SuiteOfTests, GetAppInfoTester, GetAppInfoTestB2);
282 	ADD_TEST4(BRoster, SuiteOfTests, GetAppInfoTester, GetAppInfoTestB3);
283 
284 	ADD_TEST4(BRoster, SuiteOfTests, GetAppInfoTester,
285 			  GetRunningAppInfoTest1);
286 	ADD_TEST4(BRoster, SuiteOfTests, GetAppInfoTester,
287 			  GetRunningAppInfoTest2);
288 	ADD_TEST4(BRoster, SuiteOfTests, GetAppInfoTester,
289 			  GetRunningAppInfoTest3);
290 
291 	return SuiteOfTests;
292 }
293 
294