1//------------------------------------------------------------------------------
2//	TeamForTester.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 "TeamForTester.h"
25
26// Local Defines ---------------------------------------------------------------
27
28// Globals ---------------------------------------------------------------------
29
30//------------------------------------------------------------------------------
31
32/*
33	team_id TeamFor(const char *signature) const
34	@case 1			signature is NULL
35	@results		Should return B_BAD_VALUE.
36*/
37void TeamForTester::TeamForTestA1()
38{
39// R5: crashes when passing a NULL signature
40#ifndef TEST_R5
41	BRoster roster;
42	CHK(roster.TeamFor((const char*)NULL) == B_BAD_VALUE);
43#endif
44}
45
46/*
47	team_id TeamFor(const char *signature) const
48	@case 2			signature is not NULL, but no app with this signature is
49					running
50	@results		Should return B_ERROR.
51*/
52void TeamForTester::TeamForTestA2()
53{
54	BRoster roster;
55	CHK(roster.TeamFor("application/x-vnd.obos-app-run-testapp1") == B_ERROR);
56}
57
58/*
59	team_id TeamFor(const char *signature) const
60	@case 3			signature is not NULL and an (two) app(s) with this
61					signature is (are) running; quit one; quit the second one
62	@results		Should return the ID of one of the teams;
63					the ID of the second team; B_ERROR.
64*/
65void TeamForTester::TeamForTestA3()
66{
67	// run the remote apps
68	AppRunner runner1(true);
69	AppRunner runner2(true);
70	CHK(runner1.Run("AppRunTestApp1") == B_OK);
71	CHK(runner2.Run("AppRunTestApp1") == B_OK);
72	// create the BRoster and perform the tests
73	BRoster roster;
74	team_id team = roster.TeamFor("application/x-vnd.obos-app-run-testapp1");
75	CHK(team == runner1.Team() || team == runner2.Team());
76	// quit app 1
77	runner1.WaitFor(true);
78	CHK(roster.TeamFor("application/x-vnd.obos-app-run-testapp1")
79		== runner2.Team());
80	// quit app 2
81	runner2.WaitFor(true);
82	CHK(roster.TeamFor("application/x-vnd.obos-app-run-testapp1") == B_ERROR);
83}
84
85/*
86	team_id TeamFor(entry_ref *ref) const
87	@case 1			ref is NULL
88	@results		Should return B_BAD_VALUE.
89*/
90void TeamForTester::TeamForTestB1()
91{
92// R5: crashes when passing a NULL ref
93#ifndef TEST_R5
94	BRoster roster;
95	CHK(roster.TeamFor((entry_ref*)NULL) == B_BAD_VALUE);
96#endif
97}
98
99/*
100	team_id TeamFor(entry_ref *ref) const
101	@case 2			ref is not NULL, but no app with this ref is running
102	@results		Should return B_ERROR.
103*/
104void TeamForTester::TeamForTestB2()
105{
106	BRoster roster;
107	entry_ref ref;
108	CHK(find_test_app("AppRunTestApp1", &ref) == B_OK);
109	CHK(roster.TeamFor(&ref) == B_ERROR);
110}
111
112/*
113	team_id TeamFor(entry_ref *ref) const
114	@case 3			ref is not NULL and an (two) app(s) with this ref is (are)
115					running; quit one; quit the second one
116	@results		Should return the ID of one of the teams;
117					the ID of the second team; B_ERROR.
118*/
119void TeamForTester::TeamForTestB3()
120{
121	entry_ref ref;
122	CHK(find_test_app("AppRunTestApp1", &ref) == B_OK);
123	// run the remote apps
124	AppRunner runner1(true);
125	AppRunner runner2(true);
126	CHK(runner1.Run("AppRunTestApp1") == B_OK);
127	CHK(runner2.Run("AppRunTestApp1") == B_OK);
128	// create the BRoster and perform the tests
129	BRoster roster;
130	team_id team = roster.TeamFor(&ref);
131	CHK(team == runner1.Team() || team == runner2.Team());
132	// quit app 1
133	runner1.WaitFor(true);
134	CHK(roster.TeamFor(&ref) == runner2.Team());
135	// quit app 2
136	runner2.WaitFor(true);
137	CHK(roster.TeamFor(&ref) == B_ERROR);
138}
139
140
141Test* TeamForTester::Suite()
142{
143	TestSuite* SuiteOfTests = new TestSuite;
144
145	ADD_TEST4(BRoster, SuiteOfTests, TeamForTester, TeamForTestA1);
146	ADD_TEST4(BRoster, SuiteOfTests, TeamForTester, TeamForTestA2);
147	ADD_TEST4(BRoster, SuiteOfTests, TeamForTester, TeamForTestA3);
148
149	ADD_TEST4(BRoster, SuiteOfTests, TeamForTester, TeamForTestB1);
150	ADD_TEST4(BRoster, SuiteOfTests, TeamForTester, TeamForTestB2);
151	ADD_TEST4(BRoster, SuiteOfTests, TeamForTester, TeamForTestB3);
152
153	return SuiteOfTests;
154}
155
156