<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/10696">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">measurement: add unit tests for ts45008_83_is_sub()<br><br>The function ts45008_83_is_sub() is an integral part of the measurement<br>calculation as it automatically tags incoming measurements as SUB<br>measurements. This is important in the context of DTX. Unfortunately<br>there is no unit test for this function yet.<br><br>- Add unit test for ts45008_83_is_sub()<br><br>Change-Id: Ia26774859f4bf31baee075896905079368bddd42<br>Related: OS#3502<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, 163 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/96/10696/1</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 5c3def0..b4fc35b 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%);">+bool ts45008_83_is_sub(struct gsm_lchan *lchan, uint32_t fn, bool is_amr_sid_update);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int is_meas_complete(struct gsm_lchan *lchan, uint32_t fn);</span><br><span> </span><br><span> bool is_meas_overdue(struct gsm_lchan *lchan, uint32_t *fn_missed_end, uint32_t fn);</span><br><span>diff --git a/src/common/measurement.c b/src/common/measurement.c</span><br><span>index b0ef869..bc27287 100644</span><br><span>--- a/src/common/measurement.c</span><br><span>+++ b/src/common/measurement.c</span><br><span>@@ -27,8 +27,9 @@</span><br><span>         return false;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Decide if a given frame number is part of the "-SUB" measurements (true) or not (false) */</span><br><span style="color: hsl(0, 100%, 40%);">-static bool ts45008_83_is_sub(struct gsm_lchan *lchan, uint32_t fn, bool is_amr_sid_update)</span><br><span style="color: hsl(120, 100%, 40%);">+/* Decide if a given frame number is part of the "-SUB" measurements (true) or not (false)</span><br><span style="color: hsl(120, 100%, 40%);">+ * (this function is only used internally, it is public to call it from unit-tests) */</span><br><span style="color: hsl(120, 100%, 40%);">+bool ts45008_83_is_sub(struct gsm_lchan *lchan, uint32_t fn, bool is_amr_sid_update)</span><br><span> {</span><br><span>    uint32_t fn104 = fn % 104;</span><br><span> </span><br><span>diff --git a/tests/meas/meas_test.c b/tests/meas/meas_test.c</span><br><span>index 0166771..4009ddb 100644</span><br><span>--- a/tests/meas/meas_test.c</span><br><span>+++ b/tests/meas/meas_test.c</span><br><span>@@ -719,6 +719,138 @@</span><br><span>  }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static bool test_ts45008_83_is_sub_is_sacch(uint32_t fn)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       if (fn % 104 == 12)</span><br><span style="color: hsl(120, 100%, 40%);">+           return true;</span><br><span style="color: hsl(120, 100%, 40%);">+  if (fn % 104 == 25)</span><br><span style="color: hsl(120, 100%, 40%);">+           return true;</span><br><span style="color: hsl(120, 100%, 40%);">+  if (fn % 104 == 38)</span><br><span style="color: hsl(120, 100%, 40%);">+           return true;</span><br><span style="color: hsl(120, 100%, 40%);">+  if (fn % 104 == 51)</span><br><span style="color: hsl(120, 100%, 40%);">+           return true;</span><br><span style="color: hsl(120, 100%, 40%);">+  if (fn % 104 == 64)</span><br><span style="color: hsl(120, 100%, 40%);">+           return true;</span><br><span style="color: hsl(120, 100%, 40%);">+  if (fn % 104 == 77)</span><br><span style="color: hsl(120, 100%, 40%);">+           return true;</span><br><span style="color: hsl(120, 100%, 40%);">+  if (fn % 104 == 90)</span><br><span style="color: hsl(120, 100%, 40%);">+           return true;</span><br><span style="color: hsl(120, 100%, 40%);">+  if (fn % 104 == 103)</span><br><span style="color: hsl(120, 100%, 40%);">+          return true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        return false;</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 bool test_ts45008_83_is_sub_is_sub(uint32_t fn, uint8_t ss)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     fn = fn % 104;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (fn >= 52 && fn <= 59)</span><br><span style="color: hsl(120, 100%, 40%);">+               return true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (ss == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                if (fn == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                  return true;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (fn == 2)</span><br><span style="color: hsl(120, 100%, 40%);">+                  return true;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (fn == 4)</span><br><span style="color: hsl(120, 100%, 40%);">+                  return true;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (fn == 6)</span><br><span style="color: hsl(120, 100%, 40%);">+                  return true;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (fn == 52)</span><br><span style="color: hsl(120, 100%, 40%);">+                 return true;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (fn == 54)</span><br><span style="color: hsl(120, 100%, 40%);">+                 return true;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (fn == 56)</span><br><span style="color: hsl(120, 100%, 40%);">+                 return true;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (fn == 58)</span><br><span style="color: hsl(120, 100%, 40%);">+                 return true;</span><br><span style="color: hsl(120, 100%, 40%);">+  } else if (ss == 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (fn == 14)</span><br><span style="color: hsl(120, 100%, 40%);">+                 return true;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (fn == 16)</span><br><span style="color: hsl(120, 100%, 40%);">+                 return true;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (fn == 18)</span><br><span style="color: hsl(120, 100%, 40%);">+                 return true;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (fn == 20)</span><br><span style="color: hsl(120, 100%, 40%);">+                 return true;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (fn == 66)</span><br><span style="color: hsl(120, 100%, 40%);">+                 return true;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (fn == 68)</span><br><span style="color: hsl(120, 100%, 40%);">+                 return true;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (fn == 70)</span><br><span style="color: hsl(120, 100%, 40%);">+                 return true;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (fn == 72)</span><br><span style="color: hsl(120, 100%, 40%);">+                 return true;</span><br><span style="color: hsl(120, 100%, 40%);">+  } else</span><br><span style="color: hsl(120, 100%, 40%);">+                OSMO_ASSERT(false);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return false;</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_ts45008_83_is_sub_single(uint8_t ts, uint8_t ss, bool fr)</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%);">+      bool rc;</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     lchan = &trx->ts[ts].lchan[ss];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("Checking: ");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (fr) {</span><br><span style="color: hsl(120, 100%, 40%);">+             printf("TCH/F");</span><br><span style="color: hsl(120, 100%, 40%);">+            lchan->type = GSM_LCHAN_TCH_F;</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%);">+             lchan->tch_mode = GSM48_CMODE_SPEECH_V1;</span><br><span style="color: hsl(120, 100%, 40%);">+   } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              printf("TCH/H");</span><br><span style="color: hsl(120, 100%, 40%);">+            lchan->type = GSM_LCHAN_TCH_H;</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%);">+             lchan->tch_mode = GSM48_CMODE_SPEECH_V1;</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%);">+   printf(" TS=%u ", ts);</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("SS=%u", ss);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Walk trough the first 100 intervals and check for unexpected</span><br><span style="color: hsl(120, 100%, 40%);">+        * results (false positive and false negative) */</span><br><span style="color: hsl(120, 100%, 40%);">+     for (i = 0; i < 104 * 100; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+          rc = ts45008_83_is_sub(lchan, i, false);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (rc) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (!test_ts45008_83_is_sub_is_sacch(i)</span><br><span style="color: hsl(120, 100%, 40%);">+                           && !test_ts45008_83_is_sub_is_sub(i, ss)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               printf("==> Unexpected SUB frame at fn=%u", i);</span><br><span style="color: hsl(120, 100%, 40%);">+                          OSMO_ASSERT(false);</span><br><span style="color: hsl(120, 100%, 40%);">+                   }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (test_ts45008_83_is_sub_is_sacch(i)</span><br><span style="color: hsl(120, 100%, 40%);">+                            && test_ts45008_83_is_sub_is_sub(i, ss)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                printf("==> Unexpected non-SUB frame at fn=%u",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 i);</span><br><span style="color: hsl(120, 100%, 40%);">+                            OSMO_ASSERT(false);</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%);">+     printf("\n");</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_ts45008_83_is_sub(void)</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%);">+</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 ts45008_83_is_sub()\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  for (i = 0; i < 7; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+            test_ts45008_83_is_sub_single(i, 0, true);</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i = 0; i < 7; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+            test_ts45008_83_is_sub_single(i, 0, false);</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i = 0; i < 7; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+            test_ts45008_83_is_sub_single(i, 1, false);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int main(int argc, char **argv)</span><br><span> {</span><br><span>     void *tall_bts_ctx;</span><br><span>@@ -785,6 +917,7 @@</span><br><span>    test_lchan_meas_process_measurement(true, false);</span><br><span>    test_lchan_meas_process_measurement(false, true);</span><br><span>    test_lchan_meas_process_measurement(true, true);</span><br><span style="color: hsl(120, 100%, 40%);">+      test_ts45008_83_is_sub();</span><br><span> </span><br><span>        printf("Success\n");</span><br><span> </span><br><span>diff --git a/tests/meas/meas_test.ok b/tests/meas/meas_test.ok</span><br><span>index d8f8174..ac32acf 100644</span><br><span>--- a/tests/meas/meas_test.ok</span><br><span>+++ b/tests/meas/meas_test.ok</span><br><span>@@ -1055,4 +1055,29 @@</span><br><span> (leaving out measurement sample for SACCH block)</span><br><span> (leaving out measurement sample for SACCH block)</span><br><span> (leaving out measurement sample for SACCH block)</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%);">+Testing ts45008_83_is_sub()</span><br><span style="color: hsl(120, 100%, 40%);">+Checking: TCH/F TS=0 SS=0</span><br><span style="color: hsl(120, 100%, 40%);">+Checking: TCH/F TS=1 SS=0</span><br><span style="color: hsl(120, 100%, 40%);">+Checking: TCH/F TS=2 SS=0</span><br><span style="color: hsl(120, 100%, 40%);">+Checking: TCH/F TS=3 SS=0</span><br><span style="color: hsl(120, 100%, 40%);">+Checking: TCH/F TS=4 SS=0</span><br><span style="color: hsl(120, 100%, 40%);">+Checking: TCH/F TS=5 SS=0</span><br><span style="color: hsl(120, 100%, 40%);">+Checking: TCH/F TS=6 SS=0</span><br><span style="color: hsl(120, 100%, 40%);">+Checking: TCH/H TS=0 SS=0</span><br><span style="color: hsl(120, 100%, 40%);">+Checking: TCH/H TS=1 SS=0</span><br><span style="color: hsl(120, 100%, 40%);">+Checking: TCH/H TS=2 SS=0</span><br><span style="color: hsl(120, 100%, 40%);">+Checking: TCH/H TS=3 SS=0</span><br><span style="color: hsl(120, 100%, 40%);">+Checking: TCH/H TS=4 SS=0</span><br><span style="color: hsl(120, 100%, 40%);">+Checking: TCH/H TS=5 SS=0</span><br><span style="color: hsl(120, 100%, 40%);">+Checking: TCH/H TS=6 SS=0</span><br><span style="color: hsl(120, 100%, 40%);">+Checking: TCH/H TS=0 SS=1</span><br><span style="color: hsl(120, 100%, 40%);">+Checking: TCH/H TS=1 SS=1</span><br><span style="color: hsl(120, 100%, 40%);">+Checking: TCH/H TS=2 SS=1</span><br><span style="color: hsl(120, 100%, 40%);">+Checking: TCH/H TS=3 SS=1</span><br><span style="color: hsl(120, 100%, 40%);">+Checking: TCH/H TS=4 SS=1</span><br><span style="color: hsl(120, 100%, 40%);">+Checking: TCH/H TS=5 SS=1</span><br><span style="color: hsl(120, 100%, 40%);">+Checking: TCH/H TS=6 SS=1</span><br><span> Success</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10696">change 10696</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/10696"/><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: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ia26774859f4bf31baee075896905079368bddd42 </div>
<div style="display:none"> Gerrit-Change-Number: 10696 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>