Mercurial > irccd
comparison tests/cmd-rule-move/main.cpp @ 451:1fdedd2977d2
Irccdctl: implement rule-move
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 07 Jul 2017 18:03:18 +0200 |
parents | |
children | 7e273b7f4f92 |
comparison
equal
deleted
inserted
replaced
450:c8c68d4bf555 | 451:1fdedd2977d2 |
---|---|
1 /* | |
2 * main.cpp -- test rule-move remote command | |
3 * | |
4 * Copyright (c) 2013-2017 David Demelier <markand@malikania.fr> | |
5 * | |
6 * Permission to use, copy, modify, and/or distribute this software for any | |
7 * purpose with or without fee is hereby granted, provided that the above | |
8 * copyright notice and this permission notice appear in all copies. | |
9 * | |
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 */ | |
18 | |
19 #include <command.hpp> | |
20 #include <command-tester.hpp> | |
21 #include <service.hpp> | |
22 | |
23 using namespace irccd; | |
24 using namespace irccd::command; | |
25 | |
26 class RuleMoveCommandTest : public CommandTester { | |
27 protected: | |
28 nlohmann::json m_result; | |
29 | |
30 /* | |
31 * Rule sets are unordered so use this function to search a string in | |
32 * the JSON array. | |
33 */ | |
34 inline bool contains(const nlohmann::json &array, const std::string &str) | |
35 { | |
36 for (const auto &v : array) | |
37 if (v.is_string() && v == str) | |
38 return true; | |
39 | |
40 return false; | |
41 } | |
42 | |
43 public: | |
44 RuleMoveCommandTest() | |
45 : CommandTester(std::make_unique<RuleMoveCommand>()) | |
46 { | |
47 m_irccd.commands().add(std::make_unique<RuleListCommand>()); | |
48 m_irccd.rules().add(Rule( | |
49 { "s0" }, | |
50 { "c0" }, | |
51 { "o0" }, | |
52 { "p0" }, | |
53 { "onMessage" }, | |
54 RuleAction::Drop | |
55 )); | |
56 m_irccd.rules().add(Rule( | |
57 { "s1", }, | |
58 { "c1", }, | |
59 { "o1", }, | |
60 { "p1", }, | |
61 { "onMessage", }, | |
62 RuleAction::Accept | |
63 )); | |
64 m_irccd.rules().add(Rule( | |
65 { "s2", }, | |
66 { "c2", }, | |
67 { "o2", }, | |
68 { "p2", }, | |
69 { "onMessage", }, | |
70 RuleAction::Accept | |
71 )); | |
72 m_irccdctl.client().onMessage.connect([&] (auto result) { | |
73 m_result = result; | |
74 }); | |
75 } | |
76 }; | |
77 | |
78 TEST_F(RuleMoveCommandTest, backward) | |
79 { | |
80 try { | |
81 m_irccdctl.client().request({ | |
82 { "command", "rule-move" }, | |
83 { "from", 2 }, | |
84 { "to", 0 } | |
85 }); | |
86 | |
87 poll([&] () { | |
88 return m_result.is_object(); | |
89 }); | |
90 | |
91 ASSERT_TRUE(m_result.is_object()); | |
92 ASSERT_TRUE(m_result["status"].get<bool>()); | |
93 | |
94 m_result = nullptr; | |
95 m_irccdctl.client().request({{ "command", "rule-list" }}); | |
96 | |
97 poll([&] () { | |
98 return m_result.is_object(); | |
99 }); | |
100 | |
101 ASSERT_TRUE(m_result.is_object()); | |
102 ASSERT_TRUE(m_result["status"].get<bool>()); | |
103 | |
104 // Rule 2. | |
105 { | |
106 auto servers = m_result["list"][0]["servers"]; | |
107 auto channels = m_result["list"][0]["channels"]; | |
108 auto plugins = m_result["list"][0]["plugins"]; | |
109 auto events = m_result["list"][0]["events"]; | |
110 | |
111 ASSERT_TRUE(contains(servers, "s2")); | |
112 ASSERT_TRUE(contains(channels, "c2")); | |
113 ASSERT_TRUE(contains(plugins, "p2")); | |
114 ASSERT_TRUE(contains(events, "onMessage")); | |
115 ASSERT_EQ("accept", m_result["list"][0]["action"].get<std::string>()); | |
116 } | |
117 | |
118 // Rule 0. | |
119 { | |
120 auto servers = m_result["list"][1]["servers"]; | |
121 auto channels = m_result["list"][1]["channels"]; | |
122 auto plugins = m_result["list"][1]["plugins"]; | |
123 auto events = m_result["list"][1]["events"]; | |
124 | |
125 ASSERT_TRUE(contains(servers, "s0")); | |
126 ASSERT_TRUE(contains(channels, "c0")); | |
127 ASSERT_TRUE(contains(plugins, "p0")); | |
128 ASSERT_TRUE(contains(events, "onMessage")); | |
129 ASSERT_EQ("drop", m_result["list"][1]["action"].get<std::string>()); | |
130 } | |
131 | |
132 // Rule 1. | |
133 { | |
134 auto servers = m_result["list"][2]["servers"]; | |
135 auto channels = m_result["list"][2]["channels"]; | |
136 auto plugins = m_result["list"][2]["plugins"]; | |
137 auto events = m_result["list"][2]["events"]; | |
138 | |
139 ASSERT_TRUE(contains(servers, "s1")); | |
140 ASSERT_TRUE(contains(channels, "c1")); | |
141 ASSERT_TRUE(contains(plugins, "p1")); | |
142 ASSERT_TRUE(contains(events, "onMessage")); | |
143 ASSERT_EQ("accept", m_result["list"][2]["action"].get<std::string>()); | |
144 } | |
145 } catch (const std::exception& ex) { | |
146 FAIL() << ex.what(); | |
147 } | |
148 } | |
149 | |
150 TEST_F(RuleMoveCommandTest, upward) | |
151 { | |
152 try { | |
153 m_irccdctl.client().request({ | |
154 { "command", "rule-move" }, | |
155 { "from", 0 }, | |
156 { "to", 2 } | |
157 }); | |
158 | |
159 poll([&] () { | |
160 return m_result.is_object(); | |
161 }); | |
162 | |
163 ASSERT_TRUE(m_result.is_object()); | |
164 ASSERT_TRUE(m_result["status"].get<bool>()); | |
165 | |
166 m_result = nullptr; | |
167 m_irccdctl.client().request({{ "command", "rule-list" }}); | |
168 | |
169 poll([&] () { | |
170 return m_result.is_object(); | |
171 }); | |
172 | |
173 ASSERT_TRUE(m_result.is_object()); | |
174 ASSERT_TRUE(m_result["status"].get<bool>()); | |
175 | |
176 // Rule 1. | |
177 { | |
178 auto servers = m_result["list"][0]["servers"]; | |
179 auto channels = m_result["list"][0]["channels"]; | |
180 auto plugins = m_result["list"][0]["plugins"]; | |
181 auto events = m_result["list"][0]["events"]; | |
182 | |
183 ASSERT_TRUE(contains(servers, "s1")); | |
184 ASSERT_TRUE(contains(channels, "c1")); | |
185 ASSERT_TRUE(contains(plugins, "p1")); | |
186 ASSERT_TRUE(contains(events, "onMessage")); | |
187 ASSERT_EQ("accept", m_result["list"][0]["action"].get<std::string>()); | |
188 } | |
189 | |
190 // Rule 2. | |
191 { | |
192 auto servers = m_result["list"][1]["servers"]; | |
193 auto channels = m_result["list"][1]["channels"]; | |
194 auto plugins = m_result["list"][1]["plugins"]; | |
195 auto events = m_result["list"][1]["events"]; | |
196 | |
197 ASSERT_TRUE(contains(servers, "s2")); | |
198 ASSERT_TRUE(contains(channels, "c2")); | |
199 ASSERT_TRUE(contains(plugins, "p2")); | |
200 ASSERT_TRUE(contains(events, "onMessage")); | |
201 ASSERT_EQ("accept", m_result["list"][1]["action"].get<std::string>()); | |
202 } | |
203 | |
204 // Rule 0. | |
205 { | |
206 auto servers = m_result["list"][2]["servers"]; | |
207 auto channels = m_result["list"][2]["channels"]; | |
208 auto plugins = m_result["list"][2]["plugins"]; | |
209 auto events = m_result["list"][2]["events"]; | |
210 | |
211 ASSERT_TRUE(contains(servers, "s0")); | |
212 ASSERT_TRUE(contains(channels, "c0")); | |
213 ASSERT_TRUE(contains(plugins, "p0")); | |
214 ASSERT_TRUE(contains(events, "onMessage")); | |
215 ASSERT_EQ("drop", m_result["list"][2]["action"].get<std::string>()); | |
216 } | |
217 } catch (const std::exception& ex) { | |
218 FAIL() << ex.what(); | |
219 } | |
220 } | |
221 | |
222 TEST_F(RuleMoveCommandTest, same) | |
223 { | |
224 try { | |
225 m_irccdctl.client().request({ | |
226 { "command", "rule-move" }, | |
227 { "from", 1 }, | |
228 { "to", 1 } | |
229 }); | |
230 | |
231 poll([&] () { | |
232 return m_result.is_object(); | |
233 }); | |
234 | |
235 ASSERT_TRUE(m_result.is_object()); | |
236 ASSERT_TRUE(m_result["status"].get<bool>()); | |
237 | |
238 m_result = nullptr; | |
239 m_irccdctl.client().request({{ "command", "rule-list" }}); | |
240 | |
241 poll([&] () { | |
242 return m_result.is_object(); | |
243 }); | |
244 | |
245 ASSERT_TRUE(m_result.is_object()); | |
246 ASSERT_TRUE(m_result["status"].get<bool>()); | |
247 | |
248 // Rule 0. | |
249 { | |
250 auto servers = m_result["list"][0]["servers"]; | |
251 auto channels = m_result["list"][0]["channels"]; | |
252 auto plugins = m_result["list"][0]["plugins"]; | |
253 auto events = m_result["list"][0]["events"]; | |
254 | |
255 ASSERT_TRUE(contains(servers, "s0")); | |
256 ASSERT_TRUE(contains(channels, "c0")); | |
257 ASSERT_TRUE(contains(plugins, "p0")); | |
258 ASSERT_TRUE(contains(events, "onMessage")); | |
259 ASSERT_EQ("drop", m_result["list"][0]["action"].get<std::string>()); | |
260 } | |
261 | |
262 // Rule 1. | |
263 { | |
264 auto servers = m_result["list"][1]["servers"]; | |
265 auto channels = m_result["list"][1]["channels"]; | |
266 auto plugins = m_result["list"][1]["plugins"]; | |
267 auto events = m_result["list"][1]["events"]; | |
268 | |
269 ASSERT_TRUE(contains(servers, "s1")); | |
270 ASSERT_TRUE(contains(channels, "c1")); | |
271 ASSERT_TRUE(contains(plugins, "p1")); | |
272 ASSERT_TRUE(contains(events, "onMessage")); | |
273 ASSERT_EQ("accept", m_result["list"][1]["action"].get<std::string>()); | |
274 } | |
275 | |
276 // Rule 2. | |
277 { | |
278 auto servers = m_result["list"][2]["servers"]; | |
279 auto channels = m_result["list"][2]["channels"]; | |
280 auto plugins = m_result["list"][2]["plugins"]; | |
281 auto events = m_result["list"][2]["events"]; | |
282 | |
283 ASSERT_TRUE(contains(servers, "s2")); | |
284 ASSERT_TRUE(contains(channels, "c2")); | |
285 ASSERT_TRUE(contains(plugins, "p2")); | |
286 ASSERT_TRUE(contains(events, "onMessage")); | |
287 ASSERT_EQ("accept", m_result["list"][2]["action"].get<std::string>()); | |
288 } | |
289 } catch (const std::exception& ex) { | |
290 FAIL() << ex.what(); | |
291 } | |
292 } | |
293 | |
294 TEST_F(RuleMoveCommandTest, beyond) | |
295 { | |
296 try { | |
297 m_irccdctl.client().request({ | |
298 { "command", "rule-move" }, | |
299 { "from", 0 }, | |
300 { "to", 123 } | |
301 }); | |
302 | |
303 poll([&] () { | |
304 return m_result.is_object(); | |
305 }); | |
306 | |
307 ASSERT_TRUE(m_result.is_object()); | |
308 ASSERT_TRUE(m_result["status"].get<bool>()); | |
309 | |
310 m_result = nullptr; | |
311 m_irccdctl.client().request({{ "command", "rule-list" }}); | |
312 | |
313 poll([&] () { | |
314 return m_result.is_object(); | |
315 }); | |
316 | |
317 ASSERT_TRUE(m_result.is_object()); | |
318 ASSERT_TRUE(m_result["status"].get<bool>()); | |
319 | |
320 // Rule 1. | |
321 { | |
322 auto servers = m_result["list"][0]["servers"]; | |
323 auto channels = m_result["list"][0]["channels"]; | |
324 auto plugins = m_result["list"][0]["plugins"]; | |
325 auto events = m_result["list"][0]["events"]; | |
326 | |
327 ASSERT_TRUE(contains(servers, "s1")); | |
328 ASSERT_TRUE(contains(channels, "c1")); | |
329 ASSERT_TRUE(contains(plugins, "p1")); | |
330 ASSERT_TRUE(contains(events, "onMessage")); | |
331 ASSERT_EQ("accept", m_result["list"][0]["action"].get<std::string>()); | |
332 } | |
333 | |
334 // Rule 2. | |
335 { | |
336 auto servers = m_result["list"][1]["servers"]; | |
337 auto channels = m_result["list"][1]["channels"]; | |
338 auto plugins = m_result["list"][1]["plugins"]; | |
339 auto events = m_result["list"][1]["events"]; | |
340 | |
341 ASSERT_TRUE(contains(servers, "s2")); | |
342 ASSERT_TRUE(contains(channels, "c2")); | |
343 ASSERT_TRUE(contains(plugins, "p2")); | |
344 ASSERT_TRUE(contains(events, "onMessage")); | |
345 ASSERT_EQ("accept", m_result["list"][1]["action"].get<std::string>()); | |
346 } | |
347 | |
348 // Rule 0. | |
349 { | |
350 auto servers = m_result["list"][2]["servers"]; | |
351 auto channels = m_result["list"][2]["channels"]; | |
352 auto plugins = m_result["list"][2]["plugins"]; | |
353 auto events = m_result["list"][2]["events"]; | |
354 | |
355 ASSERT_TRUE(contains(servers, "s0")); | |
356 ASSERT_TRUE(contains(channels, "c0")); | |
357 ASSERT_TRUE(contains(plugins, "p0")); | |
358 ASSERT_TRUE(contains(events, "onMessage")); | |
359 ASSERT_EQ("drop", m_result["list"][2]["action"].get<std::string>()); | |
360 } | |
361 } catch (const std::exception& ex) { | |
362 FAIL() << ex.what(); | |
363 } | |
364 } | |
365 | |
366 TEST_F(RuleMoveCommandTest, outOfBounds) | |
367 { | |
368 try { | |
369 m_irccdctl.client().request({ | |
370 { "command", "rule-move" }, | |
371 { "from", 1024 }, | |
372 { "to", 0 } | |
373 }); | |
374 | |
375 poll([&] () { | |
376 return m_result.is_object(); | |
377 }); | |
378 | |
379 ASSERT_TRUE(m_result.is_object()); | |
380 ASSERT_FALSE(m_result["status"].get<bool>()); | |
381 } catch (const std::exception& ex) { | |
382 FAIL() << ex.what(); | |
383 } | |
384 } | |
385 | |
386 int main(int argc, char **argv) | |
387 { | |
388 testing::InitGoogleTest(&argc, argv); | |
389 | |
390 return RUN_ALL_TESTS(); | |
391 } |