libamxo  4.3.4
Object Definition Language (ODL) parsing
test_invalid_odl.c
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** SPDX-License-Identifier: BSD-2-Clause-Patent
4 **
5 ** SPDX-FileCopyrightText: Copyright (c) 2023 SoftAtHome
6 **
7 ** Redistribution and use in source and binary forms, with or without modification,
8 ** are permitted provided that the following conditions are met:
9 **
10 ** 1. Redistributions of source code must retain the above copyright notice,
11 ** this list of conditions and the following disclaimer.
12 **
13 ** 2. Redistributions in binary form must reproduce the above copyright notice,
14 ** this list of conditions and the following disclaimer in the documentation
15 ** and/or other materials provided with the distribution.
16 **
17 ** Subject to the terms and conditions of this license, each copyright holder
18 ** and contributor hereby grants to those receiving rights under this license
19 ** a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable
20 ** (except for failure to satisfy the conditions of this license) patent license
21 ** to make, have made, use, offer to sell, sell, import, and otherwise transfer
22 ** this software, where such license applies only to those patent claims, already
23 ** acquired or hereafter acquired, licensable by such copyright holder or contributor
24 ** that are necessarily infringed by:
25 **
26 ** (a) their Contribution(s) (the licensed copyrights of copyright holders and
27 ** non-copyrightable additions of contributors, in source or binary form) alone;
28 ** or
29 **
30 ** (b) combination of their Contribution(s) with the work of authorship to which
31 ** such Contribution(s) was added by such copyright holder or contributor, if,
32 ** at the time the Contribution is added, such addition causes such combination
33 ** to be necessarily infringed. The patent license shall not apply to any other
34 ** combinations which include the Contribution.
35 **
36 ** Except as expressly stated above, no rights or licenses from any copyright
37 ** holder or contributor is granted under this license, whether expressly, by
38 ** implication, estoppel or otherwise.
39 **
40 ** DISCLAIMER
41 **
42 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
43 ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44 ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45 ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
46 ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47 ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
48 ** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
49 ** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
50 ** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
51 ** USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
52 **
53 ****************************************************************************/
54 #include <sys/time.h>
55 #include <sys/resource.h>
56 #include <sys/types.h>
57 #include <sys/stat.h>
58 
59 #include <string.h>
60 #include <stdlib.h>
61 #include <stdio.h>
62 #include <stdarg.h>
63 #include <stddef.h>
64 #include <setjmp.h>
65 #include <inttypes.h>
66 #include <limits.h>
67 #include <unistd.h>
68 #include <fcntl.h>
69 #include <cmocka.h>
70 
71 #include <amxc/amxc.h>
72 #include <amxp/amxp_signal.h>
73 #include <amxd/amxd_dm.h>
74 #include <amxd/amxd_object.h>
75 #include <amxd/amxd_parameter.h>
76 #include <amxo/amxo.h>
77 
78 #include "test_invalid_odl.h"
79 
80 #include <amxc/amxc_macros.h>
81 static amxd_status_t test_dummy_action(UNUSED amxd_object_t* const object,
82  UNUSED amxd_param_t* const param,
83  UNUSED amxd_action_t reason,
84  UNUSED const amxc_var_t* const args,
85  UNUSED amxc_var_t* const retval,
86  UNUSED void* priv) {
87  return amxd_status_ok;
88 }
89 
90 static void _print_event(const char* const sig_name,
91  UNUSED const amxc_var_t* const data,
92  UNUSED void* const priv) {
93 
94  printf("Event received %s\n", sig_name);
95 }
96 
97 void test_invalid_object_attrs(UNUSED void** state) {
98  amxd_dm_t dm;
99  amxo_parser_t parser;
100  const char* odls[] = {
101  "%define { %in object Test; }",
102  "%define { %out object Test; }",
103  "%define { %mandatory object Test; }",
104  "%define { %strict object Test; }",
105  "%define { %volatile object Test; }",
106  "%define { %template object Test; }",
107  "%define { %instance object Test; }",
108  NULL
109  };
110 
111  amxd_dm_init(&dm);
112  amxo_parser_init(&parser);
113 
114  for(int i = 0; odls[i] != NULL; i++) {
115  assert_int_not_equal(amxo_parser_parse_string(&parser, odls[i], amxd_dm_get_root(&dm)), 0);
116  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_invalid_attr);
117  amxd_dm_clean(&dm);
118  }
119 
120  amxo_parser_clean(&parser);
121  amxd_dm_clean(&dm);
122 }
123 
124 void test_invalid_param_attrs(UNUSED void** state) {
125  amxd_dm_t dm;
126  amxo_parser_t parser;
127  const char* odls[] = {
128  "%define { object Test { %in string Param; } }",
129  "%define { object Test { %out string Param; } }",
130  "%define { object Test { %mandatory string Param; } }",
131  "%define { object Test { %strict string Param; } }",
132  NULL
133  };
134 
135  amxd_dm_init(&dm);
136  amxo_parser_init(&parser);
137 
138  for(int i = 0; odls[i] != NULL; i++) {
139  assert_int_not_equal(amxo_parser_parse_string(&parser, odls[i], amxd_dm_get_root(&dm)), 0);
140  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_invalid_attr);
141  amxd_dm_clean(&dm);
142  }
143 
144  amxo_parser_clean(&parser);
145  amxd_dm_clean(&dm);
146 }
147 
148 void test_invalid_func_attrs(UNUSED void** state) {
149  amxd_dm_t dm;
150  amxo_parser_t parser;
151  const char* odls[] = {
152  "%define { object Test { %read-only void Func(); } }",
153  "%define { object Test { %persistent void Func(); } }",
154  "%define { object Test { %in void Func(); } }",
155  "%define { object Test { %out void Func(); } }",
156  "%define { object Test { %mandatory void Func(); } }",
157  "%define { object Test { %strict void Func(); } }",
158  "%define { object Test { %volatile void Func(); } }",
159  NULL
160  };
161 
162  amxd_dm_init(&dm);
163  amxo_parser_init(&parser);
164 
165  for(int i = 0; odls[i] != NULL; i++) {
166  assert_int_not_equal(amxo_parser_parse_string(&parser, odls[i], amxd_dm_get_root(&dm)), 0);
167  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_invalid_attr);
168  amxd_dm_clean(&dm);
169  }
170 
171  amxo_parser_clean(&parser);
172  amxd_dm_clean(&dm);
173 }
174 
175 void test_add_inst_on_singelton(UNUSED void** state) {
176  amxd_dm_t dm;
177  amxo_parser_t parser;
178  const char* odl =
179  "%define { object Test; }" \
180  "%populate { object Test { instance add(0,\"\"); } }";
181 
182  amxd_dm_init(&dm);
183  amxo_parser_init(&parser);
184 
185  assert_int_not_equal(amxo_parser_parse_string(&parser, odl, amxd_dm_get_root(&dm)), 0);
186  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_invalid_type);
187 
188  amxo_parser_clean(&parser);
189  amxd_dm_clean(&dm);
190 }
191 
192 void test_duplicate_inst_index(UNUSED void** state) {
193  amxd_dm_t dm;
194  amxo_parser_t parser;
195  const char* odl =
196  "%define { object Test[]; }" \
197  "%populate { object Test { instance add(1,\"\"); instance add(1,\"\"); } }";
198 
199  amxd_dm_init(&dm);
200  amxo_parser_init(&parser);
201 
202  assert_int_not_equal(amxo_parser_parse_string(&parser, odl, amxd_dm_get_root(&dm)), 0);
203  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_duplicate);
204 
205  amxo_parser_clean(&parser);
206  amxd_dm_clean(&dm);
207 }
208 
209 void test_duplicate_inst_name(UNUSED void** state) {
210  amxd_dm_t dm;
211  amxo_parser_t parser;
212  const char* odl =
213  "%define { object Test[]; }" \
214  "%populate { object Test { instance add(0,\"AB\"); instance add(0,\"AB\"); } }";
215 
216  amxd_dm_init(&dm);
217  amxo_parser_init(&parser);
218 
219  assert_int_not_equal(amxo_parser_parse_string(&parser, odl, amxd_dm_get_root(&dm)), 0);
220  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_duplicate);
221 
222  amxo_parser_clean(&parser);
223  amxd_dm_clean(&dm);
224 }
225 
226 void test_invalid_inst_name(UNUSED void** state) {
227  amxd_dm_t dm;
228  amxo_parser_t parser;
229  const char* odl =
230  "%define { object Test[]; }" \
231  "%populate { object Test { instance add(0,\"%Text$\"); instance add(0,\"AB\"); } }";
232 
233  amxd_dm_init(&dm);
234  amxo_parser_init(&parser);
235 
236  assert_int_not_equal(amxo_parser_parse_string(&parser, odl, amxd_dm_get_root(&dm)), 0);
237  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_invalid_name);
238 
239  amxo_parser_clean(&parser);
240  amxd_dm_clean(&dm);
241 }
242 
243 void test_instance_of_singleton(UNUSED void** state) {
244  amxd_dm_t dm;
245  amxo_parser_t parser;
246  const char* odl =
247  "%define { object Test; }" \
248  "%populate { object Test { instance add(0,\"Text\"); instance add(0,\"AB\"); } }";
249 
250  amxd_dm_init(&dm);
251  amxo_parser_init(&parser);
252 
253  assert_int_not_equal(amxo_parser_parse_string(&parser, odl, amxd_dm_get_root(&dm)), 0);
254  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_invalid_type);
255 
256  amxo_parser_clean(&parser);
257  amxd_dm_clean(&dm);
258 }
259 
260 void test_duplicate_obj_name(UNUSED void** state) {
261  amxd_dm_t dm;
262  amxo_parser_t parser;
263  const char* odl = "%define { object Test1; object Test2; object Test1; }";
264 
265  amxd_dm_init(&dm);
266  amxo_parser_init(&parser);
267 
268  assert_int_not_equal(amxo_parser_parse_string(&parser, odl, amxd_dm_get_root(&dm)), 0);
269  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_duplicate);
270 
271  amxo_parser_clean(&parser);
272  amxd_dm_clean(&dm);
273 }
274 
275 void test_invalid_obj_name(UNUSED void** state) {
276  amxd_dm_t dm;
277  amxo_parser_t parser;
278  const char* odl = "%define { object \"23&Test1\"; }";
279 
280  amxd_dm_init(&dm);
281  amxo_parser_init(&parser);
282 
283  assert_int_not_equal(amxo_parser_parse_string(&parser, odl, amxd_dm_get_root(&dm)), 0);
284  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_invalid_name);
285 
286  amxo_parser_clean(&parser);
287  amxd_dm_clean(&dm);
288 }
289 
290 void test_duplicate_param_name(UNUSED void** state) {
291  amxd_dm_t dm;
292  amxo_parser_t parser;
293  const char* odl = "%define { object Test { string P1; string P2; string P1; } }";
294 
295  amxd_dm_init(&dm);
296  amxo_parser_init(&parser);
297 
298  assert_int_not_equal(amxo_parser_parse_string(&parser, odl, amxd_dm_get_root(&dm)), 0);
299  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_duplicate);
300 
301  amxo_parser_clean(&parser);
302  amxd_dm_clean(&dm);
303 }
304 
306  amxd_dm_t dm;
307  amxo_parser_t parser;
308  const char* odl = "%define { object Test { string P1; object TT[] { counted with P1; } } }";
309 
310  amxd_dm_init(&dm);
311  amxo_parser_init(&parser);
312 
313  assert_int_not_equal(amxo_parser_parse_string(&parser, odl, amxd_dm_get_root(&dm)), 0);
314  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_duplicate);
315 
316  amxo_parser_clean(&parser);
317  amxd_dm_clean(&dm);
318 }
319 
320 void test_invalid_param_name(UNUSED void** state) {
321  amxd_dm_t dm;
322  amxo_parser_t parser;
323  const char* odl = "%define { object Test { string \"12$P1\"; } }";
324 
325  amxd_dm_init(&dm);
326  amxo_parser_init(&parser);
327 
328  assert_int_not_equal(amxo_parser_parse_string(&parser, odl, amxd_dm_get_root(&dm)), 0);
329  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_invalid_name);
330 
331  amxo_parser_clean(&parser);
332  amxd_dm_clean(&dm);
333 }
334 
335 void test_invalid_func_name(UNUSED void** state) {
336  amxd_dm_t dm;
337  amxo_parser_t parser;
338  const char* odl = "%define { object Test { void \"F$1\"(); } }";
339 
340  amxd_dm_init(&dm);
341  amxo_parser_init(&parser);
342 
343  assert_int_not_equal(amxo_parser_parse_string(&parser, odl, amxd_dm_get_root(&dm)), 0);
344  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_invalid_name);
345 
346  amxo_parser_clean(&parser);
347  amxd_dm_clean(&dm);
348 }
349 
351  amxd_dm_t dm;
352  amxo_parser_t parser;
353  const char* odl = "%define { object Test { void F1(bool a1, bool a2, bool a1); } }";
354 
355  amxd_dm_init(&dm);
356  amxo_parser_init(&parser);
357 
358  assert_int_not_equal(amxo_parser_parse_string(&parser, odl, amxd_dm_get_root(&dm)), 0);
359  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_invalid_name);
360 
361  amxo_parser_clean(&parser);
362  amxd_dm_clean(&dm);
363 }
364 
366  amxd_dm_t dm;
367  amxo_parser_t parser;
368  const char* odl = "%define { object Test; } %populate { object NoneExisting; }";
369 
370  amxd_dm_init(&dm);
371  amxo_parser_init(&parser);
372 
373  assert_int_not_equal(amxo_parser_parse_string(&parser, odl, amxd_dm_get_root(&dm)), 0);
374  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_object_not_found);
375 
376  amxo_parser_clean(&parser);
377  amxd_dm_clean(&dm);
378 }
379 
381  amxd_dm_t dm;
382  amxo_parser_t parser;
383  const char* odl = "%define { object Test { string P1;} } %populate { object Test { parameter P2 = \"text\"; } }";
384 
385  amxd_dm_init(&dm);
386  amxo_parser_init(&parser);
387 
388  assert_int_not_equal(amxo_parser_parse_string(&parser, odl, amxd_dm_get_root(&dm)), 0);
389  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_parameter_not_found);
390 
391  amxo_parser_clean(&parser);
392  amxd_dm_clean(&dm);
393 }
394 
395 void test_invalid_param_value(UNUSED void** state) {
396  amxd_dm_t dm;
397  amxo_parser_t parser;
398  const char* odl = "%define { object Test { bool P1;} } %populate { object Test { parameter P1 = \"text\"; } }";
399  const char* odl2 = "%define { object Test { string P1;} } %populate { object Test { parameter P1 = [ 1, 2, 3 ]; } }";
400 
401  amxd_dm_init(&dm);
402  amxo_parser_init(&parser);
403 
404  assert_int_not_equal(amxo_parser_parse_string(&parser, odl, amxd_dm_get_root(&dm)), 0);
405  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_invalid_value);
406  amxd_dm_clean(&dm);
407 
408  assert_int_not_equal(amxo_parser_parse_string(&parser, odl2, amxd_dm_get_root(&dm)), 0);
409  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_invalid_value);
410 
411  amxo_parser_clean(&parser);
412  amxd_dm_clean(&dm);
413 }
414 
416  amxd_dm_t dm;
417  amxo_parser_t parser;
418  const char* odl =
419  "%define {"
420  " object Test {"
421  " uint32 P1 {"
422  " default 50;"
423  " on action validate call check_maximum 10;"
424  " }"
425  " }"
426  "}";
427 
428  amxd_dm_init(&dm);
429  amxo_parser_init(&parser);
430 
431  assert_int_not_equal(amxo_parser_parse_string(&parser, odl, amxd_dm_get_root(&dm)), 0);
432  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_invalid_value);
433 
434  amxo_parser_clean(&parser);
435  amxd_dm_clean(&dm);
436 }
437 
438 void test_invalid_action_name(UNUSED void** state) {
439  amxd_dm_t dm;
440  amxo_parser_t parser;
441  const char* odl =
442  "%define {"
443  " object Test {"
444  " uint32 P1 {"
445  " default 50;"
446  " on action reset call dummy;"
447  " }"
448  " }"
449  "}";
450 
451  amxd_dm_init(&dm);
452  amxo_parser_init(&parser);
453 
455 
456  assert_int_not_equal(amxo_parser_parse_string(&parser, odl, amxd_dm_get_root(&dm)), 0);
457  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_invalid_action);
458 
459  amxo_parser_clean(&parser);
460  amxd_dm_clean(&dm);
461 }
462 
464  amxd_dm_t dm;
465  amxo_parser_t parser;
466  const char* odl =
467  "%define {"
468  " object Test {"
469  " on action reset call dummy;"
470  " }"
471  "}";
472 
473  amxd_dm_init(&dm);
474  amxo_parser_init(&parser);
475 
477 
478  assert_int_not_equal(amxo_parser_parse_string(&parser, odl, amxd_dm_get_root(&dm)), 0);
479  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_invalid_action);
480 
481  amxo_parser_clean(&parser);
482  amxd_dm_clean(&dm);
483 }
484 
485 void test_invalid_resolvers(UNUSED void** state) {
486  amxd_dm_t dm;
487  amxo_parser_t parser;
488  const char* odls[] = {
489  "%define { object Test { void test()<!!>;} }",
490  "%define { object Test { void test()<!:!>;} }",
491  "%define { object Test { void test()<!:echo!>;} }",
492  "%define { object Test { void test()<!invalid:echo!>;} }",
493  "%define { object Test { void test()<!more!>;} }",
494  NULL
495  };
496 
497  amxd_dm_init(&dm);
498  amxo_parser_init(&parser);
499 
500  for(int i = 0; odls[i] != NULL; i++) {
501  assert_int_not_equal(amxo_parser_parse_string(&parser, odls[i], amxd_dm_get_root(&dm)), 0);
502  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_invalid_name);
503  amxd_dm_clean(&dm);
504  }
505 
506  amxo_parser_clean(&parser);
507  amxd_dm_clean(&dm);
508 }
509 
511  amxd_dm_t dm;
512  amxo_parser_t parser;
513  const char* odls[] = {
514  " import \"../test_plugin/test_plugin.so\" as test_plugin; %define { entry-point test_plugin.not_existing; }",
515  NULL
516  };
517 
518  amxd_dm_init(&dm);
519  amxo_parser_init(&parser);
520 
521  for(int i = 0; odls[i] != NULL; i++) {
522  assert_int_not_equal(amxo_parser_parse_string(&parser, odls[i], amxd_dm_get_root(&dm)), 0);
523  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_function_not_found);
524  amxd_dm_clean(&dm);
525  }
526 
527  amxo_parser_clean(&parser);
528  amxd_dm_clean(&dm);
529 }
530 
532  amxd_dm_t dm;
533  amxo_parser_t parser;
534  const char* odls[] = {
535  "%define { object Test { string Text { on action \"list\" call dummy; } } }",
536  "%define { object Test { string Text { on action add-inst call dummy; } } }",
537  "%define { object Test { string Text { on action del-inst call dummy; } } }",
538  NULL
539  };
540 
541  amxd_dm_init(&dm);
542  amxo_parser_init(&parser);
543 
545 
546  for(int i = 0; odls[i] != NULL; i++) {
547  assert_int_not_equal(amxo_parser_parse_string(&parser, odls[i], amxd_dm_get_root(&dm)), 0);
548  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_invalid_action);
549  amxd_dm_clean(&dm);
550  }
551 
552  amxo_parser_clean(&parser);
553  amxd_dm_clean(&dm);
554 }
555 
556 void test_not_resolved_action(UNUSED void** state) {
557  amxd_dm_t dm;
558  amxo_parser_t parser;
559  const char* odls[] = {
560  "%define { object Test { on action \"list\" call not_existing; } }",
561  "%define { object Test { string Text { on action read call no_existing; } } }",
562  "%define { object Test { on action write call not_existing; } }",
563  NULL
564  };
565 
566  amxd_dm_init(&dm);
567  amxo_parser_init(&parser);
568 
569  for(int i = 0; odls[i] != NULL; i++) {
570  assert_int_equal(amxo_parser_parse_string(&parser, odls[i], amxd_dm_get_root(&dm)), 0);
571  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_ok);
572  amxd_dm_clean(&dm);
573  }
574 
575  amxo_parser_clean(&parser);
576  amxd_dm_clean(&dm);
577 }
578 
579 void test_add_not_existing_mib(UNUSED void** state) {
580  amxd_dm_t dm;
581  amxo_parser_t parser;
582  const char* odls[] = {
583  "%define { object Test { extend with mib FakeMib; } }",
584  NULL
585  };
586 
587  amxd_dm_init(&dm);
588  amxo_parser_init(&parser);
589 
590  for(int i = 0; odls[i] != NULL; i++) {
591  assert_int_not_equal(amxo_parser_parse_string(&parser, odls[i], amxd_dm_get_root(&dm)), 0);
592  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_object_not_found);
593  amxd_dm_clean(&dm);
594  }
595 
596  amxo_parser_clean(&parser);
597  amxd_dm_clean(&dm);
598 }
599 
601  amxd_dm_t dm;
602  amxo_parser_t parser;
603  const char* odls[] = {
604  "%define { mib TestMib { string Text; } object Test { string Text; extend with mib TestMib; } }",
605  "%define { mib TestMib { string Text; } object Test { extend with mib TestMib; string Text; } }",
606  NULL
607  };
608 
609  amxd_dm_init(&dm);
610  amxo_parser_init(&parser);
611 
612  for(int i = 0; odls[i] != NULL; i++) {
613  assert_int_not_equal(amxo_parser_parse_string(&parser, odls[i], amxd_dm_get_root(&dm)), 0);
614  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_duplicate);
615  amxd_dm_clean(&dm);
616  }
617 
618  amxo_parser_clean(&parser);
619  amxd_dm_clean(&dm);
620 }
621 
623  amxd_dm_t dm;
624  amxo_parser_t parser;
625 
626  const char* odl =
627  "%define {\n"
628  " object Test { string text = \"Hallo\"; }\n"
629  "}\n"
630  "%populate {\n"
631  " on event \".*\" call print_event \n"
632  " filter \'object matches \"[(adsads[\"';\n"
633  "}\n";
634 
635  amxd_dm_init(&dm);
636  amxo_parser_init(&parser);
637 
638  amxo_resolver_ftab_add(&parser, "print_event", AMXO_FUNC(_print_event));
639  assert_int_not_equal(amxo_parser_parse_string(&parser, odl, amxd_dm_get_root(&dm)), 0);
640  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_invalid_value);
641 
642  amxo_parser_clean(&parser);
643  amxd_dm_clean(&dm);
644 }
645 
646 void test_invalid_key_params(UNUSED void** state) {
647  amxd_dm_t dm;
648  amxo_parser_t parser;
649 
650  const char* odl_1 =
651  "%define {\n"
652  " object TestRoot {\n"
653  " object Test[] {\n"
654  " %key string text;\n"
655  " }\n"
656  " }\n"
657  "}\n"
658  "%populate {\n"
659  " object TestRoot.Test {\n"
660  " instance add();\n"
661  " }\n"
662  "}\n";
663 
664  const char* odl_2 =
665  "%define {\n"
666  " object TestRoot {\n"
667  " object Test[] {\n"
668  " %key string text;\n"
669  " }\n"
670  " }\n"
671  "}\n"
672  "%populate {\n"
673  " object TestRoot.Test {\n"
674  " instance add() {\n"
675  " parameter text = \"KeyValue\";\n"
676  " }\n"
677  " }\n"
678  "}\n";
679 
680  const char* odl_3 =
681  "%define {\n"
682  " object TestRoot {\n"
683  " object Test[] {\n"
684  " %key string text;\n"
685  " }\n"
686  " }\n"
687  "}\n"
688  "%populate {\n"
689  " object TestRoot.Test {\n"
690  " instance add(text = \"key1\");\n"
691  " instance add(text = \"key1\");\n"
692  " }\n"
693  "}\n";
694 
695  const char* odl_4 =
696  "%define {\n"
697  " object TestRoot {\n"
698  " object Test[] {\n"
699  " %key string text = \"Hallo\";\n"
700  " }\n"
701  " }\n"
702  "}\n";
703 
704  amxd_dm_init(&dm);
705  amxo_parser_init(&parser);
706 
707  printf("%s\n", odl_1);
708  fflush(stdout);
709  assert_int_not_equal(amxo_parser_parse_string(&parser, odl_1, amxd_dm_get_root(&dm)), 0);
710  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_missing_key);
711  amxd_dm_clean(&dm);
712 
713  printf("%s\n", odl_2);
714  fflush(stdout);
715  assert_int_not_equal(amxo_parser_parse_string(&parser, odl_2, amxd_dm_get_root(&dm)), 0);
716  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_missing_key);
717  amxd_dm_clean(&dm);
718 
719  printf("%s\n", odl_3);
720  fflush(stdout);
721  assert_int_not_equal(amxo_parser_parse_string(&parser, odl_3, amxd_dm_get_root(&dm)), 0);
722  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_duplicate);
723  amxd_dm_clean(&dm);
724 
725  printf("%s\n", odl_4);
726  fflush(stdout);
727  assert_int_not_equal(amxo_parser_parse_string(&parser, odl_4, amxd_dm_get_root(&dm)), 0);
728  assert_int_equal(amxo_parser_get_status(&parser), amxd_status_invalid_value);
729  amxd_dm_clean(&dm);
730 
731  amxo_parser_clean(&parser);
732 }
733 
734 void test_empty_file_name(UNUSED void** state) {
735  amxd_dm_t dm;
736  amxo_parser_t parser;
737 
738  amxd_dm_init(&dm);
739  amxo_parser_init(&parser);
740 
741  assert_int_not_equal(amxo_parser_parse_file(&parser, "", amxd_dm_get_root(&dm)), 0);
742 
743  amxo_parser_clean(&parser);
744  amxd_dm_clean(&dm);
745 }
746 
748  amxd_dm_t dm;
749  amxo_parser_t* parser = NULL;
750 
751  amxd_dm_init(&dm);
752  amxo_parser_new(&parser);
753 
754  assert_int_not_equal(amxo_parser_parse_file(parser, "./non-existing.odl", amxd_dm_get_root(&dm)), 0);
755 
756  amxo_parser_delete(&parser);
757  amxd_dm_clean(&dm);
759 }
Ambiorix ODL parser header file.
include test_include odl
Definition: test_valid.odl:66
int amxo_parser_parse_string(amxo_parser_t *parser, const char *text, amxd_object_t *object)
Parses a string containing a valid ODL part.
void amxo_parser_clean(amxo_parser_t *parser)
Cleans up the odl parser instance.
int amxo_parser_parse_file(amxo_parser_t *parser, const char *file_path, amxd_object_t *object)
Parses an odl file.
int amxo_parser_new(amxo_parser_t **parser)
Allocates memory for a new parser instance on the heap and initializes the odl parser.
static amxd_status_t amxo_parser_get_status(amxo_parser_t *parser)
Get the status of the odl parser.
Definition: amxo.h:414
int amxo_parser_init(amxo_parser_t *parser)
Initializes a new odl parser instance.
void amxo_parser_delete(amxo_parser_t **parser)
Cleans the odl parser content and frees the allocated memory.
int amxo_resolver_ftab_add(amxo_parser_t *parser, const char *fn_name, amxo_fn_ptr_t fn)
Adds a C function to the function table.
void amxo_resolver_import_close_all(void)
Unloads all loaded shared objects.
#define AMXO_FUNC(x)
Function ponter caster macro.
Definition: amxo_types.h:80
The ODL parser structure.
Definition: amxo_types.h:245
void test_duplicate_param_name_with_counter(UNUSED void **state)
void test_add_mib_with_duplicates(UNUSED void **state)
void test_add_not_existing_mib(UNUSED void **state)
void test_invalid_parameter_actions(UNUSED void **state)
void test_invalid_action_name(UNUSED void **state)
void test_add_inst_on_singelton(UNUSED void **state)
void test_invalid_param_value(UNUSED void **state)
void test_invalid_param_attrs(UNUSED void **state)
void test_invalid_key_params(UNUSED void **state)
void test_invalid_object_attrs(UNUSED void **state)
void test_duplicate_func_arg_name(UNUSED void **state)
void test_invalid_param_value_validate(UNUSED void **state)
void test_not_resolved_action(UNUSED void **state)
void test_select_none_existing_obj(UNUSED void **state)
void test_invalid_resolvers(UNUSED void **state)
void test_invalid_obj_name(UNUSED void **state)
void test_duplicate_param_name(UNUSED void **state)
static amxd_status_t test_dummy_action(UNUSED amxd_object_t *const object, UNUSED amxd_param_t *const param, UNUSED amxd_action_t reason, UNUSED const amxc_var_t *const args, UNUSED amxc_var_t *const retval, UNUSED void *priv)
void test_invalid_func_attrs(UNUSED void **state)
void test_invalid_param_name(UNUSED void **state)
void test_duplicate_obj_name(UNUSED void **state)
void test_duplicate_inst_name(UNUSED void **state)
void test_select_none_existing_param(UNUSED void **state)
void test_duplicate_inst_index(UNUSED void **state)
void test_not_existing_entry_point(UNUSED void **state)
void test_invalid_inst_name(UNUSED void **state)
static void _print_event(const char *const sig_name, UNUSED const amxc_var_t *const data, UNUSED void *const priv)
void test_invalid_regexp_in_filter(UNUSED void **state)
void test_instance_of_singleton(UNUSED void **state)
void test_empty_file_name(UNUSED void **state)
void test_invalid_object_action_name(UNUSED void **state)
void test_invalid_func_name(UNUSED void **state)
void test_parse_non_existing_file(UNUSED void **state)
#define UNUSED
Definition: test_issue_48.c:84