55 #include <sys/resource.h>
56 #include <sys/types.h>
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>
81 #include <amxc/amxc_macros.h>
85 amxc_var_t config_options;
86 amxc_var_t* the_array = NULL;
88 amxc_var_init(&config_options);
89 amxc_var_set_type(&config_options, AMXC_VAR_ID_HTABLE);
90 the_array = amxc_var_add_key(amxc_llist_t, &config_options,
"MyArray", NULL);
91 amxc_var_add(uint32_t, the_array, 100);
92 amxc_var_add(int32_t, the_array, -100);
93 amxc_var_add(
bool, the_array,
true);
94 amxc_var_add(
bool, the_array,
false);
95 amxc_var_add(cstring_t, the_array,
"Text");
96 amxc_var_add(csv_string_t, the_array,
"Text,text");
97 amxc_var_add(ssv_string_t, the_array,
"Text text");
98 amxc_var_add(uint64_t, the_array, 100);
99 amxc_var_add(int64_t, the_array, -100);
108 amxc_var_dump(&parser.
config, STDOUT_FILENO);
111 unlink(
"test_config.odl");
115 amxc_var_clean(&config_options);
121 amxc_var_t config_options;
122 amxc_var_t* the_array = NULL;
124 amxc_var_init(&config_options);
125 amxc_var_set_type(&config_options, AMXC_VAR_ID_HTABLE);
126 the_array = amxc_var_add_key(amxc_llist_t, &config_options,
"MyArray", NULL);
127 amxc_var_add(amxc_htable_t, the_array, NULL);
134 amxc_var_dump(&parser.
config, STDOUT_FILENO);
137 unlink(
"test_config.odl");
141 amxc_var_clean(&config_options);
147 amxc_var_t config_options;
148 amxc_var_t* the_table = NULL;
150 amxc_var_init(&config_options);
151 amxc_var_set_type(&config_options, AMXC_VAR_ID_HTABLE);
152 the_table = amxc_var_add_key(amxc_htable_t, &config_options,
"populate_behavior", NULL);
153 amxc_var_add_key(cstring_t, the_table,
"unknown_parameter",
"add");
154 amxc_var_add_key(cstring_t, the_table,
"duplicate_instance",
"update");
163 amxc_var_dump(&parser.
config, STDOUT_FILENO);
166 unlink(
"test_config.odl");
170 amxc_var_clean(&config_options);
176 amxc_var_t config_options;
177 amxc_var_t* the_table = NULL;
179 amxc_var_init(&config_options);
180 amxc_var_set_type(&config_options, AMXC_VAR_ID_HTABLE);
181 the_table = amxc_var_add_key(amxc_htable_t, &config_options,
"populate_behavior", NULL);
182 amxc_var_add_key(amxc_htable_t, the_table,
"some_key", NULL);
183 amxc_var_add_key(amxc_llist_t, the_table,
"other_key", NULL);
190 amxc_var_dump(&parser.
config, STDOUT_FILENO);
193 unlink(
"test_config.odl");
197 amxc_var_clean(&config_options);
203 amxc_var_t config_options;
204 amxc_var_t* the_table = NULL;
206 amxc_var_init(&config_options);
207 amxc_var_set_type(&config_options, AMXC_VAR_ID_HTABLE);
208 the_table = amxc_var_add_key(amxc_htable_t, &config_options,
"populate_behavior", NULL);
209 amxc_var_add_key(cstring_t, the_table,
"%some_key",
"value");
210 amxc_var_add_key(cstring_t, the_table,
"key.with.dots",
"SomeValue");
211 the_table = amxc_var_add_key(amxc_htable_t, &config_options,
"root.key.with.dots", NULL);
212 amxc_var_add_key(cstring_t, the_table,
"$key",
"value");
219 amxc_var_dump(&parser.
config, STDOUT_FILENO);
226 amxc_var_clean(&config_options);
232 amxc_var_t config_options;
237 amxc_var_init(&config_options);
238 amxc_var_set_type(&config_options, AMXC_VAR_ID_HTABLE);
239 amxc_var_add_key(
bool, &config_options,
"enable_auto_detect",
true);
240 amxc_var_add_key(uint32_t, &config_options,
"iteratations", 10);
241 amxc_var_add_key(amxc_ts_t, &config_options,
"time", &now);
242 amxc_var_add_key(amxc_llist_t, &config_options,
"requires", NULL);
253 amxc_var_dump(&parser.
config, STDOUT_FILENO);
258 unlink(
"test_config.odl");
260 amxc_var_clean(&config_options);
268 amxc_var_t config_options;
273 amxc_var_init(&config_options);
274 amxc_var_set_type(&config_options, AMXC_VAR_ID_HTABLE);
275 amxc_var_add_key(
bool, &config_options,
"%enable_auto_detect",
true);
276 amxc_var_add_key(uint32_t, &config_options,
"1234AAQ", 10);
277 amxc_var_add_key(amxc_ts_t, &config_options,
"Test=Value", &now);
284 amxc_var_dump(&parser.
config, STDOUT_FILENO);
288 unlink(
"test_config.odl");
290 amxc_var_clean(&config_options);
298 amxc_var_t config_options;
300 amxc_var_init(&config_options);
301 amxc_var_set_type(&config_options, AMXC_VAR_ID_HTABLE);
302 amxc_var_add_key(
double, &config_options,
"1234AAQ", 10.3);
303 amxc_var_add_key(fd_t, &config_options,
"Test=Value", 22);
310 amxc_var_clean(&config_options);
318 amxc_var_t config_options;
323 amxc_var_init(&config_options);
324 amxc_var_set_type(&config_options, AMXC_VAR_ID_HTABLE);
325 amxc_var_add_key(
bool, &config_options,
"enable_auto_detect",
true);
326 amxc_var_add_key(uint32_t, &config_options,
"iteratations", 10);
327 amxc_var_add_key(amxc_ts_t, &config_options,
"time", &now);
334 amxc_var_clean(&config_options);
335 amxc_var_set_type(&config_options, AMXC_VAR_ID_HTABLE);
336 amxc_var_add_key(
bool, &config_options,
"fixed_dir",
true);
337 amxc_var_add_key(uint32_t, &config_options,
"max_objects", 10);
347 amxc_var_dump(&parser.
config, STDOUT_FILENO);
354 unlink(
"test_config.odl");
356 amxc_var_clean(&config_options);
364 amxd_object_t*
object = NULL;
365 amxd_object_t* instance = NULL;
370 amxc_var_init(&values);
371 amxc_var_set_type(&values, AMXC_VAR_ID_HTABLE);
372 amxc_var_add_key(cstring_t, &values,
"Text",
"Key3");
375 object = amxd_dm_findf(&dm,
"MyRootObject.ChildObject.TemplateObject");
376 assert_ptr_not_equal(
object, NULL);
377 assert_int_equal(amxd_object_add_instance(&instance,
object, NULL, 3, &values), 0);
382 object = amxd_dm_findf(&dm,
"MyRootObject.ChildObject.TemplateObject.3");
383 assert_ptr_not_equal(
object, NULL);
385 object = amxd_dm_findf(&dm,
"MyRootObject");
386 assert_int_equal(
amxo_parser_save(&parser,
"test_save.odl",
object, 2, NULL,
false), 0);
389 object = amxd_dm_findf(&dm,
"MyRootObject.ChildObject");
390 assert_ptr_not_equal(
object, NULL);
391 object = amxd_dm_findf(&dm,
"MyRootObject.ChildObject.TemplateObject.3");
392 assert_ptr_equal(
object, NULL);
394 unlink(
"test_save.odl");
395 amxc_var_clean(&values);
413 unlink(
"test_save.odl");
421 amxd_object_t*
object = NULL;
427 object = amxd_dm_findf(&dm,
"MyRootObject.ChildObject.TemplateObject.1");
432 object = amxd_dm_findf(&dm,
"MyRootObject.ChildObject.TemplateObject.1");
433 assert_ptr_not_equal(
object, NULL);
434 object = amxd_dm_findf(&dm,
"MyRootObject.ChildObject.TemplateObject.2");
435 assert_ptr_equal(
object, NULL);
437 unlink(
"test_save.odl");
445 amxd_object_t*
object = NULL;
451 object = amxd_dm_findf(&dm,
"MainObject");
453 object = amxd_dm_findf(&dm,
"MainObject.InstanceObject.1");
454 amxd_object_delete(&
object);
457 object = amxd_dm_findf(&dm,
"MainObject.InstanceObject.1");
458 assert_non_null(
object);
460 unlink(
"test_save.odl");
468 amxd_object_t*
object = NULL;
483 amxd_object_t*
object = NULL;
498 amxc_var_t* rw_data_path = NULL;
505 amxc_var_set(cstring_t, rw_data_path,
"/tmp");
507 assert_int_equal(
amxo_parser_save_object(&parser,
"${rw_data_path}/test_save.odl", amxd_dm_get_root(&dm),
false), 0);
509 fd = open(
"/tmp/test_save.odl", O_RDONLY);
510 assert_int_not_equal(fd, -1);
512 unlink(
"/tmp/test_save.odl");
532 fd = open(
"/tmp/test_save.odl", O_RDONLY);
533 assert_int_not_equal(fd, -1);
535 unlink(
"/tmp/test_save.odl");
544 amxd_object_t*
object = NULL;
551 object = amxd_dm_findf(&dm,
"MainObject.InstanceObject.1");
552 assert_non_null(
object);
553 value = amxd_object_get_value(cstring_t,
object,
"TextA", NULL);
554 assert_string_equal(value,
"\"Hello\"");
556 value = amxd_object_get_value(cstring_t,
object,
"TextB", NULL);
557 assert_string_equal(value,
"\"Hello\"");
559 value = amxd_object_get_value(cstring_t,
object,
"TextC", NULL);
560 assert_string_equal(value,
"A'B");
562 value = amxd_object_get_value(cstring_t,
object,
"TextD", NULL);
563 assert_string_equal(value,
"A\"B");
565 object = amxd_dm_findf(&dm,
"MainObject.InstanceObject.2");
566 assert_non_null(
object);
567 value = amxd_object_get_value(cstring_t,
object,
"TextA", NULL);
568 assert_string_equal(value,
"Text \"with\" single and double 'quotes'");
570 value = amxd_object_get_value(cstring_t,
object,
"TextB", NULL);
571 assert_string_equal(value,
"${test}");
573 value = amxd_object_get_value(cstring_t,
object,
"TextC", NULL);
574 assert_string_equal(value,
"");
576 value = amxd_object_get_value(cstring_t,
object,
"TextD", NULL);
577 assert_string_equal(value,
"$(test)");
580 object = amxd_dm_findf(&dm,
"MainObject");
582 object = amxd_dm_findf(&dm,
"MainObject.InstanceObject.1");
583 amxd_object_delete(&
object);
584 object = amxd_dm_findf(&dm,
"MainObject.InstanceObject.2");
585 amxd_object_delete(&
object);
588 object = amxd_dm_findf(&dm,
"MainObject.InstanceObject.1");
589 assert_non_null(
object);
590 value = amxd_object_get_value(cstring_t,
object,
"TextA", NULL);
591 assert_string_equal(value,
"\"Hello\"");
593 value = amxd_object_get_value(cstring_t,
object,
"TextB", NULL);
594 assert_string_equal(value,
"\"Hello\"");
596 value = amxd_object_get_value(cstring_t,
object,
"TextC", NULL);
597 assert_string_equal(value,
"A'B");
599 value = amxd_object_get_value(cstring_t,
object,
"TextD", NULL);
600 assert_string_equal(value,
"A\"B");
602 object = amxd_dm_findf(&dm,
"MainObject.InstanceObject.2");
603 assert_non_null(
object);
604 value = amxd_object_get_value(cstring_t,
object,
"TextA", NULL);
605 assert_string_equal(value,
"Text \"with\" single and double 'quotes'");
607 value = amxd_object_get_value(cstring_t,
object,
"TextB", NULL);
608 assert_string_equal(value,
"${test}");
610 value = amxd_object_get_value(cstring_t,
object,
"TextC", NULL);
611 assert_string_equal(value,
"");
613 value = amxd_object_get_value(cstring_t,
object,
"TextD", NULL);
614 assert_string_equal(value,
"$(test)");
617 unlink(
"test_save.odl");
Ambiorix ODL parser header file.
static size_t buffer_size
int amxo_parser_save_object(amxo_parser_t *pctx, const char *filename, amxd_object_t *object, bool append)
int amxo_parser_save_config(amxo_parser_t *pctx, const char *filename, amxc_var_t *config, bool append)
int amxo_parser_save(amxo_parser_t *pctx, const char *filename, amxd_object_t *object, uint32_t depth, amxc_var_t *config, bool append)
amxc_var_t * amxo_parser_get_config(amxo_parser_t *parser, const char *path)
Gets a configuration option.
amxc_var_t * amxo_parser_claim_config(amxo_parser_t *parser, const char *path)
Gets or creates a configuration option.
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_init(amxo_parser_t *parser)
Initializes a new odl parser instance.
The ODL parser structure.
void test_save_config_array(UNUSED void **state)
void test_save_takes_rw_data_path_into_account(UNUSED void **state)
void test_save_fails_if_append_to_none_existing_file(UNUSED void **state)
void test_save_config_succeeds_when_using_keys_with_symbols(UNUSED void **state)
void test_save_config_key_value_pairs(UNUSED void **state)
void test_can_save_load_parameter_values_with_special_characters(UNUSED void **state)
void test_save_can_change_buffer_size(UNUSED void **state)
void test_can_save_instance(UNUSED void **state)
void test_save_config_fails_for_unsupported_data_types(UNUSED void **state)
void test_config_arrays_can_contain_tables(UNUSED void **state)
void test_can_save_from_root(UNUSED void **state)
void test_config_tables_can_be_composite(UNUSED void **state)
void test_can_save_object(UNUSED void **state)
void test_save_fails_if_file_can_not_be_opened(UNUSED void **state)
void test_can_save_load_objects_with_keyword_names(UNUSED void **state)
void test_save_config_values(UNUSED void **state)
void test_save_can_append_config_values(UNUSED void **state)
void test_config_tables_keys_can_contain_symbols(UNUSED void **state)