55 #include <sys/resource.h>
56 #include <sys/signalfd.h>
71 #include <amxc/amxc_macros.h>
72 #include <amxc/amxc.h>
82 struct signalfd_siginfo fdsi;
86 sigaddset(&
mask, SIGALRM);
88 sigprocmask(SIG_BLOCK, &
mask, NULL);
90 sfd = signalfd(-1, &
mask, 0);
91 s = read(sfd, &fdsi,
sizeof(
struct signalfd_siginfo));
92 assert_int_equal(s,
sizeof(
struct signalfd_siginfo));
93 if(fdsi.ssi_signo == SIGALRM) {
94 printf(
"GOT SIGALRM\n");
98 printf(
"Read unexpected signal\n");
108 int64_t previous = 0;
116 amxc_ts_format(&item->
next, str_ts, 40);
117 printf(
"scheduler item %s - next = %s\n", amxc_htable_it_get_key(&item->
hit), str_ts);
119 if((item->
next.sec == previous) || (previous == 0)) {
126 assert_true(item->
next.sec >= previous);
127 previous = item->
next.sec;
132 const amxc_var_t*
const data,
134 const char* expected_id = (
const char*) priv;
139 amxc_ts_format(&ts, str_ts, 40);
141 assert_non_null(GET_CHAR(data,
"id"));
142 assert_string_equal(GET_CHAR(data,
"id"), expected_id);
144 printf(
"Got trigger: %s from %s at %s\n", sig_name, expected_id, str_ts);
150 const amxc_var_t*
const data,
151 UNUSED void*
const priv) {
152 printf(
"Signal = %s\n", sig_name);
154 amxc_var_dump(data, STDERR_FILENO);
158 const amxc_var_t*
const data,
160 const char* expected_id = (
const char*) priv;
165 amxc_ts_format(&ts, str_ts, 40);
167 check_expected(sig_name);
168 assert_non_null(GET_CHAR(data,
"id"));
169 assert_string_equal(GET_CHAR(data,
"id"), expected_id);
171 printf(
"Got trigger: %s from %s at %s\n", sig_name, expected_id, str_ts);
177 UNUSED const amxc_var_t*
const data,
180 assert_non_null(scheduler);
188 assert_non_null(scheduler);
203 assert_int_equal(amxc_llist_size(&scheduler->
ordered_items), 8);
204 assert_int_equal(amxc_htable_size(&scheduler->
items), 8);
210 assert_null(scheduler);
218 assert_non_null(scheduler);
226 assert_int_equal(amxc_llist_size(&scheduler->
ordered_items), 4);
227 assert_int_equal(amxc_htable_size(&scheduler->
items), 4);
232 assert_int_equal(amxc_llist_size(&scheduler->
ordered_items), 2);
233 assert_int_equal(amxc_htable_size(&scheduler->
items), 2);
237 assert_null(scheduler);
244 assert_non_null(scheduler);
247 assert_non_null(scheduler->
timer);
296 assert_null(scheduler);
303 assert_non_null(scheduler);
306 assert_non_null(scheduler->
timer);
355 assert_null(scheduler);
363 assert_non_null(scheduler);
366 assert_non_null(scheduler->
timer);
390 printf(
"Expecting %d triggers if scheduler was enabled\n",
trigger_counter);
402 printf(
"Scheduler is enabled again - expecting %d triggers\n",
trigger_counter);
408 assert_null(scheduler);
415 assert_non_null(scheduler);
418 assert_non_null(scheduler->
timer);
443 assert_null(scheduler);
450 assert_non_null(scheduler);
453 assert_non_null(scheduler->
timer);
468 assert_null(scheduler);
475 assert_non_null(scheduler);
478 assert_non_null(scheduler->
timer);
496 printf(
"Wait for SIGALRM\n");
498 printf(
"SIGALRM -> Handle events\n");
503 assert_null(scheduler);
510 assert_non_null(scheduler);
513 assert_non_null(scheduler->
timer);
555 assert_null(scheduler);
562 assert_non_null(scheduler);
565 assert_non_null(scheduler->
timer);
602 assert_null(scheduler);
609 assert_non_null(scheduler);
612 assert_non_null(scheduler->
timer);
632 printf(
"Expecting %d triggers if all items are enabled\n",
trigger_counter);
639 printf(
"Expecting %d triggers if all items are enabled\n",
trigger_counter);
646 printf(
"Expecting %d triggers if all items are enabled\n",
trigger_counter);
653 assert_null(scheduler);
660 assert_non_null(scheduler);
701 assert_null(scheduler);
int amxp_scheduler_connect(amxp_scheduler_t *scheduler, const char *id, amxp_slot_fn_t fn, void *priv)
Connects a callback function to the scheduler.
int amxp_scheduler_use_local_time(amxp_scheduler_t *scheduler, bool use_local_time)
Use local time or UTC time in calculation for next trigger times.
int amxp_scheduler_set_weekly_begin_end_item(amxp_scheduler_t *scheduler, const char *id, const char *start_time, const char *end_time, const char *days_of_week)
Adds a schedule item or updates a schedule item using a start time, end time and list of week days.
int amxp_scheduler_enable_item(amxp_scheduler_t *scheduler, const char *id, bool enable)
Enables or disable a schedule item.
int amxp_scheduler_new(amxp_scheduler_t **scheduler)
Allocates a amxp_scheduler_t structures and initializes to an empty scheduler.
int amxp_scheduler_set_weekly_item(amxp_scheduler_t *scheduler, const char *id, const char *time, const char *days_of_week, uint32_t duration)
Adds a schedule item or updates a schedule item using a time and list of week days.
void amxp_scheduler_delete(amxp_scheduler_t **scheduler)
Frees the previously allocated amxp_scheduler_t structure.
int amxp_scheduler_remove_item(amxp_scheduler_t *scheduler, const char *id)
Removes a schedule item from the scheduler.
amxp_signal_mngr_t * amxp_scheduler_get_sigmngr(amxp_scheduler_t *scheduler)
Gets the signal manager of a scheduler.
int amxp_scheduler_enable(amxp_scheduler_t *scheduler, bool enable)
Enables or disable the scheduler.
int amxp_scheduler_set_cron_begin_end_item(amxp_scheduler_t *scheduler, const char *id, const char *cron_begin, const char *cron_end)
Adds a schedule item or updates a schedule item using a cron expressions.
int amxp_scheduler_set_cron_item(amxp_scheduler_t *scheduler, const char *id, const char *cron_expr, uint32_t duration)
Adds a schedule item or updates a schedule item using a cron expression.
int amxp_scheduler_update(amxp_scheduler_t *scheduler)
Forces recalculation of the schedule items' next occurrence time.
int amxp_signal_read(void)
Reads from the amxp signal file descriptor.
int amxp_timer_start(amxp_timer_t *timer, unsigned int timeout_msec)
Starts or resets a timer.
void amxp_timers_check(void)
Check all timers and call the callback function when the timer is in Timer expired state.
void amxp_timers_calculate(void)
Caclulates the remaining time of all timers.
void amxp_timer_delete(amxp_timer_t **timer)
Deletes a timer.
int amxp_timer_new(amxp_timer_t **timer, amxp_timer_cb_t cb, void *priv)
Allocate and initializes a new timer.
Structure containing a schedule item.
Structure containing a scheduler.
amxp_signal_mngr_t sigmngr
amxc_llist_t ordered_items
void test_scheduler_can_disable_items(UNUSED void **state)
void test_scheduler_add_invalid_item_fails(UNUSED void **state)
static void delete_schedule(UNUSED const char *const sig_name, UNUSED const amxc_var_t *const data, void *const priv)
void test_scheduler_adding_running_triggers_start_end(UNUSED void **state)
void test_can_add_schedules(UNUSED void **state)
void test_scheduler_can_disable_running_items(UNUSED void **state)
void test_disabled_scheduler_does_not_trigger_signals(UNUSED void **state)
void test_scheduler_can_remove_schedule_in_callback(UNUSED void **state)
void test_scheduler_can_trigger_start_stop(UNUSED void **state)
void test_scheduler_adding_running_triggers_start_duration(UNUSED void **state)
void test_scheduler_using_local_time(UNUSED void **state)
static int32_t trigger_counter
static void read_sigalrm(void)
void test_scheduler_triggers_signals(UNUSED void **state)
static void check_start_stop_trigger(const char *const sig_name, const amxc_var_t *const data, void *const priv)
static void check_scheduler(amxp_scheduler_t *scheduler)
static void dump_schedule_trigger(const char *const sig_name, const amxc_var_t *const data, UNUSED void *const priv)
static void check_schedule_trigger(const char *const sig_name, const amxc_var_t *const data, void *const priv)
static void handle_events(void)
void test_can_remove_schedules(UNUSED void **state)