Pau Espin Pedrol has submitted this change and it was merged.

Change subject: tests: Add osmux2 testsuite
......................................................................


tests: Add osmux2 testsuite

This test is aimed at testing several specific scenarios related to how
osmux manages in/out of osmux/rtp packets over time.

Change-Id: I3bf59276424ea87c4e66a6ff46de1e3e9a06a904
---
M tests/Makefile.am
A tests/osmux/osmux_test2.c
A tests/osmux/osmux_test2.ok
M tests/testsuite.at
4 files changed, 497 insertions(+), 1 deletion(-)

Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified



diff --git a/tests/Makefile.am b/tests/Makefile.am
index a53fdb3..7c06b13 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,11 +1,14 @@
 AM_CFLAGS = -Wall -I$(top_srcdir)/include $(LIBOSMOCORE_CFLAGS) -g
 AM_LDFLAGS = $(LIBOSMOCORE_LDFLAGS)
 
-check_PROGRAMS = osmux/osmux_test jibuf/jibuf_test
+check_PROGRAMS = osmux/osmux_test osmux/osmux_test2 jibuf/jibuf_test
 check_HEADERS =
 
 osmux_osmux_test_SOURCES = osmux/osmux_test.c
 osmux_osmux_test_LDADD = $(LIBOSMOCORE_LIBS) 
$(top_builddir)/src/libosmonetif.la
+
+osmux_osmux_test2_SOURCES = osmux/osmux_test2.c
+osmux_osmux_test2_LDADD = $(LIBOSMOCORE_LIBS) 
$(top_builddir)/src/libosmonetif.la
 
 jibuf_jibuf_test_SOURCES = jibuf/jibuf_test.c
 jibuf_jibuf_test_LDADD = $(LIBOSMOCORE_LIBS) 
$(top_builddir)/src/libosmonetif.la
@@ -52,6 +55,7 @@
 
 EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE)            \
             osmux/osmux_test.ok \
+            osmux/osmux_test2.ok \
             jibuf/jibuf_test.ok
 
 DISTCLEANFILES = atconfig
diff --git a/tests/osmux/osmux_test2.c b/tests/osmux/osmux_test2.c
new file mode 100644
index 0000000..ecd9296
--- /dev/null
+++ b/tests/osmux/osmux_test2.c
@@ -0,0 +1,378 @@
+/* (C) 2017 by sysmocom - s.f.m.c. GmbH <i...@sysmocom.de>
+ *
+ * Author: Pau Espin Pedrol <pes...@sysmocom.de>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ *
+ * 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <inttypes.h>
+#include <string.h>
+#include <signal.h>
+#include <arpa/inet.h>
+#include <sys/time.h>
+#include <getopt.h>
+
+#include <osmocom/core/select.h>
+#include <osmocom/core/application.h>
+#include <osmocom/core/logging.h>
+#include <osmocom/core/msgb.h>
+#include <osmocom/netif/rtp.h>
+#include <osmocom/netif/osmux.h>
+#include <osmocom/netif/amr.h>
+
+static uint8_t osmux_next_seq;
+
+#define TIME_RTP_PKT_MS 20
+#define BATCH_FACTOR 6
+/* ----------------------------- */
+
+/* Logging related stuff */
+#define INT2IDX(x)   (-1*(x)-1)
+struct log_info_cat jibuf_test_cat[] = {
+       [INT2IDX(DLMUX)] = {
+               .name = "DLMUX",
+               .description = "Osmocom Osmux",
+               .enabled = 1, .loglevel = LOGL_DEBUG,
+               },
+};
+const struct log_info log_info = {
+       .filter_fn = NULL,
+       .cat = jibuf_test_cat,
+       .num_cat = ARRAY_SIZE(jibuf_test_cat),
+};
+/* ----------------------------- */
+
+static void osmux_init(uint8_t seq)
+{
+       osmux_next_seq = seq;
+}
+
+static struct msgb *osmux_new(uint8_t cid, uint8_t seq, uint8_t batch_factor)
+{
+       struct msgb *msg;
+       struct osmux_hdr *osmuxh;
+
+       msg = msgb_alloc(1500, "test");
+       if (!msg)
+               exit(EXIT_FAILURE);
+       msgb_put(msg, sizeof(struct osmux_hdr));
+
+       osmuxh = (struct osmux_hdr *)msg->data;
+       osmuxh->amr_q = 0;
+       osmuxh->amr_f = 0;
+       osmuxh->rtp_m = 0;
+       osmuxh->ctr = batch_factor - 1;
+       osmuxh->ft = 1;
+       osmuxh->seq = osmux_next_seq;
+       osmuxh->circuit_id = cid;
+       osmuxh->amr_ft = AMR_FT_2; /* 5.90 */
+       osmuxh->amr_cmr = 0;
+       msgb_put(msg, osmo_amr_bytes(osmuxh->amr_ft)*batch_factor);
+       return msg;
+}
+
+static struct msgb *osmux_next(void)
+{
+       osmux_next_seq++;
+       return osmux_new(0, osmux_next_seq, BATCH_FACTOR);
+}
+
+static void sigalarm_handler(int foo)
+{
+       printf("FAIL: test did not run successfully\n");
+       exit(EXIT_FAILURE);
+}
+
+
+static void clock_debug(char* str)
+{
+       struct timespec ts;
+       struct timeval tv;
+       osmo_clock_gettime(CLOCK_MONOTONIC, &ts);
+       osmo_gettimeofday(&tv, NULL);
+       printf("sys={%lu.%06lu}, mono={%lu.%06lu}: %s\n",
+               tv.tv_sec, tv.tv_usec, ts.tv_sec, ts.tv_nsec/1000, str);
+}
+
+static void clock_override_enable(bool enable)
+{
+       osmo_gettimeofday_override = enable;
+       osmo_clock_override_enable(CLOCK_MONOTONIC, enable);
+}
+
+static void clock_override_set(long sec, long usec)
+{
+       struct timespec *mono;
+       osmo_gettimeofday_override_time.tv_sec = sec;
+       osmo_gettimeofday_override_time.tv_usec = usec;
+       mono = osmo_clock_override_gettimespec(CLOCK_MONOTONIC);
+       mono->tv_sec = sec;
+       mono->tv_nsec = usec*1000;
+
+       clock_debug("clock_override_set");
+}
+
+static void clock_override_add_debug(long sec, long usec, bool dbg)
+{
+       osmo_gettimeofday_override_add(sec, usec);
+       osmo_clock_override_add(CLOCK_MONOTONIC, sec, usec*1000);
+       if (dbg)
+               clock_debug("clock_override_add");
+}
+#define clock_override_add(sec, usec) clock_override_add_debug(sec, usec, true)
+
+static void tx_cb(struct msgb *msg, void *data)
+{
+       struct osmux_out_handle *h_output = (struct osmux_out_handle *) data;
+       struct rtp_hdr *rtph;
+       char buf[250];
+       rtph = osmo_rtp_get_hdr(msg);
+       snprintf(buf, sizeof(buf), "dequeue: seq=%"PRIu16" ts=%"PRIu32"%s 
enqueued=%u",
+               ntohs(rtph->sequence), ntohl(rtph->timestamp), rtph->marker ? " 
M" : "",
+               llist_count(&h_output->list));
+       clock_debug(buf);
+       msgb_free(msg);
+}
+
+#define PULL_NEXT(h_output) { \
+               struct msgb *_msg; \
+               struct osmux_hdr *_osmuxh; \
+               int _rc; \
+               _msg = osmux_next(); \
+               _osmuxh = osmux_xfrm_output_pull(_msg); \
+               OSMO_ASSERT(_osmuxh); \
+               _rc = osmux_xfrm_output_sched((h_output), _osmuxh); \
+               OSMO_ASSERT(_rc == _osmuxh->ctr+1); \
+               }
+
+static void test_output_consecutive(void)
+{
+       struct osmux_out_handle h_output;
+
+       printf("===test_output_consecutive===\n");
+
+       clock_override_enable(true);
+       clock_override_set(0, 0);
+       osmux_init(32);
+       osmux_xfrm_output_init(&h_output, 0x7000000);
+       h_output.rtp_seq = (uint16_t)50;
+       h_output.rtp_timestamp = (uint32_t)500;
+       osmux_xfrm_output_set_tx_cb(&h_output, tx_cb, &h_output);
+
+       /* First osmux frame at t=0 */
+       PULL_NEXT(&h_output);
+       clock_debug("first dequed before first select");
+       osmo_select_main(0);
+
+       clock_override_add(0, TIME_RTP_PKT_MS*1000);
+       clock_debug("second select, second dequed");
+       osmo_select_main(0);
+
+       clock_override_add(0, TIME_RTP_PKT_MS*1000);
+       clock_debug("third select, third dequed");
+       osmo_select_main(0);
+
+       clock_override_add(0, TIME_RTP_PKT_MS*1000);
+       clock_debug("fourth select, fourth dequed");
+       osmo_select_main(0);
+
+       clock_override_add(0, TIME_RTP_PKT_MS*1000);
+       clock_debug("fifth select, fifth dequed");
+       osmo_select_main(0);
+
+       clock_override_add(0, TIME_RTP_PKT_MS*1000);
+       clock_debug("sixth select, sixth dequed");
+       osmo_select_main(0);
+       OSMO_ASSERT(llist_empty(&h_output.list));
+
+       /* Second osmux frame at t=80 */
+       clock_debug("send second osmux frame");
+       PULL_NEXT(&h_output);
+       clock_debug("first dequed before first select");
+       osmo_select_main(0);
+
+       clock_override_add(0, TIME_RTP_PKT_MS*1000);
+       clock_debug("second select, second dequed");
+       osmo_select_main(0);
+
+       clock_override_add(0, 4*TIME_RTP_PKT_MS*1000);
+       clock_debug("third select, four packet should be dequeued");
+       osmo_select_main(0);
+       OSMO_ASSERT(llist_empty(&h_output.list));
+       OSMO_ASSERT(!osmo_timer_pending(&h_output.timer));
+
+       clock_debug("calling flush on empty list, should do nothing");
+       osmux_xfrm_output_flush(&h_output);
+       OSMO_ASSERT(llist_empty(&h_output.list));
+       OSMO_ASSERT(!osmo_timer_pending(&h_output.timer));
+}
+
+static void test_output_interleaved(void)
+{
+       struct osmux_out_handle h_output;
+
+       printf("===test_output_interleaved===\n");
+
+       clock_override_enable(true);
+       clock_override_set(0, 0);
+       osmux_init(32);
+       osmux_xfrm_output_init(&h_output, 0x7000000);
+       h_output.rtp_seq = (uint16_t)50;
+       h_output.rtp_timestamp = (uint32_t)500;
+       osmux_xfrm_output_set_tx_cb(&h_output, tx_cb, &h_output);
+
+       /* First osmux frame at t=0, but it actually arrives late due to jitter,
+          so 2nd frame is going to arrive before the 1st one is completelly
+          scheduled */
+       PULL_NEXT(&h_output);
+
+       clock_override_add(0, 2*TIME_RTP_PKT_MS*1000);
+       clock_debug("select, 3 dequed, 3 still queued");
+       osmo_select_main(0);
+
+       /* Second osmux frame at t=0 */
+       clock_debug("next frame arrives, 3 pending rtp packets are dequeued and 
first of new osmux frame too");
+       PULL_NEXT(&h_output);
+       osmo_select_main(0);
+       OSMO_ASSERT(llist_count(&h_output.list) == 5);
+
+       clock_override_add(0, 5*TIME_RTP_PKT_MS*1000);
+       clock_debug("calling select, then all should be out");
+       osmo_select_main(0);
+
+       OSMO_ASSERT(llist_empty(&h_output.list));
+       OSMO_ASSERT(!osmo_timer_pending(&h_output.timer));
+}
+
+static void test_output_2together(void)
+{
+       struct osmux_out_handle h_output;
+
+       printf("===test_output_2together===\n");
+
+       clock_override_enable(true);
+       clock_override_set(0, 0);
+       osmux_init(32);
+       osmux_xfrm_output_init(&h_output, 0x7000000);
+       h_output.rtp_seq = (uint16_t)50;
+       h_output.rtp_timestamp = (uint32_t)500;
+       osmux_xfrm_output_set_tx_cb(&h_output, tx_cb, &h_output);
+
+       /* First osmux frame at t=0, but it actually arrives late due to jitter,
+          so we receive both at the same time. */
+       PULL_NEXT(&h_output);
+       clock_debug("calling select in between 2 osmux recv");
+       osmo_select_main(0);
+       PULL_NEXT(&h_output);
+
+       clock_debug("calling select after receiving 2nd osmux. Dequeue 1st 
osmux frame and 1st rtp from 2nd osmux frame.");
+       osmo_select_main(0);
+       OSMO_ASSERT(llist_count(&h_output.list) == 5);
+
+       clock_override_add(0, 5*TIME_RTP_PKT_MS*1000);
+       clock_debug("select, all 5 remaining should be out");
+       osmo_select_main(0);
+
+       OSMO_ASSERT(llist_empty(&h_output.list));
+       OSMO_ASSERT(!osmo_timer_pending(&h_output.timer));
+}
+
+/* FIXME: this test shows generated rtp stream doesn't have osmux lost frames 
into account! */
+static void test_output_frame_lost(void)
+{
+       struct osmux_out_handle h_output;
+
+       printf("===test_output_frame_lost===\n");
+
+       clock_override_enable(true);
+       clock_override_set(0, 0);
+       osmux_init(32);
+       osmux_xfrm_output_init(&h_output, 0x7000000);
+       h_output.rtp_seq = (uint16_t)50;
+       h_output.rtp_timestamp = (uint32_t)500;
+       osmux_xfrm_output_set_tx_cb(&h_output, tx_cb, &h_output);
+
+       clock_debug("first osmux frame");
+       PULL_NEXT(&h_output);
+       clock_override_add(0, 5*TIME_RTP_PKT_MS*1000);
+       osmo_select_main(0);
+
+       clock_debug("one osmux frame is now lost (seq++)");
+       osmux_next();
+       clock_override_add(0, 6*TIME_RTP_PKT_MS*1000);
+
+       clock_debug("3rd osmux frame arrives");
+       PULL_NEXT(&h_output);
+       clock_override_add(0, 5*TIME_RTP_PKT_MS*1000);
+       osmo_select_main(0);
+
+       OSMO_ASSERT(llist_empty(&h_output.list));
+       OSMO_ASSERT(!osmo_timer_pending(&h_output.timer));
+}
+
+static void test_output_flush(void)
+{
+       struct osmux_out_handle h_output;
+
+       printf("===test_output_flush===\n");
+
+       clock_override_enable(true);
+       clock_override_set(0, 0);
+       osmux_init(32);
+       osmux_xfrm_output_init(&h_output, 0x7000000);
+       h_output.rtp_seq = (uint16_t)50;
+       h_output.rtp_timestamp = (uint32_t)500;
+       osmux_xfrm_output_set_tx_cb(&h_output, tx_cb, &h_output);
+
+       clock_debug("first osmux frame");
+       PULL_NEXT(&h_output);
+       clock_override_add(0, 2*TIME_RTP_PKT_MS*1000);
+       osmo_select_main(0);
+
+       clock_debug("2nd osmux frame arrives");
+       PULL_NEXT(&h_output);
+
+       clock_debug("flushing, all packet should be transmitted immediately");
+       OSMO_ASSERT(llist_count(&h_output.list) == 9);
+       OSMO_ASSERT(osmo_timer_pending(&h_output.timer));
+       osmux_xfrm_output_flush(&h_output);
+       OSMO_ASSERT(llist_empty(&h_output.list));
+       OSMO_ASSERT(!osmo_timer_pending(&h_output.timer));
+}
+
+int main(int argc, char **argv)
+{
+
+       if (signal(SIGALRM, sigalarm_handler) == SIG_ERR) {
+               perror("signal");
+               exit(EXIT_FAILURE);
+       }
+
+       void *tall_ctx = talloc_named_const(NULL, 1, "Root context");
+       msgb_talloc_ctx_init(tall_ctx, 0);
+       osmo_init_logging2(tall_ctx, &log_info);
+       log_set_print_filename(osmo_stderr_target, 0);
+       log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
+       log_set_category_filter(osmo_stderr_target, DLMUX, 1, LOGL_DEBUG);
+
+       alarm(10);
+
+       test_output_consecutive();
+       test_output_interleaved();
+       test_output_2together();
+       test_output_frame_lost();
+       test_output_flush();
+
+       fprintf(stdout, "OK: Test passed\n");
+       return EXIT_SUCCESS;
+}
diff --git a/tests/osmux/osmux_test2.ok b/tests/osmux/osmux_test2.ok
new file mode 100644
index 0000000..1e6f95a
--- /dev/null
+++ b/tests/osmux/osmux_test2.ok
@@ -0,0 +1,108 @@
+===test_output_consecutive===
+sys={0.000000}, mono={0.000000}: clock_override_set
+sys={0.000000}, mono={0.000000}: dequeue: seq=50 ts=500 enqueued=5
+sys={0.000000}, mono={0.000000}: first dequed before first select
+sys={0.020000}, mono={0.020000}: clock_override_add
+sys={0.020000}, mono={0.020000}: second select, second dequed
+sys={0.020000}, mono={0.020000}: dequeue: seq=51 ts=660 enqueued=4
+sys={0.040000}, mono={0.040000}: clock_override_add
+sys={0.040000}, mono={0.040000}: third select, third dequed
+sys={0.040000}, mono={0.040000}: dequeue: seq=52 ts=820 enqueued=3
+sys={0.060000}, mono={0.060000}: clock_override_add
+sys={0.060000}, mono={0.060000}: fourth select, fourth dequed
+sys={0.060000}, mono={0.060000}: dequeue: seq=53 ts=980 enqueued=2
+sys={0.080000}, mono={0.080000}: clock_override_add
+sys={0.080000}, mono={0.080000}: fifth select, fifth dequed
+sys={0.080000}, mono={0.080000}: dequeue: seq=54 ts=1140 enqueued=1
+sys={0.100000}, mono={0.100000}: clock_override_add
+sys={0.100000}, mono={0.100000}: sixth select, sixth dequed
+sys={0.100000}, mono={0.100000}: dequeue: seq=55 ts=1300 enqueued=0
+sys={0.100000}, mono={0.100000}: send second osmux frame
+sys={0.100000}, mono={0.100000}: dequeue: seq=56 ts=1460 enqueued=5
+sys={0.100000}, mono={0.100000}: first dequed before first select
+sys={0.120000}, mono={0.120000}: clock_override_add
+sys={0.120000}, mono={0.120000}: second select, second dequed
+sys={0.120000}, mono={0.120000}: dequeue: seq=57 ts=1620 enqueued=4
+sys={0.200000}, mono={0.200000}: clock_override_add
+sys={0.200000}, mono={0.200000}: third select, four packet should be dequeued
+sys={0.200000}, mono={0.200000}: dequeue: seq=58 ts=1780 enqueued=3
+sys={0.200000}, mono={0.200000}: dequeue: seq=59 ts=1940 enqueued=2
+sys={0.200000}, mono={0.200000}: dequeue: seq=60 ts=2100 enqueued=1
+sys={0.200000}, mono={0.200000}: dequeue: seq=61 ts=2260 enqueued=0
+sys={0.200000}, mono={0.200000}: calling flush on empty list, should do nothing
+===test_output_interleaved===
+sys={0.000000}, mono={0.000000}: clock_override_set
+sys={0.000000}, mono={0.000000}: dequeue: seq=50 ts=500 enqueued=5
+sys={0.040000}, mono={0.040000}: clock_override_add
+sys={0.040000}, mono={0.040000}: select, 3 dequed, 3 still queued
+sys={0.040000}, mono={0.040000}: dequeue: seq=51 ts=660 enqueued=4
+sys={0.040000}, mono={0.040000}: dequeue: seq=52 ts=820 enqueued=3
+sys={0.040000}, mono={0.040000}: next frame arrives, 3 pending rtp packets are 
dequeued and first of new osmux frame too
+sys={0.040000}, mono={0.040000}: dequeue: seq=53 ts=980 enqueued=8
+sys={0.040000}, mono={0.040000}: dequeue: seq=54 ts=1140 enqueued=7
+sys={0.040000}, mono={0.040000}: dequeue: seq=55 ts=1300 enqueued=6
+sys={0.040000}, mono={0.040000}: dequeue: seq=56 ts=1460 enqueued=5
+sys={0.140000}, mono={0.140000}: clock_override_add
+sys={0.140000}, mono={0.140000}: calling select, then all should be out
+sys={0.140000}, mono={0.140000}: dequeue: seq=57 ts=1620 enqueued=4
+sys={0.140000}, mono={0.140000}: dequeue: seq=58 ts=1780 enqueued=3
+sys={0.140000}, mono={0.140000}: dequeue: seq=59 ts=1940 enqueued=2
+sys={0.140000}, mono={0.140000}: dequeue: seq=60 ts=2100 enqueued=1
+sys={0.140000}, mono={0.140000}: dequeue: seq=61 ts=2260 enqueued=0
+===test_output_2together===
+sys={0.000000}, mono={0.000000}: clock_override_set
+sys={0.000000}, mono={0.000000}: dequeue: seq=50 ts=500 enqueued=5
+sys={0.000000}, mono={0.000000}: calling select in between 2 osmux recv
+sys={0.000000}, mono={0.000000}: calling select after receiving 2nd osmux. 
Dequeue 1st osmux frame and 1st rtp from 2nd osmux frame.
+sys={0.000000}, mono={0.000000}: dequeue: seq=51 ts=660 enqueued=10
+sys={0.000000}, mono={0.000000}: dequeue: seq=52 ts=820 enqueued=9
+sys={0.000000}, mono={0.000000}: dequeue: seq=53 ts=980 enqueued=8
+sys={0.000000}, mono={0.000000}: dequeue: seq=54 ts=1140 enqueued=7
+sys={0.000000}, mono={0.000000}: dequeue: seq=55 ts=1300 enqueued=6
+sys={0.000000}, mono={0.000000}: dequeue: seq=56 ts=1460 enqueued=5
+sys={0.100000}, mono={0.100000}: clock_override_add
+sys={0.100000}, mono={0.100000}: select, all 5 remaining should be out
+sys={0.100000}, mono={0.100000}: dequeue: seq=57 ts=1620 enqueued=4
+sys={0.100000}, mono={0.100000}: dequeue: seq=58 ts=1780 enqueued=3
+sys={0.100000}, mono={0.100000}: dequeue: seq=59 ts=1940 enqueued=2
+sys={0.100000}, mono={0.100000}: dequeue: seq=60 ts=2100 enqueued=1
+sys={0.100000}, mono={0.100000}: dequeue: seq=61 ts=2260 enqueued=0
+===test_output_frame_lost===
+sys={0.000000}, mono={0.000000}: clock_override_set
+sys={0.000000}, mono={0.000000}: first osmux frame
+sys={0.000000}, mono={0.000000}: dequeue: seq=50 ts=500 enqueued=5
+sys={0.100000}, mono={0.100000}: clock_override_add
+sys={0.100000}, mono={0.100000}: dequeue: seq=51 ts=660 enqueued=4
+sys={0.100000}, mono={0.100000}: dequeue: seq=52 ts=820 enqueued=3
+sys={0.100000}, mono={0.100000}: dequeue: seq=53 ts=980 enqueued=2
+sys={0.100000}, mono={0.100000}: dequeue: seq=54 ts=1140 enqueued=1
+sys={0.100000}, mono={0.100000}: dequeue: seq=55 ts=1300 enqueued=0
+sys={0.100000}, mono={0.100000}: one osmux frame is now lost (seq++)
+sys={0.220000}, mono={0.220000}: clock_override_add
+sys={0.220000}, mono={0.220000}: 3rd osmux frame arrives
+sys={0.220000}, mono={0.220000}: dequeue: seq=56 ts=1460 enqueued=5
+sys={0.320000}, mono={0.320000}: clock_override_add
+sys={0.320000}, mono={0.320000}: dequeue: seq=57 ts=1620 enqueued=4
+sys={0.320000}, mono={0.320000}: dequeue: seq=58 ts=1780 enqueued=3
+sys={0.320000}, mono={0.320000}: dequeue: seq=59 ts=1940 enqueued=2
+sys={0.320000}, mono={0.320000}: dequeue: seq=60 ts=2100 enqueued=1
+sys={0.320000}, mono={0.320000}: dequeue: seq=61 ts=2260 enqueued=0
+===test_output_flush===
+sys={0.000000}, mono={0.000000}: clock_override_set
+sys={0.000000}, mono={0.000000}: first osmux frame
+sys={0.000000}, mono={0.000000}: dequeue: seq=50 ts=500 enqueued=5
+sys={0.040000}, mono={0.040000}: clock_override_add
+sys={0.040000}, mono={0.040000}: dequeue: seq=51 ts=660 enqueued=4
+sys={0.040000}, mono={0.040000}: dequeue: seq=52 ts=820 enqueued=3
+sys={0.040000}, mono={0.040000}: 2nd osmux frame arrives
+sys={0.040000}, mono={0.040000}: flushing, all packet should be transmitted 
immediately
+sys={0.040000}, mono={0.040000}: dequeue: seq=53 ts=980 enqueued=8
+sys={0.040000}, mono={0.040000}: dequeue: seq=54 ts=1140 enqueued=7
+sys={0.040000}, mono={0.040000}: dequeue: seq=55 ts=1300 enqueued=6
+sys={0.040000}, mono={0.040000}: dequeue: seq=56 ts=1460 enqueued=5
+sys={0.040000}, mono={0.040000}: dequeue: seq=57 ts=1620 enqueued=4
+sys={0.040000}, mono={0.040000}: dequeue: seq=58 ts=1780 enqueued=3
+sys={0.040000}, mono={0.040000}: dequeue: seq=59 ts=1940 enqueued=2
+sys={0.040000}, mono={0.040000}: dequeue: seq=60 ts=2100 enqueued=1
+sys={0.040000}, mono={0.040000}: dequeue: seq=61 ts=2260 enqueued=0
+OK: Test passed
diff --git a/tests/testsuite.at b/tests/testsuite.at
index 81d40ba..67b91c6 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -7,6 +7,12 @@
 AT_CHECK([$abs_top_builddir/tests/osmux/osmux_test], [0], [expout], [ignore])
 AT_CLEANUP
 
+AT_SETUP([osmux_test2])
+AT_KEYWORDS([osmux_test2])
+cat $abs_srcdir/osmux/osmux_test2.ok > expout
+AT_CHECK([$abs_top_builddir/tests/osmux/osmux_test2], [0], [expout], [ignore])
+AT_CLEANUP
+
 AT_SETUP([jibuf_test])
 AT_KEYWORDS([jibuf_test])
 cat $abs_srcdir/jibuf/jibuf_test.ok > expout

-- 
To view, visit https://gerrit.osmocom.org/7870
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I3bf59276424ea87c4e66a6ff46de1e3e9a06a904
Gerrit-PatchSet: 4
Gerrit-Project: libosmo-netif
Gerrit-Branch: master
Gerrit-Owner: Pau Espin Pedrol <pes...@sysmocom.de>
Gerrit-Reviewer: Harald Welte <lafo...@gnumonks.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: Pablo Neira Ayuso <pa...@gnumonks.org>
Gerrit-Reviewer: Pau Espin Pedrol <pes...@sysmocom.de>

Reply via email to