]> granicus.if.org Git - icinga2/blob - test/config-ops.cpp
Move new password functions into tlsutility
[icinga2] / test / config-ops.cpp
1 /******************************************************************************
2  * Icinga 2                                                                   *
3  * Copyright (C) 2012-2017 Icinga Development Team (https://www.icinga.com/)  *
4  *                                                                            *
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.                     *
9  *                                                                            *
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.                               *
14  *                                                                            *
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  ******************************************************************************/
19
20 #include "config/configcompiler.hpp"
21 #include "base/exception.hpp"
22 #include <BoostTestTargetConfig.h>
23
24 using namespace icinga;
25
26 BOOST_AUTO_TEST_SUITE(config_ops)
27
28 BOOST_AUTO_TEST_CASE(simple)
29 {
30         ScriptFrame frame;
31         Expression *expr;
32         Dictionary::Ptr dict;
33
34         expr = ConfigCompiler::CompileText("<test>", "");
35         BOOST_CHECK(expr->Evaluate(frame).GetValue() == Empty);
36         delete expr;
37
38         expr = ConfigCompiler::CompileText("<test>", "\n3");
39         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
40         delete expr;
41
42         expr = ConfigCompiler::CompileText("<test>", "{ 3\n\n5 }");
43         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
44         delete expr;
45
46         expr = ConfigCompiler::CompileText("<test>", "1 + 3");
47         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 4);
48         delete expr;
49
50         expr = ConfigCompiler::CompileText("<test>", "3 - 1");
51         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 2);
52         delete expr;
53
54         expr = ConfigCompiler::CompileText("<test>", "5m * 10");
55         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3000);
56         delete expr;
57
58         expr = ConfigCompiler::CompileText("<test>", "5m / 5");
59         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 60);
60         delete expr;
61
62         expr = ConfigCompiler::CompileText("<test>", "7 & 3");
63         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
64         delete expr;
65
66         expr = ConfigCompiler::CompileText("<test>", "2 | 3");
67         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
68         delete expr;
69
70         expr = ConfigCompiler::CompileText("<test>", "true && false");
71         BOOST_CHECK(!expr->Evaluate(frame).GetValue());
72         delete expr;
73
74         expr = ConfigCompiler::CompileText("<test>", "true || false");
75         BOOST_CHECK(expr->Evaluate(frame).GetValue());
76         delete expr;
77
78         expr = ConfigCompiler::CompileText("<test>", "3 < 5");
79         BOOST_CHECK(expr->Evaluate(frame).GetValue());
80         delete expr;
81
82         expr = ConfigCompiler::CompileText("<test>", "3 > 5");
83         BOOST_CHECK(!expr->Evaluate(frame).GetValue());
84         delete expr;
85
86         expr = ConfigCompiler::CompileText("<test>", "3 <= 3");
87         BOOST_CHECK(expr->Evaluate(frame).GetValue());
88         delete expr;
89
90         expr = ConfigCompiler::CompileText("<test>", "3 >= 3");
91         BOOST_CHECK(expr->Evaluate(frame).GetValue());
92         delete expr;
93
94         expr = ConfigCompiler::CompileText("<test>", "2 + 3 * 4");
95         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 14);
96         delete expr;
97
98         expr = ConfigCompiler::CompileText("<test>", "(2 + 3) * 4");
99         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 20);
100         delete expr;
101
102         expr = ConfigCompiler::CompileText("<test>", "2 * - 3");
103         BOOST_CHECK(expr->Evaluate(frame).GetValue() == -6);
104         delete expr;
105
106         expr = ConfigCompiler::CompileText("<test>", "-(2 + 3)");
107         BOOST_CHECK(expr->Evaluate(frame).GetValue() == -5);
108         delete expr;
109
110         expr = ConfigCompiler::CompileText("<test>", "- 2 * 2 - 2 * 3 - 4 * - 5");
111         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 10);
112         delete expr;
113
114         expr = ConfigCompiler::CompileText("<test>", "!0 == true");
115         BOOST_CHECK(expr->Evaluate(frame).GetValue());
116         delete expr;
117
118         expr = ConfigCompiler::CompileText("<test>", "~0");
119         BOOST_CHECK(expr->Evaluate(frame).GetValue() == (double)~(long)0);
120         delete expr;
121
122         expr = ConfigCompiler::CompileText("<test>", "4 << 8");
123         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 1024);
124         delete expr;
125
126         expr = ConfigCompiler::CompileText("<test>", "1024 >> 4");
127         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 64);
128         delete expr;
129
130         expr = ConfigCompiler::CompileText("<test>", "2 << 3 << 4");
131         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 256);
132         delete expr;
133
134         expr = ConfigCompiler::CompileText("<test>", "256 >> 4 >> 3");
135         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 2);
136         delete expr;
137
138         expr = ConfigCompiler::CompileText("<test>", "\"hello\" == \"hello\"");
139         BOOST_CHECK(expr->Evaluate(frame).GetValue());
140         delete expr;
141
142         expr = ConfigCompiler::CompileText("<test>", "\"hello\" != \"hello\"");
143         BOOST_CHECK(!expr->Evaluate(frame).GetValue());
144         delete expr;
145
146         expr = ConfigCompiler::CompileText("<test>", "\"foo\" in [ \"foo\", \"bar\" ]");
147         BOOST_CHECK(expr->Evaluate(frame).GetValue());
148         delete expr;
149
150         expr = ConfigCompiler::CompileText("<test>", "\"foo\" in [ \"bar\", \"baz\" ]");
151         BOOST_CHECK(!expr->Evaluate(frame).GetValue());
152         delete expr;
153
154         expr = ConfigCompiler::CompileText("<test>", "\"foo\" in null");
155         BOOST_CHECK(!expr->Evaluate(frame).GetValue());
156         delete expr;
157
158         expr = ConfigCompiler::CompileText("<test>", "\"foo\" in \"bar\"");
159         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
160         delete expr;
161
162         expr = ConfigCompiler::CompileText("<test>", "\"foo\" !in [ \"bar\", \"baz\" ]");
163         BOOST_CHECK(expr->Evaluate(frame).GetValue());
164         delete expr;
165
166         expr = ConfigCompiler::CompileText("<test>", "\"foo\" !in [ \"foo\", \"bar\" ]");
167         BOOST_CHECK(!expr->Evaluate(frame).GetValue());
168         delete expr;
169
170         expr = ConfigCompiler::CompileText("<test>", "\"foo\" !in null");
171         BOOST_CHECK(expr->Evaluate(frame).GetValue());
172         delete expr;
173
174         expr = ConfigCompiler::CompileText("<test>", "\"foo\" !in \"bar\"");
175         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
176         delete expr;
177
178         expr = ConfigCompiler::CompileText("<test>", "{ a += 3 }");
179         dict = expr->Evaluate(frame).GetValue();
180         delete expr;
181         BOOST_CHECK(dict->GetLength() == 1);
182         BOOST_CHECK(dict->Get("a") == 3);
183
184         expr = ConfigCompiler::CompileText("<test>", "test");
185         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
186         delete expr;
187
188         expr = ConfigCompiler::CompileText("<test>", "null + 3");
189         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
190         delete expr;
191
192         expr = ConfigCompiler::CompileText("<test>", "3 + null");
193         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
194         delete expr;
195
196         expr = ConfigCompiler::CompileText("<test>", "\"test\" + 3");
197         BOOST_CHECK(expr->Evaluate(frame).GetValue() == "test3");
198         delete expr;
199
200         expr = ConfigCompiler::CompileText("<test>", "\"\\\"te\\\\st\"");
201         BOOST_CHECK(expr->Evaluate(frame).GetValue() == "\"te\\st");
202         delete expr;
203
204         expr = ConfigCompiler::CompileText("<test>", "\"\\'test\"");
205         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
206         delete expr;
207
208         expr = ConfigCompiler::CompileText("<test>", "({ a = 3\nb = 3 })");
209         BOOST_CHECK(expr->Evaluate(frame).GetValue().IsObjectType<Dictionary>());
210         delete expr;
211 }
212
213 BOOST_AUTO_TEST_CASE(advanced)
214 {
215         ScriptFrame frame;
216         Expression *expr;
217         Function::Ptr func;
218
219         expr = ConfigCompiler::CompileText("<test>", "regex(\"^Hello\", \"Hello World\")");
220         BOOST_CHECK(expr->Evaluate(frame).GetValue());
221         delete expr;
222
223         expr = ConfigCompiler::CompileText("<test>", "__boost_test()");
224         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
225         delete expr;
226
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));
231         delete expr;
232
233         expr = ConfigCompiler::CompileText("<test>", "var v = 7; v");
234         BOOST_CHECK(expr->Evaluate(frame).GetValue());
235         delete expr;
236
237         expr = ConfigCompiler::CompileText("<test>", "{ a = 3 }.a");
238         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
239         delete expr;
240
241         expr = ConfigCompiler::CompileText("<test>", "[ 2, 3 ][1]");
242         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
243         delete expr;
244
245         expr = ConfigCompiler::CompileText("<test>", "var v = { a = 3}; v.a");
246         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
247         delete expr;
248
249         expr = ConfigCompiler::CompileText("<test>", "a = 3 b = 3");
250         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
251         delete expr;
252
253         expr = ConfigCompiler::CompileText("<test>", "function() { 3 }()");
254         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
255         delete expr;
256
257         expr = ConfigCompiler::CompileText("<test>", "function() { return 3, 5 }()");
258         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
259         delete expr;
260
261         expr = ConfigCompiler::CompileText("<test>", "typeof([]) == Array");
262         BOOST_CHECK(expr->Evaluate(frame).GetValue());
263         delete expr;
264
265         expr = ConfigCompiler::CompileText("<test>", "typeof({}) == Dictionary");
266         BOOST_CHECK(expr->Evaluate(frame).GetValue());
267         delete expr;
268
269         expr = ConfigCompiler::CompileText("<test>", "typeof(3) == Number");
270         BOOST_CHECK(expr->Evaluate(frame).GetValue());
271         delete expr;
272
273         expr = ConfigCompiler::CompileText("<test>", "typeof(\"test\") == String");
274         BOOST_CHECK(expr->Evaluate(frame).GetValue());
275         delete expr;
276
277         expr = ConfigCompiler::CompileText("<test>", "(7 | 8) == 15");
278         BOOST_CHECK(expr->Evaluate(frame).GetValue());
279         delete expr;
280
281         expr = ConfigCompiler::CompileText("<test>", "(7 ^ 8) == 15");
282         BOOST_CHECK(expr->Evaluate(frame).GetValue());
283         delete expr;
284
285         expr = ConfigCompiler::CompileText("<test>", "(7 & 15) == 7");
286         BOOST_CHECK(expr->Evaluate(frame).GetValue());
287         delete expr;
288
289         expr = ConfigCompiler::CompileText("<test>", "7 in [7] == true");
290         BOOST_CHECK(expr->Evaluate(frame).GetValue());
291         delete expr;
292
293         expr = ConfigCompiler::CompileText("<test>", "7 !in [7] == false");
294         BOOST_CHECK(expr->Evaluate(frame).GetValue());
295         delete expr;
296
297         expr = ConfigCompiler::CompileText("<test>", "(7 | 8) > 14");
298         BOOST_CHECK(expr->Evaluate(frame).GetValue());
299         delete expr;
300
301         expr = ConfigCompiler::CompileText("<test>", "(7 ^ 8) > 14");
302         BOOST_CHECK(expr->Evaluate(frame).GetValue());
303         delete expr;
304
305         expr = ConfigCompiler::CompileText("<test>", "(7 & 15) > 6");
306         BOOST_CHECK(expr->Evaluate(frame).GetValue());
307         delete expr;
308
309         expr = ConfigCompiler::CompileText("<test>", "\"a\" = 3");
310         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
311         delete expr;
312
313         expr = ConfigCompiler::CompileText("<test>", "3 = 3");
314         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
315         delete expr;
316
317         expr = ConfigCompiler::CompileText("<test>", "var e; e");
318         BOOST_CHECK(expr->Evaluate(frame).GetValue().IsEmpty());
319         delete expr;
320
321         expr = ConfigCompiler::CompileText("<test>", "var e = 3; e");
322         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
323         delete expr;
324
325         expr = ConfigCompiler::CompileText("<test>", "Array.x");
326         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
327         delete expr;
328
329         expr = ConfigCompiler::CompileText("<test>", "{{ 3 }}");
330         func = expr->Evaluate(frame).GetValue();
331         BOOST_CHECK(func->Invoke() == 3);
332         delete expr;
333 }
334
335 BOOST_AUTO_TEST_SUITE_END()