aboutsummaryrefslogtreecommitdiffstats
path: root/tests/tbf/TbfTest.cpp
diff options
context:
space:
mode:
authorMax <msuraev@sysmocom.de>2017-12-15 11:25:14 +0100
committerMax <msuraev@sysmocom.de>2018-01-12 15:29:41 +0100
commit7d32f55e4ef44adc3a3ed5234eaad135f660ed11 (patch)
treedf0d957aa86c3ce5edf0169bc695d4377b7edb8b /tests/tbf/TbfTest.cpp
parent2617bf201661fca909774aa44d8ee017e5225ab1 (diff)
Avoid code duplication in TBF test
Move repetitive checks into corresponding macros to avoid copy-pasted code. This also enables strickter checks some of which were apparently omitted while copy-pasting. This is part of preparation work to move to separate UL/DL windows. Related: OS#1759 Change-Id: If7aa72f5aa66c5e9c255542c066b5494c098aab2
Diffstat (limited to 'tests/tbf/TbfTest.cpp')
-rw-r--r--tests/tbf/TbfTest.cpp197
1 files changed, 75 insertions, 122 deletions
diff --git a/tests/tbf/TbfTest.cpp b/tests/tbf/TbfTest.cpp
index 44f42b9b..fbbe366b 100644
--- a/tests/tbf/TbfTest.cpp
+++ b/tests/tbf/TbfTest.cpp
@@ -295,6 +295,13 @@ static void test_tbf_final_ack(enum test_tbf_final_ack_mode test_mode)
printf("=== end %s ===\n", __func__);
}
+/* Receive an ACK */
+#define RCV_ACK(fin, tbf, rbb) do { \
+ tbf->rcvd_dl_ack(fin, tbf->m_window.v_s(), rbb); \
+ if (!fin) \
+ OSMO_ASSERT(tbf->m_window.window_empty()); \
+ } while(0)
+
static void test_tbf_delayed_release()
{
BTS the_bts;
@@ -340,16 +347,13 @@ static void test_tbf_delayed_release()
/* ACK all blocks */
memset(rbb, 0xff, sizeof(rbb));
- /* Receive an ACK */
- dl_tbf->rcvd_dl_ack(false, dl_tbf->m_window.v_s(), rbb);
- OSMO_ASSERT(dl_tbf->m_window.window_empty());
+
+ RCV_ACK(false, dl_tbf, rbb); /* Receive an ACK */
/* Force sending of a single block containing an LLC dummy command */
request_dl_rlc_block(dl_tbf, &fn);
- /* Receive an ACK */
- dl_tbf->rcvd_dl_ack(false, dl_tbf->m_window.v_s(), rbb);
- OSMO_ASSERT(dl_tbf->m_window.window_empty());
+ RCV_ACK(false, dl_tbf, rbb); /* Receive an ACK */
/* Timeout (make sure fn % 52 remains valid) */
fn += 52 * ((msecs_to_frames(bts->dl_tbf_idle_msec + 100) + 51)/ 52);
@@ -357,8 +361,7 @@ static void test_tbf_delayed_release()
OSMO_ASSERT(dl_tbf->state_is(GPRS_RLCMAC_FINISHED));
- /* Receive a final ACK */
- dl_tbf->rcvd_dl_ack(true, dl_tbf->m_window.v_s(), rbb);
+ RCV_ACK(true, dl_tbf, rbb); /* Receive a final ACK */
/* Clean up and ensure tbfs are in the correct state */
OSMO_ASSERT(dl_tbf->state_is(GPRS_RLCMAC_WAIT_RELEASE));
@@ -2692,8 +2695,7 @@ static void establish_and_use_egprs_dl_tbf(BTS *the_bts, int mcs)
OSMO_ASSERT(dl_tbf->state_is(GPRS_RLCMAC_FLOW));
- /* Receive a final ACK */
- dl_tbf->rcvd_dl_ack(true, dl_tbf->m_window.v_s(), rbb);
+ RCV_ACK(true, dl_tbf, rbb); /* Receive a final ACK */
/* Clean up and ensure tbfs are in the correct state */
OSMO_ASSERT(dl_tbf->state_is(GPRS_RLCMAC_WAIT_RELEASE));
@@ -2742,8 +2744,7 @@ static void tbf_cleanup(gprs_rlcmac_dl_tbf *dl_tbf)
{
uint8_t rbb[64/8];
- /* Receive a final ACK */
- dl_tbf->rcvd_dl_ack(true, dl_tbf->m_window.v_s(), rbb);
+ RCV_ACK(true, dl_tbf, rbb); /* Receive a final ACK */
/* Clean up and ensure tbfs are in the correct state */
OSMO_ASSERT(dl_tbf->state_is(GPRS_RLCMAC_WAIT_RELEASE));
@@ -2753,6 +2754,30 @@ static void tbf_cleanup(gprs_rlcmac_dl_tbf *dl_tbf)
}
+#define NACK(tbf, x) do { \
+ tbf->m_window.m_v_b.mark_nacked(x); \
+ OSMO_ASSERT(tbf->m_window.m_v_b.is_nacked(x)); \
+ } while(0)
+
+#define CHECK_UNACKED(tbf, cs, bsn) do { \
+ OSMO_ASSERT(tbf->m_window.m_v_b.is_unacked(bsn)); \
+ OSMO_ASSERT(tbf->m_rlc.block(bsn)->cs_current_trans.to_num() == cs); \
+ } while(0)
+
+#define CHECK_NACKED(tbf, cs, bsn) do { \
+ OSMO_ASSERT(tbf->m_window.m_v_b.is_nacked(bsn)); \
+ OSMO_ASSERT(tbf->m_rlc.block(bsn)->cs_current_trans.to_num() == cs); \
+ } while(0)
+
+#define MAKE_ACKED(m, tbf, fn, cs, check_unacked) do { \
+ m = tbf->create_dl_acked_block(fn, tbf->control_ts); \
+ OSMO_ASSERT(m); \
+ if (check_unacked) \
+ CHECK_UNACKED(tbf, cs, 0); \
+ else \
+ CHECK_NACKED(tbf, cs, 0); \
+ } while(0)
+
static void egprs_spb_to_normal_validation(BTS *the_bts,
unsigned int mcs, unsigned int demanded_mcs)
{
@@ -2777,15 +2802,13 @@ static void egprs_spb_to_normal_validation(BTS *the_bts,
fn = fn_add_blocks(fn, 1);
/* Send first RLC data block BSN 0 */
- msg = dl_tbf->create_dl_acked_block(fn, dl_tbf->control_ts);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_unacked(0));
- OSMO_ASSERT(dl_tbf->m_rlc.block(0)->cs_current_trans.to_num()
- == mcs);
+ MAKE_ACKED(msg, dl_tbf, fn, mcs, true);
egprs2 = (struct gprs_rlc_dl_header_egprs_2 *) msg->data;
bsn1 = (egprs2->bsn1_hi << 9) | (egprs2->bsn1_mid << 1) | (egprs2->bsn1_lo);
- dl_tbf->m_window.m_v_b.mark_nacked(0);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_nacked(0));
+
+ NACK(dl_tbf, 0);
+
OSMO_ASSERT(bsn1 == 0);
dl_tbf->ms()->set_current_cs_dl
@@ -2795,10 +2818,7 @@ static void egprs_spb_to_normal_validation(BTS *the_bts,
fn = fn_add_blocks(fn, 1);
/* Send first segment with demanded_mcs */
- msg = dl_tbf->create_dl_acked_block(fn, dl_tbf->control_ts);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_nacked(0));
- OSMO_ASSERT(dl_tbf->m_rlc.block(0)->cs_current_trans.to_num()
- == demanded_mcs);
+ MAKE_ACKED(msg, dl_tbf, fn, demanded_mcs, false);
OSMO_ASSERT(dl_tbf->m_rlc.block(0)->spb_status.block_status_dl
== EGPRS_RESEG_FIRST_SEG_SENT);
@@ -2809,10 +2829,7 @@ static void egprs_spb_to_normal_validation(BTS *the_bts,
OSMO_ASSERT(egprs3->cps == 3);
/* Send second segment with demanded_mcs */
- msg = dl_tbf->create_dl_acked_block(fn, dl_tbf->control_ts);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_unacked(0));
- OSMO_ASSERT(dl_tbf->m_rlc.block(0)->cs_current_trans.to_num()
- == demanded_mcs);
+ MAKE_ACKED(msg, dl_tbf, fn, demanded_mcs, true);
OSMO_ASSERT(dl_tbf->m_rlc.block(0)->spb_status.block_status_dl
== EGPRS_RESEG_SECOND_SEG_SENT);
@@ -2830,8 +2847,8 @@ static void egprs_spb_to_normal_validation(BTS *the_bts,
(static_cast < GprsCodingScheme::Scheme >
(GprsCodingScheme::CS4 + mcs));
- dl_tbf->m_window.m_v_b.mark_nacked(0);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_nacked(0));
+ NACK(dl_tbf, 0);
+
msg = dl_tbf->create_dl_acked_block(fn, dl_tbf->control_ts);
egprs2 = (struct gprs_rlc_dl_header_egprs_2 *) msg->data;
@@ -2871,13 +2888,9 @@ static void establish_and_use_egprs_dl_tbf_for_spb(BTS *the_bts,
fn = fn_add_blocks(fn, 1);
/* Send first RLC data block BSN 0 */
- msg = dl_tbf->create_dl_acked_block(fn, dl_tbf->control_ts);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_unacked(0));
- OSMO_ASSERT(dl_tbf->m_rlc.block(0)->cs_current_trans.to_num()
- == mcs);
+ MAKE_ACKED(msg, dl_tbf, fn, mcs, true);
- dl_tbf->m_window.m_v_b.mark_nacked(0);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_nacked(0));
+ NACK(dl_tbf, 0);
dl_tbf->ms()->set_current_cs_dl
(static_cast < GprsCodingScheme::Scheme >
@@ -2886,10 +2899,7 @@ static void establish_and_use_egprs_dl_tbf_for_spb(BTS *the_bts,
fn = fn_add_blocks(fn, 1);
/* Send first segment with demanded_mcs */
- msg = dl_tbf->create_dl_acked_block(fn, dl_tbf->control_ts);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_nacked(0));
- OSMO_ASSERT(dl_tbf->m_rlc.block(0)->cs_current_trans.to_num()
- == demanded_mcs);
+ MAKE_ACKED(msg, dl_tbf, fn, demanded_mcs, false);
OSMO_ASSERT(dl_tbf->m_rlc.block(0)->spb_status.block_status_dl
== EGPRS_RESEG_FIRST_SEG_SENT);
@@ -2913,10 +2923,7 @@ static void establish_and_use_egprs_dl_tbf_for_spb(BTS *the_bts,
}
/* Send second segment with demanded_mcs */
- msg = dl_tbf->create_dl_acked_block(fn, dl_tbf->control_ts);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_unacked(0));
- OSMO_ASSERT(dl_tbf->m_rlc.block(0)->cs_current_trans.to_num()
- == demanded_mcs);
+ MAKE_ACKED(msg, dl_tbf, fn, demanded_mcs, true);
OSMO_ASSERT(dl_tbf->m_rlc.block(0)->spb_status.block_status_dl
== EGPRS_RESEG_SECOND_SEG_SENT);
@@ -2965,19 +2972,11 @@ static void establish_and_use_egprs_dl_tbf_for_retx(BTS *the_bts,
((mcs == 7) && (demanded_mcs < 7))) {
fn = fn_add_blocks(fn, 1);
/* Send 2 RLC data block */
- msg = dl_tbf->create_dl_acked_block(fn, dl_tbf->control_ts);
- OSMO_ASSERT(msg);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_unacked(0));
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_unacked(1));
- OSMO_ASSERT(dl_tbf->m_rlc.block(0)->cs_current_trans.to_num()
- == mcs);
- OSMO_ASSERT(dl_tbf->m_rlc.block(1)->cs_current_trans.to_num()
- == mcs);
-
- dl_tbf->m_window.m_v_b.mark_nacked(0);
- dl_tbf->m_window.m_v_b.mark_nacked(1);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_nacked(0));
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_nacked(1));
+ MAKE_ACKED(msg, dl_tbf, fn, mcs, true);
+ CHECK_UNACKED(dl_tbf, mcs, 1);
+
+ NACK(dl_tbf, 0);
+ NACK(dl_tbf, 1);
/* Set the demanded MCS to demanded_mcs */
dl_tbf->ms()->set_current_cs_dl
@@ -2986,43 +2985,26 @@ static void establish_and_use_egprs_dl_tbf_for_retx(BTS *the_bts,
fn = fn_add_blocks(fn, 1);
/* Retransmit the first RLC data block with demanded_mcs */
- msg = dl_tbf->create_dl_acked_block(fn, dl_tbf->control_ts);
- OSMO_ASSERT(msg);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_unacked(0));
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_nacked(1));
- OSMO_ASSERT(dl_tbf->m_rlc.block(0)->cs_current_trans.to_num()
- == demanded_mcs);
+ MAKE_ACKED(msg, dl_tbf, fn, demanded_mcs, true);
+ CHECK_NACKED(dl_tbf, mcs, 1);
fn = fn_add_blocks(fn, 1);
/* Retransmit the second RLC data block with demanded_mcs */
- msg = dl_tbf->create_dl_acked_block(fn, dl_tbf->control_ts);
- OSMO_ASSERT(msg);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_unacked(0));
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_unacked(1));
- OSMO_ASSERT(dl_tbf->m_rlc.block(1)->cs_current_trans.to_num()
- == demanded_mcs);
+ MAKE_ACKED(msg, dl_tbf, fn, demanded_mcs, true);
+ CHECK_UNACKED(dl_tbf, demanded_mcs, 1);
} else if (((mcs == 5) && (demanded_mcs > 6)) ||
((mcs == 6) && (demanded_mcs > 8))) {
fn = fn_add_blocks(fn, 1);
/* Send first RLC data block BSN 0 */
- msg = dl_tbf->create_dl_acked_block(fn, dl_tbf->control_ts);
- OSMO_ASSERT(msg);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_unacked(0));
- OSMO_ASSERT(dl_tbf->m_rlc.block(0)->cs_current_trans.to_num()
- == mcs);
+ MAKE_ACKED(msg, dl_tbf, fn, mcs, true);
fn = fn_add_blocks(fn, 1);
/* Send second RLC data block BSN 1 */
- msg = dl_tbf->create_dl_acked_block(fn, dl_tbf->control_ts);
- OSMO_ASSERT(msg);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_unacked(1));
- OSMO_ASSERT(dl_tbf->m_rlc.block(1)->cs_current_trans.to_num()
- == mcs);
+ MAKE_ACKED(msg, dl_tbf, fn, mcs, true);
+ CHECK_UNACKED(dl_tbf, mcs, 1);
- dl_tbf->m_window.m_v_b.mark_nacked(0);
- dl_tbf->m_window.m_v_b.mark_nacked(1);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_nacked(0));
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_nacked(1));
+ NACK(dl_tbf, 0);
+ NACK(dl_tbf, 1);
dl_tbf->ms()->set_current_cs_dl
(static_cast < GprsCodingScheme::Scheme >
@@ -3030,63 +3012,34 @@ static void establish_and_use_egprs_dl_tbf_for_retx(BTS *the_bts,
fn = fn_add_blocks(fn, 1);
/* Send first, second RLC data blocks with demanded_mcs */
- msg = dl_tbf->create_dl_acked_block(fn, dl_tbf->control_ts);
- OSMO_ASSERT(msg);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_unacked(0));
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_unacked(1));
- OSMO_ASSERT(dl_tbf->m_rlc.block(0)->cs_current_trans.to_num()
- == demanded_mcs);
- OSMO_ASSERT(dl_tbf->m_rlc.block(1)->cs_current_trans.to_num()
- == demanded_mcs);
+ MAKE_ACKED(msg, dl_tbf, fn, demanded_mcs, true);
+ CHECK_UNACKED(dl_tbf, demanded_mcs, 1);
} else if (mcs > 6) {
/* No Mcs change cases are handled here for mcs > MCS6*/
fn = fn_add_blocks(fn, 1);
/* Send first,second RLC data blocks */
- msg = dl_tbf->create_dl_acked_block(fn, dl_tbf->control_ts);
- OSMO_ASSERT(msg);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_unacked(0));
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_unacked(1));
- OSMO_ASSERT(dl_tbf->m_rlc.block(0)->cs_current_trans.to_num()
- == mcs);
- OSMO_ASSERT(dl_tbf->m_rlc.block(1)->cs_current_trans.to_num()
- == mcs);
-
- dl_tbf->m_window.m_v_b.mark_nacked(0);
- dl_tbf->m_window.m_v_b.mark_nacked(1);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_nacked(0));
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_nacked(1));
+ MAKE_ACKED(msg, dl_tbf, fn, mcs, true);
+ CHECK_UNACKED(dl_tbf, mcs, 1);
+
+ NACK(dl_tbf, 0);
+ NACK(dl_tbf, 1);
fn = fn_add_blocks(fn, 1);
/* Send first,second RLC data blocks with demanded_mcs*/
- msg = dl_tbf->create_dl_acked_block(fn, dl_tbf->control_ts);
- OSMO_ASSERT(msg);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_unacked(0));
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_unacked(1));
- OSMO_ASSERT(dl_tbf->m_rlc.block(0)->cs_current_trans.to_num()
- == mcs);
- OSMO_ASSERT(dl_tbf->m_rlc.block(1)->cs_current_trans.to_num()
- == mcs);
+ MAKE_ACKED(msg, dl_tbf, fn, mcs, true);
+ CHECK_UNACKED(dl_tbf, mcs, 1);
} else {
/* No MCS change cases are handled here for mcs <= MCS6*/
fn = fn_add_blocks(fn, 1);
/* Send first RLC data block */
- msg = dl_tbf->create_dl_acked_block(fn, dl_tbf->control_ts);
- OSMO_ASSERT(msg);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_unacked(0));
- OSMO_ASSERT(dl_tbf->m_rlc.block(0)->cs_current_trans.to_num()
- == mcs);
+ MAKE_ACKED(msg, dl_tbf, fn, mcs, true);
- dl_tbf->m_window.m_v_b.mark_nacked(0);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_nacked(0));
+ NACK(dl_tbf, 0);
fn = fn_add_blocks(fn, 1);
/* Send first RLC data block with demanded_mcs */
- msg = dl_tbf->create_dl_acked_block(fn, dl_tbf->control_ts);
- OSMO_ASSERT(msg);
- OSMO_ASSERT(dl_tbf->m_window.m_v_b.is_unacked(0));
- OSMO_ASSERT(dl_tbf->m_rlc.block(0)->cs_current_trans.to_num()
- == mcs);
+ MAKE_ACKED(msg, dl_tbf, fn, mcs, true);
}
tbf_cleanup(dl_tbf);