<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/10663">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">measurement: add unit tests for is_meas_complete()<br><br>We do not test is_meas_complete() individually yet, but it is an<br>integral part of the measurement processings since this function decides<br>where a measurement interval ends.<br><br>- Add unit tests that test TCH/F, TCH/H, SDCCH/4 and STDCH/8<br><br>Change-Id: I8f89d9e7092cd65ba4d5c5649140692dcc20bdd6<br>Related: OS#2987<br>---<br>M include/osmo-bts/measurement.h<br>M src/common/measurement.c<br>M tests/meas/meas_test.c<br>M tests/meas/meas_test.ok<br>4 files changed, 187 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/measurement.h b/include/osmo-bts/measurement.h</span><br><span>index 57eeef5..5c3def0 100644</span><br><span>--- a/include/osmo-bts/measurement.h</span><br><span>+++ b/include/osmo-bts/measurement.h</span><br><span>@@ -12,6 +12,8 @@</span><br><span> </span><br><span> void lchan_meas_reset(struct gsm_lchan *lchan);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int is_meas_complete(struct gsm_lchan *lchan, uint32_t fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> bool is_meas_overdue(struct gsm_lchan *lchan, uint32_t *fn_missed_end, uint32_t fn);</span><br><span> </span><br><span> #endif</span><br><span>diff --git a/src/common/measurement.c b/src/common/measurement.c</span><br><span>index cb45e6e..158849d 100644</span><br><span>--- a/src/common/measurement.c</span><br><span>+++ b/src/common/measurement.c</span><br><span>@@ -244,8 +244,10 @@</span><br><span>     return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* determine if a measurement period ends at the given frame number */</span><br><span style="color: hsl(0, 100%, 40%);">-static int is_meas_complete(struct gsm_lchan *lchan, uint32_t fn)</span><br><span style="color: hsl(120, 100%, 40%);">+/* determine if a measurement period ends at the given frame number</span><br><span style="color: hsl(120, 100%, 40%);">+ * (this function is only used internally, it is public to call it from</span><br><span style="color: hsl(120, 100%, 40%);">+ * unit-tests) */</span><br><span style="color: hsl(120, 100%, 40%);">+int is_meas_complete(struct gsm_lchan *lchan, uint32_t fn)</span><br><span> {</span><br><span>  unsigned int fn_mod = -1;</span><br><span>    const uint8_t *tbl;</span><br><span>diff --git a/tests/meas/meas_test.c b/tests/meas/meas_test.c</span><br><span>index ec89df9..0166771 100644</span><br><span>--- a/tests/meas/meas_test.c</span><br><span>+++ b/tests/meas/meas_test.c</span><br><span>@@ -484,6 +484,182 @@</span><br><span>     OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void test_is_meas_complete_single(struct gsm_lchan *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      uint32_t fn_end, uint8_t intv_len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int k;</span><br><span style="color: hsl(120, 100%, 40%);">+       int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint32_t offset;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Walk through multiple measurement intervals and make sure that the</span><br><span style="color: hsl(120, 100%, 40%);">+  * interval end is detected only in the expected location */</span><br><span style="color: hsl(120, 100%, 40%);">+  for (k = 0; k < 100; k++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                offset = intv_len * k;</span><br><span style="color: hsl(120, 100%, 40%);">+                for (i = 0; i < intv_len; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   rc = is_meas_complete(lchan, i + offset);</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (rc)</span><br><span style="color: hsl(120, 100%, 40%);">+                               OSMO_ASSERT(i + offset == fn_end + offset);</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_is_meas_complete(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_lchan *lchan;</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("\n\n");</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("===========================================================\n");</span><br><span style="color: hsl(120, 100%, 40%);">+    printf("Testing is_meas_complete()\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Test interval end detection on TCH/F TS0-TS7 */</span><br><span style="color: hsl(120, 100%, 40%);">+    lchan = &trx->ts[0].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 12, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[1].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 25, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[2].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 38, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[3].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 51, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[4].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 64, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[5].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 77, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[6].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 90, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[7].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 103, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Test interval end detection on TCH/H TS0-TS7 */</span><br><span style="color: hsl(120, 100%, 40%);">+    lchan = &trx->ts[0].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 12, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[1].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 12, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[0].lchan[1];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 25, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[1].lchan[1];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 25, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[2].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 38, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[3].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 38, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[2].lchan[1];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 51, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[3].lchan[1];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 51, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[4].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 64, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[5].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 64, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[4].lchan[1];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 77, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[5].lchan[1];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 77, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[6].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 90, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[7].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 90, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[6].lchan[1];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 103, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      lchan = &trx->ts[7].lchan[1];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+     test_is_meas_complete_single(lchan, 103, 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Test interval end detection on SDCCH/8 SS0-SS7 */</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan = &trx->ts[0].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(120, 100%, 40%);">+    test_is_meas_complete_single(lchan, 66, 102);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[0].lchan[1];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(120, 100%, 40%);">+    test_is_meas_complete_single(lchan, 70, 102);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[0].lchan[2];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(120, 100%, 40%);">+    test_is_meas_complete_single(lchan, 74, 102);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[0].lchan[3];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(120, 100%, 40%);">+    test_is_meas_complete_single(lchan, 78, 102);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[0].lchan[4];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(120, 100%, 40%);">+    test_is_meas_complete_single(lchan, 98, 102);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[0].lchan[5];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(120, 100%, 40%);">+    test_is_meas_complete_single(lchan, 0, 102);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        lchan = &trx->ts[0].lchan[6];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(120, 100%, 40%);">+    test_is_meas_complete_single(lchan, 4, 102);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        lchan = &trx->ts[0].lchan[7];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(120, 100%, 40%);">+    test_is_meas_complete_single(lchan, 8, 102);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Test interval end detection on SDCCH/4 SS0-SS3 */</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan = &trx->ts[0].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_CCCH_SDCCH4;</span><br><span style="color: hsl(120, 100%, 40%);">+       test_is_meas_complete_single(lchan, 88, 102);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[0].lchan[1];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_CCCH_SDCCH4;</span><br><span style="color: hsl(120, 100%, 40%);">+       test_is_meas_complete_single(lchan, 92, 102);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[0].lchan[2];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_CCCH_SDCCH4;</span><br><span style="color: hsl(120, 100%, 40%);">+       test_is_meas_complete_single(lchan, 6, 102);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        lchan = &trx->ts[0].lchan[3];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_CCCH_SDCCH4;</span><br><span style="color: hsl(120, 100%, 40%);">+       test_is_meas_complete_single(lchan, 10, 102);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* This tests the robustness of lchan_meas_process_measurement(). This is the</span><br><span>  * function that is called from l1_sap.c each time a measurement indication is</span><br><span>  * received. The process must still go on when measurement indications (blocks)</span><br><span>@@ -604,6 +780,7 @@</span><br><span>       printf("***************************************************\n");</span><br><span> </span><br><span>       test_is_meas_overdue();</span><br><span style="color: hsl(120, 100%, 40%);">+       test_is_meas_complete();</span><br><span>     test_lchan_meas_process_measurement(false, false);</span><br><span>   test_lchan_meas_process_measurement(true, false);</span><br><span>    test_lchan_meas_process_measurement(false, true);</span><br><span>diff --git a/tests/meas/meas_test.ok b/tests/meas/meas_test.ok</span><br><span>index 77b652e..d8f8174 100644</span><br><span>--- a/tests/meas/meas_test.ok</span><br><span>+++ b/tests/meas/meas_test.ok</span><br><span>@@ -584,6 +584,10 @@</span><br><span> </span><br><span> </span><br><span> ===========================================================</span><br><span style="color: hsl(120, 100%, 40%);">+Testing is_meas_complete()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+===========================================================</span><br><span> Testing lchan_meas_process_measurement()</span><br><span> (leaving out measurement sample for SACCH block)</span><br><span> (leaving out measurement sample for SACCH block)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10663">change 10663</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/10663"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I8f89d9e7092cd65ba4d5c5649140692dcc20bdd6 </div>
<div style="display:none"> Gerrit-Change-Number: 10663 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>