diff --git a/tests/test_queue_fairness/Makefile b/tests/test_queue_fairness/Makefile new file mode 100644 index 0000000000..609832133e --- /dev/null +++ b/tests/test_queue_fairness/Makefile @@ -0,0 +1,6 @@ +PROJECT = test_queue_fairness +include ../Makefile.tests_common + +USEMODULE += vtimer + +include $(RIOTBASE)/Makefile.include diff --git a/tests/test_queue_fairness/main.c b/tests/test_queue_fairness/main.c new file mode 100644 index 0000000000..3f1a10fa64 --- /dev/null +++ b/tests/test_queue_fairness/main.c @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2014 Freie Universität Berlin + * + * This file is subject to the terms and conditions of the GNU Lesser General + * Public License. See the file LICENSE in the top level directory for more + * details. + */ + +/** + * @ingroup tests + * @{ + * @file + * @brief Test if the queue used for messaging is fair. + * @author René Kijewski + * @} + */ + +#include + +#include "flags.h" +#include "kernel.h" +#include "msg.h" +#include "sched.h" +#include "thread.h" +#include "vtimer.h" + +#define STACK_SIZE (KERNEL_CONF_STACKSIZE_DEFAULT + KERNEL_CONF_STACKSIZE_PRINTF) + +#define NUM_CHILDREN (3) +#define NUM_ITERATIONS (10) + +static char stacks[NUM_CHILDREN][STACK_SIZE]; +static int pids[NUM_CHILDREN]; +static char names[NUM_CHILDREN][8]; + +static int parent_pid; + +static void child_fun(void) +{ + printf("Start of %s.\n", active_thread->name); + + for (int i = 0; i < NUM_ITERATIONS; ++i) { + msg_t m; + m.type = i + 1; + m.content.ptr = (void *) active_thread->name; + msg_send(&m, parent_pid, true); + } + + printf("End of %s.\n", active_thread->name); +} + +int main(void) +{ + puts("Start."); + parent_pid = thread_pid; + + for (int i = 0; i < NUM_CHILDREN; ++i) { + snprintf(names[i], sizeof (names[i]), "child%2u", i + 1); + pids[i] = thread_create(stacks[i], + sizeof (stacks[i]), + PRIORITY_MAIN + 1, + CREATE_WOUT_YIELD | CREATE_STACKTEST, + child_fun, + names[i]); + } + + int last_iteration = 0; + for (int i = 0; i < NUM_ITERATIONS * NUM_CHILDREN; ++i) { + msg_t m; + msg_receive(&m); + int cur_iteration = (int) m.type; + char *child = (char *) m.content.ptr; + + printf("Received message from %s, iteration %u / %u: %s\n", + child, cur_iteration, NUM_ITERATIONS, + cur_iteration >= last_iteration ? "okay" : "ERROR"); + + last_iteration = cur_iteration; + vtimer_usleep(25 * 1000); + } + + puts("Done."); + return 0; +} diff --git a/tests/test_queue_fairness/tests/01-test b/tests/test_queue_fairness/tests/01-test new file mode 100755 index 0000000000..0164072e0d --- /dev/null +++ b/tests/test_queue_fairness/tests/01-test @@ -0,0 +1,44 @@ +#!/usr/bin/env expect + +set timeout 5 + +set pid [spawn make term] +puts "-*- Spawened $pid -*-\n" + +set result 0 +expect { + "Start." {} + timeout { + set result 1 + } +} + +while { $result == 0 } { + set result 1 + expect { + "Received message" { + expect { + ": okay" { set result 0 } + ": ERROR" { set result 1 } + timeout { break } + } + } + "Done." { + set result 0 + break + } + timeout { break } + } +} + +if { $result == 0 } { + puts "\n-*- Test successful! -*-\n" +} else { + puts "\n-*- TEST HAD ERRORS! -*-\n" +} +spawn kill -15 $pid +sleep 1 +spawn kill -9 $pid +wait +close +exit $result