aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2018-05-15 15:37:05 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2018-05-15 16:49:50 +0200
commitfab0df4913dbf6497de21fcaa2fcd8187ca64a31 (patch)
tree82e860d87dd9322a1f9861109728d015798675b6 /tests
parentbac671eda8f34918b7f71e6e42a3e92fac931efa (diff)
tests: jibuf_test: Add scenario to show out-of-order bug
Diffstat (limited to 'tests')
-rw-r--r--tests/jibuf/jibuf_test.c61
-rw-r--r--tests/jibuf/jibuf_test.ok22
2 files changed, 83 insertions, 0 deletions
diff --git a/tests/jibuf/jibuf_test.c b/tests/jibuf/jibuf_test.c
index c0c24fd..7993a65 100644
--- a/tests/jibuf/jibuf_test.c
+++ b/tests/jibuf/jibuf_test.c
@@ -619,6 +619,66 @@ static void test_rtp_marker(void)
osmo_jibuf_delete(jb);
}
+/* This test aims at testing scenarios described in OS#3262, in which syncpoint
+ packets can provoke a situation in which packets are stored out-of-order in
+ the queue. */
+static void test_rtp_marker_queue_order()
+{
+ int min_delay = 60;
+ struct msgb *msg;
+ struct rtp_hdr *rtph;
+
+ printf("===test_rtp_marker_queue_order===\n");
+
+ clock_override_enable(true);
+ clock_override_set(0, 0);
+ rtp_init(32, 400);
+ jb = osmo_jibuf_alloc(NULL);
+ osmo_jibuf_set_dequeue_cb(jb, dequeue_cb, NULL);
+ osmo_jibuf_set_min_delay(jb, min_delay);
+ osmo_jibuf_set_max_delay(jb, 200);
+
+ /* First rtp at t=0, should be scheduled in min_delay time */
+ clock_debug("enqueue 1st packet");
+ ENQUEUE_NEXT(jb);
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ clock_debug("enqueue 2nd packet");
+ ENQUEUE_NEXT(jb);
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ clock_debug("enqueue 3rd packet");
+ ENQUEUE_NEXT(jb);
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+
+ /* We then emulate an scenario in which an Osmux queue in front of us
+ receives a new frame before expected time, which means the packets in
+ the osmux genreated rtp queue will be flushed and sent to jibuf
+ directly. On top, the first packet of the new frame has the RTP
+ Marker bit set. */
+ clock_debug("enqueue 3 packets instantly");
+ ENQUEUE_NEXT(jb); /* scheduled min_delay+0 */
+ ENQUEUE_NEXT(jb); /* a min_delay+TIME_RTP_PKT_MS */
+ ENQUEUE_NEXT(jb); /* scheduled min_delay+TIME_RTP_PKT_MS*2 */
+ clock_debug("enqueue pkt with marker=1 instantly");
+ msg = rtp_next();
+ rtph = osmo_rtp_get_hdr(msg);
+ rtph->marker = 1;
+ OSMO_ASSERT(osmo_jibuf_enqueue(jb, msg) == 0); /* syncpoint, scheduled in min_delay+0 */
+ osmo_select_main(0);
+
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ clock_debug("enqueue pkt after syncpoint");
+ ENQUEUE_NEXT(jb); /* scheduled min_delay+0 */
+
+ clock_debug("all packets dequeued");
+ clock_override_add(0, min_delay*1000);
+ osmo_select_main(0);
+
+ /* This assert shows that packets are queued out of order in this case:*/
+ OSMO_ASSERT(!osmo_jibuf_empty(jb));
+
+ osmo_jibuf_delete(jb);
+}
+
static void test_rtp_out_of_sync(unsigned int time_inc_ms, uint16_t seq_nosync_inc, uint32_t ts_nosync_inc, bool expect_drop)
{
int min_delay = 60;
@@ -754,6 +814,7 @@ int main(int argc, char **argv)
test_seq_wraparound();
test_timestamp_wraparound();
test_rtp_marker();
+ test_rtp_marker_queue_order();
test_rtp_out_of_sync(80*TIME_RTP_PKT_MS, 5, 5*SAMPLES_PER_PKT, true);
test_rtp_out_of_sync(80*TIME_RTP_PKT_MS, 6, 5*SAMPLES_PER_PKT, false);
test_rtp_out_of_sync(80*TIME_RTP_PKT_MS, 5, 5*SAMPLES_PER_PKT + 3, false);
diff --git a/tests/jibuf/jibuf_test.ok b/tests/jibuf/jibuf_test.ok
index e495435..6bf52fb 100644
--- a/tests/jibuf/jibuf_test.ok
+++ b/tests/jibuf/jibuf_test.ok
@@ -365,6 +365,28 @@ sys={0.140000}, mono={0.140000}: 2 packets dequeued
sys={0.200000}, mono={0.200000}: clock_override_add
sys={0.200000}, mono={0.200000}: dequeue: seq=35 ts=880 INTERMEDIATE
sys={0.200000}, mono={0.200000}: dequeue: seq=36 ts=1040 LATEST
+===test_rtp_marker_queue_order===
+sys={0.000000}, mono={0.000000}: clock_override_set
+sys={0.000000}, mono={0.000000}: enqueue 1st packet
+sys={0.020000}, mono={0.020000}: clock_override_add
+sys={0.020000}, mono={0.020000}: enqueue 2nd packet
+sys={0.040000}, mono={0.040000}: clock_override_add
+sys={0.040000}, mono={0.040000}: enqueue 3rd packet
+sys={0.060000}, mono={0.060000}: clock_override_add
+sys={0.060000}, mono={0.060000}: enqueue 3 packets instantly
+sys={0.060000}, mono={0.060000}: enqueue pkt with marker=1 instantly
+sys={0.060000}, mono={0.060000}: dequeue: seq=33 ts=560 INTERMEDIATE
+sys={0.080000}, mono={0.080000}: clock_override_add
+sys={0.080000}, mono={0.080000}: enqueue pkt after syncpoint
+sys={0.080000}, mono={0.080000}: all packets dequeued
+sys={0.140000}, mono={0.140000}: clock_override_add
+sys={0.140000}, mono={0.140000}: dequeue: seq=34 ts=720 INTERMEDIATE
+sys={0.140000}, mono={0.140000}: dequeue: seq=35 ts=880 INTERMEDIATE
+sys={0.140000}, mono={0.140000}: dequeue: seq=36 ts=1040 INTERMEDIATE
+sys={0.140000}, mono={0.140000}: dequeue: seq=39 ts=1520 INTERMEDIATE
+sys={0.140000}, mono={0.140000}: dequeue: seq=37 ts=1200 INTERMEDIATE
+sys={0.140000}, mono={0.140000}: dequeue: seq=40 ts=1680 LATEST
+sys={0.140000}, mono={0.140000}: dequeue: seq=38 ts=1360 INTERMEDIATE
===test_rtp_out_of_sync(1600, 5, 800, 1)===
sys={0.000000}, mono={0.000000}: clock_override_set
sys={0.000000}, mono={0.000000}: enqueue 1st packet (seq=33, ts=560)