xref: /haiku/src/tests/servers/launch/ConditionsTest.cpp (revision d54bb194d767c8764ac91bbf63130063ce6b76f6)
1 /*
2  * Copyright 2015, Axel Dörfler, axeld@pinc-software.de.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include "ConditionsTest.h"
8 
9 #include <stdlib.h>
10 
11 #include <driver_settings.h>
12 #include <String.h>
13 
14 #include <cppunit/TestCaller.h>
15 #include <cppunit/TestSuite.h>
16 
17 #include "Conditions.h"
18 #include "SettingsParser.h"
19 
20 
21 class TestConditionContext : public ConditionContext {
22 public:
IsSafeMode() const23 			bool				IsSafeMode() const
24 									{ return false; }
BootVolumeIsReadOnly() const25 			bool				BootVolumeIsReadOnly() const
26 									{ return false; }
27 };
28 
29 
30 static TestConditionContext sConditionContext;
31 
32 
ConditionsTest()33 ConditionsTest::ConditionsTest()
34 {
35 }
36 
37 
~ConditionsTest()38 ConditionsTest::~ConditionsTest()
39 {
40 }
41 
42 
43 void
TestEmpty()44 ConditionsTest::TestEmpty()
45 {
46 	Condition* condition = _Condition("");
47 	CPPUNIT_ASSERT(condition == NULL);
48 }
49 
50 
51 void
TestSafemode()52 ConditionsTest::TestSafemode()
53 {
54 	Condition* condition = _Condition("safemode");
55 	CPPUNIT_ASSERT(!condition->Test(sConditionContext));
56 	CPPUNIT_ASSERT(condition->IsConstant(sConditionContext));
57 
58 	class SafemodeConditionContext : public TestConditionContext {
59 	public:
60 		bool IsSafeMode() const
61 		{
62 			return true;
63 		}
64 	} safemodeContext;
65 	CPPUNIT_ASSERT(condition->Test(safemodeContext));
66 	CPPUNIT_ASSERT(condition->IsConstant(safemodeContext));
67 }
68 
69 
70 void
TestFileExists()71 ConditionsTest::TestFileExists()
72 {
73 	Condition* condition = _Condition("file_exists /boot");
74 	CPPUNIT_ASSERT(condition->Test(sConditionContext));
75 	CPPUNIT_ASSERT(!condition->IsConstant(sConditionContext));
76 
77 	condition = _Condition("file_exists /boot/don't fool me!");
78 	CPPUNIT_ASSERT(!condition->Test(sConditionContext));
79 }
80 
81 
82 void
TestOr()83 ConditionsTest::TestOr()
84 {
85 	Condition* condition = _Condition("or {\n"
86 		"file_exists /boot\n"
87 		"}\n");
88 	CPPUNIT_ASSERT(condition->Test(sConditionContext));
89 	CPPUNIT_ASSERT(!condition->IsConstant(sConditionContext));
90 
91 	condition = _Condition("or {\n"
92 		"file_exists /nowhere\n"
93 		"}\n");
94 	CPPUNIT_ASSERT(!condition->Test(sConditionContext));
95 	CPPUNIT_ASSERT(!condition->IsConstant(sConditionContext));
96 
97 	condition = _Condition("or {\n"
98 		"file_exists /boot\n"
99 		"file_exists /nowhere\n"
100 		"}\n");
101 	CPPUNIT_ASSERT(condition->Test(sConditionContext));
102 	CPPUNIT_ASSERT(!condition->IsConstant(sConditionContext));
103 
104 	condition = _Condition("or {\n"
105 		"not safemode\n"
106 		"file_exists /boot\n"
107 		"}\n");
108 	CPPUNIT_ASSERT(condition->Test(sConditionContext));
109 	CPPUNIT_ASSERT(condition->IsConstant(sConditionContext));
110 
111 	condition = _Condition("or {\n"
112 		"safemode\n"
113 		"file_exists /boot\n"
114 		"}\n");
115 	CPPUNIT_ASSERT(condition->Test(sConditionContext));
116 	CPPUNIT_ASSERT(!condition->IsConstant(sConditionContext));
117 }
118 
119 
120 void
TestAnd()121 ConditionsTest::TestAnd()
122 {
123 	Condition* condition = _Condition("and {\n"
124 		"file_exists /boot\n"
125 		"}\n");
126 	CPPUNIT_ASSERT(condition->Test(sConditionContext));
127 	CPPUNIT_ASSERT(!condition->IsConstant(sConditionContext));
128 
129 	condition = _Condition("and {\n"
130 		"file_exists /nowhere\n"
131 		"}\n");
132 	CPPUNIT_ASSERT(!condition->Test(sConditionContext));
133 	CPPUNIT_ASSERT(!condition->IsConstant(sConditionContext));
134 
135 	condition = _Condition("and {\n"
136 		"file_exists /boot\n"
137 		"file_exists /nowhere\n"
138 		"}\n");
139 	CPPUNIT_ASSERT(!condition->Test(sConditionContext));
140 	CPPUNIT_ASSERT(!condition->IsConstant(sConditionContext));
141 
142 	condition = _Condition("and {\n"
143 		"safemode\n"
144 		"file_exists /nowhere\n"
145 		"}\n");
146 	CPPUNIT_ASSERT(!condition->Test(sConditionContext));
147 	CPPUNIT_ASSERT(condition->IsConstant(sConditionContext));
148 
149 	condition = _Condition("and {\n"
150 		"not safemode\n"
151 		"file_exists /nowhere\n"
152 		"}\n");
153 	CPPUNIT_ASSERT(!condition->Test(sConditionContext));
154 	CPPUNIT_ASSERT(!condition->IsConstant(sConditionContext));
155 
156 	condition = _Condition("and {\n"
157 		"safemode\n"
158 		"}\n");
159 	CPPUNIT_ASSERT(!condition->Test(sConditionContext));
160 	CPPUNIT_ASSERT(condition->IsConstant(sConditionContext));
161 }
162 
163 
164 void
TestNot()165 ConditionsTest::TestNot()
166 {
167 	Condition* condition = _Condition("not safemode");
168 	CPPUNIT_ASSERT(condition->Test(sConditionContext));
169 
170 	class SafemodeConditionContext : public TestConditionContext {
171 	public:
172 		bool IsSafeMode() const
173 		{
174 			return true;
175 		}
176 	} safemodeContext;
177 	CPPUNIT_ASSERT(!condition->Test(safemodeContext));
178 
179 }
180 
181 
182 /*static*/ void
AddTests(BTestSuite & parent)183 ConditionsTest::AddTests(BTestSuite& parent)
184 {
185 	CppUnit::TestSuite& suite = *new CppUnit::TestSuite("ConditionsTest");
186 
187 	suite.addTest(new CppUnit::TestCaller<ConditionsTest>(
188 		"ConditionsTest::TestEmpty", &ConditionsTest::TestEmpty));
189 	suite.addTest(new CppUnit::TestCaller<ConditionsTest>(
190 		"ConditionsTest::TestSafemode", &ConditionsTest::TestSafemode));
191 	suite.addTest(new CppUnit::TestCaller<ConditionsTest>(
192 		"ConditionsTest::TestFileExists", &ConditionsTest::TestFileExists));
193 	suite.addTest(new CppUnit::TestCaller<ConditionsTest>(
194 		"ConditionsTest::TestOr", &ConditionsTest::TestOr));
195 	suite.addTest(new CppUnit::TestCaller<ConditionsTest>(
196 		"ConditionsTest::TestAnd", &ConditionsTest::TestAnd));
197 	suite.addTest(new CppUnit::TestCaller<ConditionsTest>(
198 		"ConditionsTest::TestNot", &ConditionsTest::TestNot));
199 
200 	parent.addTest("ConditionsTest", &suite);
201 }
202 
203 
204 Condition*
_Condition(const char * string)205 ConditionsTest::_Condition(const char* string)
206 {
207 	SettingsParser parser;
208 	BString input("job A {\nif {");
209 	input << string << "\n}\n}\n";
210 
211 	BMessage jobs;
212 	CPPUNIT_ASSERT_EQUAL(B_OK, parser.Parse(input, jobs));
213 
214 	BMessage job;
215 	CPPUNIT_ASSERT_EQUAL(B_OK, jobs.FindMessage("job", 0, &job));
216 	CPPUNIT_ASSERT_EQUAL(2, job.CountNames(B_ANY_TYPE));
217 	CPPUNIT_ASSERT_EQUAL(BString("A"), BString(job.GetString("name")));
218 
219 	BMessage message;
220 	CPPUNIT_ASSERT_EQUAL(B_OK, job.FindMessage("if", &message));
221 
222 	Condition* condition = Conditions::FromMessage(message);
223 	if (string[0] != '\0')
224 		CPPUNIT_ASSERT(condition != NULL);
225 	return condition;
226 }
227