summaryrefslogtreecommitdiffstats
path: root/tests/timer
diff options
context:
space:
mode:
Diffstat (limited to 'tests/timer')
-rw-r--r--tests/timer/timer_test.c61
-rw-r--r--tests/timer/timer_test.ok2
2 files changed, 52 insertions, 11 deletions
diff --git a/tests/timer/timer_test.c b/tests/timer/timer_test.c
index bcaafdb2..3775151c 100644
--- a/tests/timer/timer_test.c
+++ b/tests/timer/timer_test.c
@@ -24,6 +24,8 @@
#include <stdio.h>
#include <stdlib.h>
+#include <signal.h>
+#include <getopt.h>
#include <osmocom/core/talloc.h>
#include <osmocom/core/timer.h>
@@ -60,6 +62,7 @@ struct test_timer {
#define TIMER_PRES_SECS 0
#define TIMER_PRES_USECS 10000
+static int timer_nsteps = MAIN_TIMER_NSTEPS;
static unsigned int expired_timers = 0;
static unsigned int total_timers = 0;
static unsigned int too_late = 0;
@@ -70,9 +73,9 @@ static void main_timer_fired(void *data)
unsigned int add_in_this_step;
int i;
- if (*step == MAIN_TIMER_NSTEPS) {
- printf("Main timer has finished, please, wait a bit for the "
- "final report.\n");
+ if (*step == timer_nsteps) {
+ fprintf(stderr, "Main timer has finished, please, "
+ "wait a bit for the final report.\n");
return;
}
/* add 2^step pair of timers per step. */
@@ -94,7 +97,7 @@ static void main_timer_fired(void *data)
osmo_timer_schedule(&v->timer, seconds, 0);
llist_add(&v->head, &timer_test_list);
}
- printf("added %d timers in step %u (expired=%u)\n",
+ fprintf(stderr, "added %d timers in step %u (expired=%u)\n",
add_in_this_step, *step, expired_timers);
total_timers += add_in_this_step;
osmo_timer_schedule(&main_timer, TIME_BETWEEN_STEPS, 0);
@@ -110,7 +113,8 @@ static void secondary_timer_fired(void *data)
timersub(&current, &v->stop, &res);
if (timercmp(&res, &precision, >)) {
- printf("ERROR: timer %p has expired too late!\n", v->timer);
+ fprintf(stderr, "ERROR: timer %p has expired too late!\n",
+ v->timer);
too_late++;
}
@@ -118,7 +122,7 @@ static void secondary_timer_fired(void *data)
talloc_free(data);
expired_timers++;
if (expired_timers == total_timers) {
- printf("test over: added=%u expired=%u too_late=%u \n",
+ fprintf(stdout, "test over: added=%u expired=%u too_late=%u \n",
total_timers, expired_timers, too_late);
exit(EXIT_SUCCESS);
}
@@ -134,19 +138,54 @@ static void secondary_timer_fired(void *data)
}
}
-int main(int argc, char** argv)
+static void alarm_handler(int signum)
{
- printf("Running timer test for %u steps, accepting imprecision "
- "of %u.%.6u seconds\n",
- MAIN_TIMER_NSTEPS, TIMER_PRES_SECS, TIMER_PRES_USECS);
+ fprintf(stderr, "ERROR: We took too long to run the timer test, "
+ "something seems broken, aborting.\n");
+ exit(EXIT_FAILURE);
+}
+
+int main(int argc, char *argv[])
+{
+ int c;
+
+ if (signal(SIGALRM, alarm_handler) == SIG_ERR) {
+ perror("cannot register signal handler");
+ exit(EXIT_FAILURE);
+ }
+
+ while ((c = getopt_long(argc, argv, "s:", NULL, NULL)) != -1) {
+ switch(c) {
+ case 's':
+ timer_nsteps = atoi(optarg);
+ if (timer_nsteps <= 0) {
+ fprintf(stderr, "%s: steps must be > 0\n",
+ argv[0]);
+ exit(EXIT_FAILURE);
+ }
+ break;
+ default:
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ fprintf(stdout, "Running timer test for %u steps, accepting "
+ "imprecision of %u.%.6u seconds\n",
+ timer_nsteps, TIMER_PRES_SECS, TIMER_PRES_USECS);
osmo_timer_schedule(&main_timer, 1, 0);
+ /* if the test takes too long, we may consider that the timer scheduler
+ * has hung. We set some maximum wait time which is the double of the
+ * maximum timeout randomly set (10 seconds, worst case) plus the
+ * number of steps (since some of them are reset each step). */
+ alarm(2 * (10 + timer_nsteps));
+
#ifdef HAVE_SYS_SELECT_H
while (1) {
osmo_select_main(0);
}
#else
- printf("Select not supported on this platform!\n");
+ fprintf(stdout, "Select not supported on this platform!\n");
#endif
}
diff --git a/tests/timer/timer_test.ok b/tests/timer/timer_test.ok
new file mode 100644
index 00000000..b4e0e118
--- /dev/null
+++ b/tests/timer/timer_test.ok
@@ -0,0 +1,2 @@
+Running timer test for 5 steps, accepting imprecision of 0.010000 seconds
+test over: added=31 expired=31 too_late=0