summaryrefslogtreecommitdiff
path: root/cesar
diff options
context:
space:
mode:
Diffstat (limited to 'cesar')
-rw-r--r--cesar/ce/rx/bitloading/test/Makefile2
-rw-r--r--cesar/ce/rx/bitloading/test/fsm-Makefile21
-rw-r--r--cesar/ce/rx/bitloading/test/inc/scenario_defs.h75
-rw-r--r--cesar/ce/rx/bitloading/test/src/scenario_actions.c34
-rw-r--r--cesar/ce/rx/bitloading/test/src/scenario_events.c32
-rw-r--r--cesar/ce/rx/bitloading/test/src/test_fsm.c178
6 files changed, 341 insertions, 1 deletions
diff --git a/cesar/ce/rx/bitloading/test/Makefile b/cesar/ce/rx/bitloading/test/Makefile
index 37cdbd9481..edee041fbe 100644
--- a/cesar/ce/rx/bitloading/test/Makefile
+++ b/cesar/ce/rx/bitloading/test/Makefile
@@ -2,7 +2,7 @@
# Some variables.
# Supported target/makefile
-supported_target = sparc host
+supported_target = sparc host fsm
# Generate clean targets.
supported_target_clean = $(supported_target:%=%-clean)
diff --git a/cesar/ce/rx/bitloading/test/fsm-Makefile b/cesar/ce/rx/bitloading/test/fsm-Makefile
new file mode 100644
index 0000000000..2e9b17e305
--- /dev/null
+++ b/cesar/ce/rx/bitloading/test/fsm-Makefile
@@ -0,0 +1,21 @@
+# Variant is host.
+VARIANT = host
+
+# Include common defines.
+include common-define.mk
+
+# List of program to build.
+HOST_PROGRAMS = test_ce_fsm
+
+test_ce_fsm_SOURCES = scenario_actions.c test_fsm.c scenario_events.c
+test_ce_fsm_MODULES = $(ce_rx_bl_modules_common) lib/scenario
+
+ce_rx_bitloading_MODULE_SOURCES = transition.c
+
+INCLUDES = ce/rx/bitloading/test
+
+# Include base makefile.
+include $(BASE)/common/make/top.mk
+
+# Include some additional rules.
+include common-rule.mk
diff --git a/cesar/ce/rx/bitloading/test/inc/scenario_defs.h b/cesar/ce/rx/bitloading/test/inc/scenario_defs.h
new file mode 100644
index 0000000000..37f292b4f8
--- /dev/null
+++ b/cesar/ce/rx/bitloading/test/inc/scenario_defs.h
@@ -0,0 +1,75 @@
+#ifndef ce_rx_bitloading_test_inc_scenario_defs_h
+#define ce_rx_bitloading_test_inc_scenario_defs_h
+/* Cesar project {{{
+ *
+ * Copyright (C) 2010 Spidcom
+ *
+ * <<<Licence>>>
+ *
+ * }}} */
+/**
+ * \file ce/rx/bitloading/test/inc/scenario_defs.h
+ * \brief Scenario definition.
+ * \ingroup test
+ */
+
+#include "ce/rx/rx.h"
+#include "mac/common/sta.h"
+#include "ce/rx/bitloading/fsm/event.h"
+#include "ce_rx_bl_fsm_defs.h"
+
+/* Scenario globals. */
+#define SCENARIO_DEFS_GLOBALS \
+ ce_rx_t *ce; \
+
+/* Scenario actions. */
+#define SCENARIO_DEFS_ACTIONS \
+ IDLE__channel_data_received, \
+ INITIAL__channel_data_received, \
+ TODO
+
+/* Actions with default parameters. */
+#define __action(action) \
+typedef struct \
+{ \
+ sta_t *sta; \
+ ce_rx_bitloading_fsm_event_param_t data; \
+ ce_rx_bl_fsm_branch_t branch; \
+} scenario_action_ ## action ## _t; \
+\
+void \
+scenario_action_ ## action ## _cb ( \
+ scenario_globals_t *globals, \
+ scenario_params_t *params);
+
+__action (IDLE__channel_data_received)
+__action (INITIAL__channel_data_received)
+__action (TODO)
+
+#undef __action
+
+/* Scenario events. */
+#define SCENARIO_DEFS_EVENTS \
+ ce_rx_bl_nsr_sum_init, \
+ ce_rx_bl_nsr_sum_add, \
+ ce_rx_bl_nsr_compute_mean, \
+ ce_rx_bl_start_bl
+
+/* An event. */
+#define __event(event, param...) \
+typedef struct \
+{ \
+ PREPROC_FOR_EACH (__p_, ## param) \
+} scenario_event_ ## event ## _t;
+
+#define __p_(param) param;
+
+__event (ce_rx_bl_nsr_sum_init);
+__event (ce_rx_bl_nsr_sum_add);
+__event (ce_rx_bl_nsr_compute_mean);
+__event (ce_rx_bl_start_bl);
+
+#undef __event
+#undef __p_
+
+#endif /* ce_rx_bitloading_test_inc_scenario_defs_h */
diff --git a/cesar/ce/rx/bitloading/test/src/scenario_actions.c b/cesar/ce/rx/bitloading/test/src/scenario_actions.c
new file mode 100644
index 0000000000..01d03c4389
--- /dev/null
+++ b/cesar/ce/rx/bitloading/test/src/scenario_actions.c
@@ -0,0 +1,34 @@
+/* Cesar project {{{
+ *
+ * Copyright (C) 2010 Spidcom
+ *
+ * <<<Licence>>>
+ *
+ * }}} */
+/**
+ * \file ce/rx/bitloading/test/src/scenario_actions.c
+ * \brief Scenario actions.
+ * \ingroup test
+ */
+#include "common/std.h"
+
+#include "lib/scenario/scenario.h"
+
+#include "ce/rx/bitloading/inc/transition.h"
+
+#define __action_def(ACTION) \
+void \
+scenario_action_ ## ACTION ## _cb (scenario_globals_t *globals, \
+ scenario_params_t *params) \
+{ \
+ ce_rx_bl_fsm_branch_t ret = \
+ ce_rx_bl__ ## ACTION (globals->ce, \
+ params->action_ ## ACTION.sta, \
+ params->action_ ## ACTION.data); \
+ test_within (scenario.t); \
+ test_fail_unless (ret == params->action_ ## ACTION.branch); \
+}
+
+__action_def (IDLE__channel_data_received);
+__action_def (INITIAL__channel_data_received);
+__action_def (TODO);
diff --git a/cesar/ce/rx/bitloading/test/src/scenario_events.c b/cesar/ce/rx/bitloading/test/src/scenario_events.c
new file mode 100644
index 0000000000..f5ddd79f84
--- /dev/null
+++ b/cesar/ce/rx/bitloading/test/src/scenario_events.c
@@ -0,0 +1,32 @@
+/* Cesar project {{{
+ *
+ * Copyright (C) 2010 Spidcom
+ *
+ * <<<Licence>>>
+ *
+ * }}} */
+/**
+ * \file ce/rx/bitloading/test/src/scenario_events.c
+ * \brief Events stubs.
+ * \ingroup test
+ */
+#include "common/std.h"
+
+#include "ce/rx/bitloading/inc/nsr.h"
+
+#include "lib/scenario/scenario.h"
+
+#define __event_empty_def(ret_name, func_name, params...) \
+ret_name \
+func_name (params) \
+{ \
+ scenario_event (func_name); \
+} \
+
+__event_empty_def (void, ce_rx_bl_nsr_sum_init, ce_rx_bitloading_t
+ *bl, phy_chandata_t *chan_data, uint chan_data_count)
+__event_empty_def (void, ce_rx_bl_nsr_sum_add, ce_rx_bitloading_t
+ *bl, phy_chandata_t *chan_data, uint chan_data_count)
+__event_empty_def (void, ce_rx_bl_nsr_compute_mean, ce_rx_bitloading_t *bl);
+__event_empty_def (void, ce_rx_bl_start_bl, ce_rx_t *ce_rx, sta_t *sta,
+ tonemask_info_t *ts);
diff --git a/cesar/ce/rx/bitloading/test/src/test_fsm.c b/cesar/ce/rx/bitloading/test/src/test_fsm.c
new file mode 100644
index 0000000000..5a53ab3557
--- /dev/null
+++ b/cesar/ce/rx/bitloading/test/src/test_fsm.c
@@ -0,0 +1,178 @@
+/* Cesar project {{{
+ *
+ * Copyright (C) 2010 Spidcom
+ *
+ * <<<Licence>>>
+ *
+ * }}} */
+/**
+ * \file ce/rx/bitloading/test/src/test_fsm.c
+ * \brief Test bit loading FSM.
+ * \ingroup test
+ */
+#include "common/std.h"
+
+#include "ce/rx/inc/rx.h"
+#include "ce/rx/bitloading/fsm/event.h"
+#include "ce/rx/inc/measure.h"
+#include "mac/common/sta.h"
+#include "ce_rx_bl_fsm_defs.h"
+
+#include "lib/test.h"
+#include "lib/scenario/scenario.h"
+
+static void
+test_ce_rx_bl_measure_empty (ce_rx_measure_mbox_t *m)
+{
+ m->pb_measurements = NULL;
+ m->chan_data = NULL;
+ m->pb_measurements_count = m->chan_data_count = 0;
+ m->rx_params.sound = false;
+ m->rx_params.sound_complete = false;
+}
+
+static void
+test_ce_rx_bl_fsm_base (test_t t)
+{
+ test_suite_begin (t, "CE:RX:BL:FSM");
+
+ ce_rx_t ce = { .mac_config = INVALID_PTR, };
+ scenario_globals_t globals = {
+ .ce = &ce,
+ };
+
+ sta_t sta;
+ ce_rx_bitloading_fsm_event_param_t data;
+ ce_rx_measure_mbox_t measure;
+ data.measure = &measure;
+
+ test_case_begin (t, "sound not received yet");
+
+ test_begin (t, "IDLE, not sound, do nothing")
+ {
+ test_ce_rx_bl_measure_empty (&measure);
+ scenario_entry_t fsm_base[] =
+ {
+ SCENARIO_ACTION (IDLE__channel_data_received,
+ .sta = &sta,
+ .data = data,
+ .branch = ce_rx_bl_fsm_next_branch
+ (IDLE, channel_data_received, not_sound)),
+ /* Nothing should happen. */
+ SCENARIO_END,
+ };
+ scenario_run (t, fsm_base, &globals);
+ } test_end;
+
+ test_case_begin (t, "many sounds, one sound complete, bit loading "
+ "initial");
+
+ test_begin (t, "IDLE, many sound, one sound complete")
+ {
+ test_ce_rx_bl_measure_empty (&measure);
+ measure.rx_params.sound = true;
+ ce_rx_bitloading_fsm_event_param_t data_sc;
+ ce_rx_measure_mbox_t measure_sc;
+ data_sc.measure = &measure_sc;
+ test_ce_rx_bl_measure_empty (&measure_sc);
+ measure_sc.rx_params.sound = true;
+ measure_sc.rx_params.sound_complete = true;
+ scenario_entry_t fsm_base[] =
+ {
+ SCENARIO_ACTION (IDLE__channel_data_received,
+ .sta = &sta,
+ .data = data,
+ .branch = ce_rx_bl_fsm_next_branch
+ (IDLE, channel_data_received, sound)),
+ /* Init NSR. */
+ SCENARIO_EVENT (ce_rx_bl_nsr_sum_init),
+ SCENARIO_ACTION (INITIAL__channel_data_received,
+ .sta = &sta,
+ .data = data,
+ .branch = ce_rx_bl_fsm_next_branch
+ (INITIAL, channel_data_received,
+ sound_not_last)),
+ /* Increase NSR. */
+ SCENARIO_EVENT (ce_rx_bl_nsr_sum_add),
+ SCENARIO_ACTION (INITIAL__channel_data_received,
+ .sta = &sta,
+ .data = data,
+ .branch = ce_rx_bl_fsm_next_branch
+ (INITIAL, channel_data_received,
+ sound_not_last)),
+ /* Increase NSR. */
+ SCENARIO_EVENT (ce_rx_bl_nsr_sum_add),
+ SCENARIO_ACTION (INITIAL__channel_data_received,
+ .sta = &sta,
+ .data = data_sc,
+ .branch = ce_rx_bl_fsm_next_branch
+ (INITIAL, channel_data_received, sound_last)),
+ /* Increase NSR. */
+ SCENARIO_EVENT (ce_rx_bl_nsr_sum_add),
+ /* Compute Mean. */
+ SCENARIO_EVENT (ce_rx_bl_nsr_compute_mean),
+ /* Start BL. */
+ SCENARIO_EVENT (ce_rx_bl_start_bl),
+ SCENARIO_END,
+ };
+ scenario_run (t, fsm_base, &globals);
+ } test_end;
+
+ test_case_begin (t, "one sound complete, bit loading initial");
+
+ test_begin (t, "IDLE, one sound complete")
+ {
+ test_ce_rx_bl_measure_empty (&measure);
+ measure.rx_params.sound = true;
+ measure.rx_params.sound_complete = true;
+ scenario_entry_t fsm_base[] =
+ {
+ SCENARIO_ACTION (IDLE__channel_data_received,
+ .sta = &sta,
+ .data = data,
+ .branch = ce_rx_bl_fsm_next_branch
+ (IDLE, channel_data_received, sound_last)),
+ /* Init NSR. */
+ SCENARIO_EVENT (ce_rx_bl_nsr_sum_init),
+ /* Compute NSR mean (required because of NSR rescaling). */
+ SCENARIO_EVENT (ce_rx_bl_nsr_compute_mean),
+ /* Start BL. */
+ SCENARIO_EVENT (ce_rx_bl_start_bl),
+ SCENARIO_END,
+ };
+ scenario_run (t, fsm_base, &globals);
+ } test_end;
+
+ test_case_begin (t, "many sound complete, one bit loading");
+
+ test_begin (t, "TRACKING, many sound complete")
+ {
+ test_ce_rx_bl_measure_empty (&measure);
+ measure.rx_params.sound = true;
+ measure.rx_params.sound_complete = true;
+ scenario_entry_t fsm_base[] =
+ {
+ SCENARIO_ACTION (TODO,
+ .sta = &sta,
+ .data = data,
+ .branch = ce_rx_bl_fsm_next
+ (TRACKING, channel_data_received)),
+ /* Nothing should happen. */
+ SCENARIO_END,
+ };
+ scenario_run (t, fsm_base, &globals);
+ } test_end;
+
+}
+
+int
+main (int argc, char **argv)
+{
+ test_t t;
+ test_init (t, argc, argv);
+
+ test_ce_rx_bl_fsm_base (t);
+
+ test_result (t);
+ return test_nb_failed (t) == 0 ? 0 : 1;
+}