[PATCH 4/6] msgb/test: Add test for msgb message buffers

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.

Jacob Erlbeck jerlbeck at sysmocom.de
Tue Nov 17 09:37:47 UTC 2015


This tests several API functions of the msgb by checking the
invariant and by dumping resulting message buffers as hex.

Sponsored-by: On-Waves ehf

Conflicts:
	tests/Makefile.am
---
 tests/Makefile.am       |   9 +++-
 tests/msgb/msgb_test.c  | 120 ++++++++++++++++++++++++++++++++++++++++++++++++
 tests/msgb/msgb_test.ok |  21 +++++++++
 tests/testsuite.at      |   6 +++
 4 files changed, 154 insertions(+), 2 deletions(-)
 create mode 100644 tests/msgb/msgb_test.c
 create mode 100644 tests/msgb/msgb_test.ok

diff --git a/tests/Makefile.am b/tests/Makefile.am
index 4442355..edf25a0 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -10,7 +10,8 @@ check_PROGRAMS = timer/timer_test sms/sms_test ussd/ussd_test		\
 		 logging/logging_test fr/fr_test			\
 		 loggingrb/loggingrb_test strrb/strrb_test              \
 		 vty/vty_test comp128/comp128_test utils/utils_test	\
-		 smscb/gsm0341_test stats/stats_test
+		 smscb/gsm0341_test stats/stats_test			\
+		 msgb/msgb_test
 
 if ENABLE_MSGFILE
 check_PROGRAMS += msgfile/msgfile_test
@@ -52,6 +53,9 @@ gprs_gprs_test_LDADD = $(top_builddir)/src/libosmocore.la $(top_builddir)/src/gs
 lapd_lapd_test_SOURCES = lapd/lapd_test.c
 lapd_lapd_test_LDADD = $(top_builddir)/src/libosmocore.la $(top_builddir)/src/gsm/libosmogsm.la
 
+msgb_msgb_test_SOURCES = msgb/msgb_test.c
+msgb_msgb_test_LDADD = $(top_builddir)/src/libosmocore.la
+
 msgfile_msgfile_test_SOURCES = msgfile/msgfile_test.c
 msgfile_msgfile_test_LDADD = $(top_builddir)/src/libosmocore.la
 
@@ -127,7 +131,8 @@ EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE)		\
              fr/fr_test.ok loggingrb/logging_test.ok			\
              loggingrb/logging_test.err	strrb/strrb_test.ok		\
 	     vty/vty_test.ok comp128/comp128_test.ok			\
-	     utils/utils_test.ok stats/stats_test.ok
+	     utils/utils_test.ok stats/stats_test.ok			\
+             msgb/msgb_test.ok
 
 DISTCLEANFILES = atconfig
 
diff --git a/tests/msgb/msgb_test.c b/tests/msgb/msgb_test.c
new file mode 100644
index 0000000..412e8bb
--- /dev/null
+++ b/tests/msgb/msgb_test.c
@@ -0,0 +1,120 @@
+/*
+ * (C) 2014 by On-Waves
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+#include <stdlib.h>
+#include <osmocom/core/application.h>
+#include <osmocom/core/logging.h>
+#include <osmocom/core/utils.h>
+#include <osmocom/core/msgb.h>
+
+#include <errno.h>
+
+#include <string.h>
+
+#define CHECK_RC(rc)	\
+	if (rc != 0) {	\
+		printf("Operation failed rc=%d on %s:%d\n", rc, __FILE__, __LINE__); \
+		abort(); \
+	}
+
+static void test_msgb_api()
+{
+	struct msgb *msg = msgb_alloc_headroom(4096, 128, "data");
+	unsigned char *cptr = NULL;
+	int rc;
+
+	printf("Testing the msgb API\n");
+
+	printf("Buffer: %s\n", msgb_hexdump(msg));
+	OSMO_ASSERT(msgb_test_invariant(msg));
+	cptr = msg->l1h = msgb_put(msg, 4);
+	printf("put(4) -> data%+d\n", cptr - msg->data);
+	printf("Buffer: %s\n", msgb_hexdump(msg));
+	OSMO_ASSERT(msgb_test_invariant(msg));
+	cptr = msg->l2h = msgb_put(msg, 4);
+	printf("put(4) -> data%+d\n", cptr - msg->data);
+	printf("Buffer: %s\n", msgb_hexdump(msg));
+	OSMO_ASSERT(msgb_test_invariant(msg));
+	cptr = msg->l3h = msgb_put(msg, 4);
+	printf("put(4) -> data%+d\n", cptr - msg->data);
+	printf("Buffer: %s\n", msgb_hexdump(msg));
+	OSMO_ASSERT(msgb_test_invariant(msg));
+	cptr = msg->l4h = msgb_put(msg, 4);
+	printf("put(4) -> data%+d\n", cptr - msg->data);
+	printf("Buffer: %s\n", msgb_hexdump(msg));
+	OSMO_ASSERT(msgb_test_invariant(msg));
+	OSMO_ASSERT(msgb_length(msg) == 16);
+	cptr = msgb_push(msg, 4);
+	printf("push(4) -> data%+d\n", cptr - msg->data);
+	printf("Buffer: %s\n", msgb_hexdump(msg));
+	OSMO_ASSERT(msgb_test_invariant(msg));
+	OSMO_ASSERT(msgb_length(msg) == 20);
+	rc = msgb_trim(msg, 16);
+	printf("trim(16) -> %d\n", rc);
+	CHECK_RC(rc);
+	OSMO_ASSERT(msgb_test_invariant(msg));
+	printf("Buffer: %s\n", msgb_hexdump(msg));
+	OSMO_ASSERT(msgb_length(msg) == 16);
+
+	cptr = msgb_get(msg, 4);
+	printf("get(4) -> data%+d\n", cptr - msg->data);
+	printf("Buffer: %s\n", msgb_hexdump(msg));
+	OSMO_ASSERT(msgb_test_invariant(msg));
+	OSMO_ASSERT(msgb_length(msg) == 12);
+
+	printf("Test msgb_hexdump\n");
+	msg->l1h = msg->head;
+	printf("Buffer: %s\n", msgb_hexdump(msg));
+	msg->l3h = msg->data;
+	printf("Buffer: %s\n", msgb_hexdump(msg));
+	msg->l3h = msg->head - 1;
+	printf("Buffer: %s\n", msgb_hexdump(msg));
+
+#if 0
+extern void msgb_reset(struct msgb *m);
+#define msgb_l1(m)	((void *)(MSGB_CHECK2(m)->l1h))
+static inline unsigned int msgb_l1len(const struct msgb *msgb)
+	static inline int msgb_tailroom(const struct msgb *msgb)
+	static inline int msgb_headroom(const struct msgb *msgb)
+	static inline unsigned char *msgb_put(struct msgb *msgb, unsigned int len)
+	static inline unsigned char *msgb_get(struct msgb *msgb, unsigned int len)
+	static inline unsigned char *msgb_push(struct msgb *msgb, unsigned int len)
+	static inline unsigned char *msgb_pull(struct msgb *msgb, unsigned int len)
+	
+	static inline unsigned char *msgb_pull_to_l3(struct msgb *msg)
+	static inline int msgb_trim(struct msgb *msg, int len)
+	static inline int msgb_l3trim(struct msgb *msg, int l3len)
+	uint8_t *msgb_data(const struct msgb *msg);
+	return;
+#endif
+}
+
+static struct log_info info = {};
+
+int main(int argc, char **argv)
+{
+	osmo_init_logging(&info);
+
+	test_msgb_api();
+
+	printf("Success.\n");
+
+	return 0;
+}
diff --git a/tests/msgb/msgb_test.ok b/tests/msgb/msgb_test.ok
new file mode 100644
index 0000000..f8de0cd
--- /dev/null
+++ b/tests/msgb/msgb_test.ok
@@ -0,0 +1,21 @@
+Testing the msgb API
+Buffer: 
+put(4) -> data+0
+Buffer: [L1]> 00 00 00 00 
+put(4) -> data+4
+Buffer: [L1]> 00 00 00 00 [L2]> 00 00 00 00 
+put(4) -> data+8
+Buffer: [L1]> 00 00 00 00 [L2]> 00 00 00 00 [L3]> 00 00 00 00 
+put(4) -> data+12
+Buffer: [L1]> 00 00 00 00 [L2]> 00 00 00 00 [L3]> 00 00 00 00 [L4]> 00 00 00 00 
+push(4) -> data+0
+Buffer: 00 00 00 00 [L1]> 00 00 00 00 [L2]> 00 00 00 00 [L3]> 00 00 00 00 [L4]> 00 00 00 00 
+trim(16) -> 0
+Buffer: 00 00 00 00 [L1]> 00 00 00 00 [L2]> 00 00 00 00 [L3]> 00 00 00 00 [L4]> 
+get(4) -> data+12
+Buffer: 00 00 00 00 [L1]> 00 00 00 00 [L2]> 00 00 00 00 [L3]> (L4=tail+4) 
+Test msgb_hexdump
+Buffer: (L1=data-124) 00 00 00 00 00 00 00 00 [L2]> 00 00 00 00 [L3]> (L4=tail+4) 
+Buffer: (L1=data-124) 00 00 00 00 00 00 00 00 [L2]> (L3+8) 00 00 00 00 (L4=tail+4) 
+Buffer: (L1=data-124) 00 00 00 00 00 00 00 00 [L2]> 00 00 00 00 (L3 out of range) (L4=tail+4) 
+Success.
diff --git a/tests/testsuite.at b/tests/testsuite.at
index 85c3e8b..12199e3 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -27,6 +27,12 @@ cat $abs_srcdir/conv/conv_test.ok > expout
 AT_CHECK([$abs_top_builddir/tests/conv/conv_test], [0], [expout])
 AT_CLEANUP
 
+AT_SETUP([msgb])
+AT_KEYWORDS([msgb])
+cat $abs_srcdir/msgb/msgb_test.ok > expout
+AT_CHECK([$abs_top_builddir/tests/msgb/msgb_test], [0], [expout])
+AT_CLEANUP
+
 if ENABLE_MSGFILE
 AT_SETUP([msgfile])
 AT_KEYWORDS([msgfile])
-- 
1.9.1




More information about the OpenBSC mailing list