65 #include <amxd/amxd_transaction.h>
70 printf(
"Handling events ");
71 while(amxp_signal_read() == 0) {
81 struct signalfd_siginfo fdsi;
85 sigaddset(&mask, SIGALRM);
87 sigprocmask(SIG_BLOCK, &mask, NULL);
89 sfd = signalfd(-1, &mask, 0);
90 s = read(sfd, &fdsi,
sizeof(
struct signalfd_siginfo));
91 assert_int_equal(s,
sizeof(
struct signalfd_siginfo));
92 if(fdsi.ssi_signo == SIGALRM) {
93 printf(
"Got SIGALRM\n");
94 amxp_timers_calculate();
97 printf(
"Read unexpected signal\n");
102 amxc_var_t*
odl = NULL;
103 amxc_var_t*
config = NULL;
104 amxd_dm_t* dm = NULL;
109 odl = amxc_var_add_key(amxc_htable_t,
config,
"odl", NULL);
111 amxc_var_add_key(
bool,
odl,
"dm-load",
true);
112 amxc_var_add_key(
bool,
odl,
"dm-save",
true);
113 amxc_var_add_key(uint32_t,
odl,
"dm-save-init-delay", 1000);
115 amxp_sigmngr_enable(&dm->sigmngr,
true);
135 amxc_var_set_key(
config,
"storage-type",
storage, AMXC_VAR_FLAG_DEFAULT);
143 amxc_var_set(cstring_t,
storage,
"uci");
154 amxc_var_set(cstring_t,
storage,
"odl");
170 amxc_var_set_key(
config,
"storage-path",
storage, AMXC_VAR_FLAG_DEFAULT);
178 amxc_var_t*
odl = GET_ARG(
config,
"odl");
179 amxc_var_add_key(cstring_t,
odl,
"directory",
"./odl");
182 amxp_sigmngr_trigger_signal(&dm->sigmngr,
"app:start", NULL);
184 assert_non_null(amxd_dm_findf(dm,
"Test.Table"));
194 amxc_var_t*
odl = GET_ARG(
config,
"odl");
195 amxc_var_t* events = NULL;
201 amxp_sigmngr_trigger_signal(&dm->sigmngr,
"app:start", NULL);
204 assert_non_null(amxd_dm_findf(dm,
"Test.Table"));
210 events = amxc_var_add_key(
bool,
odl,
"load-dm-events",
true);
213 amxp_sigmngr_trigger_signal(&dm->sigmngr,
"app:start", NULL);
216 assert_non_null(amxd_dm_findf(dm,
"Test.Table"));
219 amxc_var_delete(&events);
228 amxc_var_t* dir = GETP_ARG(
config,
"odl.directory");
229 amxc_var_set(cstring_t, dir,
"./rubish");
234 assert_null(amxd_dm_findf(dm,
"Test.Table"));
244 amxc_var_t*
odl = GET_ARG(
config,
"odl");
245 amxc_var_add_key(cstring_t,
odl,
"dm-defaults",
"./defaults");
248 assert_non_null(amxd_dm_findf(dm,
"Test.Table"));
258 amxc_var_t* dir = GETP_ARG(
config,
"odl.dm-defaults");
259 amxc_var_set(cstring_t, dir,
"./rubish");
264 assert_null(amxd_dm_findf(dm,
"Test.Table"));
274 amxc_var_t* dir = GETP_ARG(
config,
"odl.dm-defaults");
275 amxc_var_t* save = GETP_ARG(
config,
"odl.dm-save");
277 amxc_var_delete(&dir);
279 dir = GETP_ARG(
config,
"odl.directory");
280 amxc_var_set(cstring_t, dir,
"./odl");
281 amxc_var_add_key(cstring_t,
config,
"name",
"save_test");
284 assert_non_null(amxd_dm_findf(dm,
"Test.Table"));
285 assert_non_null(amxd_dm_findf(dm,
"Test2"));
286 amxc_var_set(
bool, save,
true);
289 assert_int_not_equal(stat(
"./odl/save_test.odl", &statbuf), -1);
290 unlink(
"./odl/save_test.odl");
299 amxc_var_t* dir = GETP_ARG(
config,
"odl.directory");
300 amxc_var_set(cstring_t, dir,
"./odl");
305 assert_non_null(amxd_dm_findf(dm,
"Test.Table"));
306 assert_non_null(amxd_dm_findf(dm,
"Test2"));
307 amxc_var_set(cstring_t, dir,
"./rubish");
310 assert_int_equal(stat(
"./odl/save_test.odl", &statbuf), -1);
311 amxc_var_set(cstring_t, dir,
"./odl");
321 amxc_var_t*
odl = GET_ARG(
config,
"odl");
322 amxc_var_add_key(csv_string_t,
odl,
"dm-objects",
"Test,Test2.");
327 assert_non_null(amxd_dm_findf(dm,
"Test.Table"));
328 assert_non_null(amxd_dm_findf(dm,
"Test2"));
332 assert_int_not_equal(stat(
"./odl/00_Test.odl", &statbuf), -1);
333 unlink(
"./odl/00_Test.odl");
334 assert_int_not_equal(stat(
"./odl/01_Test2.odl", &statbuf), -1);
335 unlink(
"./odl/01_Test2.odl");
345 amxc_var_t* dir = GETP_ARG(
config,
"odl.directory");
346 amxc_var_set(cstring_t, dir,
"./odl");
351 assert_non_null(amxd_dm_findf(dm,
"Test.Table"));
352 assert_non_null(amxd_dm_findf(dm,
"Test2"));
353 amxc_var_set(cstring_t, dir,
"./rubish");
356 assert_int_equal(stat(
"./odl/00_Test.odl", &statbuf), -1);
357 assert_int_equal(stat(
"./odl/01_Test2.odl", &statbuf), -1);
358 amxc_var_set(cstring_t, dir,
"./odl");
368 amxc_var_t* objects = GETP_ARG(
config,
"odl.dm-objects");
369 amxc_var_set(cstring_t, objects,
"Test,Test2");
374 assert_non_null(amxd_dm_findf(dm,
"Test.Table"));
375 assert_non_null(amxd_dm_findf(dm,
"Test2"));
378 assert_int_not_equal(stat(
"./odl/00_Test.odl", &statbuf), -1);
379 unlink(
"./odl/00_Test.odl");
380 assert_int_not_equal(stat(
"./odl/01_Test2.odl", &statbuf), -1);
381 unlink(
"./odl/01_Test2.odl");
391 amxc_var_t* objects = GETP_ARG(
config,
"odl.dm-objects");
392 amxc_var_set(uint32_t, objects, 100);
397 assert_non_null(amxd_dm_findf(dm,
"Test.Table"));
398 assert_non_null(amxd_dm_findf(dm,
"Test2"));
401 assert_int_equal(stat(
"./odl/00_Test.odl", &statbuf), -1);
402 assert_int_equal(stat(
"./odl/01_Test2.odl", &statbuf), -1);
412 amxc_var_t* objects = GETP_ARG(
config,
"odl.dm-objects");
413 amxc_var_set(csv_string_t, objects,
"Test3, Test, Test4, Test2");
418 assert_non_null(amxd_dm_findf(dm,
"Test.Table"));
419 assert_non_null(amxd_dm_findf(dm,
"Test2"));
422 assert_int_not_equal(stat(
"./odl/00_Test.odl", &statbuf), -1);
423 unlink(
"./odl/00_Test.odl");
424 assert_int_not_equal(stat(
"./odl/01_Test2.odl", &statbuf), -1);
425 unlink(
"./odl/01_Test2.odl");
426 assert_int_equal(stat(
"./odl/00_Test3.odl", &statbuf), -1);
427 assert_int_equal(stat(
"./odl/02_Test4.odl", &statbuf), -1);
437 amxd_trans_t transaction;
438 amxc_var_t*
odl = GET_ARG(
config,
"odl");
439 amxc_var_t* objects = GETP_ARG(
config,
"odl.dm-objects");
440 amxc_var_delete(&objects);
441 amxc_var_add_key(
bool,
odl,
"dm-save-on-changed",
true);
446 assert_non_null(amxd_dm_findf(dm,
"Test.Table"));
447 assert_non_null(amxd_dm_findf(dm,
"Test2"));
448 amxp_sigmngr_trigger_signal(&dm->sigmngr,
"app:start", NULL);
452 amxd_trans_init(&transaction);
453 amxd_trans_select_pathf(&transaction,
"Test.Table");
454 amxd_trans_add_inst(&transaction, 0, NULL);
455 amxd_trans_set_value(cstring_t, &transaction,
"Text",
"Hallo");
456 amxd_trans_apply(&transaction, dm);
457 amxd_trans_clean(&transaction);
462 assert_int_not_equal(stat(
"./odl/save_test.odl", &statbuf), -1);
466 unlink(
"./odl/save_test.odl");
475 amxd_trans_t transaction;
480 assert_non_null(amxd_dm_findf(dm,
"Test.Table"));
481 assert_non_null(amxd_dm_findf(dm,
"Test2"));
482 amxp_sigmngr_trigger_signal(&dm->sigmngr,
"app:start", NULL);
486 amxd_trans_init(&transaction);
487 amxd_trans_select_pathf(&transaction,
"Test.Table");
488 amxd_trans_add_inst(&transaction, 0, NULL);
489 amxd_trans_set_value(cstring_t, &transaction,
"Text",
"Hallo");
490 assert_int_equal(amxd_trans_apply(&transaction, dm), 0);
491 amxd_trans_clean(&transaction);
496 assert_int_not_equal(stat(
"./odl/save_test.odl", &statbuf), -1);
497 unlink(
"./odl/save_test.odl");
499 amxd_trans_init(&transaction);
500 amxd_trans_select_pathf(&transaction,
"Test.Table.1");
501 amxd_trans_set_value(cstring_t, &transaction,
"Text",
"World");
502 assert_int_equal(amxd_trans_apply(&transaction, dm), 0);
503 amxd_trans_clean(&transaction);
508 assert_int_not_equal(stat(
"./odl/save_test.odl", &statbuf), -1);
511 unlink(
"./odl/save_test.odl");
520 amxd_trans_t transaction;
525 assert_non_null(amxd_dm_findf(dm,
"Test.Table"));
526 assert_non_null(amxd_dm_findf(dm,
"Test2"));
527 amxp_sigmngr_trigger_signal(&dm->sigmngr,
"app:start", NULL);
531 amxd_trans_init(&transaction);
532 amxd_trans_select_pathf(&transaction,
"Test.Table");
533 amxd_trans_add_inst(&transaction, 0, NULL);
534 amxd_trans_set_value(cstring_t, &transaction,
"Text",
"Hallo");
535 assert_int_equal(amxd_trans_apply(&transaction, dm), 0);
536 amxd_trans_clean(&transaction);
541 assert_int_not_equal(stat(
"./odl/save_test.odl", &statbuf), -1);
542 unlink(
"./odl/save_test.odl");
544 amxd_trans_init(&transaction);
545 amxd_trans_select_pathf(&transaction,
"Test.Table.1");
546 amxd_trans_set_value(uint32_t, &transaction,
"Number", 999);
547 assert_int_equal(amxd_trans_apply(&transaction, dm), 0);
548 amxd_trans_clean(&transaction);
552 amxp_timers_calculate();
555 assert_int_equal(stat(
"./odl/save_test.odl", &statbuf), -1);
558 unlink(
"./odl/save_test.odl");
566 amxd_trans_t transaction;
571 assert_non_null(amxd_dm_findf(dm,
"Test.Table"));
572 assert_non_null(amxd_dm_findf(dm,
"Test2"));
573 amxp_sigmngr_trigger_signal(&dm->sigmngr,
"app:start", NULL);
577 amxd_trans_init(&transaction);
578 amxd_trans_select_pathf(&transaction,
"Test.Table");
579 amxd_trans_del_inst(&transaction, 1, NULL);
580 assert_int_equal(amxd_trans_apply(&transaction, dm), 0);
581 amxd_trans_clean(&transaction);
586 assert_int_not_equal(stat(
"./odl/save_test.odl", &statbuf), -1);
589 unlink(
"./odl/save_test.odl");
599 amxd_trans_t transaction;
600 amxc_var_t*
odl = GET_ARG(
config,
"odl");
601 amxc_var_add_key(csv_string_t,
odl,
"dm-objects",
"Test2");
606 assert_non_null(amxd_dm_findf(dm,
"Test.Table"));
607 assert_non_null(amxd_dm_findf(dm,
"Test2"));
608 amxp_sigmngr_trigger_signal(&dm->sigmngr,
"app:start", NULL);
612 amxd_trans_init(&transaction);
613 amxd_trans_select_pathf(&transaction,
"Test2");
614 amxd_trans_set_value(cstring_t, &transaction,
"Text",
"Hallo");
615 amxd_trans_select_pathf(&transaction,
"Test.Table.");
616 amxd_trans_add_inst(&transaction, 0, NULL);
617 amxd_trans_set_value(cstring_t, &transaction,
"Text",
"Hallo");
618 assert_int_equal(amxd_trans_apply(&transaction, dm), 0);
619 amxd_trans_clean(&transaction);
623 amxd_trans_init(&transaction);
624 amxd_trans_select_pathf(&transaction,
"Test2");
625 amxd_trans_set_value(cstring_t, &transaction,
"Text",
"World");
626 assert_int_equal(amxd_trans_apply(&transaction, dm), 0);
627 amxd_trans_clean(&transaction);
632 assert_int_not_equal(stat(
"./odl/00_Test2.odl", &statbuf), -1);
633 assert_int_equal(stat(
"./odl/02_Test.odl", &statbuf), -1);
637 unlink(
"./odl/00_Test2.odl");
647 amxd_trans_t transaction;
648 amxc_var_t* objects = GETP_ARG(
config,
"odl.dm-objects");
649 amxc_var_set(uint32_t, objects, 100);
654 assert_non_null(amxd_dm_findf(dm,
"Test.Table"));
655 assert_non_null(amxd_dm_findf(dm,
"Test2"));
656 amxp_sigmngr_trigger_signal(&dm->sigmngr,
"app:start", NULL);
658 amxd_trans_init(&transaction);
659 amxd_trans_select_pathf(&transaction,
"Test2");
660 amxd_trans_set_value(cstring_t, &transaction,
"Text",
"Hallo");
661 amxd_trans_select_pathf(&transaction,
"Test.Table.");
662 amxd_trans_add_inst(&transaction, 0, NULL);
663 amxd_trans_set_value(cstring_t, &transaction,
"Text",
"Hallo");
664 assert_int_equal(amxd_trans_apply(&transaction, dm), 0);
665 amxd_trans_clean(&transaction);
669 amxp_timers_calculate();
673 assert_int_equal(stat(
"./odl/save_test.odl", &statbuf), -1);
674 assert_int_equal(stat(
"./odl/Test2.odl", &statbuf), -1);
675 assert_int_equal(stat(
"./odl/Test2.odl", &statbuf), -1);
static odl_storage_t storage
amxc_var_t * amxrt_get_config(void)
Gets the htable variant containing the configuration options.
int amxrt_dm_save_load_main(int reason, amxd_dm_t *dm, amxo_parser_t *parser)
The data model auto load and save module.
void amxrt_delete(void)
Clean-up ambiorix runtime.
amxd_dm_t * amxrt_get_dm(void)
Gets the runtime data model storage.
void amxrt_new(void)
Create the ambiorix runtime.
amxo_parser_t * amxrt_get_parser(void)
Gets runtime odl parser.
void test_save_fails_when_invalid_dir(UNUSED void **state)
int test_save_load_setup(UNUSED void **state)
void test_saves_when_persistent_parameter_changes(UNUSED void **state)
void test_can_save_on_changes(UNUSED void **state)
void test_does_not_save_when_invalid_objects(UNUSED void **state)
void test_can_save_on_changes_with_object_list(UNUSED void **state)
void test_can_save_separate_objects_csv(UNUSED void **state)
void test_can_start_with_directory_configured(UNUSED void **state)
void test_loads_default_when_valid_dir_is_used(UNUSED void **state)
void test_can_start_with_odl_storage_type(UNUSED void **state)
void test_can_start_with_no_storage_type(UNUSED void **state)
void test_can_start_with_no_storage_path(UNUSED void **state)
void test_can_start_with_no_odl_storage_type(UNUSED void **state)
void test_does_not_save_when_not_persistent_parameter_changes(UNUSED void **state)
void test_start_fails_with_invalid_directory_configured(UNUSED void **state)
static void read_sigalrm(void)
void test_saves_when_instance_deleted(UNUSED void **state)
void test_load_fails_with_invalid_dir_and_invalid_defaults(UNUSED void **state)
void test_can_load_files_with_eventing_on_or_off(UNUSED void **state)
void test_does_not_save_on_changed_when_invalid_objects(UNUSED void **state)
int test_save_load_teardown(UNUSED void **state)
void test_can_save_separate_objects_string(UNUSED void **state)
void test_save_skips_unknown_objects(UNUSED void **state)
void test_save_separate_objects_fail_when_invalid_dir(UNUSED void **state)
static void handle_events(void)
void test_can_save_all_objects(UNUSED void **state)