libamxp  1.4.0
Patterns C Implementation
test_scheduler.c File Reference
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/signalfd.h>
#include <signal.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <inttypes.h>
#include <limits.h>
#include <unistd.h>
#include <fcntl.h>
#include <cmocka.h>
#include <amxc/amxc_macros.h>
#include <amxc/amxc.h>
#include <amxp/amxp_scheduler.h>
#include "test_scheduler.h"

Go to the source code of this file.

Functions

static void read_sigalrm (void)
 
static void handle_events (void)
 
static void check_scheduler (amxp_scheduler_t *scheduler)
 
static void check_schedule_trigger (const char *const sig_name, const amxc_var_t *const data, void *const priv)
 
static void dump_schedule_trigger (const char *const sig_name, const amxc_var_t *const data, UNUSED void *const priv)
 
static void check_start_stop_trigger (const char *const sig_name, const amxc_var_t *const data, void *const priv)
 
static void delete_schedule (UNUSED const char *const sig_name, UNUSED const amxc_var_t *const data, void *const priv)
 
void test_can_add_schedules (UNUSED void **state)
 
void test_can_remove_schedules (UNUSED void **state)
 
void test_scheduler_triggers_signals (UNUSED void **state)
 
void test_scheduler_using_local_time (UNUSED void **state)
 
void test_disabled_scheduler_does_not_trigger_signals (UNUSED void **state)
 
void test_scheduler_can_trigger_start_stop (UNUSED void **state)
 
void test_scheduler_can_remove_schedule_in_callback (UNUSED void **state)
 
void test_scheduler_adding_running_triggers_start_duration (UNUSED void **state)
 
void test_scheduler_adding_running_triggers_start_end (UNUSED void **state)
 
void test_scheduler_can_disable_running_items (UNUSED void **state)
 
void test_scheduler_can_disable_items (UNUSED void **state)
 
void test_scheduler_add_invalid_item_fails (UNUSED void **state)
 

Variables

static int32_t trigger_counter = 0
 

Function Documentation

◆ check_schedule_trigger()

static void check_schedule_trigger ( const char *const  sig_name,
const amxc_var_t *const  data,
void *const  priv 
)
static

Definition at line 131 of file test_scheduler.c.

133  {
134  const char* expected_id = (const char*) priv;
135  char str_ts[40];
136  amxc_ts_t ts;
137 
138  amxc_ts_now(&ts);
139  amxc_ts_format(&ts, str_ts, 40);
140 
141  assert_non_null(GET_CHAR(data, "id"));
142  assert_string_equal(GET_CHAR(data, "id"), expected_id);
143 
144  printf("Got trigger: %s from %s at %s\n", sig_name, expected_id, str_ts);
145 
146  trigger_counter--;
147 }
static int32_t trigger_counter

◆ check_scheduler()

static void check_scheduler ( amxp_scheduler_t scheduler)
static

Definition at line 107 of file test_scheduler.c.

107  {
108  int64_t previous = 0;
109  bool first = true;
110  char str_ts[40];
111 
112  trigger_counter = 0;
113  amxc_llist_iterate(it, &scheduler->ordered_items) {
114  amxp_scheduler_item_t* item = amxc_container_of(it, amxp_scheduler_item_t, lit);
115 
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);
118 
119  if((item->next.sec == previous) || (previous == 0)) {
120  if(first) {
121  trigger_counter++;
122  }
123  } else {
124  first = false;
125  }
126  assert_true(item->next.sec >= previous);
127  previous = item->next.sec;
128  }
129 }
Structure containing a schedule item.
amxc_htable_it_t hit
amxc_llist_t ordered_items

◆ check_start_stop_trigger()

static void check_start_stop_trigger ( const char *const  sig_name,
const amxc_var_t *const  data,
void *const  priv 
)
static

Definition at line 157 of file test_scheduler.c.

159  {
160  const char* expected_id = (const char*) priv;
161  char str_ts[40];
162  amxc_ts_t ts;
163 
164  amxc_ts_now(&ts);
165  amxc_ts_format(&ts, str_ts, 40);
166 
167  check_expected(sig_name);
168  assert_non_null(GET_CHAR(data, "id"));
169  assert_string_equal(GET_CHAR(data, "id"), expected_id);
170 
171  printf("Got trigger: %s from %s at %s\n", sig_name, expected_id, str_ts);
172 
173  trigger_counter--;
174 }

◆ delete_schedule()

static void delete_schedule ( UNUSED const char *const  sig_name,
UNUSED const amxc_var_t *const  data,
void *const  priv 
)
static

Definition at line 176 of file test_scheduler.c.

178  {
179  amxp_scheduler_t* scheduler = (amxp_scheduler_t*) priv;
180  assert_non_null(scheduler);
181  assert_int_equal(amxp_scheduler_remove_item(scheduler, "test1"), 0);
182 }
int amxp_scheduler_remove_item(amxp_scheduler_t *scheduler, const char *id)
Removes a schedule item from the scheduler.
Structure containing a scheduler.

◆ dump_schedule_trigger()

static void dump_schedule_trigger ( const char *const  sig_name,
const amxc_var_t *const  data,
UNUSED void *const  priv 
)
static

Definition at line 149 of file test_scheduler.c.

151  {
152  printf("Signal = %s\n", sig_name);
153  fflush(stdout);
154  amxc_var_dump(data, STDERR_FILENO);
155 }

◆ handle_events()

static void handle_events ( void  )
static

Definition at line 102 of file test_scheduler.c.

102  {
103  while(amxp_signal_read() == 0) {
104  }
105 }
int amxp_signal_read(void)
Reads from the amxp signal file descriptor.
Definition: amxp_signal.c:769

◆ read_sigalrm()

static void read_sigalrm ( void  )
static

Definition at line 79 of file test_scheduler.c.

79  {
80  sigset_t mask;
81  int sfd;
82  struct signalfd_siginfo fdsi;
83  ssize_t s;
84 
85  sigemptyset(&mask);
86  sigaddset(&mask, SIGALRM);
87 
88  sigprocmask(SIG_BLOCK, &mask, NULL);
89 
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");
97  } else {
98  printf("Read unexpected signal\n");
99  }
100 }
static sigset_t mask
Definition: amxp_syssig.c:68
void amxp_timers_check(void)
Check all timers and call the callback function when the timer is in Timer expired state.
Definition: amxp_timer.c:183
void amxp_timers_calculate(void)
Caclulates the remaining time of all timers.
Definition: amxp_timer.c:144

◆ test_can_add_schedules()

void test_can_add_schedules ( UNUSED void **  state)

Definition at line 184 of file test_scheduler.c.

184  {
185  amxp_scheduler_t* scheduler = NULL;
186 
187  assert_int_equal(amxp_scheduler_new(&scheduler), 0);
188  assert_non_null(scheduler);
189  assert_true(scheduler->sigmngr.enabled);
190  assert_true(scheduler->timer->state != amxp_timer_running);
191 
192  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test1", "0/15 * * * * *", 0), 0);
193  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test2", "0/5 * * * * *", 0), 0);
194  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test3", "0/10 * * * * *", 0), 0);
195  assert_int_equal(amxp_scheduler_set_cron_begin_end_item(scheduler, "test3A", "0/10 * * * * *", "0/20 * * * * *"), 0);
196  assert_int_equal(amxp_scheduler_set_weekly_item(scheduler, "test4", "23:00", "saturday,sunday", 0), 0);
197  assert_int_equal(amxp_scheduler_set_weekly_item(scheduler, "test5", NULL, "monday-friday", 0), 0);
198  assert_int_equal(amxp_scheduler_set_weekly_begin_end_item(scheduler, "test6", NULL, NULL, "monday-friday"), 0);
199  assert_int_equal(amxp_scheduler_set_weekly_item(scheduler, "test7", NULL, "monday-friday", 7200), 0);
200 
201  assert_true(scheduler->timer->state == amxp_timer_running);
202 
203  assert_int_equal(amxc_llist_size(&scheduler->ordered_items), 8);
204  assert_int_equal(amxc_htable_size(&scheduler->items), 8);
205 
206  check_scheduler(scheduler);
207  assert_non_null(amxp_scheduler_get_sigmngr(scheduler));
208 
209  amxp_scheduler_delete(&scheduler);
210  assert_null(scheduler);
211  assert_null(amxp_scheduler_get_sigmngr(scheduler));
212 }
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_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.
amxp_signal_mngr_t * amxp_scheduler_get_sigmngr(amxp_scheduler_t *scheduler)
Gets the signal manager of a 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.
@ amxp_timer_running
Definition: amxp_timer.h:151
amxp_timer_state_t state
Definition: amxp_timer.h:166
amxc_htable_t items
amxp_signal_mngr_t sigmngr
amxp_timer_t * timer
static void check_scheduler(amxp_scheduler_t *scheduler)

◆ test_can_remove_schedules()

void test_can_remove_schedules ( UNUSED void **  state)

Definition at line 214 of file test_scheduler.c.

214  {
215  amxp_scheduler_t* scheduler = NULL;
216 
217  assert_int_equal(amxp_scheduler_new(&scheduler), 0);
218  assert_non_null(scheduler);
219  assert_true(scheduler->sigmngr.enabled);
220 
221  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test1", "0/15 * * * * *", 0), 0);
222  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test2", "0/5 * * * * *", 0), 0);
223  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test3", "0/10 * * * * *", 0), 0);
224  assert_int_equal(amxp_scheduler_set_weekly_item(scheduler, "test4", "23:00", "saturday,sunday", 0), 0);
225 
226  assert_int_equal(amxc_llist_size(&scheduler->ordered_items), 4);
227  assert_int_equal(amxc_htable_size(&scheduler->items), 4);
228 
229  assert_int_equal(amxp_scheduler_remove_item(scheduler, "test1"), 0);
230  assert_int_equal(amxp_scheduler_remove_item(scheduler, "test4"), 0);
231 
232  assert_int_equal(amxc_llist_size(&scheduler->ordered_items), 2);
233  assert_int_equal(amxc_htable_size(&scheduler->items), 2);
234 
235  check_scheduler(scheduler);
236  amxp_scheduler_delete(&scheduler);
237  assert_null(scheduler);
238 }

◆ test_disabled_scheduler_does_not_trigger_signals()

void test_disabled_scheduler_does_not_trigger_signals ( UNUSED void **  state)

Definition at line 358 of file test_scheduler.c.

358  {
359  amxp_scheduler_t* scheduler = NULL;
360  amxp_timer_t* timer = NULL;
361 
362  assert_int_equal(amxp_scheduler_new(&scheduler), 0);
363  assert_non_null(scheduler);
364  assert_true(scheduler->sigmngr.enabled);
365 
366  assert_non_null(scheduler->timer);
367  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test1", "0/15 * * * * *", 0), 0);
368  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test2", "0/5 * * * * *", 0), 0);
369  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test3", "0/10 * * * * *", 0), 0);
370  assert_int_equal(amxp_scheduler_set_weekly_item(scheduler, "test4", "23:00", "saturday,sunday", 0), 0);
371  assert_int_equal(amxp_scheduler_set_weekly_begin_end_item(scheduler, "test5", "23:00", "23:59", "saturday,sunday"), 0);
372 
373  amxp_scheduler_connect(scheduler, "test1", check_schedule_trigger, (void*) "test1");
374  amxp_scheduler_connect(scheduler, "test2", check_schedule_trigger, (void*) "test2");
375  amxp_scheduler_connect(scheduler, "test3", check_schedule_trigger, (void*) "test3");
376  amxp_scheduler_connect(scheduler, "test4", check_schedule_trigger, (void*) "test4");
377  amxp_scheduler_connect(scheduler, "test5", check_schedule_trigger, (void*) "test5");
378 
381  assert_int_equal(scheduler->timer->state, amxp_timer_running);
382  amxp_scheduler_enable(scheduler, false);
385  assert_int_equal(scheduler->timer->state, amxp_timer_off);
386  amxp_scheduler_update(scheduler);
387 
388  amxp_timer_new(&timer, NULL, NULL);
389  check_scheduler(scheduler);
390  printf("Expecting %d triggers if scheduler was enabled\n", trigger_counter);
391  amxp_timer_start(timer, 20000);
392  read_sigalrm();
393  handle_events();
394  assert_int_not_equal(trigger_counter, 0);
395  amxp_timer_delete(&timer);
396 
397  amxp_scheduler_enable(scheduler, true);
400  assert_int_equal(scheduler->timer->state, amxp_timer_running);
401  check_scheduler(scheduler);
402  printf("Scheduler is enabled again - expecting %d triggers\n", trigger_counter);
403  read_sigalrm();
404  handle_events();
405  assert_int_equal(trigger_counter, 0);
406 
407  amxp_scheduler_delete(&scheduler);
408  assert_null(scheduler);
409 }
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_enable(amxp_scheduler_t *scheduler, bool enable)
Enables or disable the scheduler.
int amxp_scheduler_update(amxp_scheduler_t *scheduler)
Forces recalculation of the schedule items' next occurrence time.
int amxp_timer_start(amxp_timer_t *timer, unsigned int timeout_msec)
Starts or resets a timer.
Definition: amxp_timer.c:296
void amxp_timer_delete(amxp_timer_t **timer)
Deletes a timer.
Definition: amxp_timer.c:247
int amxp_timer_new(amxp_timer_t **timer, amxp_timer_cb_t cb, void *priv)
Allocate and initializes a new timer.
Definition: amxp_timer.c:229
@ amxp_timer_off
Definition: amxp_timer.h:149
The timer type.
Definition: amxp_timer.h:163
static void read_sigalrm(void)
static void check_schedule_trigger(const char *const sig_name, const amxc_var_t *const data, void *const priv)
static void handle_events(void)

◆ test_scheduler_add_invalid_item_fails()

void test_scheduler_add_invalid_item_fails ( UNUSED void **  state)

Definition at line 656 of file test_scheduler.c.

656  {
657  amxp_scheduler_t* scheduler = NULL;
658 
659  assert_int_equal(amxp_scheduler_new(&scheduler), 0);
660  assert_non_null(scheduler);
661 
662  assert_int_not_equal(amxp_scheduler_set_cron_item(scheduler, "test1", "0/15 * * * *", 0), 0);
663  assert_int_not_equal(amxp_scheduler_set_cron_item(scheduler, "test1", "Invalid", 0), 0);
664  assert_int_not_equal(amxp_scheduler_set_cron_item(scheduler, "test1", "0 0 15 * * WEEKDAY", 0), 0);
665  assert_int_not_equal(amxp_scheduler_set_cron_begin_end_item(scheduler, "test1", "0 0 15 * * WEEKDAY", "* * * * * *"), 0);
666  assert_int_not_equal(amxp_scheduler_set_cron_begin_end_item(scheduler, "test1", "* * * * * *", "0 0 15 * * WEEKDAY"), 0);
667  assert_int_not_equal(amxp_scheduler_set_weekly_item(scheduler, "test1", "99:10:99", "WEEKDAYS", 0), 0);
668 
669  assert_int_not_equal(amxp_scheduler_set_cron_item(scheduler, NULL, "0/15 * * * * *", 0), 0);
670  assert_int_not_equal(amxp_scheduler_set_cron_item(scheduler, "", "0/15 * * * * *", 0), 0);
671  assert_int_not_equal(amxp_scheduler_set_cron_item(scheduler, "test1", NULL, 0), 0);
672  assert_int_not_equal(amxp_scheduler_set_cron_item(scheduler, "test1", "", 0), 0);
673  assert_int_not_equal(amxp_scheduler_set_cron_item(NULL, "test1", "* * * * * *", 0), 0);
674  assert_int_not_equal(amxp_scheduler_set_cron_begin_end_item(scheduler, "", "0 0 15 * * *", "* * * * * *"), 0);
675  assert_int_not_equal(amxp_scheduler_set_cron_begin_end_item(scheduler, NULL, "0 0 15 * * *", "* * * * * *"), 0);
676 
677  assert_int_not_equal(amxp_scheduler_set_weekly_item(scheduler, NULL, "15:00:00", "sunday", 0), 0);
678  assert_int_not_equal(amxp_scheduler_set_weekly_item(NULL, "test1", "15:00:00", "sunday", 0), 0);
679  assert_int_not_equal(amxp_scheduler_set_weekly_item(scheduler, "", "15:00:00", "sunday", 0), 0);
680  assert_int_not_equal(amxp_scheduler_set_weekly_item(scheduler, "test1", "15:00", "", 0), 0);
681  assert_int_not_equal(amxp_scheduler_set_weekly_item(scheduler, "test1", "15:00", NULL, 0), 0);
682  assert_int_not_equal(amxp_scheduler_set_weekly_begin_end_item(scheduler, NULL, "15:00:00", "16:00", "sunday"), 0);
683  assert_int_not_equal(amxp_scheduler_set_weekly_begin_end_item(NULL, "test1", "15:00:00", "16:00", "sunday"), 0);
684  assert_int_not_equal(amxp_scheduler_set_weekly_begin_end_item(scheduler, "", "15:00:00", "16:00", "sunday"), 0);
685  assert_int_not_equal(amxp_scheduler_set_weekly_begin_end_item(scheduler, "test1", "15:00:00", "16:00", ""), 0);
686  assert_int_not_equal(amxp_scheduler_set_weekly_begin_end_item(scheduler, "test1", "15:00:00", "16:00", NULL), 0);
687  assert_int_not_equal(amxp_scheduler_set_weekly_begin_end_item(scheduler, "test1", "15:00:00", "16:00", "WEEKDAY"), 0);
688  assert_int_not_equal(amxp_scheduler_set_weekly_begin_end_item(scheduler, "test1", "15:00:00", "INVALID", "sunday"), 0);
689  assert_int_not_equal(amxp_scheduler_set_weekly_begin_end_item(scheduler, "test1", "INVALID", "16:00", "sunday"), 0);
690 
691  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test1", "0/15 * * * * *", 0), 0);
692  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test1", "0 0/15 * * * *", 0), 0);
693  assert_int_equal(amxp_scheduler_remove_item(scheduler, "test2"), 0);
694  assert_int_equal(amxp_scheduler_remove_item(scheduler, "test1"), 0);
695 
698  assert_int_not_equal(scheduler->timer->state, amxp_timer_running);
699 
700  amxp_scheduler_delete(&scheduler);
701  assert_null(scheduler);
702 }

◆ test_scheduler_adding_running_triggers_start_duration()

void test_scheduler_adding_running_triggers_start_duration ( UNUSED void **  state)

Definition at line 471 of file test_scheduler.c.

471  {
472  amxp_scheduler_t* scheduler = NULL;
473 
474  assert_int_equal(amxp_scheduler_new(&scheduler), 0);
475  assert_non_null(scheduler);
476  assert_true(scheduler->sigmngr.enabled);
477 
478  assert_non_null(scheduler->timer);
479 
480  sleep(5);
481 
482  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test1", "0 * * * * *", 59), 0);
483  amxp_scheduler_connect(scheduler, "test1", check_start_stop_trigger, (void*) "test1");
484  amxp_scheduler_connect(scheduler, NULL, dump_schedule_trigger, NULL);
485 
486  trigger_counter = 2;
487  expect_string(check_start_stop_trigger, sig_name, "start:test1");
488  handle_events();
489  assert_int_equal(trigger_counter, 1);
490 
493  assert_int_equal(scheduler->timer->state, amxp_timer_running);
494 
495  expect_string(check_start_stop_trigger, sig_name, "stop:test1");
496  printf("Wait for SIGALRM\n");
497  read_sigalrm();
498  printf("SIGALRM -> Handle events\n");
499  handle_events();
500  assert_int_equal(trigger_counter, 0);
501 
502  amxp_scheduler_delete(&scheduler);
503  assert_null(scheduler);
504 }
static void check_start_stop_trigger(const char *const sig_name, const amxc_var_t *const data, void *const priv)
static void dump_schedule_trigger(const char *const sig_name, const amxc_var_t *const data, UNUSED void *const priv)

◆ test_scheduler_adding_running_triggers_start_end()

void test_scheduler_adding_running_triggers_start_end ( UNUSED void **  state)

Definition at line 506 of file test_scheduler.c.

506  {
507  amxp_scheduler_t* scheduler = NULL;
508 
509  assert_int_equal(amxp_scheduler_new(&scheduler), 0);
510  assert_non_null(scheduler);
511  assert_true(scheduler->sigmngr.enabled);
512 
513  assert_non_null(scheduler->timer);
514  sleep(2);
515 
516  assert_int_equal(amxp_scheduler_set_cron_begin_end_item(scheduler, "test1",
517  "0 * * * * *",
518  "59 * * * * *"), 0);
519 
520  amxp_scheduler_connect(scheduler, "test1", check_start_stop_trigger, (void*) "test1");
521  amxp_scheduler_connect(scheduler, NULL, dump_schedule_trigger, NULL);
522 
523  trigger_counter = 2;
524  expect_string(check_start_stop_trigger, sig_name, "start:test1");
525  handle_events();
526  assert_int_equal(trigger_counter, 1);
527 
530  assert_int_equal(scheduler->timer->state, amxp_timer_running);
531  expect_string(check_start_stop_trigger, sig_name, "stop:test1");
532 
533  read_sigalrm();
534  handle_events();
535  assert_int_equal(trigger_counter, 0);
536 
539 
540  trigger_counter = 2;
541  expect_string(check_start_stop_trigger, sig_name, "start:test1");
542  read_sigalrm();
543  handle_events();
544  assert_int_equal(trigger_counter, 1);
545 
548 
549  expect_string(check_start_stop_trigger, sig_name, "stop:test1");
550  read_sigalrm();
551  handle_events();
552  assert_int_equal(trigger_counter, 0);
553 
554  amxp_scheduler_delete(&scheduler);
555  assert_null(scheduler);
556 }

◆ test_scheduler_can_disable_items()

void test_scheduler_can_disable_items ( UNUSED void **  state)

Definition at line 605 of file test_scheduler.c.

605  {
606  amxp_scheduler_t* scheduler = NULL;
607 
608  assert_int_equal(amxp_scheduler_new(&scheduler), 0);
609  assert_non_null(scheduler);
610  assert_true(scheduler->sigmngr.enabled);
611 
612  assert_non_null(scheduler->timer);
613  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test1", "0/15 * * * * *", 0), 0);
614  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test2", "0/5 * * * * *", 0), 0);
615  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test3", "0/10 * * * * *", 0), 0);
616  assert_int_equal(amxp_scheduler_set_weekly_item(scheduler, "test4", "23:00", "saturday,sunday", 0), 0);
617 
618  amxp_scheduler_connect(scheduler, "test1", check_schedule_trigger, (void*) "test1");
619  amxp_scheduler_connect(scheduler, "test2", check_schedule_trigger, (void*) "test2");
620  amxp_scheduler_connect(scheduler, "test3", check_schedule_trigger, (void*) "test3");
621  amxp_scheduler_connect(scheduler, "test4", check_schedule_trigger, (void*) "test4");
622 
625  assert_int_equal(scheduler->timer->state, amxp_timer_running);
626 
627  amxp_scheduler_enable_item(scheduler, "test1", false);
628  amxp_scheduler_enable_item(scheduler, "test3", false);
629  amxp_scheduler_enable_item(scheduler, "test4", false);
630 
631  check_scheduler(scheduler);
632  printf("Expecting %d triggers if all items are enabled\n", trigger_counter);
633  trigger_counter = 1;
634  read_sigalrm();
635  handle_events();
636  assert_int_equal(trigger_counter, 0);
637 
638  check_scheduler(scheduler);
639  printf("Expecting %d triggers if all items are enabled\n", trigger_counter);
640  trigger_counter = 1;
641  read_sigalrm();
642  handle_events();
643  assert_int_equal(trigger_counter, 0);
644 
645  check_scheduler(scheduler);
646  printf("Expecting %d triggers if all items are enabled\n", trigger_counter);
647  trigger_counter = 1;
648  read_sigalrm();
649  handle_events();
650  assert_int_equal(trigger_counter, 0);
651 
652  amxp_scheduler_delete(&scheduler);
653  assert_null(scheduler);
654 }
int amxp_scheduler_enable_item(amxp_scheduler_t *scheduler, const char *id, bool enable)
Enables or disable a schedule item.

◆ test_scheduler_can_disable_running_items()

void test_scheduler_can_disable_running_items ( UNUSED void **  state)

Definition at line 558 of file test_scheduler.c.

558  {
559  amxp_scheduler_t* scheduler = NULL;
560 
561  assert_int_equal(amxp_scheduler_new(&scheduler), 0);
562  assert_non_null(scheduler);
563  assert_true(scheduler->sigmngr.enabled);
564 
565  assert_non_null(scheduler->timer);
566  sleep(3);
567 
568  assert_int_equal(amxp_scheduler_set_cron_begin_end_item(scheduler, "test1",
569  "0 * * * * *",
570  "59 * * * * *"), 0);
571  expect_string(check_start_stop_trigger, sig_name, "start:test1");
572 
573  amxp_scheduler_connect(scheduler, "test1", check_start_stop_trigger, (void*) "test1");
574  amxp_scheduler_connect(scheduler, NULL, dump_schedule_trigger, NULL);
575 
576  trigger_counter = 4;
577  handle_events();
578  assert_int_equal(trigger_counter, 3);
579 
582  assert_int_equal(scheduler->timer->state, amxp_timer_running);
583 
584  assert_int_equal(amxp_scheduler_enable_item(scheduler, "test1", false), 0);
585  expect_string(check_start_stop_trigger, sig_name, "stop:test1");
586 
587  handle_events();
588  assert_int_equal(trigger_counter, 2);
589 
590  assert_int_equal(amxp_scheduler_enable_item(scheduler, "test1", true), 0);
591  expect_string(check_start_stop_trigger, sig_name, "start:test1");
592 
593  handle_events();
594  assert_int_equal(trigger_counter, 1);
595 
596  expect_string(check_start_stop_trigger, sig_name, "stop:test1");
597  read_sigalrm();
598  handle_events();
599  assert_int_equal(trigger_counter, 0);
600 
601  amxp_scheduler_delete(&scheduler);
602  assert_null(scheduler);
603 }

◆ test_scheduler_can_remove_schedule_in_callback()

void test_scheduler_can_remove_schedule_in_callback ( UNUSED void **  state)

Definition at line 446 of file test_scheduler.c.

446  {
447  amxp_scheduler_t* scheduler = NULL;
448 
449  assert_int_equal(amxp_scheduler_new(&scheduler), 0);
450  assert_non_null(scheduler);
451  assert_true(scheduler->sigmngr.enabled);
452 
453  assert_non_null(scheduler->timer);
454  trigger_counter = 2;
455 
456  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test1", "0/5 * * * * *", 3), 0);
457 
458  amxp_scheduler_connect(scheduler, "test1", delete_schedule, (void*) scheduler);
459 
462  assert_int_equal(scheduler->timer->state, amxp_timer_running);
463 
464  read_sigalrm();
465  handle_events();
466 
467  amxp_scheduler_delete(&scheduler);
468  assert_null(scheduler);
469 }
static void delete_schedule(UNUSED const char *const sig_name, UNUSED const amxc_var_t *const data, void *const priv)

◆ test_scheduler_can_trigger_start_stop()

void test_scheduler_can_trigger_start_stop ( UNUSED void **  state)

Definition at line 411 of file test_scheduler.c.

411  {
412  amxp_scheduler_t* scheduler = NULL;
413 
414  assert_int_equal(amxp_scheduler_new(&scheduler), 0);
415  assert_non_null(scheduler);
416  assert_true(scheduler->sigmngr.enabled);
417 
418  assert_non_null(scheduler->timer);
419  trigger_counter = 2;
420 
421  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test1", "0/5 * * * * *", 3), 0);
422  expect_string(check_start_stop_trigger, sig_name, "start:test1");
423  expect_string(check_start_stop_trigger, sig_name, "stop:test1");
424 
425  amxp_scheduler_connect(scheduler, "test1", check_start_stop_trigger, (void*) "test1");
426 
429  assert_int_equal(scheduler->timer->state, amxp_timer_running);
430 
431  handle_events();
432 
433  if(trigger_counter == 2) {
434  read_sigalrm();
435  handle_events();
436  }
437 
438  read_sigalrm();
439  handle_events();
440  assert_int_equal(trigger_counter, 0);
441 
442  amxp_scheduler_delete(&scheduler);
443  assert_null(scheduler);
444 }

◆ test_scheduler_triggers_signals()

void test_scheduler_triggers_signals ( UNUSED void **  state)

Definition at line 240 of file test_scheduler.c.

240  {
241  amxp_scheduler_t* scheduler = NULL;
242 
243  assert_int_equal(amxp_scheduler_new(&scheduler), 0);
244  assert_non_null(scheduler);
245  assert_true(scheduler->sigmngr.enabled);
246 
247  assert_non_null(scheduler->timer);
248  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test1", "0/15 * * * * *", 0), 0);
249  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test2", "0/5 * * * * *", 0), 0);
250  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test3", "0/10 * * * * *", 0), 0);
251  assert_int_equal(amxp_scheduler_set_weekly_item(scheduler, "test4", "23:00", "saturday,sunday", 0), 0);
252  assert_int_equal(amxp_scheduler_set_weekly_begin_end_item(scheduler, "test5", "23:00", "23:59", "saturday,sunday"), 0);
253 
254  amxp_scheduler_connect(scheduler, "test1", check_schedule_trigger, (void*) "test1");
255  amxp_scheduler_connect(scheduler, "test2", check_schedule_trigger, (void*) "test2");
256  amxp_scheduler_connect(scheduler, "test3", check_schedule_trigger, (void*) "test3");
257  amxp_scheduler_connect(scheduler, "test4", check_schedule_trigger, (void*) "test4");
258  amxp_scheduler_connect(scheduler, "test5", check_schedule_trigger, (void*) "test5");
259  amxp_scheduler_connect(scheduler, NULL, dump_schedule_trigger, NULL);
260 
263  assert_int_equal(scheduler->timer->state, amxp_timer_running);
264 
265  check_scheduler(scheduler);
266  printf("Expecting %d triggers\n", trigger_counter);
267  read_sigalrm();
268  handle_events();
269  assert_int_equal(trigger_counter, 0);
270 
271  check_scheduler(scheduler);
272  printf("Expecting %d triggers\n", trigger_counter);
273  read_sigalrm();
274  handle_events();
275  assert_int_equal(trigger_counter, 0);
276 
277  check_scheduler(scheduler);
278  printf("Expecting %d triggers\n", trigger_counter);
279  read_sigalrm();
280  handle_events();
281  assert_int_equal(trigger_counter, 0);
282 
283  check_scheduler(scheduler);
284  printf("Expecting %d triggers\n", trigger_counter);
285  read_sigalrm();
286  handle_events();
287  assert_int_equal(trigger_counter, 0);
288 
289  check_scheduler(scheduler);
290  printf("Expecting %d triggers\n", trigger_counter);
291  read_sigalrm();
292  handle_events();
293  assert_int_equal(trigger_counter, 0);
294 
295  amxp_scheduler_delete(&scheduler);
296  assert_null(scheduler);
297 }

◆ test_scheduler_using_local_time()

void test_scheduler_using_local_time ( UNUSED void **  state)

Definition at line 299 of file test_scheduler.c.

299  {
300  amxp_scheduler_t* scheduler = NULL;
301 
302  assert_int_equal(amxp_scheduler_new(&scheduler), 0);
303  assert_non_null(scheduler);
304  assert_true(scheduler->sigmngr.enabled);
305 
306  assert_non_null(scheduler->timer);
307  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test1", "0/15 * * * * *", 0), 0);
308  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test2", "0/5 * * * * *", 0), 0);
309  assert_int_equal(amxp_scheduler_use_local_time(scheduler, true), 0);
310  assert_int_equal(amxp_scheduler_set_cron_item(scheduler, "test3", "0/10 * * * * *", 0), 0);
311  assert_int_equal(amxp_scheduler_set_weekly_item(scheduler, "test4", "23:00", "saturday", 0), 0);
312  assert_int_equal(amxp_scheduler_set_weekly_begin_end_item(scheduler, "test5", "23:00", "23:59", "saturday,sunday"), 0);
313  assert_int_equal(amxp_scheduler_set_cron_begin_end_item(scheduler, "test6", "0 0/15 * * * *", "0 0/1 * * * *"), 0);
314 
315  amxp_scheduler_connect(scheduler, "test1", check_schedule_trigger, (void*) "test1");
316  amxp_scheduler_connect(scheduler, "test2", check_schedule_trigger, (void*) "test2");
317  amxp_scheduler_connect(scheduler, "test3", check_schedule_trigger, (void*) "test3");
318  amxp_scheduler_connect(scheduler, "test4", check_schedule_trigger, (void*) "test4");
319 
322  assert_int_equal(scheduler->timer->state, amxp_timer_running);
323 
324  check_scheduler(scheduler);
325  printf("Expecting %d triggers\n", trigger_counter);
326  read_sigalrm();
327  handle_events();
328  assert_int_equal(trigger_counter, 0);
329 
330  check_scheduler(scheduler);
331  printf("Expecting %d triggers\n", trigger_counter);
332  read_sigalrm();
333  handle_events();
334  assert_int_equal(trigger_counter, 0);
335 
336  check_scheduler(scheduler);
337  printf("Expecting %d triggers\n", trigger_counter);
338  read_sigalrm();
339  handle_events();
340  assert_int_equal(trigger_counter, 0);
341 
342  check_scheduler(scheduler);
343  printf("Expecting %d triggers\n", trigger_counter);
344  read_sigalrm();
345  handle_events();
346  assert_int_equal(trigger_counter, 0);
347 
348  check_scheduler(scheduler);
349  printf("Expecting %d triggers\n", trigger_counter);
350  read_sigalrm();
351  handle_events();
352  assert_int_equal(trigger_counter, 0);
353 
354  amxp_scheduler_delete(&scheduler);
355  assert_null(scheduler);
356 }
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.

Variable Documentation

◆ trigger_counter

int32_t trigger_counter = 0
static

Definition at line 77 of file test_scheduler.c.