summaryrefslogtreecommitdiff
path: root/cesar/ce/rx/bitloading/test
diff options
context:
space:
mode:
authorJérôme Jutteau2011-09-23 17:55:30 +0200
committerCyril Jourdan2013-01-18 11:53:44 +0100
commit54d22b2dc90686c4c8c6adb8411a18c2adb89d96 (patch)
treece665d5c752d63249cdc758bc877636864d91ad4 /cesar/ce/rx/bitloading/test
parentaf08cd04895692bbfbc77474542d35ee16dca28a (diff)
cesar/ce/rx/bl: adjust global fsm transitions for intervals, refs #2366
Diffstat (limited to 'cesar/ce/rx/bitloading/test')
-rw-r--r--cesar/ce/rx/bitloading/test/intervals/Makefile9
-rw-r--r--cesar/ce/rx/bitloading/test/intervals/inc/scenario_defs.h11
-rw-r--r--cesar/ce/rx/bitloading/test/intervals/src/scenario_intervals_actions.c4
-rw-r--r--cesar/ce/rx/bitloading/test/intervals/src/test_fsm.c307
4 files changed, 329 insertions, 2 deletions
diff --git a/cesar/ce/rx/bitloading/test/intervals/Makefile b/cesar/ce/rx/bitloading/test/intervals/Makefile
index 10805c0c59..e9e8a42648 100644
--- a/cesar/ce/rx/bitloading/test/intervals/Makefile
+++ b/cesar/ce/rx/bitloading/test/intervals/Makefile
@@ -1,5 +1,5 @@
# List of program to build.
-HOST_PROGRAMS = test_ce_intervals_fsm
+HOST_PROGRAMS = test_ce_intervals_fsm test_ce_fsm
# Base directory.
BASE = ../../../../..
@@ -11,6 +11,13 @@ test_ce_intervals_fsm_MODULES = lib ce/rx/bitloading/fsm ce/rx/bitloading \
ce/rx/cp/stub ce/common lib/scenario
test_ce_intervals_CONFIG_MODULES = cp
+test_ce_fsm_SOURCES = scenario_intervals_actions.c \
+ test_fsm.c scenario_intervals_events.c \
+ ../../src/ecos_stub.c
+test_ce_fsm_MODULES = lib ce/rx/bitloading/fsm ce/rx/bitloading \
+ ce/rx/cp/stub ce/common lib/scenario
+test_ce_fsm_CONFIG_MODULES = cp
+
ce_rx_bitloading_MODULE_SOURCES = transition.c intervals.c common.c pber.c \
ber_margin_update.c
mac_common_MODULE_SOURCES = interval.c
diff --git a/cesar/ce/rx/bitloading/test/intervals/inc/scenario_defs.h b/cesar/ce/rx/bitloading/test/intervals/inc/scenario_defs.h
index 6f56e6c7ba..e8516c7f1e 100644
--- a/cesar/ce/rx/bitloading/test/intervals/inc/scenario_defs.h
+++ b/cesar/ce/rx/bitloading/test/intervals/inc/scenario_defs.h
@@ -35,7 +35,11 @@
INTERVAL_SOUND__interval_data, \
INTERVAL_SOUND_WAIT__interval_sound, \
INTERVAL_SOUND_WAIT__interval_sound_completed, \
- INTERVAL_SOUND_WAIT__interval_data
+ INTERVAL_SOUND_WAIT__interval_data, \
+ IDLE__sound_completed, \
+ INITIAL__sound_completed, \
+ INTERVALS__sound, \
+ INTERVALS__sound_completed
/* Actions with default parameters. */
#define __action(action) \
@@ -61,6 +65,11 @@ __action (INTERVAL_SOUND_WAIT__interval_sound);
__action (INTERVAL_SOUND_WAIT__interval_sound_completed);
__action (INTERVAL_SOUND_WAIT__interval_data);
+__action (IDLE__sound_completed);
+__action (INITIAL__sound_completed);
+__action (INTERVALS__sound);
+__action (INTERVALS__sound_completed);
+
#undef __action
/* Scenario events. */
diff --git a/cesar/ce/rx/bitloading/test/intervals/src/scenario_intervals_actions.c b/cesar/ce/rx/bitloading/test/intervals/src/scenario_intervals_actions.c
index c0fde0f6dc..4d62949adf 100644
--- a/cesar/ce/rx/bitloading/test/intervals/src/scenario_intervals_actions.c
+++ b/cesar/ce/rx/bitloading/test/intervals/src/scenario_intervals_actions.c
@@ -38,3 +38,7 @@ __action_def (INTERVAL_SOUND_WAIT__interval_sound);
__action_def (INTERVAL_SOUND_WAIT__interval_sound_completed);
__action_def (INTERVAL_SOUND_WAIT__interval_data);
+__action_def (IDLE__sound_completed);
+__action_def (INITIAL__sound_completed);
+__action_def (INTERVALS__sound);
+__action_def (INTERVALS__sound_completed);
diff --git a/cesar/ce/rx/bitloading/test/intervals/src/test_fsm.c b/cesar/ce/rx/bitloading/test/intervals/src/test_fsm.c
new file mode 100644
index 0000000000..da96df089b
--- /dev/null
+++ b/cesar/ce/rx/bitloading/test/intervals/src/test_fsm.c
@@ -0,0 +1,307 @@
+/* Cesar project {{{
+ *
+ * Copyright (C) 2010 Spidcom
+ *
+ * <<<Licence>>>
+ *
+ * }}} */
+/**
+ * \file ce/rx/bitloading/test/intervals/src/test_fsm.c
+ * \brief Test new FSM transitions for intervals.
+ * \ingroup test
+ */
+#include "common/std.h"
+
+#include "ce/rx/inc/rx.h"
+#include "ce/rx/bitloading/fsm/event.h"
+#include "ce/rx/bitloading/inc/ber.h"
+#include "ce/rx/bitloading/inc/pber.h"
+#include "ce/rx/inc/measure.h"
+#include "ce/common/mod.h"
+#include "mac/common/sta.h"
+#include "mac/common/tonemap.h"
+#include "ce_rx_bl_fsm_defs.h"
+
+#include "lib/test.h"
+#include "lib/scenario/scenario.h"
+#include "lib/preproc.h"
+#include "lib/rnd.h"
+
+#include <cyg/kernel/kapi.h>
+#include <string.h>
+
+u8 mac_interval_fsm_count_ = 6;
+u8 mac_interval_repetition_count_ = 4;
+u16 mac_interval_measure_shift_tolerance_ = 0;
+
+/**
+ * The configuration of the BER module.
+ */
+ce_rx_bl_ber_conf_t ce_rx_bl_ber_conf;
+
+/* Global CE/RX behavior stub. */
+ce_rx_behavior_t ce_rx_behavior = CE_RX_BEHAVIOR_INTERVALS_ENABLE;
+
+static void
+test_ce_rx_bl_fsm_IDLE (test_t t)
+{
+ mac_config_t config;
+ config.tonemask_info.carrier_nb = PHY_CARRIER_NB;
+ config.tonemask_info.tonemap_robo[PHY_MOD_ROBO].one_pb_data_tck = 0;
+ config.tonemask_info.tonemap_robo[PHY_MOD_ROBO].bits_per_symbol = 42;
+ bsu_aclf_t aclf;
+ *((bsu_aclf_bp_t*) &aclf.beacon_period_theo_tck) = BSU_ACLF_BP_50HZ_TCK;
+
+ ce_rx_t ce = { .mac_config = &config, .aclf = &aclf, .tck_per_rtc = 1};
+ scenario_globals_t globals = {
+ .ce = &ce,
+ };
+ ce_rx_measure_mbox_t measure;
+ u8 default_tmi = 0; /* ROBO */
+ int tested_fsm_id = CE_RX_MEASURE_NO_INTERVAL;
+ measure.fsm_id = tested_fsm_id;
+ measure.rx_params.sound = true;
+ measure.rx_params.sound_complete = true;
+
+ sta_t sta;
+ tonemaps_t rx_tms;
+ sta.rx_tonemaps = &rx_tms;
+ sta.rx_tonemaps->default_tmi = default_tmi;
+ ce_rx_bitloading_init (&sta.ce_rx_bt);
+
+ test_case_begin (t, "IDLE, sound_completed while mode_interval is on");
+
+ test_begin (t, "The transition branch to mode_interval.")
+ {
+ scenario_entry_t fsm_base[300];
+ int pos = 0;
+
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_ACTION (
+ IDLE__sound_completed, .sta = &sta, .measure = measure,
+ .branch = ce_rx_bl_fsm_next_branch (IDLE, sound_completed,
+ mode_interval));
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_bl_nsr_sum_init, .bl = &sta.ce_rx_bt);
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_bl_nsr_compute_mean, .bl = &sta.ce_rx_bt);
+
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_bl_initial, .bl = &sta.ce_rx_bt);
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ tonemaps_set_first_free_tmi);
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_bl_ber_sliding_mean_update,
+ .bl = &sta.ce_rx_bt);
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_cp_send_mme_new_tone_map,
+ .ce_rx = &ce, .peer = &sta,
+ .new_tmi = DEFAULT_NEW_TMI, .old_tmi = 0, .initial_ce = true);
+
+ /* Check intervals are updated with default tmi */
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ mac_interval_clear, .tms = &rx_tms);
+ int j;
+ int total_ints = mac_interval_fsm_count_ *
+ mac_interval_repetition_count_;
+
+ for (j = 0; j < total_ints; j++)
+ {
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ mac_interval_append, .tms = &rx_tms, .tmi = DEFAULT_NEW_TMI);
+ }
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ mac_interval_commit_changes, .tms = &rx_tms);
+
+ /* - check MMe is sent */
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_cp_send_mme_refresh_tmi_list, .ce_rx = &ce, .peer = &sta);
+
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_END;
+ scenario_run (t, fsm_base, &globals);
+
+ test_fail_unless (sta.rx_tonemaps->default_tmi == DEFAULT_NEW_TMI);
+ } test_end;
+
+ /* Clean. */
+ ce_rx_bl_intervals_free (sta.intervals);
+}
+
+static void
+test_ce_rx_bl_fsm_INITIAL (test_t t)
+{
+ mac_config_t config;
+ config.tonemask_info.carrier_nb = PHY_CARRIER_NB;
+ config.tonemask_info.tonemap_robo[PHY_MOD_ROBO].one_pb_data_tck = 0;
+ config.tonemask_info.tonemap_robo[PHY_MOD_ROBO].bits_per_symbol = 42;
+ bsu_aclf_t aclf;
+ *((bsu_aclf_bp_t*) &aclf.beacon_period_theo_tck) = BSU_ACLF_BP_50HZ_TCK;
+
+ ce_rx_t ce = { .mac_config = &config, .aclf = &aclf, .tck_per_rtc = 1};
+ scenario_globals_t globals = {
+ .ce = &ce,
+ };
+
+ ce_rx_measure_mbox_t measure;
+ u8 default_tmi = 0; /* ROBO */
+ int tested_fsm_id = CE_RX_MEASURE_NO_INTERVAL;
+ measure.fsm_id = tested_fsm_id;
+ measure.rx_params.sound = true;
+ measure.rx_params.sound_complete = true;
+
+ sta_t sta;
+ tonemaps_t rx_tms;
+ sta.rx_tonemaps = &rx_tms;
+ sta.rx_tonemaps->default_tmi = default_tmi;
+ ce_rx_bitloading_init (&sta.ce_rx_bt);
+
+ test_case_begin (t, "INITIAL, sound_completed while mode_interval is on");
+
+ test_begin (t, "The transition branch to mode_interval.")
+ {
+ scenario_entry_t fsm_base[300];
+ int pos = 0;
+
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_ACTION (
+ INITIAL__sound_completed, .sta = &sta,
+ .measure = measure,
+ .branch = ce_rx_bl_fsm_next_branch (INITIAL,
+ sound_completed, mode_interval));
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_bl_nsr_sum_add, .bl = &sta.ce_rx_bt);
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_bl_nsr_compute_mean, .bl = &sta.ce_rx_bt);
+
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_bl_initial, .bl = &sta.ce_rx_bt);
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ tonemaps_set_first_free_tmi);
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_bl_ber_sliding_mean_update,
+ .bl = &sta.ce_rx_bt);
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_cp_send_mme_new_tone_map,
+ .ce_rx = &ce, .peer = &sta,
+ .new_tmi = DEFAULT_NEW_TMI, .old_tmi = 0, .initial_ce = true);
+
+ /* Check intervals are updated with default tmi */
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ mac_interval_clear, .tms = &rx_tms);
+ int j;
+ int total_ints = mac_interval_fsm_count_ *
+ mac_interval_repetition_count_;
+
+ for (j = 0; j < total_ints; j++)
+ {
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ mac_interval_append, .tms = &rx_tms, .tmi = DEFAULT_NEW_TMI);
+ }
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ mac_interval_commit_changes, .tms = &rx_tms);
+
+ /* - check MMe is sent */
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_cp_send_mme_refresh_tmi_list, .ce_rx = &ce, .peer = &sta);
+
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_END;
+ scenario_run (t, fsm_base, &globals);
+
+ test_fail_unless (sta.rx_tonemaps->default_tmi == DEFAULT_NEW_TMI);
+ } test_end;
+
+ /* Clean. */
+ ce_rx_bl_intervals_free (sta.intervals);
+}
+
+static void
+test_ce_rx_bl_fsm_INTERVALS (test_t t)
+{
+ mac_config_t config;
+ config.tonemask_info.carrier_nb = PHY_CARRIER_NB;
+ config.tonemask_info.tonemap_robo[PHY_MOD_ROBO].one_pb_data_tck = 0;
+ config.tonemask_info.tonemap_robo[PHY_MOD_ROBO].bits_per_symbol = 42;
+ bsu_aclf_t aclf;
+ *((bsu_aclf_bp_t*) &aclf.beacon_period_theo_tck) = BSU_ACLF_BP_50HZ_TCK;
+
+ ce_rx_t ce = { .mac_config = &config, .aclf = &aclf, };
+ scenario_globals_t globals = {
+ .ce = &ce,
+ };
+ /* Initialize an empty release list. */
+ tonemap_release_list_init (&ce.tonemap_release_list);
+
+ ce_rx_measure_mbox_t measure;
+ u8 tested_tmi = 0; /* ROBO mode makes test more simple */
+ int tested_fsm_id = CE_RX_MEASURE_NO_INTERVAL;
+ measure.fsm_id = tested_fsm_id;
+ measure.rx_params.sound = true;
+ measure.rx_params.sound_complete = false;
+
+ sta_t sta;
+ tonemaps_t rx_tms;
+ sta.rx_tonemaps = &rx_tms;
+ sta.rx_tonemaps->default_tmi = tested_tmi;
+ sta.intervals = ce_rx_bl_intervals_alloc (tested_tmi);
+ ce_rx_bitloading_init (&sta.ce_rx_bt);
+
+ test_case_begin (t, "INTERVALS, sound is received");
+
+ test_begin (t, "The FSM returns to INITIAL.")
+ {
+ scenario_entry_t fsm_base[300];
+ int pos = 0;
+
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_ACTION (
+ INTERVALS__sound, .sta = &sta,
+ .measure = measure,
+ .branch = ce_rx_bl_fsm_next (INTERVALS, sound));
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ tonemaps_reset, .tms = sta.rx_tonemaps);
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_bl_nsr_sum_init, .bl = &sta.ce_rx_bt);
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_END;
+ scenario_run (t, fsm_base, &globals);
+ } test_end;
+
+ /* Clean. */
+ /* Nothing need to be cleaned in the test because the scenario does it. */
+
+ test_case_begin (t, "INTERVALS, sound_completed is received");
+
+ test_begin (t, "The event is ignored.")
+ {
+ scenario_entry_t fsm_base[300];
+ int pos = 0;
+
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_ACTION (
+ INTERVALS__sound_completed, .sta = &sta,
+ .measure = measure,
+ .branch = ce_rx_bl_fsm_next (INTERVALS, sound_completed));
+ fsm_base[pos++] = (scenario_entry_t) 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_suite_begin (t, "CE:RX:BL:INTERVALS: MAIN FSM");
+ ce_rx_bl_ber_conf_init();
+ test_ce_rx_bl_fsm_IDLE (t);
+ test_ce_rx_bl_fsm_INITIAL (t);
+ test_ce_rx_bl_fsm_INTERVALS (t);
+
+ /* Memory check. */
+ test_case_begin (t, "General");
+ test_begin (t, "Memory")
+ {
+ test_fail_unless (blk_check_memory ());
+ } test_end;
+
+ test_result (t);
+ return test_nb_failed (t) == 0 ? 0 : 1;
+}
+
+