<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-pcu/+/23355">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">tests: Introduce unit tests for PDCH UL Controller<br><br>Related: OS#5020<br>Change-Id: Ie1ff0ca3d7fc8a9824d6fe4dceb746e301082bda<br>---<br>M tests/Makefile.am<br>M tests/testsuite.at<br>A tests/ulc/PdchUlcTest.cpp<br>A tests/ulc/PdchUlcTest.err<br>A tests/ulc/PdchUlcTest.ok<br>5 files changed, 214 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-pcu refs/changes/55/23355/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/tests/Makefile.am b/tests/Makefile.am</span><br><span>index b377fdb..40617bb 100644</span><br><span>--- a/tests/Makefile.am</span><br><span>+++ b/tests/Makefile.am</span><br><span>@@ -15,6 +15,7 @@</span><br><span>        bitcomp/BitcompTest \</span><br><span>        fn/FnTest \</span><br><span>  app_info/AppInfoTest \</span><br><span style="color: hsl(120, 100%, 40%);">+        ulc/PdchUlcTest \</span><br><span>    $(NULL)</span><br><span> </span><br><span> noinst_PROGRAMS = emu/pcu_emu</span><br><span>@@ -143,6 +144,15 @@</span><br><span>  $(LIBOSMOCORE_LIBS) \</span><br><span>        $(COMMON_LA)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ulc_PdchUlcTest_SOURCES = ulc/PdchUlcTest.cpp</span><br><span style="color: hsl(120, 100%, 40%);">+ulc_PdchUlcTest_LDADD = \</span><br><span style="color: hsl(120, 100%, 40%);">+    $(top_builddir)/src/libgprs.la \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(LIBOSMOGB_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+   $(LIBOSMOGSM_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(LIBOSMOCTRL_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOCORE_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(COMMON_LA)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # The `:;' works around a Bash 3.2 bug when the output is not writeable.</span><br><span> $(srcdir)/package.m4: $(top_srcdir)/configure.ac</span><br><span>   :;{ \</span><br><span>@@ -177,6 +187,7 @@</span><br><span>  edge/EdgeTest.ok \</span><br><span>   fn/FnTest.ok \</span><br><span>       app_info/AppInfoTest.ok app_info/AppInfoTest.err \</span><br><span style="color: hsl(120, 100%, 40%);">+    ulc/PdchUlcTest.ok ulc/PdchUlcTest.err \</span><br><span>     $(NULL)</span><br><span> </span><br><span> DISTCLEANFILES = atconfig</span><br><span>diff --git a/tests/testsuite.at b/tests/testsuite.at</span><br><span>index 8a319bd..f6dc62c 100644</span><br><span>--- a/tests/testsuite.at</span><br><span>+++ b/tests/testsuite.at</span><br><span>@@ -88,3 +88,10 @@</span><br><span> cat $abs_srcdir/app_info/AppInfoTest.err > experr</span><br><span> AT_CHECK([$OSMO_QEMU $abs_top_builddir/tests/app_info/AppInfoTest], [0], [expout], [experr])</span><br><span> AT_CLEANUP</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AT_SETUP([ulc])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_KEYWORDS([ulc])</span><br><span style="color: hsl(120, 100%, 40%);">+cat $abs_srcdir/ulc/PdchUlcTest.ok > expout</span><br><span style="color: hsl(120, 100%, 40%);">+cat $abs_srcdir/ulc/PdchUlcTest.err > experr</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CHECK([$OSMO_QEMU $abs_top_builddir/tests/ulc/PdchUlcTest], [0], [expout], [experr])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CLEANUP</span><br><span>diff --git a/tests/ulc/PdchUlcTest.cpp b/tests/ulc/PdchUlcTest.cpp</span><br><span>new file mode 100644</span><br><span>index 0000000..df922f3</span><br><span>--- /dev/null</span><br><span>+++ b/tests/ulc/PdchUlcTest.cpp</span><br><span>@@ -0,0 +1,188 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* PDCH UL Controller test</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Pau Espin Pedrol <pespin@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Philipp Maier</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.</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%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern "C" {</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/application.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm_utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/talloc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></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%);">+#include "bts.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "sba.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "pdch_ul_controller.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* globals used by the code */</span><br><span style="color: hsl(120, 100%, 40%);">+void *tall_pcu_ctx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_reserve_multiple()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("=== start: %s ===\n", __FUNCTION__);</span><br><span style="color: hsl(120, 100%, 40%);">+        const uint32_t fn = 20;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gprs_rlcmac_bts *bts = bts_alloc(the_pcu, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gprs_rlcmac_pdch *pdch = &bts->trx[0].pdch[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gprs_rlcmac_tbf *tbf1 = (struct gprs_rlcmac_tbf*)0x1234; /*Dummy pointer */</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gprs_rlcmac_tbf *tbf2 = (struct gprs_rlcmac_tbf*)0x5678; /*Dummy pointer */</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gprs_rlcmac_sba *sba1, *sba2;</span><br><span style="color: hsl(120, 100%, 40%);">+  pdch->last_rts_fn = fn; /* This is used by sba_alloc to set + reserve FN */</span><br><span style="color: hsl(120, 100%, 40%);">+        sba1 = sba_alloc(bts, pdch, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       pdch->last_rts_fn = fn_next_block(pdch->last_rts_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+   sba2 = sba_alloc(bts, pdch, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       uint32_t tbf1_poll_fn1 = fn_next_block(sba2->fn);</span><br><span style="color: hsl(120, 100%, 40%);">+  uint32_t tbf2_poll_fn1 = fn_next_block(tbf1_poll_fn1);</span><br><span style="color: hsl(120, 100%, 40%);">+        uint32_t tbf1_poll_fn2 = fn_next_block(tbf2_poll_fn1);</span><br><span style="color: hsl(120, 100%, 40%);">+        int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct pdch_ulc_node *node;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* SBAs are reserved directly during allocation: */</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(pdch_ulc_fn_is_free(pdch->ulc, sba1->fn) == false);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(pdch_ulc_get_sba(pdch->ulc, sba1->fn) == sba1);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(pdch_ulc_fn_is_free(pdch->ulc, sba2->fn) == false);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(pdch_ulc_get_sba(pdch->ulc, sba2->fn) == sba2);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = pdch_ulc_reserve_sba(pdch->ulc, sba1);</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(rc == -EEXIST);</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(pdch_ulc_fn_is_free(pdch->ulc, sba1->fn) == false);</span><br><span style="color: hsl(120, 100%, 40%);">+ node = pdch_ulc_get_node(pdch->ulc, sba1->fn);</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(node->type == PDCH_ULC_NODE_SBA && node->sba.sba == sba1);</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(pdch_ulc_fn_is_free(pdch->ulc, sba1->fn) == false);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       rc = pdch_ulc_reserve_sba(pdch->ulc, sba2);</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(rc == -EEXIST);</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(pdch_ulc_get_sba(pdch->ulc, sba1->fn) == sba1);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(pdch_ulc_get_sba(pdch->ulc, sba2->fn) == sba2);</span><br><span style="color: hsl(120, 100%, 40%);">+     node = pdch_ulc_get_node(pdch->ulc, sba2->fn);</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(node->type == PDCH_ULC_NODE_SBA && node->sba.sba == sba2);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        rc = pdch_ulc_reserve_tbf_poll(pdch->ulc, sba1->fn, tbf1);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(rc == -EEXIST);</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(pdch_ulc_get_tbf_poll(pdch->ulc, sba1->fn) == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+        rc = pdch_ulc_reserve_tbf_poll(pdch->ulc, sba2->fn, tbf1);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(rc == -EEXIST);</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(pdch_ulc_get_tbf_poll(pdch->ulc, sba2->fn) == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Now Reserve correctly TBF1 */</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(pdch_ulc_fn_is_free(pdch->ulc, tbf1_poll_fn1) == true);</span><br><span style="color: hsl(120, 100%, 40%);">+        rc = pdch_ulc_reserve_tbf_poll(pdch->ulc, tbf1_poll_fn1, tbf1);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(rc == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(pdch_ulc_get_tbf_poll(pdch->ulc, tbf1_poll_fn1) == tbf1);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(pdch_ulc_fn_is_free(pdch->ulc, tbf1_poll_fn1) == false);</span><br><span style="color: hsl(120, 100%, 40%);">+       node = pdch_ulc_get_node(pdch->ulc, tbf1_poll_fn1);</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(node->type == PDCH_ULC_NODE_TBF_POLL && node->tbf_poll.poll_tbf == tbf1);</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(pdch_ulc_fn_is_free(pdch->ulc, tbf1_poll_fn1) == false);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Now reserve correctly TBF2 */</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(pdch_ulc_fn_is_free(pdch->ulc, tbf2_poll_fn1) == true);</span><br><span style="color: hsl(120, 100%, 40%);">+        rc = pdch_ulc_reserve_tbf_poll(pdch->ulc, tbf2_poll_fn1, tbf2);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(rc == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(pdch_ulc_get_tbf_poll(pdch->ulc, tbf2_poll_fn1) == tbf2);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(pdch_ulc_fn_is_free(pdch->ulc, tbf2_poll_fn1) == false);</span><br><span style="color: hsl(120, 100%, 40%);">+       node = pdch_ulc_get_node(pdch->ulc, tbf2_poll_fn1);</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(node->type == PDCH_ULC_NODE_TBF_POLL && node->tbf_poll.poll_tbf == tbf2);</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(pdch_ulc_fn_is_free(pdch->ulc, tbf2_poll_fn1) == false);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Now Reserve TBF1 for POLL again on a later FN, which is totally expected: */</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(pdch_ulc_fn_is_free(pdch->ulc, tbf1_poll_fn2) == true);</span><br><span style="color: hsl(120, 100%, 40%);">+        rc = pdch_ulc_reserve_tbf_poll(pdch->ulc, tbf1_poll_fn2, tbf1);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(rc == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(pdch_ulc_get_tbf_poll(pdch->ulc, tbf1_poll_fn2) == tbf1);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(pdch_ulc_fn_is_free(pdch->ulc, tbf1_poll_fn2) == false);</span><br><span style="color: hsl(120, 100%, 40%);">+       node = pdch_ulc_get_node(pdch->ulc, tbf1_poll_fn2);</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(node->type == PDCH_ULC_NODE_TBF_POLL && node->tbf_poll.poll_tbf == tbf1);</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(pdch_ulc_fn_is_free(pdch->ulc, tbf1_poll_fn2) == false);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Now release them in different ways: */</span><br><span style="color: hsl(120, 100%, 40%);">+     node = pdch_ulc_pop_node(pdch->ulc, sba2->fn);</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(node->type == PDCH_ULC_NODE_SBA && node->sba.sba == sba2);</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(pdch_ulc_get_sba(pdch->ulc, sba2->fn) == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(pdch_ulc_fn_is_free(pdch->ulc, sba2->fn) == true);</span><br><span style="color: hsl(120, 100%, 40%);">+  /* This will probably print a wanring since in general SBAs are expected</span><br><span style="color: hsl(120, 100%, 40%);">+       * to be released from ULC during sba_free() time: */</span><br><span style="color: hsl(120, 100%, 40%);">+ sba_free(sba2);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     pdch_ulc_expire_fn(pdch->ulc, sba1->fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* here the 2 tbf1 entries should be removed, so Ul Controller should</span><br><span style="color: hsl(120, 100%, 40%);">+    only have 1 entry for tbf2 after the call: */</span><br><span style="color: hsl(120, 100%, 40%);">+      pdch_ulc_release_tbf(pdch->ulc, tbf1);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(pdch_ulc_get_tbf_poll(pdch->ulc, tbf1_poll_fn1) == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(pdch_ulc_get_tbf_poll(pdch->ulc, tbf1_poll_fn2) == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(pdch_ulc_get_tbf_poll(pdch->ulc, tbf2_poll_fn1) == tbf2);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = pdch_ulc_release_fn(pdch->ulc, tbf1_poll_fn1);</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(rc == -ENOKEY);</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = pdch_ulc_release_fn(pdch->ulc, tbf1_poll_fn2);</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(rc == -ENOKEY);</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = pdch_ulc_release_fn(pdch->ulc, tbf2_poll_fn1);</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(rc == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Make sure the store is empty now: */</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(!rb_first(&pdch->ulc->tree_root));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    talloc_free(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("=== end: %s ===\n", __FUNCTION__);</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%);">+int main(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ tall_pcu_ctx = talloc_named_const(NULL, 1, "pdch_ulc test context");</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!tall_pcu_ctx)</span><br><span style="color: hsl(120, 100%, 40%);">+            abort();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    msgb_talloc_ctx_init(tall_pcu_ctx, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_init_logging2(tall_pcu_ctx, &gprs_log_info);</span><br><span style="color: hsl(120, 100%, 40%);">+ log_set_use_color(osmo_stderr_target, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_NONE);</span><br><span style="color: hsl(120, 100%, 40%);">+       log_set_log_level(osmo_stderr_target, LOGL_DEBUG);</span><br><span style="color: hsl(120, 100%, 40%);">+    log_set_print_category_hex(osmo_stderr_target, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    log_set_print_category(osmo_stderr_target, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+        log_parse_category_mask(osmo_stderr_target, "DPCU,1:DRLCMAC,1:DRLCMACUL,1");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      the_pcu = gprs_pcu_alloc(tall_pcu_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     test_reserve_multiple();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    talloc_free(the_pcu);</span><br><span style="color: hsl(120, 100%, 40%);">+ return EXIT_SUCCESS;</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%);">+ * stubs that should not be reached</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int16_t spoof_mnc = 0, spoof_mcc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+bool spoof_mnc_3_digits = false;</span><br><span style="color: hsl(120, 100%, 40%);">+extern "C" {</span><br><span style="color: hsl(120, 100%, 40%);">+      void l1if_pdch_req() {</span><br><span style="color: hsl(120, 100%, 40%);">+                abort();</span><br><span style="color: hsl(120, 100%, 40%);">+      } void l1if_connect_pdch() {</span><br><span style="color: hsl(120, 100%, 40%);">+          abort();</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     void l1if_close_pdch() {</span><br><span style="color: hsl(120, 100%, 40%);">+              abort();</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     void l1if_open_pdch() {</span><br><span style="color: hsl(120, 100%, 40%);">+               abort();</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/tests/ulc/PdchUlcTest.err b/tests/ulc/PdchUlcTest.err</span><br><span>new file mode 100644</span><br><span>index 0000000..29b4846</span><br><span>--- /dev/null</span><br><span>+++ b/tests/ulc/PdchUlcTest.err</span><br><span>@@ -0,0 +1,6 @@</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=0) Trying to reserve already reserved FN 72</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=0) Trying to reserve already reserved FN 78</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=0) Trying to reserve already reserved FN 72</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=0) Trying to reserve already reserved FN 78</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=0) Trying to release unregistered SBA (FN=78, TA=0)</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=0) Timeout for registered SBA (FN=72, TA=0)</span><br><span>diff --git a/tests/ulc/PdchUlcTest.ok b/tests/ulc/PdchUlcTest.ok</span><br><span>new file mode 100644</span><br><span>index 0000000..a07636f</span><br><span>--- /dev/null</span><br><span>+++ b/tests/ulc/PdchUlcTest.ok</span><br><span>@@ -0,0 +1,2 @@</span><br><span style="color: hsl(120, 100%, 40%);">+=== start: test_reserve_multiple ===</span><br><span style="color: hsl(120, 100%, 40%);">+=== end: test_reserve_multiple ===</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/23355">change 23355</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/c/osmo-pcu/+/23355"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-pcu </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ie1ff0ca3d7fc8a9824d6fe4dceb746e301082bda </div>
<div style="display:none"> Gerrit-Change-Number: 23355 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>