]> granicus.if.org Git - icinga2/blob - test/config-ops.cpp
Merge pull request #5931 from Icinga/feature/linker-flags
[icinga2] / test / config-ops.cpp
1 /******************************************************************************
2  * Icinga 2                                                                   *
3  * Copyright (C) 2012-2018 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         std::unique_ptr<Expression> expr;
32         Dictionary::Ptr dict;
33
34         expr = ConfigCompiler::CompileText("<test>", "");
35         BOOST_CHECK(expr->Evaluate(frame).GetValue() == Empty);
36
37         expr = ConfigCompiler::CompileText("<test>", "\n3");
38         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
39
40         expr = ConfigCompiler::CompileText("<test>", "{ 3\n\n5 }");
41         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
42
43         expr = ConfigCompiler::CompileText("<test>", "1 + 3");
44         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 4);
45
46         expr = ConfigCompiler::CompileText("<test>", "3 - 1");
47         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 2);
48
49         expr = ConfigCompiler::CompileText("<test>", "5m * 10");
50         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3000);
51
52         expr = ConfigCompiler::CompileText("<test>", "5m / 5");
53         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 60);
54
55         expr = ConfigCompiler::CompileText("<test>", "7 & 3");
56         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
57
58         expr = ConfigCompiler::CompileText("<test>", "2 | 3");
59         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
60
61         expr = ConfigCompiler::CompileText("<test>", "true && false");
62         BOOST_CHECK(!expr->Evaluate(frame).GetValue());
63
64         expr = ConfigCompiler::CompileText("<test>", "true || false");
65         BOOST_CHECK(expr->Evaluate(frame).GetValue());
66
67         expr = ConfigCompiler::CompileText("<test>", "3 < 5");
68         BOOST_CHECK(expr->Evaluate(frame).GetValue());
69
70         expr = ConfigCompiler::CompileText("<test>", "3 > 5");
71         BOOST_CHECK(!expr->Evaluate(frame).GetValue());
72
73         expr = ConfigCompiler::CompileText("<test>", "3 <= 3");
74         BOOST_CHECK(expr->Evaluate(frame).GetValue());
75
76         expr = ConfigCompiler::CompileText("<test>", "3 >= 3");
77         BOOST_CHECK(expr->Evaluate(frame).GetValue());
78
79         expr = ConfigCompiler::CompileText("<test>", "2 + 3 * 4");
80         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 14);
81
82         expr = ConfigCompiler::CompileText("<test>", "(2 + 3) * 4");
83         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 20);
84
85         expr = ConfigCompiler::CompileText("<test>", "2 * - 3");
86         BOOST_CHECK(expr->Evaluate(frame).GetValue() == -6);
87
88         expr = ConfigCompiler::CompileText("<test>", "-(2 + 3)");
89         BOOST_CHECK(expr->Evaluate(frame).GetValue() == -5);
90
91         expr = ConfigCompiler::CompileText("<test>", "- 2 * 2 - 2 * 3 - 4 * - 5");
92         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 10);
93
94         expr = ConfigCompiler::CompileText("<test>", "!0 == true");
95         BOOST_CHECK(expr->Evaluate(frame).GetValue());
96
97         expr = ConfigCompiler::CompileText("<test>", "~0");
98         BOOST_CHECK(expr->Evaluate(frame).GetValue() == (double)~(long)0);
99
100         expr = ConfigCompiler::CompileText("<test>", "4 << 8");
101         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 1024);
102
103         expr = ConfigCompiler::CompileText("<test>", "1024 >> 4");
104         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 64);
105
106         expr = ConfigCompiler::CompileText("<test>", "2 << 3 << 4");
107         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 256);
108
109         expr = ConfigCompiler::CompileText("<test>", "256 >> 4 >> 3");
110         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 2);
111
112         expr = ConfigCompiler::CompileText("<test>", "\"hello\" == \"hello\"");
113         BOOST_CHECK(expr->Evaluate(frame).GetValue());
114
115         expr = ConfigCompiler::CompileText("<test>", "\"hello\" != \"hello\"");
116         BOOST_CHECK(!expr->Evaluate(frame).GetValue());
117
118         expr = ConfigCompiler::CompileText("<test>", "\"foo\" in [ \"foo\", \"bar\" ]");
119         BOOST_CHECK(expr->Evaluate(frame).GetValue());
120
121         expr = ConfigCompiler::CompileText("<test>", "\"foo\" in [ \"bar\", \"baz\" ]");
122         BOOST_CHECK(!expr->Evaluate(frame).GetValue());
123
124         expr = ConfigCompiler::CompileText("<test>", "\"foo\" in null");
125         BOOST_CHECK(!expr->Evaluate(frame).GetValue());
126
127         expr = ConfigCompiler::CompileText("<test>", "\"foo\" in \"bar\"");
128         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
129
130         expr = ConfigCompiler::CompileText("<test>", "\"foo\" !in [ \"bar\", \"baz\" ]");
131         BOOST_CHECK(expr->Evaluate(frame).GetValue());
132
133         expr = ConfigCompiler::CompileText("<test>", "\"foo\" !in [ \"foo\", \"bar\" ]");
134         BOOST_CHECK(!expr->Evaluate(frame).GetValue());
135
136         expr = ConfigCompiler::CompileText("<test>", "\"foo\" !in null");
137         BOOST_CHECK(expr->Evaluate(frame).GetValue());
138
139         expr = ConfigCompiler::CompileText("<test>", "\"foo\" !in \"bar\"");
140         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
141
142         expr = ConfigCompiler::CompileText("<test>", "{ a += 3 }");
143         dict = expr->Evaluate(frame).GetValue();
144         BOOST_CHECK(dict->GetLength() == 1);
145         BOOST_CHECK(dict->Get("a") == 3);
146
147         expr = ConfigCompiler::CompileText("<test>", "test");
148         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
149
150         expr = ConfigCompiler::CompileText("<test>", "null + 3");
151         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
152
153         expr = ConfigCompiler::CompileText("<test>", "3 + null");
154         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
155
156         expr = ConfigCompiler::CompileText("<test>", "\"test\" + 3");
157         BOOST_CHECK(expr->Evaluate(frame).GetValue() == "test3");
158
159         expr = ConfigCompiler::CompileText("<test>", "\"\\\"te\\\\st\"");
160         BOOST_CHECK(expr->Evaluate(frame).GetValue() == "\"te\\st");
161
162         expr = ConfigCompiler::CompileText("<test>", "\"\\'test\"");
163         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
164
165         expr = ConfigCompiler::CompileText("<test>", "({ a = 3\nb = 3 })");
166         BOOST_CHECK(expr->Evaluate(frame).GetValue().IsObjectType<Dictionary>());
167 }
168
169 BOOST_AUTO_TEST_CASE(advanced)
170 {
171         ScriptFrame frame;
172         std::unique_ptr<Expression> expr;
173         Function::Ptr func;
174
175         expr = ConfigCompiler::CompileText("<test>", "regex(\"^Hello\", \"Hello World\")");
176         BOOST_CHECK(expr->Evaluate(frame).GetValue());
177
178         expr = ConfigCompiler::CompileText("<test>", "__boost_test()");
179         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
180
181         Object::Ptr self = new Object();
182         ScriptFrame frame2(self);
183         expr = ConfigCompiler::CompileText("<test>", "this");
184         BOOST_CHECK(expr->Evaluate(frame2).GetValue() == Value(self));
185
186         expr = ConfigCompiler::CompileText("<test>", "var v = 7; v");
187         BOOST_CHECK(expr->Evaluate(frame).GetValue());
188
189         expr = ConfigCompiler::CompileText("<test>", "{ a = 3 }.a");
190         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
191
192         expr = ConfigCompiler::CompileText("<test>", "[ 2, 3 ][1]");
193         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
194
195         expr = ConfigCompiler::CompileText("<test>", "var v = { a = 3}; v.a");
196         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
197
198         expr = ConfigCompiler::CompileText("<test>", "a = 3 b = 3");
199         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
200
201         expr = ConfigCompiler::CompileText("<test>", "function() { 3 }()");
202         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
203
204         expr = ConfigCompiler::CompileText("<test>", "function() { return 3, 5 }()");
205         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
206
207         expr = ConfigCompiler::CompileText("<test>", "typeof([]) == Array");
208         BOOST_CHECK(expr->Evaluate(frame).GetValue());
209
210         expr = ConfigCompiler::CompileText("<test>", "typeof({}) == Dictionary");
211         BOOST_CHECK(expr->Evaluate(frame).GetValue());
212
213         expr = ConfigCompiler::CompileText("<test>", "typeof(3) == Number");
214         BOOST_CHECK(expr->Evaluate(frame).GetValue());
215
216         expr = ConfigCompiler::CompileText("<test>", "typeof(\"test\") == String");
217         BOOST_CHECK(expr->Evaluate(frame).GetValue());
218
219         expr = ConfigCompiler::CompileText("<test>", "(7 | 8) == 15");
220         BOOST_CHECK(expr->Evaluate(frame).GetValue());
221
222         expr = ConfigCompiler::CompileText("<test>", "(7 ^ 8) == 15");
223         BOOST_CHECK(expr->Evaluate(frame).GetValue());
224
225         expr = ConfigCompiler::CompileText("<test>", "(7 & 15) == 7");
226         BOOST_CHECK(expr->Evaluate(frame).GetValue());
227
228         expr = ConfigCompiler::CompileText("<test>", "7 in [7] == true");
229         BOOST_CHECK(expr->Evaluate(frame).GetValue());
230
231         expr = ConfigCompiler::CompileText("<test>", "7 !in [7] == false");
232         BOOST_CHECK(expr->Evaluate(frame).GetValue());
233
234         expr = ConfigCompiler::CompileText("<test>", "(7 | 8) > 14");
235         BOOST_CHECK(expr->Evaluate(frame).GetValue());
236
237         expr = ConfigCompiler::CompileText("<test>", "(7 ^ 8) > 14");
238         BOOST_CHECK(expr->Evaluate(frame).GetValue());
239
240         expr = ConfigCompiler::CompileText("<test>", "(7 & 15) > 6");
241         BOOST_CHECK(expr->Evaluate(frame).GetValue());
242
243         expr = ConfigCompiler::CompileText("<test>", "\"a\" = 3");
244         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
245
246         expr = ConfigCompiler::CompileText("<test>", "3 = 3");
247         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
248
249         expr = ConfigCompiler::CompileText("<test>", "var e; e");
250         BOOST_CHECK(expr->Evaluate(frame).GetValue().IsEmpty());
251
252         expr = ConfigCompiler::CompileText("<test>", "var e = 3; e");
253         BOOST_CHECK(expr->Evaluate(frame).GetValue() == 3);
254
255         expr = ConfigCompiler::CompileText("<test>", "Array.x");
256         BOOST_CHECK_THROW(expr->Evaluate(frame).GetValue(), ScriptError);
257
258         expr = ConfigCompiler::CompileText("<test>", "{{ 3 }}");
259         func = expr->Evaluate(frame).GetValue();
260         BOOST_CHECK(func->Invoke() == 3);
261 }
262
263 BOOST_AUTO_TEST_SUITE_END()