Line data Source code
1 : /*
2 : * License:
3 : * Copyright (c) 2006-2021 Made to Order Software Corp. All Rights Reserved
4 : *
5 : * https://snapwebsites.org/
6 : * contact@m2osw.com
7 : *
8 : * This program is free software; you can redistribute it and/or modify
9 : * it under the terms of the GNU General Public License as published by
10 : * the Free Software Foundation; either version 2 of the License, or
11 : * (at your option) any later version.
12 : *
13 : * This program is distributed in the hope that it will be useful,
14 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 : * GNU General Public License for more details.
17 : *
18 : * You should have received a copy of the GNU General Public License along
19 : * with this program; if not, write to the Free Software Foundation, Inc.,
20 : * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 : *
22 : * Authors:
23 : * Alexis Wilke alexis@m2osw.com
24 : */
25 :
26 : // self
27 : //
28 : #include "main.h"
29 :
30 :
31 : // advgetopt lib
32 : //
33 : #include <advgetopt/conf_file.h>
34 : #include <advgetopt/utils.h>
35 :
36 :
37 : // snapdev lib
38 : //
39 : #include <snapdev/safe_setenv.h>
40 :
41 :
42 : // C++ lib
43 : //
44 : #include <fstream>
45 :
46 :
47 : // last include
48 : //
49 : #include <snapdev/poison.h>
50 :
51 :
52 :
53 99 : int shuffle_rand(int n)
54 : {
55 99 : return rand() % n;
56 : }
57 :
58 :
59 :
60 4 : CATCH_TEST_CASE("utils_unquote", "[utils][valid]")
61 : {
62 4 : CATCH_START_SECTION("Unquote, default pairs")
63 1 : CATCH_REQUIRE(advgetopt::unquote("") == "");
64 1 : CATCH_REQUIRE(advgetopt::unquote("a") == "a");
65 1 : CATCH_REQUIRE(advgetopt::unquote("ab") == "ab");
66 1 : CATCH_REQUIRE(advgetopt::unquote("abc") == "abc");
67 :
68 1 : CATCH_REQUIRE(advgetopt::unquote("''") == "");
69 1 : CATCH_REQUIRE(advgetopt::unquote("'a'") == "a");
70 1 : CATCH_REQUIRE(advgetopt::unquote("'ab'") == "ab");
71 1 : CATCH_REQUIRE(advgetopt::unquote("'abc'") == "abc");
72 1 : CATCH_REQUIRE(advgetopt::unquote("'abcd'") == "abcd");
73 :
74 1 : CATCH_REQUIRE(advgetopt::unquote("\"\"") == "");
75 1 : CATCH_REQUIRE(advgetopt::unquote("\"a\"") == "a");
76 1 : CATCH_REQUIRE(advgetopt::unquote("\"ab\"") == "ab");
77 1 : CATCH_REQUIRE(advgetopt::unquote("\"abc\"") == "abc");
78 1 : CATCH_REQUIRE(advgetopt::unquote("\"abcd\"") == "abcd");
79 :
80 1 : CATCH_REQUIRE(advgetopt::unquote("\"'") == "\"'");
81 1 : CATCH_REQUIRE(advgetopt::unquote("\"a'") == "\"a'");
82 1 : CATCH_REQUIRE(advgetopt::unquote("\"ab'") == "\"ab'");
83 1 : CATCH_REQUIRE(advgetopt::unquote("\"abc'") == "\"abc'");
84 1 : CATCH_REQUIRE(advgetopt::unquote("\"abcd'") == "\"abcd'");
85 :
86 1 : CATCH_REQUIRE(advgetopt::unquote("'\"") == "'\"");
87 1 : CATCH_REQUIRE(advgetopt::unquote("'a\"") == "'a\"");
88 1 : CATCH_REQUIRE(advgetopt::unquote("'ab\"") == "'ab\"");
89 1 : CATCH_REQUIRE(advgetopt::unquote("'abc\"") == "'abc\"");
90 1 : CATCH_REQUIRE(advgetopt::unquote("'abcd\"") == "'abcd\"");
91 :
92 1 : CATCH_REQUIRE(advgetopt::unquote("\"") == "\"");
93 1 : CATCH_REQUIRE(advgetopt::unquote("\"a") == "\"a");
94 1 : CATCH_REQUIRE(advgetopt::unquote("\"ab") == "\"ab");
95 1 : CATCH_REQUIRE(advgetopt::unquote("\"abc") == "\"abc");
96 1 : CATCH_REQUIRE(advgetopt::unquote("\"abcd") == "\"abcd");
97 :
98 1 : CATCH_REQUIRE(advgetopt::unquote("'") == "'");
99 1 : CATCH_REQUIRE(advgetopt::unquote("'a") == "'a");
100 1 : CATCH_REQUIRE(advgetopt::unquote("'ab") == "'ab");
101 1 : CATCH_REQUIRE(advgetopt::unquote("'abc") == "'abc");
102 1 : CATCH_REQUIRE(advgetopt::unquote("'abcd") == "'abcd");
103 :
104 1 : CATCH_REQUIRE(advgetopt::unquote("'") == "'");
105 1 : CATCH_REQUIRE(advgetopt::unquote("a'") == "a'");
106 1 : CATCH_REQUIRE(advgetopt::unquote("ab'") == "ab'");
107 1 : CATCH_REQUIRE(advgetopt::unquote("abc'") == "abc'");
108 1 : CATCH_REQUIRE(advgetopt::unquote("abcd'") == "abcd'");
109 :
110 1 : CATCH_REQUIRE(advgetopt::unquote("\"") == "\"");
111 1 : CATCH_REQUIRE(advgetopt::unquote("a\"") == "a\"");
112 1 : CATCH_REQUIRE(advgetopt::unquote("ab\"") == "ab\"");
113 1 : CATCH_REQUIRE(advgetopt::unquote("abc\"") == "abc\"");
114 1 : CATCH_REQUIRE(advgetopt::unquote("abcd\"") == "abcd\"");
115 : CATCH_END_SECTION()
116 :
117 4 : CATCH_START_SECTION("Unquote, brackets")
118 1 : CATCH_REQUIRE(advgetopt::unquote("", "[]<>{}") == "");
119 1 : CATCH_REQUIRE(advgetopt::unquote("a", "[]<>{}") == "a");
120 1 : CATCH_REQUIRE(advgetopt::unquote("ab", "[]<>{}") == "ab");
121 1 : CATCH_REQUIRE(advgetopt::unquote("abc", "[]<>{}") == "abc");
122 :
123 1 : CATCH_REQUIRE(advgetopt::unquote("{}", "[]<>{}") == "");
124 1 : CATCH_REQUIRE(advgetopt::unquote("{a}", "[]<>{}") == "a");
125 1 : CATCH_REQUIRE(advgetopt::unquote("{ab}", "[]<>{}") == "ab");
126 1 : CATCH_REQUIRE(advgetopt::unquote("{abc}", "[]<>{}") == "abc");
127 1 : CATCH_REQUIRE(advgetopt::unquote("{abcd}", "[]<>{}") == "abcd");
128 :
129 1 : CATCH_REQUIRE(advgetopt::unquote("[]", "[]<>{}") == "");
130 1 : CATCH_REQUIRE(advgetopt::unquote("[a]", "[]<>{}") == "a");
131 1 : CATCH_REQUIRE(advgetopt::unquote("[ab]", "[]<>{}") == "ab");
132 1 : CATCH_REQUIRE(advgetopt::unquote("[abc]", "[]<>{}") == "abc");
133 1 : CATCH_REQUIRE(advgetopt::unquote("[abcd]", "[]<>{}") == "abcd");
134 :
135 1 : CATCH_REQUIRE(advgetopt::unquote("<>", "[]<>{}") == "");
136 1 : CATCH_REQUIRE(advgetopt::unquote("<a>", "[]<>{}") == "a");
137 1 : CATCH_REQUIRE(advgetopt::unquote("<ab>", "[]<>{}") == "ab");
138 1 : CATCH_REQUIRE(advgetopt::unquote("<abc>", "[]<>{}") == "abc");
139 1 : CATCH_REQUIRE(advgetopt::unquote("<abcd>", "[]<>{}") == "abcd");
140 :
141 1 : CATCH_REQUIRE(advgetopt::unquote("[}", "[]<>{}") == "[}");
142 1 : CATCH_REQUIRE(advgetopt::unquote("[a}", "[]<>{}") == "[a}");
143 1 : CATCH_REQUIRE(advgetopt::unquote("[ab}", "[]<>{}") == "[ab}");
144 1 : CATCH_REQUIRE(advgetopt::unquote("[abc}", "[]<>{}") == "[abc}");
145 1 : CATCH_REQUIRE(advgetopt::unquote("[abcd}", "[]<>{}") == "[abcd}");
146 :
147 1 : CATCH_REQUIRE(advgetopt::unquote("[>", "[]<>{}") == "[>");
148 1 : CATCH_REQUIRE(advgetopt::unquote("[a>", "[]<>{}") == "[a>");
149 1 : CATCH_REQUIRE(advgetopt::unquote("[ab>", "[]<>{}") == "[ab>");
150 1 : CATCH_REQUIRE(advgetopt::unquote("[abc>", "[]<>{}") == "[abc>");
151 1 : CATCH_REQUIRE(advgetopt::unquote("[abcd>", "[]<>{}") == "[abcd>");
152 :
153 1 : CATCH_REQUIRE(advgetopt::unquote("'\"", "[]<>{}") == "'\"");
154 1 : CATCH_REQUIRE(advgetopt::unquote("'a\"", "[]<>{}") == "'a\"");
155 1 : CATCH_REQUIRE(advgetopt::unquote("'ab\"", "[]<>{}") == "'ab\"");
156 1 : CATCH_REQUIRE(advgetopt::unquote("'abc\"", "[]<>{}") == "'abc\"");
157 1 : CATCH_REQUIRE(advgetopt::unquote("'abcd\"", "[]<>{}") == "'abcd\"");
158 :
159 1 : CATCH_REQUIRE(advgetopt::unquote("[", "[]<>{}") == "[");
160 1 : CATCH_REQUIRE(advgetopt::unquote("[a", "[]<>{}") == "[a");
161 1 : CATCH_REQUIRE(advgetopt::unquote("[ab", "[]<>{}") == "[ab");
162 1 : CATCH_REQUIRE(advgetopt::unquote("[abc", "[]<>{}") == "[abc");
163 1 : CATCH_REQUIRE(advgetopt::unquote("[abcd", "[]<>{}") == "[abcd");
164 :
165 1 : CATCH_REQUIRE(advgetopt::unquote("{", "[]<>{}") == "{");
166 1 : CATCH_REQUIRE(advgetopt::unquote("{a", "[]<>{}") == "{a");
167 1 : CATCH_REQUIRE(advgetopt::unquote("{ab", "[]<>{}") == "{ab");
168 1 : CATCH_REQUIRE(advgetopt::unquote("{abc", "[]<>{}") == "{abc");
169 1 : CATCH_REQUIRE(advgetopt::unquote("{abcd", "[]<>{}") == "{abcd");
170 :
171 1 : CATCH_REQUIRE(advgetopt::unquote("<", "[]<>{}") == "<");
172 1 : CATCH_REQUIRE(advgetopt::unquote("<a", "[]<>{}") == "<a");
173 1 : CATCH_REQUIRE(advgetopt::unquote("<ab", "[]<>{}") == "<ab");
174 1 : CATCH_REQUIRE(advgetopt::unquote("<abc", "[]<>{}") == "<abc");
175 1 : CATCH_REQUIRE(advgetopt::unquote("<abcd", "[]<>{}") == "<abcd");
176 :
177 1 : CATCH_REQUIRE(advgetopt::unquote("}", "[]<>{}") == "}");
178 1 : CATCH_REQUIRE(advgetopt::unquote("a}", "[]<>{}") == "a}");
179 1 : CATCH_REQUIRE(advgetopt::unquote("ab}", "[]<>{}") == "ab}");
180 1 : CATCH_REQUIRE(advgetopt::unquote("abc}", "[]<>{}") == "abc}");
181 1 : CATCH_REQUIRE(advgetopt::unquote("abcd}", "[]<>{}") == "abcd}");
182 :
183 1 : CATCH_REQUIRE(advgetopt::unquote("]", "[]<>{}") == "]");
184 1 : CATCH_REQUIRE(advgetopt::unquote("a]", "[]<>{}") == "a]");
185 1 : CATCH_REQUIRE(advgetopt::unquote("ab]", "[]<>{}") == "ab]");
186 1 : CATCH_REQUIRE(advgetopt::unquote("abc]", "[]<>{}") == "abc]");
187 1 : CATCH_REQUIRE(advgetopt::unquote("abcd]", "[]<>{}") == "abcd]");
188 :
189 1 : CATCH_REQUIRE(advgetopt::unquote(">", "[]<>{}") == ">");
190 1 : CATCH_REQUIRE(advgetopt::unquote("a>", "[]<>{}") == "a>");
191 1 : CATCH_REQUIRE(advgetopt::unquote("ab>", "[]<>{}") == "ab>");
192 1 : CATCH_REQUIRE(advgetopt::unquote("abc>", "[]<>{}") == "abc>");
193 1 : CATCH_REQUIRE(advgetopt::unquote("abcd>", "[]<>{}") == "abcd>");
194 : CATCH_END_SECTION()
195 2 : }
196 :
197 :
198 :
199 :
200 13 : CATCH_TEST_CASE("utils_split", "[utils][valid]")
201 : {
202 22 : CATCH_START_SECTION("Split three words")
203 2 : advgetopt::string_list_t result;
204 2 : advgetopt::split_string("test with spaces"
205 : , result
206 1 : , {" "});
207 1 : CATCH_REQUIRE(result.size() == 3);
208 1 : CATCH_REQUIRE(result[0] == "test");
209 1 : CATCH_REQUIRE(result[1] == "with");
210 1 : CATCH_REQUIRE(result[2] == "spaces");
211 : CATCH_END_SECTION()
212 :
213 22 : CATCH_START_SECTION("Split three words, one with single quotes")
214 2 : advgetopt::string_list_t result;
215 2 : advgetopt::split_string("test 'with quotes and' spaces"
216 : , result
217 1 : , {" "});
218 1 : CATCH_REQUIRE(result.size() == 3);
219 1 : CATCH_REQUIRE(result[0] == "test");
220 1 : CATCH_REQUIRE(result[1] == "with quotes and");
221 1 : CATCH_REQUIRE(result[2] == "spaces");
222 : CATCH_END_SECTION()
223 :
224 22 : CATCH_START_SECTION("Split three words, one with double quotes")
225 2 : advgetopt::string_list_t result;
226 2 : advgetopt::split_string("test \"with quotes and\" spaces"
227 : , result
228 1 : , {" "});
229 1 : CATCH_REQUIRE(result.size() == 3);
230 1 : CATCH_REQUIRE(result[0] == "test");
231 1 : CATCH_REQUIRE(result[1] == "with quotes and");
232 1 : CATCH_REQUIRE(result[2] == "spaces");
233 : CATCH_END_SECTION()
234 :
235 22 : CATCH_START_SECTION("Split three words, one with single quotes but no spaces")
236 2 : advgetopt::string_list_t result;
237 2 : advgetopt::split_string("test'with quotes and'nospaces"
238 : , result
239 1 : , {" "});
240 1 : CATCH_REQUIRE(result.size() == 3);
241 1 : CATCH_REQUIRE(result[0] == "test");
242 1 : CATCH_REQUIRE(result[1] == "with quotes and");
243 1 : CATCH_REQUIRE(result[2] == "nospaces");
244 : CATCH_END_SECTION()
245 :
246 22 : CATCH_START_SECTION("Split three words, one with double quotes but no spaces")
247 2 : advgetopt::string_list_t result;
248 2 : advgetopt::split_string("test\"with quotes and\"nospaces"
249 : , result
250 1 : , {" "});
251 1 : CATCH_REQUIRE(result.size() == 3);
252 1 : CATCH_REQUIRE(result[0] == "test");
253 1 : CATCH_REQUIRE(result[1] == "with quotes and");
254 1 : CATCH_REQUIRE(result[2] == "nospaces");
255 : CATCH_END_SECTION()
256 :
257 22 : CATCH_START_SECTION("Split five words, four separators")
258 2 : advgetopt::string_list_t result;
259 5 : advgetopt::split_string("test,with quite|many;separators"
260 : , result
261 4 : , {" ",",","|",";"});
262 1 : CATCH_REQUIRE(result.size() == 5);
263 1 : CATCH_REQUIRE(result[0] == "test");
264 1 : CATCH_REQUIRE(result[1] == "with");
265 1 : CATCH_REQUIRE(result[2] == "quite");
266 1 : CATCH_REQUIRE(result[3] == "many");
267 1 : CATCH_REQUIRE(result[4] == "separators");
268 : CATCH_END_SECTION()
269 :
270 22 : CATCH_START_SECTION("Split five words, multiple/repeated separators")
271 2 : advgetopt::string_list_t result;
272 5 : advgetopt::split_string("test, with quite|||many ; separators"
273 : , result
274 4 : , {" ",",","|",";"});
275 1 : CATCH_REQUIRE(result.size() == 5);
276 1 : CATCH_REQUIRE(result[0] == "test");
277 1 : CATCH_REQUIRE(result[1] == "with");
278 1 : CATCH_REQUIRE(result[2] == "quite");
279 1 : CATCH_REQUIRE(result[3] == "many");
280 1 : CATCH_REQUIRE(result[4] == "separators");
281 : CATCH_END_SECTION()
282 :
283 22 : CATCH_START_SECTION("Split five words, and empty entries")
284 2 : advgetopt::string_list_t result;
285 5 : advgetopt::split_string("|||test, with quite\"\"many ; ''separators''"
286 : , result
287 4 : , {" ",",","|",";"});
288 1 : CATCH_REQUIRE(result.size() == 5);
289 1 : CATCH_REQUIRE(result[0] == "test");
290 1 : CATCH_REQUIRE(result[1] == "with");
291 1 : CATCH_REQUIRE(result[2] == "quite");
292 1 : CATCH_REQUIRE(result[3] == "many");
293 1 : CATCH_REQUIRE(result[4] == "separators");
294 : CATCH_END_SECTION()
295 :
296 22 : CATCH_START_SECTION("Split five words, start/end with separator")
297 2 : advgetopt::string_list_t result;
298 2 : advgetopt::split_string("|start|and|end|with|separator|"
299 : , result
300 1 : , {"|"});
301 1 : CATCH_REQUIRE(result.size() == 5);
302 1 : CATCH_REQUIRE(result[0] == "start");
303 1 : CATCH_REQUIRE(result[1] == "and");
304 1 : CATCH_REQUIRE(result[2] == "end");
305 1 : CATCH_REQUIRE(result[3] == "with");
306 1 : CATCH_REQUIRE(result[4] == "separator");
307 : CATCH_END_SECTION()
308 :
309 22 : CATCH_START_SECTION("Split five words, unclosed double quote")
310 2 : advgetopt::string_list_t result;
311 2 : advgetopt::split_string("\"unclosed quote|mark"
312 : , result
313 1 : , {"|"});
314 1 : CATCH_REQUIRE(result.size() == 1);
315 1 : CATCH_REQUIRE(result[0] == "unclosed quote|mark");
316 : CATCH_END_SECTION()
317 :
318 22 : CATCH_START_SECTION("Split five words, unclosed single quote")
319 2 : advgetopt::string_list_t result;
320 3 : advgetopt::split_string("here is an \"unclosed quote|mark"
321 : , result
322 2 : , {"|"," "});
323 : //CATCH_REQUIRE(result.size() == 4);
324 1 : CATCH_REQUIRE(result[0] == "here");
325 1 : CATCH_REQUIRE(result[1] == "is");
326 1 : CATCH_REQUIRE(result[2] == "an");
327 1 : CATCH_REQUIRE(result[3] == "unclosed quote|mark");
328 : CATCH_END_SECTION()
329 11 : }
330 :
331 :
332 :
333 :
334 6 : CATCH_TEST_CASE("utils_insert_group_name", "[utils][valid]")
335 : {
336 8 : CATCH_START_SECTION("Full insert")
337 : // CONFIG FILE HAS NO EXTENSION
338 : {
339 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
340 : "/this/is/a/path"
341 : , "group-name"
342 2 : , "project-name"));
343 1 : CATCH_REQUIRE(fullname.size() == 1);
344 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-path");
345 : }
346 :
347 : {
348 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
349 : "/this/is/a/path"
350 : , "group-name"
351 2 : , ""));
352 1 : CATCH_REQUIRE(fullname.size() == 1);
353 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-path");
354 : }
355 :
356 : {
357 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
358 : "/this/is/a/path"
359 : , "group-name"
360 2 : , nullptr));
361 1 : CATCH_REQUIRE(fullname.size() == 1);
362 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-path");
363 : }
364 :
365 : {
366 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
367 : "/this/is/a/path"
368 : , ""
369 2 : , "project-name"));
370 1 : CATCH_REQUIRE(fullname.size() == 1);
371 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/project-name.d/50-path");
372 : }
373 :
374 : {
375 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
376 : "/this/is/a/path"
377 : , nullptr
378 2 : , "project-name"));
379 1 : CATCH_REQUIRE(fullname.size() == 1);
380 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/project-name.d/50-path");
381 : }
382 :
383 : // CONFIG FILE HAS EXTENSION
384 : {
385 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
386 : "/this/is/a/basename.ext"
387 : , "group-name"
388 2 : , "project-name"));
389 1 : CATCH_REQUIRE(fullname.size() == 1);
390 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-basename.ext");
391 : }
392 :
393 : {
394 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
395 : "/this/is/a/basename.ext"
396 : , "group-name"
397 2 : , ""));
398 1 : CATCH_REQUIRE(fullname.size() == 1);
399 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-basename.ext");
400 : }
401 :
402 : {
403 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
404 : "/this/is/a/basename.ext"
405 : , "group-name"
406 2 : , nullptr));
407 1 : CATCH_REQUIRE(fullname.size() == 1);
408 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-basename.ext");
409 : }
410 :
411 : {
412 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
413 : "/this/is/a/basename.ext"
414 : , ""
415 2 : , "project-name"));
416 1 : CATCH_REQUIRE(fullname.size() == 1);
417 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/project-name.d/50-basename.ext");
418 : }
419 :
420 : {
421 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
422 : "/this/is/a/basename.ext"
423 : , nullptr
424 2 : , "project-name"));
425 1 : CATCH_REQUIRE(fullname.size() == 1);
426 1 : CATCH_REQUIRE(fullname[0] == "/this/is/a/project-name.d/50-basename.ext");
427 : }
428 : CATCH_END_SECTION()
429 :
430 8 : CATCH_START_SECTION("Empty cases")
431 : {
432 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
433 : "/this/is/a/path"
434 : , nullptr
435 2 : , nullptr));
436 1 : CATCH_REQUIRE(fullname.empty());
437 : }
438 :
439 : {
440 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
441 : "/this/is/a/path"
442 : , nullptr
443 2 : , ""));
444 1 : CATCH_REQUIRE(fullname.empty());
445 : }
446 :
447 : {
448 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
449 : "/this/is/a/path"
450 : , ""
451 2 : , nullptr));
452 1 : CATCH_REQUIRE(fullname.empty());
453 : }
454 :
455 : {
456 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
457 : "/this/is/a/path"
458 : , ""
459 2 : , ""));
460 1 : CATCH_REQUIRE(fullname.empty());
461 : }
462 :
463 : {
464 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
465 : ""
466 : , "group-name"
467 2 : , "project-name"));
468 1 : CATCH_REQUIRE(fullname.empty());
469 : }
470 :
471 : {
472 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
473 : ""
474 : , ""
475 2 : , "project-name"));
476 1 : CATCH_REQUIRE(fullname.empty());
477 : }
478 :
479 : {
480 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
481 : ""
482 : , nullptr
483 2 : , "project-name"));
484 1 : CATCH_REQUIRE(fullname.empty());
485 : }
486 :
487 : {
488 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
489 : ""
490 : , nullptr
491 2 : , ""));
492 1 : CATCH_REQUIRE(fullname.empty());
493 : }
494 :
495 : {
496 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
497 : ""
498 : , nullptr
499 2 : , nullptr));
500 1 : CATCH_REQUIRE(fullname.empty());
501 : }
502 : CATCH_END_SECTION()
503 :
504 8 : CATCH_START_SECTION("Basename Only")
505 : {
506 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
507 : "basename"
508 : , nullptr
509 2 : , "advgetopt"));
510 1 : CATCH_REQUIRE(fullname.size() == 1);
511 1 : CATCH_REQUIRE(fullname[0] == "advgetopt.d/50-basename");
512 : }
513 :
514 : {
515 1 : advgetopt::string_list_t fullname(advgetopt::insert_group_name(
516 : "basename.ext"
517 : , "advgetopt"
518 2 : , nullptr));
519 1 : CATCH_REQUIRE(fullname.size() == 1);
520 1 : CATCH_REQUIRE(fullname[0] == "advgetopt.d/50-basename.ext");
521 : }
522 : CATCH_END_SECTION()
523 :
524 8 : CATCH_START_SECTION("Actual List of Files on Disk")
525 : {
526 1 : SNAP_CATCH2_NAMESPACE::init_tmp_dir("advgetopt-multi", "sorted-user-conf", false);
527 :
528 : // generate an array of numbers from 00 to 99
529 : //
530 2 : std::vector<int> numbers;
531 101 : for(int i = 0; i < 100; ++i)
532 : {
533 100 : numbers.push_back(i);
534 : }
535 1 : std::random_shuffle(numbers.begin(), numbers.end(), shuffle_rand);
536 1 : int const max(rand() % 50 + 10);
537 1 : numbers.resize(max);
538 2 : std::string path(SNAP_CATCH2_NAMESPACE::g_config_project_filename);
539 1 : std::string::size_type const pos(path.rfind('/'));
540 1 : path = path.substr(0, pos);
541 2 : advgetopt::string_list_t filenames;
542 31 : for(int i = 0; i < max; ++i)
543 : {
544 60 : std::stringstream ss;
545 30 : ss << path;
546 30 : ss << '/';
547 30 : int const n(numbers[i]);
548 30 : if(n < 10)
549 : {
550 4 : ss << '0';
551 : }
552 30 : ss << n;
553 30 : ss << "-sorted-user-conf.config";
554 30 : filenames.push_back(ss.str());
555 60 : std::ofstream conf;
556 30 : conf.open(ss.str(), std::ios_base::out);
557 30 : CATCH_REQUIRE(conf.is_open());
558 30 : conf << "# Config with a number" << std::endl;
559 30 : conf << "var=\"value: " << numbers[i] << "\"" << std::endl;
560 : }
561 1 : std::sort(filenames.begin(), filenames.end());
562 2 : std::string const last_filename(*filenames.rbegin());
563 1 : std::string::size_type const slash_pos(last_filename.rfind('/'));
564 2 : std::string const expected_var("value: " + last_filename.substr(slash_pos + 1, 2));
565 :
566 1 : advgetopt::string_list_t fullnames(advgetopt::insert_group_name(
567 : SNAP_CATCH2_NAMESPACE::g_config_filename
568 : , "advgetopt-multi"
569 2 : , "multi-channels"));
570 1 : CATCH_REQUIRE(fullnames.size() == filenames.size());
571 31 : for(size_t idx(0); idx < filenames.size(); ++idx)
572 : {
573 30 : CATCH_REQUIRE(fullnames[idx] == filenames[idx]);
574 : }
575 :
576 : {
577 2 : std::ofstream conf;
578 1 : conf.open(SNAP_CATCH2_NAMESPACE::g_config_filename, std::ios_base::out);
579 1 : CATCH_REQUIRE(conf.is_open());
580 1 : conf << "# Original Config with a number" << std::endl;
581 1 : conf << "var=master value" << std::endl;
582 :
583 : // verify the master config file
584 : //
585 2 : advgetopt::conf_file_setup setup(SNAP_CATCH2_NAMESPACE::g_config_filename);
586 2 : advgetopt::conf_file::pointer_t config_file(advgetopt::conf_file::get_conf_file(setup));
587 1 : CATCH_REQUIRE(config_file->get_parameter("var") == "master value");
588 : }
589 :
590 : {
591 : // run a load to verify that we indeed get the last var=...
592 : // value and not some random entry
593 : //
594 2 : std::string temp_dir = SNAP_CATCH2_NAMESPACE::g_tmp_dir + "/.config";
595 1 : char const * const dirs[] = {
596 1 : temp_dir.c_str(),
597 : nullptr
598 1 : };
599 1 : advgetopt::option opts[] = {
600 : advgetopt::define_option(
601 : advgetopt::Name("var")
602 : , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_SHOW_USAGE_ON_ERROR>())
603 : , advgetopt::Help("verify loading configuration files in a serie.")
604 : ),
605 : advgetopt::end_options()
606 : };
607 : #pragma GCC diagnostic push
608 : #pragma GCC diagnostic ignored "-Wpedantic"
609 1 : advgetopt::options_environment env = {
610 : .f_project_name = "sorted-configs",
611 : .f_group_name = "advgetopt-multi",
612 : .f_options = opts,
613 : .f_options_files_directory = nullptr,
614 : .f_environment_variable_name = nullptr,
615 : .f_configuration_files = nullptr,
616 : .f_configuration_filename = "sorted-user-conf.config",
617 : .f_configuration_directories = dirs,
618 : .f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_PROCESS_SYSTEM_PARAMETERS,
619 : .f_help_header = nullptr,
620 : .f_help_footer = nullptr,
621 : .f_version = nullptr,
622 : .f_license = nullptr,
623 : .f_copyright = nullptr,
624 : .f_build_date = UTC_BUILD_DATE,
625 : .f_build_time = UTC_BUILD_TIME,
626 : .f_groups = nullptr
627 1 : };
628 : #pragma GCC diagnostic pop
629 1 : char const * const argv[] = {
630 : "test",
631 : nullptr
632 : };
633 2 : advgetopt::getopt opt(env, 1, const_cast<char **>(argv));
634 1 : CATCH_REQUIRE(memcmp(&opt.get_options_environment(), &env, sizeof(env)) == 0);
635 1 : CATCH_REQUIRE(opt.get_string("var") == expected_var);
636 : }
637 : }
638 : CATCH_END_SECTION()
639 4 : }
640 :
641 :
642 :
643 :
644 :
645 :
646 :
647 5 : CATCH_TEST_CASE("utils_handle_user_directory", "[utils][valid]")
648 : {
649 6 : CATCH_START_SECTION("Valid cases")
650 2 : snap::safe_setenv env("HOME", "/home/advgetopt");
651 :
652 : {
653 2 : std::string result(advgetopt::handle_user_directory("~"));
654 1 : CATCH_REQUIRE(result == "/home/advgetopt");
655 : }
656 :
657 : {
658 2 : std::string result(advgetopt::handle_user_directory("~/"));
659 1 : CATCH_REQUIRE(result == "/home/advgetopt/");
660 : }
661 :
662 : {
663 2 : std::string result(advgetopt::handle_user_directory("~/.config/advgetopt.conf"));
664 1 : CATCH_REQUIRE(result == "/home/advgetopt/.config/advgetopt.conf");
665 : }
666 : CATCH_END_SECTION()
667 :
668 6 : CATCH_START_SECTION("$HOME is empty")
669 2 : snap::safe_setenv env("HOME", "");
670 :
671 : {
672 2 : std::string result(advgetopt::handle_user_directory("~"));
673 1 : CATCH_REQUIRE(result == "~");
674 : }
675 :
676 : {
677 2 : std::string result(advgetopt::handle_user_directory("~/.config/advgetopt.conf"));
678 1 : CATCH_REQUIRE(result == "~/.config/advgetopt.conf");
679 : }
680 : CATCH_END_SECTION()
681 :
682 6 : CATCH_START_SECTION("Paths do not start with ~")
683 2 : snap::safe_setenv env("HOME", "/home/advgetopt");
684 :
685 : {
686 2 : std::string result(advgetopt::handle_user_directory("/~"));
687 1 : CATCH_REQUIRE(result == "/~");
688 : }
689 :
690 : {
691 2 : std::string result(advgetopt::handle_user_directory("/~/.config/advgetopt.conf"));
692 1 : CATCH_REQUIRE(result == "/~/.config/advgetopt.conf");
693 : }
694 : CATCH_END_SECTION()
695 3 : }
696 :
697 :
698 :
699 :
700 :
701 4 : CATCH_TEST_CASE("utils_true_false", "[utils][boolean]")
702 : {
703 4 : CATCH_START_SECTION("True Values")
704 : {
705 1 : CATCH_REQUIRE(advgetopt::is_true("true"));
706 1 : CATCH_REQUIRE(advgetopt::is_true("on"));
707 1 : CATCH_REQUIRE(advgetopt::is_true("1"));
708 :
709 1 : CATCH_REQUIRE_FALSE(advgetopt::is_true("false"));
710 1 : CATCH_REQUIRE_FALSE(advgetopt::is_true("off"));
711 1 : CATCH_REQUIRE_FALSE(advgetopt::is_true("0"));
712 :
713 1 : CATCH_REQUIRE_FALSE(advgetopt::is_true("random"));
714 : }
715 : CATCH_END_SECTION()
716 :
717 4 : CATCH_START_SECTION("False Values")
718 : {
719 1 : CATCH_REQUIRE(advgetopt::is_false("false"));
720 1 : CATCH_REQUIRE(advgetopt::is_false("off"));
721 1 : CATCH_REQUIRE(advgetopt::is_false("0"));
722 :
723 1 : CATCH_REQUIRE_FALSE(advgetopt::is_false("true"));
724 1 : CATCH_REQUIRE_FALSE(advgetopt::is_false("on"));
725 1 : CATCH_REQUIRE_FALSE(advgetopt::is_false("1"));
726 :
727 1 : CATCH_REQUIRE_FALSE(advgetopt::is_false("random"));
728 : }
729 : CATCH_END_SECTION()
730 8 : }
731 :
732 :
733 :
734 :
735 :
736 :
737 :
738 : // vim: ts=4 sw=4 et
|