/* Cesar project {{{ * * Copyright (C) 2009 Spidcom * * <<>> * * }}} */ /** * \file src/vs.c * \brief Test sta/action/vs.c * \ingroup test */ #include "common/std.h" #include "lib/scenario/scenario.h" #include "inc/test_sta_action.h" #include "ce/rx/bitloading/nsr.h" blk_t* nsr_block; void vs_get_snr_test_case (test_t t) { /* init test context */ test_sta_action_t ctx; cp_t *cp = &ctx.cp; const cp_tei_t tei_1 = 10; const mac_t mac_1 = 0x111111111111ull; const cp_nid_t our_nid = 0x111111111111ull; u32 snr[CP_MSG_SNR_IN_MSG_NB]; /* init globals */ scenario_globals_t globals = { .cp = &ctx.cp, }; cp_mme_peer_t peer = CP_MME_PEER (0x112233445577ull, 5); cp_mme_tx_t mme_to_send; globals.mme = &mme_to_send; test_sta_action_init (&ctx); /* Create our net/AVLN. */ test_sta_action_create_our_net (&ctx, our_nid, tei_1); cp_net_t *my_net = cp_sta_mgr_get_our_avln (cp); cp_sta_t *sta_1 = cp_sta_mgr_sta_add (cp, my_net, tei_1, mac_1); sta_t* station = mac_store_sta_get (cp->mac_store, tei_1); station->rx_tonemaps->intervals->version = 2; station->rx_tonemaps->intervals->intervals_nb = 3; cp_sta_set_authenticated (cp, sta_1, true); /* Create snr blocks */ const uint blk_size = BLK_SIZE / sizeof (u32); u32 i = 0; blk_t *last; blk_t *first = blk_alloc_desc_range (PHY_CARRIER_NB / blk_size + (PHY_CARRIER_NB % blk_size ? 1 : 0), &last); blk_t *cur = first; u32* cur_data; for (i = 0; i < PHY_CARRIER_NB; i++) { if (i % blk_size == 0) { if (i) /* Get a new block. */ cur = cur->next; /* Get current data. */ cur_data = (u32 *) cur->data; } cur_data[i % blk_size] = -i; } test_case_begin (t, "get snr : invalid message"); nsr_block = first; test_begin (t, "ok") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_snr_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_snr_req_receive, .ok = false, .mac_addr = mac_1, .tm_int_i = 0, .int_id = 1, .carrier_gr = 0), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; test_case_begin (t, "get snr : station not authenticated"); cp_sta_set_authenticated (cp, sta_1, false); for (i = 0; i < CP_MSG_SNR_IN_MSG_NB; i++) snr[i] = 0; test_begin (t, "ok") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_snr_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_snr_req_receive, .ok = true, .mac_addr = mac_1, .tm_int_i = 0, .int_id = station->rx_tonemaps->intervals->version, .carrier_gr = 0), SCENARIO_EVENT (cp_msg_vs_get_snr_cnf_send, .peer = peer, .result = CP_MSG_VS_GET_SNR_CNF_RESULT_FAILURE, .int_id = 0, .intervals_nb = 0, .intervals = 0, .tm_ber = 0, .snr = snr), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; cp_sta_set_authenticated (cp, sta_1, true); test_case_begin (t, "get snr : invalid interval version"); for (i = 0; i < CP_MSG_SNR_IN_MSG_NB; i++) snr[i] = 0; test_begin (t, "ok") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_snr_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_snr_req_receive, .ok = true, .mac_addr = mac_1, .tm_int_i = 0, .int_id = 1, .carrier_gr = 0), SCENARIO_EVENT (cp_msg_vs_get_snr_cnf_send, .peer = peer, .result = CP_MSG_VS_GET_SNR_CNF_RESULT_BAD_TMP_INT_LIST_ID, .int_id = station->rx_tonemaps->intervals->version, .intervals_nb = station->rx_tonemaps->intervals->intervals_nb, .intervals = station->rx_tonemaps->intervals, .tm_ber = 0, .snr = snr), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; test_case_begin (t, "get snr : request intervals only"); test_begin (t, "ok") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_snr_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_snr_req_receive, .ok = true, .mac_addr = mac_1, .tm_int_i = CP_MSG_VS_GET_SNR_REQ_INT_LIST_ONLY, .int_id = 1, .carrier_gr = 0), SCENARIO_EVENT (cp_msg_vs_get_snr_cnf_send, .peer = peer, .result = CP_MSG_VS_GET_SNR_CNF_RESULT_SUCCESS, .int_id = station->rx_tonemaps->intervals->version, .intervals_nb = station->rx_tonemaps->intervals->intervals_nb, .intervals = station->rx_tonemaps->intervals, .tm_ber = 0, .snr = snr), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; test_case_begin (t, "get snr : snr return ko"); nsr_block = 0; test_begin (t, "ok") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_snr_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_snr_req_receive, .ok = true, .mac_addr = mac_1, .tm_int_i = 0, .int_id = station->rx_tonemaps->intervals->version, .carrier_gr = 0), SCENARIO_EVENT (cp_msg_vs_get_snr_cnf_send, .peer = peer, .result = CP_MSG_VS_GET_SNR_CNF_RESULT_FAILURE, .int_id = station->rx_tonemaps->intervals->version, .intervals_nb = station->rx_tonemaps->intervals->intervals_nb, .intervals = station->rx_tonemaps->intervals, .tm_ber = 0, .snr = snr), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; test_case_begin (t, "get snr : request is correct"); nsr_block = first; int group; for (group = 0; group < CP_MSG_VS_GET_SNR_REQ_CARRIER_GR_NB; group++) { for (i = 0; i < CP_MSG_SNR_IN_MSG_NB; i++) { if (i * CP_MSG_VS_GET_SNR_REQ_CARRIER_GR_NB + group < PHY_CARRIER_OFFSET) snr[i] = 0; else if (i * CP_MSG_VS_GET_SNR_REQ_CARRIER_GR_NB + group < PHY_CARRIER_OFFSET + PHY_CARRIER_NB) { snr[i] = -(i * CP_MSG_VS_GET_SNR_REQ_CARRIER_GR_NB + group - PHY_CARRIER_OFFSET); snr[i] /= CE_RX_BL_NSR_SOUND_RESCALE; } else snr[i] = 0; } test_begin (t, "ok") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_snr_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_snr_req_receive, .ok = true, .mac_addr = mac_1, .tm_int_i = 1, .int_id = station->rx_tonemaps->intervals->version, .carrier_gr = group), SCENARIO_EVENT (cp_msg_vs_get_snr_cnf_send, .peer = peer, .result = CP_MSG_VS_GET_SNR_CNF_RESULT_SUCCESS, .int_id = station->rx_tonemaps->intervals->version, .intervals_nb = station->rx_tonemaps->intervals->intervals_nb, .intervals = station->rx_tonemaps->intervals, .tm_ber = 0, .carrier_gr = group, .snr = snr), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; } /* Cleanup. */ blk_release_desc_range (first, last); blk_release (station); slab_release (sta_1); cp_sta_mgr_sta_remove_from_mac (cp, mac_1); test_sta_action_uninit (&ctx); } void vs_get_link_stats_test_case (test_t t) { /* init test context */ test_sta_action_t ctx; cp_t *cp = &ctx.cp; const cp_tei_t tei_1 = 10; const mac_t mac_1 = 0x111111111111ull; const cp_nid_t our_nid = 0x111111111111ull; u8 lid_tx = 0; u8 lid_rx = 1; /* init globals */ scenario_globals_t globals = { .cp = &ctx.cp, }; const cp_tei_t my_tei = 2; cp_mme_peer_t peer = CP_MME_PEER (0x112233445577ull, 5); cp_mme_tx_t mme_to_send; globals.mme = &mme_to_send; test_sta_action_init (&ctx); test_case_begin (t, "vs_get_link_stats_req invalid message"); test_begin (t, "ok") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_link_stats_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_link_stats_req_receive, .ok = false), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; /* Create our net/AVLN. */ test_sta_action_create_our_net (&ctx, our_nid, my_tei); cp_net_t *my_net = cp_sta_mgr_get_our_avln (cp); test_case_begin (t, "vs_get_link_stats_req invalid nid"); test_begin (t, "ok") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_link_stats_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_link_stats_req_receive, .ok = true, .ReqType = CP_MSG_VS_GET_LINK_STATS_REQ_REQTYPE_GET_STAT, .ReqID = 1, .nid = 1, .lid = lid_tx, .TLFlag = CP_MSG_VS_GET_LINK_STATS_REQ_TLFLAG_TX_LINK, .Mgmt_Flag = CP_MSG_VS_GET_LINK_STATS_REQ_MGMTFLAG_NOT_MGMT_LINK, .dasa = mac_1), SCENARIO_EVENT (cp_msg_vs_get_link_stats_cnf_send, .peer = peer, .ReqID = 1, .result = CP_MSG_VS_GET_LINK_STATS_CNF_RESULT_FAILURE), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; test_case_begin (t, "vs_get_link_stats_req unknown mac"); test_begin (t, "ok") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_link_stats_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_link_stats_req_receive, .ok = true, .ReqType = CP_MSG_VS_GET_LINK_STATS_REQ_REQTYPE_GET_STAT, .ReqID = 2, .nid = our_nid, .lid = lid_tx, .TLFlag = CP_MSG_VS_GET_LINK_STATS_REQ_TLFLAG_TX_LINK, .Mgmt_Flag = CP_MSG_VS_GET_LINK_STATS_REQ_MGMTFLAG_NOT_MGMT_LINK, .dasa = mac_1), SCENARIO_EVENT (cp_msg_vs_get_link_stats_cnf_send, .peer = peer, .ReqID = 2, .result = CP_MSG_VS_GET_LINK_STATS_CNF_RESULT_FAILURE), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; /* Create a station in the network */ cp_sta_t *sta_1 = cp_sta_mgr_sta_add (cp, my_net, tei_1, mac_1); test_case_begin (t, "vs_get_link_stats_req unknown link"); test_begin (t, "ok") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_link_stats_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_link_stats_req_receive, .ok = true, .ReqType = CP_MSG_VS_GET_LINK_STATS_REQ_REQTYPE_GET_STAT, .ReqID = 3, .nid = our_nid, .lid = lid_tx, .TLFlag = CP_MSG_VS_GET_LINK_STATS_REQ_TLFLAG_TX_LINK, .Mgmt_Flag = CP_MSG_VS_GET_LINK_STATS_REQ_MGMTFLAG_NOT_MGMT_LINK, .dasa = mac_1), SCENARIO_EVENT (cp_msg_vs_get_link_stats_cnf_send, .peer = peer, .ReqID = 3, .result = CP_MSG_VS_GET_LINK_STATS_CNF_RESULT_FAILURE), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; /* Create a tx link (tx=true, broadcast=false, mme=false) */ bool added = false; mfs_t *m_tx = mac_store_mfs_add (cp->mac_store, true, false, false, lid_tx, tei_1, &added); m_tx->tx.stats.num_bad_pbs_crc = 123; test_case_begin (t, "vs_get_link_stats_req valid tx link req"); test_begin (t, "ok") { test_fail_unless (added == true); scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_link_stats_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_link_stats_req_receive, .ok = true, .ReqType = CP_MSG_VS_GET_LINK_STATS_REQ_REQTYPE_GET_STAT, .ReqID = 4, .nid = our_nid, .lid = lid_tx, .TLFlag = CP_MSG_VS_GET_LINK_STATS_REQ_TLFLAG_TX_LINK, .Mgmt_Flag = CP_MSG_VS_GET_LINK_STATS_REQ_MGMTFLAG_NOT_MGMT_LINK, .dasa = mac_1), SCENARIO_EVENT (cp_msg_vs_get_link_stats_cnf_send, .peer = peer, .ReqID = 4, .result = CP_MSG_VS_GET_LINK_STATS_CNF_RESULT_SUCCESS, .Bad_CRC = 123), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; /* Create a rx link (tx=false, broadcast=false, mme=false) */ added = false; mfs_t *m_rx = mac_store_mfs_add (cp->mac_store, false, false, false, lid_rx, tei_1, &added); m_rx->rx.stats.num_bad_pbs_crc = 321; test_case_begin (t, "vs_get_link_stats_req valid rx link req"); test_begin (t, "ok") { test_fail_unless (added == true); scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_link_stats_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_link_stats_req_receive, .ok = true, .ReqType = CP_MSG_VS_GET_LINK_STATS_REQ_REQTYPE_GET_STAT, .ReqID = 5, .nid = our_nid, .lid = lid_rx, .TLFlag = CP_MSG_VS_GET_LINK_STATS_REQ_TLFLAG_RX_LINK, .Mgmt_Flag = CP_MSG_VS_GET_LINK_STATS_REQ_MGMTFLAG_NOT_MGMT_LINK, .dasa = mac_1), SCENARIO_EVENT (cp_msg_vs_get_link_stats_cnf_send, .peer = peer, .ReqID = 5, .result = CP_MSG_VS_GET_LINK_STATS_CNF_RESULT_SUCCESS, .Bad_CRC = 321), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; test_case_begin (t, "vs_get_link_stats_req valid tx link get and reset"); test_begin (t, "ok") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_link_stats_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_link_stats_req_receive, .ok = true, .ReqType = CP_MSG_VS_GET_LINK_STATS_REQ_REQTYPE_GET_RESET_STAT, .ReqID = 6, .nid = our_nid, .lid = lid_tx, .TLFlag = CP_MSG_VS_GET_LINK_STATS_REQ_TLFLAG_TX_LINK, .Mgmt_Flag = CP_MSG_VS_GET_LINK_STATS_REQ_MGMTFLAG_NOT_MGMT_LINK, .dasa = mac_1), SCENARIO_EVENT (cp_msg_vs_get_link_stats_cnf_send, .peer = peer, .ReqID = 6, .result = CP_MSG_VS_GET_LINK_STATS_CNF_RESULT_SUCCESS, .Bad_CRC = 123), SCENARIO_END }; scenario_run (t, entries, &globals); test_fail_unless (m_tx->tx.stats.num_bad_pbs_crc == 0); } test_end; test_case_begin (t, "link_stats_req valid rx link reset"); test_begin (t, "ok") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_link_stats_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_link_stats_req_receive, .ok = true, .ReqType = CP_MSG_VS_GET_LINK_STATS_REQ_REQTYPE_RESET_STAT, .ReqID = 7, .nid = our_nid, .lid = lid_rx, .TLFlag = CP_MSG_VS_GET_LINK_STATS_REQ_TLFLAG_RX_LINK, .Mgmt_Flag = CP_MSG_VS_GET_LINK_STATS_REQ_MGMTFLAG_NOT_MGMT_LINK, .dasa = mac_1), SCENARIO_EVENT (cp_msg_vs_get_link_stats_cnf_send, .peer = peer, .ReqID = 7, .result = CP_MSG_VS_GET_LINK_STATS_CNF_RESULT_SUCCESS, .Bad_CRC = 0), SCENARIO_END }; scenario_run (t, entries, &globals); test_fail_unless (m_tx->tx.stats.num_bad_pbs_crc == 0); } test_end; /* Cleanup. */ mac_store_mfs_remove (cp->mac_store, m_rx); blk_release (m_rx); mac_store_mfs_remove (cp->mac_store, m_tx); blk_release (m_tx); slab_release (sta_1); cp_sta_mgr_sta_remove_from_mac (cp, mac_1); test_sta_action_uninit (&ctx); } void vs_get_tonemap_test_case (test_t t) { /* init test context */ test_sta_action_t ctx; cp_t *cp = &ctx.cp; const cp_tei_t tei_1 = 10; const mac_t mac_1 = 0x111111111111ull; const cp_nid_t our_nid = 0x111111111111ull; /* init globals */ scenario_globals_t globals = { .cp = &ctx.cp, }; cp_mme_peer_t peer = CP_MME_PEER (0x112233445577ull, 5); cp_mme_tx_t mme_to_send; globals.mme = &mme_to_send; test_sta_action_init (&ctx); test_case_begin (t, "get tonemap"); test_begin (t, "get_tonemap_req_receive return false") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_tonemap_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_tonemap_req_receive, .ok = false, .mac_addr = mac_1, .tmi = 0, .int_id = 0, .dir = 0), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; test_begin (t, "invalid mac address") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_tonemap_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_tonemap_req_receive, .ok = true, .mac_addr = mac_1, .tmi = 0x00, .int_id = 0, .dir = CP_MSG_VS_GET_TONEMAP_REQ_DIRECTION_RX), SCENARIO_EVENT (cp_msg_vs_get_tonemap_cnf_send, .peer = peer, .result = CP_MSG_VS_GET_TONEMAP_CNF_RESULT_FAILURE, .beacon_delta = 0, .int_id = 0, .tms = 0, .tmi = 0), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; /* Create our net/AVLN. */ test_sta_action_create_our_net (&ctx, our_nid, tei_1); cp_net_t *my_net = cp_sta_mgr_get_our_avln (cp); cp_sta_t *sta_1 = cp_sta_mgr_sta_add (cp, my_net, tei_1, mac_1); sta_t* station = mac_store_sta_get (cp->mac_store, tei_1); cp_sta_set_authenticated (cp, sta_1, true); test_begin (t, "tonemap doesn't exist") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_tonemap_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_tonemap_req_receive, .ok = true, .mac_addr = mac_1, .tmi = 4, .int_id = station->tx_tonemaps->intervals->version, .dir = CP_MSG_VS_GET_TONEMAP_REQ_DIRECTION_TX), SCENARIO_EVENT (cp_msg_vs_get_tonemap_cnf_send, .peer = peer, .result = CP_MSG_VS_GET_TONEMAP_CNF_RESULT_FAILURE, .beacon_delta = 0, .int_id = station->tx_tonemaps->intervals->version, .tms = 0, .tmi = 0), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; station->tx_tonemaps->tm[4] = tonemap_alloc (); station->rx_tonemaps->tm[4] = tonemap_alloc (); station->tx_tonemaps->intervals->version = 23; station->rx_tonemaps->intervals->version = 15; test_begin (t, "correct tonemap") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_tonemap_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_tonemap_req_receive, .ok = true, .mac_addr = mac_1, .tmi = 4, .int_id = station->tx_tonemaps->intervals->version, .dir = CP_MSG_VS_GET_TONEMAP_REQ_DIRECTION_TX), SCENARIO_EVENT (cp_msg_vs_get_tonemap_cnf_send, .peer = peer, .result = CP_MSG_VS_GET_TONEMAP_CNF_RESULT_SUCCESS, .beacon_delta = 0, .int_id = station->tx_tonemaps->intervals->version, .tms = station->tx_tonemaps, .tmi = 4), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; cp_sta_set_authenticated (cp, sta_1, false); test_begin (t, "requesting station is not part of our avln") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_tonemap_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_tonemap_req_receive, .ok = true, .mac_addr = mac_1, .tmi = 0x00, .int_id = 0, .dir = CP_MSG_VS_GET_TONEMAP_REQ_DIRECTION_RX), SCENARIO_EVENT (cp_msg_vs_get_tonemap_cnf_send, .peer = peer, .result = CP_MSG_VS_GET_TONEMAP_CNF_RESULT_FAILURE, .beacon_delta = 0, .int_id = 0, .tms = 0, .tmi = 0), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; cp_sta_set_authenticated (cp, sta_1, true); /* In this test we try to get the tonemap tx with the tmi version of * the rx, which is invalid. */ test_begin (t, "wrong interval list index") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_tonemap_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_tonemap_req_receive, .ok = true, .mac_addr = mac_1, .tmi = 4, .int_id = station->rx_tonemaps->intervals->version, .dir = CP_MSG_VS_GET_TONEMAP_REQ_DIRECTION_TX), SCENARIO_EVENT (cp_msg_vs_get_tonemap_cnf_send, .peer = peer, .result = CP_MSG_VS_GET_TONEMAP_CNF_RESULT_BAD_TMP_INT_LIST_ID, .beacon_delta = 0, .int_id = station->tx_tonemaps->intervals->version, .tms = station->tx_tonemaps, .tmi = 4), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; test_begin (t, "only get intervals and tonemaps") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_tonemap_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_tonemap_req_receive, .ok = true, .mac_addr = mac_1, .tmi = CP_MSG_VS_GET_TONEMAP_TMI_AND_INT_ONLY, .int_id = 0, .dir = CP_MSG_VS_GET_TONEMAP_REQ_DIRECTION_TX), SCENARIO_EVENT (cp_msg_vs_get_tonemap_cnf_send, .peer = peer, .result = CP_MSG_VS_GET_TONEMAP_CNF_RESULT_SUCCESS, .beacon_delta = 0, .int_id = station->tx_tonemaps->intervals->version, .tms = station->tx_tonemaps, .tmi = CP_MSG_VS_GET_TONEMAP_TMI_AND_INT_ONLY), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; /* Cleanup. */ blk_release (station); slab_release (sta_1); test_sta_action_uninit (&ctx); } void imac_get_discover_list_test_case (test_t t) { /* init test context */ test_sta_action_t ctx; cp_t *cp = &ctx.cp; const cp_tei_t tei_1 = 10; const mac_t mac_1 = 0x111111111111ull; const cp_nid_t our_nid = 0x111111111111ull; /* init globals */ scenario_globals_t globals = { .cp = &ctx.cp, }; cp_mme_peer_t peer = CP_MME_PEER (0x112233445577ull, 5); cp_mme_tx_t mme_to_send; globals.mme = &mme_to_send; test_sta_action_init (&ctx); test_case_begin (t, "get discover list"); test_begin (t, "get_discover_list_req_receive return false") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__imac_get_discover_list_req, .peer = peer), SCENARIO_EVENT (cp_msg_imac_get_discover_list_req_receive, .ok = false), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; test_begin (t, "get_discover_list_req_receive return true, no sta") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__imac_get_discover_list_req, .peer = peer), SCENARIO_EVENT (cp_msg_imac_get_discover_list_req_receive, .ok = true), SCENARIO_EVENT (cp_msg_imac_get_discover_list_cnf_send_begin, .peer = peer, .result = CP_MSG_IMAC_GET_DISCOVER_LIST_RESULT_SUCCESS, .version = CP_MSG_GET_DISCOVER_LIST_VERSION, .num_stations = 0), SCENARIO_EVENT (cp_msg_imac_get_discover_list_cnf_send_end), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; /* Create our net/AVLN. */ test_sta_action_create_our_net (&ctx, our_nid, tei_1); cp_net_t *my_net = cp_sta_mgr_get_our_avln (cp); cp_sta_t *sta_1 = cp_sta_mgr_sta_add (cp, my_net, tei_1, mac_1); sta_t *sta1 = mac_store_sta_get (cp->mac_store, tei_1); sta1->tx_tonemaps->intervals->intervals_nb = 0; sta1->tx_tonemaps->default_tmi = PHY_MOD_ROBO; sta1->rx_tonemaps->intervals->intervals_nb = 0; sta1->rx_tonemaps->default_tmi = PHY_MOD_HS_ROBO; cp->mac_config->tonemask_info.tonemap_robo[PHY_MOD_ROBO].ble = 0x15; cp->mac_config->tonemask_info.tonemap_robo[PHY_MOD_HS_ROBO].ble = 0x16; test_begin (t, "one station in our net") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__imac_get_discover_list_req, .peer = peer), SCENARIO_EVENT (cp_msg_imac_get_discover_list_req_receive, .ok = true), SCENARIO_EVENT (cp_msg_imac_get_discover_list_cnf_send_begin, .peer = peer, .result = CP_MSG_IMAC_GET_DISCOVER_LIST_RESULT_SUCCESS, .version = CP_MSG_GET_DISCOVER_LIST_VERSION, .num_stations = 1), SCENARIO_EVENT (cp_msg_imac_get_discover_list_cnf_send, .mac = mac_1, .ble_tx = 69, .ble_rx = 138), SCENARIO_EVENT (cp_msg_imac_get_discover_list_cnf_send_end), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; cp_net_t *other_net = cp_sta_mgr_add_avln (cp, 5, our_nid+1); cp_sta_t *sta_2 = cp_sta_mgr_sta_add (cp, other_net, tei_1+1, mac_1+1); cp_sta_t *sta_3 = cp_sta_mgr_sta_add (cp, my_net, tei_1+2, mac_1+2); sta_t *sta3 = mac_store_sta_get (cp->mac_store, tei_1+2); sta3->tx_tonemaps->intervals->intervals_nb = 0; sta3->tx_tonemaps->default_tmi = TONEMAP_INDEX_NEGOTIATED_FIRST; sta3->tx_tonemaps->tm[TONEMAP_INDEX_NEGOTIATED_FIRST] = tonemap_alloc (); sta3->tx_tonemaps->tm[TONEMAP_INDEX_NEGOTIATED_FIRST]->ble = 0x23; sta3->rx_tonemaps->intervals->intervals_nb = 4; sta3->rx_tonemaps->tm[TONEMAP_INDEX_NEGOTIATED_FIRST] = tonemap_alloc (); sta3->rx_tonemaps->tm[TONEMAP_INDEX_NEGOTIATED_FIRST]->ble = 0xFF; sta3->rx_tonemaps->tm[TONEMAP_INDEX_NEGOTIATED_FIRST + 1] = tonemap_alloc (); sta3->rx_tonemaps->tm[TONEMAP_INDEX_NEGOTIATED_FIRST + 1]->ble = 0x00; sta3->rx_tonemaps->tm[TONEMAP_INDEX_NEGOTIATED_FIRST + 2] = tonemap_alloc (); sta3->rx_tonemaps->tm[TONEMAP_INDEX_NEGOTIATED_FIRST + 2]->ble = 0x08; sta3->rx_tonemaps->tm[TONEMAP_INDEX_NEGOTIATED_FIRST + 3] = tonemap_alloc (); sta3->rx_tonemaps->tm[TONEMAP_INDEX_NEGOTIATED_FIRST + 3]->ble = 0x0F; sta3->rx_tonemaps->intervals->interval[0].tmi = TONEMAP_INDEX_NEGOTIATED_FIRST; sta3->rx_tonemaps->intervals->interval[0].end_offset_atu = 10; sta3->rx_tonemaps->intervals->interval[1].tmi = TONEMAP_INDEX_NEGOTIATED_FIRST + 1; sta3->rx_tonemaps->intervals->interval[1].end_offset_atu = 100; sta3->rx_tonemaps->intervals->interval[2].tmi = TONEMAP_INDEX_NEGOTIATED_FIRST + 2; sta3->rx_tonemaps->intervals->interval[2].end_offset_atu = 400; sta3->rx_tonemaps->intervals->interval[3].tmi = TONEMAP_INDEX_NEGOTIATED_FIRST + 3; sta3->rx_tonemaps->intervals->interval[3].end_offset_atu = 500; test_begin (t, "one more station in our net and one in an other net") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__imac_get_discover_list_req, .peer = peer), SCENARIO_EVENT (cp_msg_imac_get_discover_list_req_receive, .ok = true), SCENARIO_EVENT (cp_msg_imac_get_discover_list_cnf_send_begin, .peer = peer, .result = CP_MSG_IMAC_GET_DISCOVER_LIST_RESULT_SUCCESS, .version = CP_MSG_GET_DISCOVER_LIST_VERSION, .num_stations = 3), SCENARIO_EVENT (cp_msg_imac_get_discover_list_cnf_send, .mac = mac_1, .ble_tx = 69, .ble_rx = 138), SCENARIO_EVENT (cp_msg_imac_get_discover_list_cnf_send, .mac = mac_1+2, .ble_tx = 18, .ble_rx = 65), SCENARIO_EVENT (cp_msg_imac_get_discover_list_cnf_send, .mac = mac_1+1, .ble_tx = 0, .ble_rx = 0), SCENARIO_EVENT (cp_msg_imac_get_discover_list_cnf_send_end), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; /* Cleanup. */ blk_release (sta1); blk_release (sta3); slab_release (sta_3); cp_sta_mgr_sta_remove_from_mac (cp, mac_1+2); slab_release (sta_2); cp_sta_mgr_sta_remove_from_mac (cp, mac_1+1); slab_release (sta_1); cp_sta_mgr_sta_remove_from_mac (cp, mac_1); test_sta_action_uninit (&ctx); } void vs_get_ce_stats_test_case (test_t t) { test_case_begin (t, "vs_get_ce_stats"); test_sta_action_t ctx; cp_t *cp = &ctx.cp; /* Init globals. */ scenario_globals_t globals = { .cp = &ctx.cp, }; cp_mme_peer_t peer = CP_MME_PEER (0x112233445577ull, 5); cp_mme_tx_t mme_to_send; globals.mme = &mme_to_send; test_sta_action_init (&ctx); test_begin (t, "invalid address") { mac_t mac = MAC_ZERO; scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_ce_stats_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_ce_stats_req_receive, .mac = mac, .ok = false), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; test_begin (t, "non existing mac") { mac_t mac = 0x42ull; scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_ce_stats_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_ce_stats_req_receive, .mac = mac, .ok = true), SCENARIO_EVENT ( cp_msg_vs_get_ce_stats_cnf_send, .peer = peer, .version = 0, .result = CP_MSG_VS_GET_CE_STATS_CNF_RESULT_FAILURE, .sta = NULL, .ti = NULL), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; /* Add a station. */ mac_t mac = 0x42ull; const cp_tei_t tei = 10; const cp_nid_t our_nid = 0x111111111111ull; test_sta_action_create_our_net (&ctx, our_nid, tei); cp_net_t *my_net = cp_sta_mgr_get_our_avln (&ctx.cp); cp_sta_t *cp_sta = cp_sta_mgr_sta_add (cp, my_net, tei, mac); sta_t *sta = mac_store_sta_get (cp->mac_store, tei); cp_sta_set_authenticated (cp, cp_sta, true); test_begin (t, "existing mac") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_ce_stats_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_ce_stats_req_receive, .mac = mac, .ok = true), SCENARIO_EVENT ( cp_msg_vs_get_ce_stats_cnf_send, .peer = peer, .version = 0, .result = CP_MSG_VS_GET_CE_STATS_CNF_RESULT_SUCCESS, .sta = sta, .ti = &cp->mac_config->tonemask_info), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; cp_sta_set_authenticated (cp, cp_sta, false); test_begin (t, "existing mac, but stations not authenticated") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_ce_stats_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_ce_stats_req_receive, .mac = mac, .ok = true), SCENARIO_EVENT ( cp_msg_vs_get_ce_stats_cnf_send, .peer = peer, .version = 0, .result = CP_MSG_VS_GET_CE_STATS_CNF_RESULT_FAILURE, .sta = NULL, .ti = NULL), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; blk_release (sta); slab_release (cp_sta); cp_sta_mgr_sta_remove_from_mac (cp, mac); test_sta_action_uninit (&ctx); } void vs_get_pb_stats_test_case (test_t t) { test_sta_action_t ctx; /* Init globals. */ scenario_globals_t globals = { .cp = &ctx.cp, }; cp_mme_peer_t peer = CP_MME_PEER (0x112233445577ull, 5); cp_mme_tx_t mme_to_send; globals.mme = &mme_to_send; test_sta_action_init (&ctx); test_case_begin (t, "vs_get_pb_stats"); test_begin (t, "basic behavior") { scenario_entry_t entries[] = { SCENARIO_ACTION (vs__started__vs_get_pb_stats_req, .peer = peer), SCENARIO_EVENT (cp_msg_vs_get_pb_stats_req_receive, .stei_filter = MAC_TEI_UNASSOCIATED, .ok = true), SCENARIO_EVENT ( cp_msg_vs_get_pb_stats_cnf_send_begin, .peer = peer, .nb_measures = 0), SCENARIO_EVENT ( cp_msg_vs_get_pb_stats_cnf_send_measure, .start_to_read = 0, .nb_entries = 0), SCENARIO_EVENT ( cp_msg_vs_get_pb_stats_cnf_send_end), SCENARIO_END }; scenario_run (t, entries, &globals); } test_end; test_sta_action_uninit (&ctx); } void vs_test_suite (test_t t) { test_suite_begin (t, "vs"); vs_get_tonemap_test_case (t); vs_get_link_stats_test_case (t); imac_get_discover_list_test_case (t); vs_get_snr_test_case (t); vs_get_ce_stats_test_case (t); vs_get_pb_stats_test_case (t); test_case_begin (t, "memory"); test_begin (t, "memory") { test_fail_unless (blk_check_memory ()); } test_end; }