1//------------------------------------------------------------------------------
2//	GetAppListTester.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 <List.h>
14#include <Looper.h>
15#include <Roster.h>
16#include <String.h>
17
18// Project Includes ------------------------------------------------------------
19#include <TestShell.h>
20#include <TestUtils.h>
21#include <cppunit/TestAssert.h>
22
23// Local Includes --------------------------------------------------------------
24#include "AppRunner.h"
25#include "GetAppListTester.h"
26
27// Local Defines ---------------------------------------------------------------
28
29// Globals ---------------------------------------------------------------------
30
31//------------------------------------------------------------------------------
32
33// contains_list
34static
35bool
36contains_list(const BList &a, const BList &b)
37{
38	int32 bCount = b.CountItems();
39	bool contains = true;
40	for (int32 i = 0; contains && i < bCount; i++)
41		contains = a.HasItem(b.ItemAt(i));
42	return contains;
43}
44
45// check_list
46static
47void
48check_list(const BList &toCheck, const BList &base, const BList &extendedBase,
49		   const BList &expected)
50{
51	// toCheck and extendedBase must have prefix base
52	int32 baseCount = base.CountItems();
53	for (int32 i = 0; i < baseCount; i++) {
54		CHK(base.ItemAt(i) == toCheck.ItemAt(i));
55		CHK(base.ItemAt(i) == extendedBase.ItemAt(i));
56	}
57	// toCheck must have correct size
58	int32 toCheckCount = toCheck.CountItems();
59	int32 extendedBaseCount = extendedBase.CountItems();
60	int32 expectedCount = expected.CountItems();
61	CHK(toCheckCount == extendedBaseCount + expectedCount);
62	// toCheck must contain all elements of extendedBase and expected
63	// (arbitrary order)
64	BList list(extendedBase);
65	list.AddList((BList*)&expected);
66	CHK(contains_list(toCheck, list));
67	CHK(contains_list(list, toCheck));
68}
69
70// check_list
71static
72void
73check_list(const BList &toCheck, const BList &base, const BList &expected)
74{
75	check_list(toCheck, base, base, expected);
76}
77
78// check_list
79static
80void
81check_list(const BList &toCheck, const BList &expected)
82{
83	BList base;
84	check_list(toCheck, base, expected);
85}
86
87
88/*
89	void GetAppList(BList *teamIDList) const
90	@case 1			teamIDList is NULL
91	@results		Should do nothing.
92*/
93void GetAppListTester::GetAppListTestA1()
94{
95// R5: crashes when passing a NULL BList
96#ifndef TEST_R5
97	BRoster roster;
98	roster.GetAppList(NULL);
99#endif
100}
101
102/*
103	void GetAppList(BList *teamIDList) const
104	@case 2			teamIDList is not NULL and not empty
105	@results		Should append the team IDs of all running apps to
106					teamIDList.
107*/
108void GetAppListTester::GetAppListTestA2()
109{
110	// create a list with some dummy entries
111	BList list;
112	list.AddItem((void*)-7);
113	list.AddItem((void*)-42);
114	// get a list of running applications for reference
115	BRoster roster;
116	BList list1(list);
117	roster.GetAppList(&list1);
118	// run some apps
119	AppRunner runner1(true);
120	AppRunner runner2(true);
121	AppRunner runner3(true);
122	CHK(runner1.Run("AppRunTestApp1") == B_OK);
123	CHK(runner2.Run("AppRunTestApp2") == B_OK);
124	CHK(runner3.Run("BMessengerTestApp1") == B_OK);
125	BList expectedApps;
126	expectedApps.AddItem((void*)runner1.Team());
127	expectedApps.AddItem((void*)runner2.Team());
128	expectedApps.AddItem((void*)runner3.Team());
129	// get a new app list and check it
130	BList list2(list);
131	roster.GetAppList(&list2);
132	check_list(list2, list, list1, expectedApps);
133	// quit app 1
134	runner1.WaitFor(true);
135	expectedApps.RemoveItem((void*)runner1.Team());
136	BList list3(list);
137	roster.GetAppList(&list3);
138	check_list(list3, list, list1, expectedApps);
139	// quit app 2
140	runner2.WaitFor(true);
141	expectedApps.RemoveItem((void*)runner2.Team());
142	BList list4(list);
143	roster.GetAppList(&list4);
144	check_list(list4, list, list1, expectedApps);
145	// quit app 3
146	runner3.WaitFor(true);
147	expectedApps.RemoveItem((void*)runner3.Team());
148	BList list5(list);
149	roster.GetAppList(&list5);
150	check_list(list5, list, list1, expectedApps);
151}
152
153/*
154	void GetAppList(const char *signature, BList *teamIDList) const
155	@case 1			signature or teamIDList are NULL
156	@results		Should do nothing/should not modify teamIDList.
157*/
158void GetAppListTester::GetAppListTestB1()
159{
160// R5: crashes when passing a NULL signature/BList
161#ifndef TEST_R5
162	const char *signature = "application/x-vnd.obos-app-run-testapp1";
163	// create a list with some dummy entries
164	BList emptyList;
165	BList list;
166	list.AddItem((void*)-7);
167	list.AddItem((void*)-42);
168	// NULL signature and list
169	BRoster roster;
170	roster.GetAppList(NULL, NULL);
171	// NULL signature
172	BList list1(list);
173	roster.GetAppList(NULL, &list1);
174	check_list(list1, list, list, emptyList);
175	// NULL list
176	AppRunner runner(true);
177	CHK(runner.Run("AppRunTestApp1") == B_OK);
178	roster.GetAppList(signature, NULL);
179	runner.WaitFor(true);
180#endif
181}
182
183/*
184	void GetAppList(const char *signature, BList *teamIDList) const
185	@case 2			teamIDList is not NULL and not empty, signature is not
186					NULL, but no app with this signature is running
187	@results		Should not modify teamIDList.
188*/
189void GetAppListTester::GetAppListTestB2()
190{
191	const char *signature = "application/x-vnd.obos-does-not-exist";
192	// create a list with some dummy entries
193	BList list;
194	list.AddItem((void*)-7);
195	list.AddItem((void*)-42);
196	// get a list of running applications for reference
197	BRoster roster;
198	BList list1(list);
199	roster.GetAppList(signature, &list1);
200	// run some apps
201	AppRunner runner1(true);
202	AppRunner runner2(true);
203	AppRunner runner3(true);
204	CHK(runner1.Run("AppRunTestApp1") == B_OK);
205	CHK(runner2.Run("AppRunTestApp2") == B_OK);
206	CHK(runner3.Run("BMessengerTestApp1") == B_OK);
207	BList expectedApps;
208	// get a new app list and check it
209	BList list2(list);
210	roster.GetAppList(signature, &list2);
211	check_list(list2, list, list1, expectedApps);
212	// quit app 1
213	runner1.WaitFor(true);
214	BList list3(list);
215	roster.GetAppList(signature, &list3);
216	check_list(list3, list, list1, expectedApps);
217	// quit app 2
218	runner2.WaitFor(true);
219	BList list4(list);
220	roster.GetAppList(signature, &list4);
221	check_list(list4, list, list1, expectedApps);
222	// quit app 3
223	runner3.WaitFor(true);
224	BList list5(list);
225	roster.GetAppList(signature, &list5);
226	check_list(list5, list, list1, expectedApps);
227}
228
229/*
230	void GetAppList(const char *signature, BList *teamIDList) const
231	@case 3			teamIDList is not NULL and not empty, signature is not
232					NULL and app(s) with this signature is (are) running
233	@results		Should append the team IDs of all running apps with the
234					supplied signature to teamIDList.
235*/
236void GetAppListTester::GetAppListTestB3()
237{
238	const char *signature = "application/x-vnd.obos-app-run-testapp1";
239	// create a list with some dummy entries
240	BList list;
241	list.AddItem((void*)-7);
242	list.AddItem((void*)-42);
243	// get a list of running applications for reference
244	BRoster roster;
245	BList list1(list);
246	roster.GetAppList(signature, &list1);
247	check_list(list1, list);
248	// run some apps
249	AppRunner runner1(true);
250	AppRunner runner2(true);
251	AppRunner runner3(true);
252	CHK(runner1.Run("AppRunTestApp1") == B_OK);
253	CHK(runner2.Run("AppRunTestApp2") == B_OK);
254	CHK(runner3.Run("BMessengerTestApp1") == B_OK);
255	BList expectedApps;
256	expectedApps.AddItem((void*)runner1.Team());
257	expectedApps.AddItem((void*)runner2.Team());
258	// get a new app list and check it
259	BList list2(list);
260	roster.GetAppList(signature, &list2);
261	check_list(list2, list, expectedApps);
262	// quit app 1
263	runner1.WaitFor(true);
264	expectedApps.RemoveItem((void*)runner1.Team());
265	BList list3(list);
266	roster.GetAppList(signature, &list3);
267	check_list(list3, list, expectedApps);
268	// quit app 2
269	runner2.WaitFor(true);
270	expectedApps.RemoveItem((void*)runner2.Team());
271	BList list4(list);
272	roster.GetAppList(signature, &list4);
273	check_list(list4, list, expectedApps);
274	// quit app 3
275	runner3.WaitFor(true);
276	BList list5(list);
277	roster.GetAppList(signature, &list5);
278	check_list(list5, list, expectedApps);
279}
280
281
282Test* GetAppListTester::Suite()
283{
284	TestSuite* SuiteOfTests = new TestSuite;
285
286	ADD_TEST4(BRoster, SuiteOfTests, GetAppListTester, GetAppListTestA1);
287	ADD_TEST4(BRoster, SuiteOfTests, GetAppListTester, GetAppListTestA2);
288
289	ADD_TEST4(BRoster, SuiteOfTests, GetAppListTester, GetAppListTestB1);
290	ADD_TEST4(BRoster, SuiteOfTests, GetAppListTester, GetAppListTestB2);
291	ADD_TEST4(BRoster, SuiteOfTests, GetAppListTester, GetAppListTestB3);
292
293	return SuiteOfTests;
294}
295
296