tests/llc: Add test_llc_meta_pdu_life_expire

Related: OS#5508
Change-Id: I7ba6be32778e2c2b22723db10fa66655812c8452
diff --git a/tests/llc/LlcTest.cpp b/tests/llc/LlcTest.cpp
index dd4c80c..3dabeed 100644
--- a/tests/llc/LlcTest.cpp
+++ b/tests/llc/LlcTest.cpp
@@ -184,6 +184,46 @@
 	TALLOC_FREE(the_pcu);
 }
 
+/* Test PDU lifetime is taken into account and packet is dropped if dequeued too
+ * late */
+static void test_llc_meta_pdu_life_expire()
+{
+	gprs_llc_queue *queue = prepare_queue();
+	MetaInfo info1 = {0};
+	MetaInfo info2 = {0};
+
+	printf("=== start %s ===\n", __func__);
+
+	OSMO_ASSERT(llc_queue_size(queue) == 0);
+	OSMO_ASSERT(llc_queue_octets(queue) == 0);
+
+	info1.recv_time.tv_sec = 123456777;
+	info1.recv_time.tv_nsec = 123456000;
+	info1.expire_time.tv_sec = 123456789;
+	info1.expire_time.tv_nsec = 987654000;
+	*clk_mono_override_time = info1.recv_time;
+	enqueue_data(queue, "LLC message 1", &info1.expire_time);
+
+	info2.recv_time.tv_sec = 123458000;
+	info2.recv_time.tv_nsec = 547352000;
+	info2.expire_time.tv_sec = 123458006;
+	info2.expire_time.tv_nsec = 867252000;
+	*clk_mono_override_time = info2.recv_time;
+	enqueue_data(queue, "LLC message 2", &info2.expire_time);
+
+	clk_mono_override_time->tv_sec = info1.expire_time.tv_sec + 1;
+	clk_mono_override_time->tv_nsec = info1.expire_time.tv_nsec;
+
+	dequeue_and_check(queue, "LLC message 2", &info2);
+
+	OSMO_ASSERT(llc_queue_size(queue) == 0);
+	OSMO_ASSERT(llc_queue_octets(queue) == 0);
+	llc_queue_clear(queue, NULL);
+
+	printf("=== end %s ===\n", __func__);
+	TALLOC_FREE(the_pcu);
+}
+
 static void test_llc_merge()
 {
 	gprs_llc_queue *queue1 = prepare_queue();
@@ -258,6 +298,7 @@
 
 	test_llc_queue();
 	test_llc_meta();
+	test_llc_meta_pdu_life_expire();
 	test_llc_merge();
 
 	if (getenv("TALLOC_REPORT_FULL"))