aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2020-02-26 20:05:33 +0100
committerPau Espin Pedrol <pespin@sysmocom.de>2020-03-02 12:05:06 +0100
commit5fc6e010a58409e73e19bd89b540f8c77bd8d397 (patch)
treed4b9246d93827c4d127767e328ed5396b4f2719c /tests
parent55f06c3d77563d5817107247c422d3e66115c352 (diff)
llc_queue::{dequeue,enqueue}() refactor
As seen in OS#4420, setting the MetaInfo.recv_time outside of llc_queue before calling llc_queue::enqueue() and later on using that value in llc_queue itself at dequeue time is not a good idea, since it can provoke errors if the recv_time was not set correctly. For instance, LlcTest was not setting the value for recv_time on some test, which ended up with a huge millisec value when substracting now() from it: """ llc.cpp:215:29: runtime error: signed integer overflow: 1582738663 * 1000 cannot be represented in type 'long int' """ This issue only appeared when started building on a raspberrypi4. Let's better set/store the MetaInfo.recv_time internally during llc_queue::enqueue(). Then, enqueue() only needs the MetaInfo.expire_time, so let's change its arg list to only receive that to avoid confusions. Take the chance to move the llc_queue APIs to use osmo_gettimeofday, since we need to fake the time now that the API itself sets that time. Also take the chance during this refactor to disallow passing null pointer by default since no user needs that. Finally, update the LlcTest accordingly with all API/behavior changes. Related: OS#4420 Change-Id: Ief6b1464dc779ff22adc2b02da7a006cd772ebce
Diffstat (limited to 'tests')
-rw-r--r--tests/llc/LlcTest.cpp80
1 files changed, 44 insertions, 36 deletions
diff --git a/tests/llc/LlcTest.cpp b/tests/llc/LlcTest.cpp
index 8163f34e..d6dd5fb6 100644
--- a/tests/llc/LlcTest.cpp
+++ b/tests/llc/LlcTest.cpp
@@ -34,6 +34,7 @@ extern "C" {
#include <osmocom/core/msgb.h>
#include <osmocom/core/talloc.h>
#include <osmocom/core/utils.h>
+#include <osmocom/core/timer.h>
#include <osmocom/vty/vty.h>
}
@@ -43,7 +44,7 @@ int16_t spoof_mnc = 0, spoof_mcc = 0;
bool spoof_mnc_3_digits = false;
static void enqueue_data(gprs_llc_queue *queue, const uint8_t *data, size_t len,
- gprs_llc_queue::MetaInfo *info = 0)
+ const struct timeval *expire_time)
{
struct timeval *tv;
uint8_t *msg_data;
@@ -54,11 +55,11 @@ static void enqueue_data(gprs_llc_queue *queue, const uint8_t *data, size_t len,
memcpy(msg_data, data, len);
- queue->enqueue(llc_msg, info);
+ queue->enqueue(llc_msg, expire_time);
}
static void dequeue_and_check(gprs_llc_queue *queue, const uint8_t *exp_data,
- size_t len, const gprs_llc_queue::MetaInfo *exp_info = 0)
+ size_t len, const gprs_llc_queue::MetaInfo *exp_info)
{
struct msgb *llc_msg;
const gprs_llc_queue::MetaInfo *info_res;
@@ -72,16 +73,17 @@ static void dequeue_and_check(gprs_llc_queue *queue, const uint8_t *exp_data,
if (!msgb_eq_data_print(llc_msg, exp_data, len))
fprintf(stderr, "check failed!\n");
- if (exp_info)
- OSMO_ASSERT(memcmp(exp_info, info_res, sizeof(*exp_info)) == 0);
-
+ if (exp_info) {
+ OSMO_ASSERT(memcmp(&exp_info->recv_time, &info_res->recv_time, sizeof(info_res->recv_time)) == 0);
+ OSMO_ASSERT(memcmp(&exp_info->expire_time, &info_res->expire_time, sizeof(info_res->expire_time)) == 0);
+ }
msgb_free(llc_msg);
}
static void enqueue_data(gprs_llc_queue *queue, const char *message,
- gprs_llc_queue::MetaInfo *info = 0)
+ const struct timeval *expire_time)
{
- enqueue_data(queue, (uint8_t *)(message), strlen(message), info);
+ enqueue_data(queue, (uint8_t *)(message), strlen(message), expire_time);
}
static void dequeue_and_check(gprs_llc_queue *queue, const char *exp_message,
@@ -94,6 +96,7 @@ static void dequeue_and_check(gprs_llc_queue *queue, const char *exp_message,
static void test_llc_queue()
{
gprs_llc_queue queue;
+ struct timeval expire_time = {0};
printf("=== start %s ===\n", __func__);
@@ -101,11 +104,11 @@ static void test_llc_queue()
OSMO_ASSERT(queue.size() == 0);
OSMO_ASSERT(queue.octets() == 0);
- enqueue_data(&queue, "LLC message");
+ enqueue_data(&queue, "LLC message", &expire_time);
OSMO_ASSERT(queue.size() == 1);
OSMO_ASSERT(queue.octets() == 11);
- enqueue_data(&queue, "other LLC message");
+ enqueue_data(&queue, "other LLC message", &expire_time);
OSMO_ASSERT(queue.size() == 2);
OSMO_ASSERT(queue.octets() == 28);
@@ -117,7 +120,7 @@ static void test_llc_queue()
OSMO_ASSERT(queue.size() == 0);
OSMO_ASSERT(queue.octets() == 0);
- enqueue_data(&queue, "LLC");
+ enqueue_data(&queue, "LLC", &expire_time);
OSMO_ASSERT(queue.size() == 1);
OSMO_ASSERT(queue.octets() == 3);
@@ -131,18 +134,8 @@ static void test_llc_queue()
static void test_llc_meta()
{
gprs_llc_queue queue;
- gprs_llc_queue::MetaInfo info1;
- gprs_llc_queue::MetaInfo info2;
-
- info1.recv_time.tv_sec = 123456777;
- info1.recv_time.tv_usec = 123456;
- info1.expire_time.tv_sec = 123456789;
- info1.expire_time.tv_usec = 987654;
-
- info2.recv_time.tv_sec = 987654321;
- info2.recv_time.tv_usec = 547352;
- info2.expire_time.tv_sec = 987654327;
- info2.expire_time.tv_usec = 867252;
+ gprs_llc_queue::MetaInfo info1 = {0};
+ gprs_llc_queue::MetaInfo info2 = {0};
printf("=== start %s ===\n", __func__);
@@ -150,8 +143,19 @@ static void test_llc_meta()
OSMO_ASSERT(queue.size() == 0);
OSMO_ASSERT(queue.octets() == 0);
- enqueue_data(&queue, "LLC message 1", &info1);
- enqueue_data(&queue, "LLC message 2", &info2);
+ info1.recv_time.tv_sec = 123456777;
+ info1.recv_time.tv_usec = 123456;
+ info1.expire_time.tv_sec = 123456789;
+ info1.expire_time.tv_usec = 987654;
+ osmo_gettimeofday_override_time = info1.recv_time;
+ enqueue_data(&queue, "LLC message 1", &info1.expire_time);
+
+ info2.recv_time.tv_sec = 987654321;
+ info2.recv_time.tv_usec = 547352;
+ info2.expire_time.tv_sec = 987654327;
+ info2.expire_time.tv_usec = 867252;
+ osmo_gettimeofday_override_time = info2.recv_time;
+ enqueue_data(&queue, "LLC message 2", &info2.expire_time);
dequeue_and_check(&queue, "LLC message 1", &info1);
dequeue_and_check(&queue, "LLC message 2", &info2);
@@ -167,27 +171,27 @@ static void test_llc_merge()
{
gprs_llc_queue queue1;
gprs_llc_queue queue2;
- gprs_llc_queue::MetaInfo info = {0};
+ struct timeval expire_time = {0};
printf("=== start %s ===\n", __func__);
queue1.init();
queue2.init();
- info.recv_time.tv_sec += 1;
- enqueue_data(&queue1, "*A*", &info);
+ osmo_gettimeofday_override_time.tv_sec += 1;
+ enqueue_data(&queue1, "*A*", &expire_time);
- info.recv_time.tv_sec += 1;
- enqueue_data(&queue1, "*B*", &info);
+ osmo_gettimeofday_override_time.tv_sec += 1;
+ enqueue_data(&queue1, "*B*", &expire_time);
- info.recv_time.tv_sec += 1;
- enqueue_data(&queue2, "*C*", &info);
+ osmo_gettimeofday_override_time.tv_sec += 1;
+ enqueue_data(&queue2, "*C*", &expire_time);
- info.recv_time.tv_sec += 1;
- enqueue_data(&queue1, "*D*", &info);
+ osmo_gettimeofday_override_time.tv_sec += 1;
+ enqueue_data(&queue1, "*D*", &expire_time);
- info.recv_time.tv_sec += 1;
- enqueue_data(&queue2, "*E*", &info);
+ osmo_gettimeofday_override_time.tv_sec += 1;
+ enqueue_data(&queue2, "*E*", &expire_time);
OSMO_ASSERT(queue1.size() == 3);
OSMO_ASSERT(queue1.octets() == 9);
@@ -231,6 +235,10 @@ int main(int argc, char **argv)
vty_init(&pcu_vty_info);
pcu_vty_init();
+ osmo_gettimeofday_override = true;
+ osmo_gettimeofday_override_time.tv_sec = 123456777;
+ osmo_gettimeofday_override_time.tv_usec = 123456;
+
test_llc_queue();
test_llc_meta();
test_llc_merge();