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