From 7d32f55e4ef44adc3a3ed5234eaad135f660ed11 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 15 Dec 2017 11:25:14 +0100 Subject: 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 --- tests/tbf/TbfTest.cpp | 197 +++++++++++++++++++------------------------------- 1 file changed, 75 insertions(+), 122 deletions(-) (limited to 'tests') 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); -- cgit v1.2.3