1 /******************************************************************************
3 * Copyright (C) 2012-2016 Icinga Development Team (https://www.icinga.org/) *
5 * This program is free software; you can redistribute it and/or *
6 * modify it under the terms of the GNU General Public License *
7 * as published by the Free Software Foundation; either version 2 *
8 * of the License, or (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the Free Software Foundation *
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
18 ******************************************************************************/
20 #include "config/configcompiler.hpp"
21 #include "base/exception.hpp"
22 #include <BoostTestTargetConfig.h>
24 using namespace icinga;
26 BOOST_AUTO_TEST_SUITE(config_ops)
28 BOOST_AUTO_TEST_CASE(simple)
34 expr = ConfigCompiler::CompileText("<test>", "");
35 BOOST_CHECK(expr->Evaluate(frame).GetValue() == Empty);
38 expr = ConfigCompiler::CompileText("<test>", "\n3");
39 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
42 expr = ConfigCompiler::CompileText("<test>", "{ 3\n\n5 }");
43 BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
46 expr = ConfigCompiler::CompileText("<test>", "1 + 3");
47 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 4);
50 expr = ConfigCompiler::CompileText("<test>", "3 - 1");
51 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 2);
54 expr = ConfigCompiler::CompileText("<test>", "5m * 10");
55 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3000);
58 expr = ConfigCompiler::CompileText("<test>", "5m / 5");
59 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 60);
62 expr = ConfigCompiler::CompileText("<test>", "7 & 3");
63 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
66 expr = ConfigCompiler::CompileText("<test>", "2 | 3");
67 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
70 expr = ConfigCompiler::CompileText("<test>", "true && false");
71 BOOST_CHECK(!expr->Evaluate(frame).GetValue());
74 expr = ConfigCompiler::CompileText("<test>", "true || false");
75 BOOST_CHECK(expr->Evaluate(frame).GetValue());
78 expr = ConfigCompiler::CompileText("<test>", "3 < 5");
79 BOOST_CHECK(expr->Evaluate(frame).GetValue());
82 expr = ConfigCompiler::CompileText("<test>", "3 > 5");
83 BOOST_CHECK(!expr->Evaluate(frame).GetValue());
86 expr = ConfigCompiler::CompileText("<test>", "3 <= 3");
87 BOOST_CHECK(expr->Evaluate(frame).GetValue());
90 expr = ConfigCompiler::CompileText("<test>", "3 >= 3");
91 BOOST_CHECK(expr->Evaluate(frame).GetValue());
94 expr = ConfigCompiler::CompileText("<test>", "2 + 3 * 4");
95 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 14);
98 expr = ConfigCompiler::CompileText("<test>", "(2 + 3) * 4");
99 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 20);
102 expr = ConfigCompiler::CompileText("<test>", "2 * - 3");
103 BOOST_CHECK(expr->Evaluate(frame).GetValue() == -6);
106 expr = ConfigCompiler::CompileText("<test>", "-(2 + 3)");
107 BOOST_CHECK(expr->Evaluate(frame).GetValue() == -5);
110 expr = ConfigCompiler::CompileText("<test>", "- 2 * 2 - 2 * 3 - 4 * - 5");
111 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 10);
114 expr = ConfigCompiler::CompileText("<test>", "!0 == true");
115 BOOST_CHECK(expr->Evaluate(frame).GetValue());
118 expr = ConfigCompiler::CompileText("<test>", "~0");
119 BOOST_CHECK(expr->Evaluate(frame).GetValue() == (double)~(long)0);
122 expr = ConfigCompiler::CompileText("<test>", "4 << 8");
123 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 1024);
126 expr = ConfigCompiler::CompileText("<test>", "1024 >> 4");
127 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 64);
130 expr = ConfigCompiler::CompileText("<test>", "2 << 3 << 4");
131 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 256);
134 expr = ConfigCompiler::CompileText("<test>", "256 >> 4 >> 3");
135 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 2);
138 expr = ConfigCompiler::CompileText("<test>", "\"hello\" == \"hello\"");
139 BOOST_CHECK(expr->Evaluate(frame).GetValue());
142 expr = ConfigCompiler::CompileText("<test>", "\"hello\" != \"hello\"");
143 BOOST_CHECK(!expr->Evaluate(frame).GetValue());
146 expr = ConfigCompiler::CompileText("<test>", "\"foo\" in [ \"foo\", \"bar\" ]");
147 BOOST_CHECK(expr->Evaluate(frame).GetValue());
150 expr = ConfigCompiler::CompileText("<test>", "\"foo\" in [ \"bar\", \"baz\" ]");
151 BOOST_CHECK(!expr->Evaluate(frame).GetValue());
154 expr = ConfigCompiler::CompileText("<test>", "\"foo\" in null");
155 BOOST_CHECK(!expr->Evaluate(frame).GetValue());
158 expr = ConfigCompiler::CompileText("<test>", "\"foo\" in \"bar\"");
159 BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
162 expr = ConfigCompiler::CompileText("<test>", "\"foo\" !in [ \"bar\", \"baz\" ]");
163 BOOST_CHECK(expr->Evaluate(frame).GetValue());
166 expr = ConfigCompiler::CompileText("<test>", "\"foo\" !in [ \"foo\", \"bar\" ]");
167 BOOST_CHECK(!expr->Evaluate(frame).GetValue());
170 expr = ConfigCompiler::CompileText("<test>", "\"foo\" !in null");
171 BOOST_CHECK(expr->Evaluate(frame).GetValue());
174 expr = ConfigCompiler::CompileText("<test>", "\"foo\" !in \"bar\"");
175 BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
178 expr = ConfigCompiler::CompileText("<test>", "{ a += 3 }");
179 dict = expr->Evaluate(frame).GetValue();
181 BOOST_CHECK(dict->GetLength() == 1);
182 BOOST_CHECK(dict->Get("a") == 3);
184 expr = ConfigCompiler::CompileText("<test>", "test");
185 BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
188 expr = ConfigCompiler::CompileText("<test>", "null + 3");
189 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
192 expr = ConfigCompiler::CompileText("<test>", "3 + null");
193 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
196 expr = ConfigCompiler::CompileText("<test>", "\"test\" + 3");
197 BOOST_CHECK(expr->Evaluate(frame).GetValue() == "test3");
200 expr = ConfigCompiler::CompileText("<test>", "\"\\\"te\\\\st\"");
201 BOOST_CHECK(expr->Evaluate(frame).GetValue() == "\"te\\st");
204 expr = ConfigCompiler::CompileText("<test>", "\"\\'test\"");
205 BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
208 expr = ConfigCompiler::CompileText("<test>", "({ a = 3\nb = 3 })");
209 BOOST_CHECK(expr->Evaluate(frame).GetValue().IsObjectType<Dictionary>());
213 BOOST_AUTO_TEST_CASE(advanced)
219 expr = ConfigCompiler::CompileText("<test>", "regex(\"^Hello\", \"Hello World\")");
220 BOOST_CHECK(expr->Evaluate(frame).GetValue());
223 expr = ConfigCompiler::CompileText("<test>", "__boost_test()");
224 BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
227 Object::Ptr self = new Object();
228 ScriptFrame frame2(self);
229 expr = ConfigCompiler::CompileText("<test>", "this");
230 BOOST_CHECK(expr->Evaluate(frame2).GetValue() == Value(self));
233 expr = ConfigCompiler::CompileText("<test>", "var v = 7; v");
234 BOOST_CHECK(expr->Evaluate(frame).GetValue());
237 expr = ConfigCompiler::CompileText("<test>", "{ a = 3 }.a");
238 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
241 expr = ConfigCompiler::CompileText("<test>", "[ 2, 3 ][1]");
242 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
245 expr = ConfigCompiler::CompileText("<test>", "var v = { a = 3}; v.a");
246 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
249 expr = ConfigCompiler::CompileText("<test>", "a = 3 b = 3");
250 BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
253 expr = ConfigCompiler::CompileText("<test>", "function() { 3 }()");
254 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
257 expr = ConfigCompiler::CompileText("<test>", "function() { return 3, 5 }()");
258 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
261 expr = ConfigCompiler::CompileText("<test>", "typeof([]) == Array");
262 BOOST_CHECK(expr->Evaluate(frame).GetValue());
265 expr = ConfigCompiler::CompileText("<test>", "typeof({}) == Dictionary");
266 BOOST_CHECK(expr->Evaluate(frame).GetValue());
269 expr = ConfigCompiler::CompileText("<test>", "typeof(3) == Number");
270 BOOST_CHECK(expr->Evaluate(frame).GetValue());
273 expr = ConfigCompiler::CompileText("<test>", "typeof(\"test\") == String");
274 BOOST_CHECK(expr->Evaluate(frame).GetValue());
277 expr = ConfigCompiler::CompileText("<test>", "(7 | 8) == 15");
278 BOOST_CHECK(expr->Evaluate(frame).GetValue());
281 expr = ConfigCompiler::CompileText("<test>", "(7 ^ 8) == 15");
282 BOOST_CHECK(expr->Evaluate(frame).GetValue());
285 expr = ConfigCompiler::CompileText("<test>", "(7 & 15) == 7");
286 BOOST_CHECK(expr->Evaluate(frame).GetValue());
289 expr = ConfigCompiler::CompileText("<test>", "7 in [7] == true");
290 BOOST_CHECK(expr->Evaluate(frame).GetValue());
293 expr = ConfigCompiler::CompileText("<test>", "7 !in [7] == false");
294 BOOST_CHECK(expr->Evaluate(frame).GetValue());
297 expr = ConfigCompiler::CompileText("<test>", "(7 | 8) > 14");
298 BOOST_CHECK(expr->Evaluate(frame).GetValue());
301 expr = ConfigCompiler::CompileText("<test>", "(7 ^ 8) > 14");
302 BOOST_CHECK(expr->Evaluate(frame).GetValue());
305 expr = ConfigCompiler::CompileText("<test>", "(7 & 15) > 6");
306 BOOST_CHECK(expr->Evaluate(frame).GetValue());
309 expr = ConfigCompiler::CompileText("<test>", "\"a\" = 3");
310 BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
313 expr = ConfigCompiler::CompileText("<test>", "3 = 3");
314 BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
317 expr = ConfigCompiler::CompileText("<test>", "var e; e");
318 BOOST_CHECK(expr->Evaluate(frame).GetValue().IsEmpty());
321 expr = ConfigCompiler::CompileText("<test>", "var e = 3; e");
322 BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
325 expr = ConfigCompiler::CompileText("<test>", "Array.x");
326 BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
329 expr = ConfigCompiler::CompileText("<test>", "{{ 3 }}");
330 func = expr->Evaluate(frame).GetValue();
331 BOOST_CHECK(func->Invoke() == 3);
335 BOOST_AUTO_TEST_SUITE_END()