Updated after the gsm340_validity_time() rename. On Sat, Mar 8, 2014 at 3:45 AM, Alexander Chemeris <[email protected]> wrote: > > > > On Fri, Mar 7, 2014 at 9:17 PM, Alexander Chemeris > <[email protected]> wrote: >> >> This tests demonstrate issues with the current code. >> >> -- >> Regards, >> Alexander Chemeris. >> CEO, Fairwaves, Inc. / ООО УмРадио >> https://fairwaves.co > > > > > -- > Regards, > Alexander Chemeris. > CEO, Fairwaves, Inc. / ООО УмРадио > https://fairwaves.co
-- Regards, Alexander Chemeris. CEO, Fairwaves, Inc. / ООО УмРадио https://fairwaves.co
From 7b33ad5e709db39b1f9b9d7a8d1f3f9d50c7fa7b Mon Sep 17 00:00:00 2001 From: Alexander Chemeris <[email protected]> Date: Fri, 7 Mar 2014 20:55:21 +0100 Subject: [PATCH 3/6] sms_test: Introduce tests for SMS Validity time relative and absolute formats. This tests demonstrate issues with the current code. --- tests/sms/sms_test.c | 130 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/sms/sms_test.ok | 82 +++++++++++++++++++++++++++++++ tests/testsuite.at | 2 +- 3 files changed, 213 insertions(+), 1 deletion(-) diff --git a/tests/sms/sms_test.c b/tests/sms/sms_test.c index 30ce1f4..f664ebc 100644 --- a/tests/sms/sms_test.c +++ b/tests/sms/sms_test.c @@ -1,6 +1,7 @@ /* * (C) 2008 by Daniel Willmann <[email protected]> * (C) 2010 by Nico Golde <[email protected]> + * (C) 2014 by Alexander Chemeris <[email protected]> * All Rights Reserved * * This program is free software; you can redistribute it and/or modify @@ -24,6 +25,7 @@ #include <string.h> #include <osmocom/gsm/protocol/gsm_03_40.h> +#include <osmocom/gsm/protocol/gsm_04_11.h> #include <osmocom/gsm/gsm_utils.h> #include <osmocom/gsm/gsm0411_utils.h> @@ -268,6 +270,133 @@ static void test_gen_oa(void) printf("Result: len(%d) data(%s)\n", len, osmo_hexdump(oa, len)); } +#define PRINT_VALIDITY_TIMES(expected, decoded) \ +{ \ + char _validity_timestamp[1024]; \ + time_t _temp_time; \ + _temp_time = (expected); \ + strftime(_validity_timestamp, sizeof(_validity_timestamp), \ + "%F %T", gmtime(&_temp_time)); \ + printf("Expected: %s\n", _validity_timestamp); \ + _temp_time = (decoded); \ + strftime(_validity_timestamp, sizeof(_validity_timestamp), \ + "%F %T", gmtime(&_temp_time)); \ + printf("Decoded: %s\n", _validity_timestamp); \ +} \ + +#define TEST_VALIDITY_DECODING(test_data, encoding) \ +{ \ + int i; \ + time_t valid_until; \ + for (i=0; i<ARRAY_SIZE(test_data); i++) \ + { \ + valid_until = gsm340_validity_time((test_data)[i].now, \ + (encoding), (test_data)[i].vp); \ + PRINT_VALIDITY_TIMES((test_data)[i].decoded, valid_until); \ + OSMO_ASSERT(valid_until == (test_data)[i].decoded); \ + } \ +} + +static void test_validity_period(void) +{ + time_t valid_until; \ + time_t vp_rel_default = SMS_DEFAULT_VALIDITY_PERIOD; + + /* Relative data */ + struct { + uint8_t vp[1]; + time_t now; + time_t decoded; + } vp_rel_test[] = { + {{5}, 0, (5 + 1) * 5 * 60}, + {{150}, 0, (12*60 + (150-143) * 30) * 60}, + {{180}, 0, ((180 - 166) * 60 * 24) * 60}, + {{250}, 0, ((250 - 192) * 60 * 24 * 7) * 60}, + /* Non-zero 'now' value should accordingly shift the decoded value */ + {{5}, 100, 100 + (5 + 1) * 5 * 60}, + {{150}, 100, 100 + (12*60 + (150-143) * 30) * 60}, + {{180}, 100, 100 + ((180 - 166) * 60 * 24) * 60}, + {{250}, 100, 100 + ((250 - 192) * 60 * 24 * 7) * 60}, + }; + + /* Absolute data */ + struct { + uint8_t vp[8]; + time_t now; + time_t decoded; + } vp_abs_test[] = { + /* 2013-05-15 12:24:36 UTC+0 + * Basic check - no timezone offset, summer time, year after 2000 */ + {{0x31, 0x50, 0x51, 0x21, 0x42, 0x63, 0x00|0x0, 0x0}, 0, 1368620676}, + /* 1984-05-15 12:24:36 UTC+0 + * Test year before 2000 */ + {{0x48, 0x50, 0x51, 0x21, 0x42, 0x63, 0x00|0x0, 0x0}, 0, 453471876}, + /* 2013-05-15 12:24:36 UTC+4 + * Test positive timezone offset*/ + {{0x31, 0x50, 0x51, 0x21, 0x42, 0x63, 0x00|0x61, 0x0}, 0, 1368606276}, + /* 2013-12-24 12:24:36 UTC + * Test winter time */ + {{0x31, 0x21, 0x42, 0x21, 0x42, 0x63, 0x00|0x0, 0x0}, 0, 1387887876}, + /* 2013-05-15 12:24:36 UTC-4 + * Test negative timezone offset */ + {{0x31, 0x50, 0x51, 0x21, 0x42, 0x63, 0x80|0x61, 0x0}, 0, 1368635076}, + /* Adding current time should not change returned value, as it's absolute */ + {{0x31, 0x50, 0x51, 0x21, 0x42, 0x63, 0x00|0x0, 0x0}, 1000, 1368620676}, + {{0x48, 0x50, 0x51, 0x21, 0x42, 0x63, 0x00|0x0, 0x0}, 1000, 453471876}, + {{0x31, 0x50, 0x51, 0x21, 0x42, 0x63, 0x00|0x61, 0x0}, 1000, 1368606276}, + {{0x31, 0x21, 0x42, 0x21, 0x42, 0x63, 0x00|0x0, 0x0}, 1000, 1387887876}, + {{0x31, 0x50, 0x51, 0x21, 0x42, 0x63, 0x80|0x61, 0x0}, 1000, 1368635076} + }; + + /* Enhanced data */ + struct { + uint8_t vp[5]; + time_t now; + time_t decoded; + } vp_enh_test[] = { + /* No Validity Period specified, no extension */ + {{0x00, 0x00, 0x00, 0x00, 0x00}, 0, SMS_DEFAULT_VALIDITY_PERIOD}, + /* Relative case, no extension */ + {{0x01, 5, 0x00, 0x00, 0x00}, 0, (5 + 1) * 5 * 60}, + {{0x01, 150, 0x00, 0x00, 0x00}, 0, (12*60 + (150-143) * 30) * 60}, + {{0x01, 180, 0x00, 0x00, 0x00}, 0, ((180 - 166) * 60 * 24) * 60}, + {{0x01, 250, 0x00, 0x00, 0x00}, 0, ((250 - 192) * 60 * 24 * 7) * 60}, + /* Relative case, with extension */ + {{0x81, 0x00, 5, 0x00, 0x00}, 0, (5 + 1) * 5 * 60}, + /* Relative integer case, no extension */ + {{0x02, 123, 0x00, 0x00, 0x00}, 0, 123}, + /* Relative semioctet case, no extension + * 2:15:23 */ + {{0x03, 0x20, 0x51, 0x32, 0x00}, 0, (2*60 + 15) * 60 + 23}, + /* Unknown functionality indicator */ + {{0x04, 0x00, 0x00, 0x00, 0x00}, 0, SMS_DEFAULT_VALIDITY_PERIOD}, + /* Non-zero 'now' value should accordingly shift the decoded value */ + {{0x00, 0x00, 0x00, 0x00, 0x00}, 1000, 1000 + SMS_DEFAULT_VALIDITY_PERIOD}, + {{0x01, 5, 0x00, 0x00, 0x00}, 1000, 1000 + (5 + 1) * 5 * 60}, + {{0x01, 150, 0x00, 0x00, 0x00}, 1000, 1000 + (12*60 + (150-143) * 30) * 60}, + {{0x01, 180, 0x00, 0x00, 0x00}, 1000, 1000 + ((180 - 166) * 60 * 24) * 60}, + {{0x01, 250, 0x00, 0x00, 0x00}, 1000, 1000 + ((250 - 192) * 60 * 24 * 7) * 60}, + {{0x81, 0x00, 5, 0x00, 0x00}, 1000, 1000 + (5 + 1) * 5 * 60}, + {{0x02, 123, 0x00, 0x00, 0x00}, 1000, 1000 + 123}, + {{0x03, 0x20, 0x51, 0x32, 0x00}, 1000, 1000 + (2*60 + 15) * 60 + 23}, + {{0x04, 0x00, 0x00, 0x00, 0x00}, 1000, 1000 + SMS_DEFAULT_VALIDITY_PERIOD}, + }; + + printf("\nTesting default validity time\n"); + valid_until = gsm340_validity_time(0, GSM340_TP_VPF_NONE, NULL); + PRINT_VALIDITY_TIMES(vp_rel_default, valid_until); + OSMO_ASSERT(valid_until == SMS_DEFAULT_VALIDITY_PERIOD); + + printf("\nTesting relative validity time\n"); + TEST_VALIDITY_DECODING(vp_rel_test, GSM340_TP_VPF_RELATIVE); + + printf("\nTesting absolute validity time\n"); + TEST_VALIDITY_DECODING(vp_abs_test, GSM340_TP_VPF_ABSOLUTE); + + printf("\nTesting enhanced validity time\n"); + TEST_VALIDITY_DECODING(vp_enh_test, GSM340_TP_VPF_ENHANCED); +} + int main(int argc, char** argv) { printf("SMS testing\n"); @@ -414,6 +543,7 @@ int main(int argc, char** argv) test_octet_return(); test_gen_oa(); + test_validity_period(); printf("OK\n"); return 0; diff --git a/tests/sms/sms_test.ok b/tests/sms/sms_test.ok index fa536ea..5ff3e0b 100644 --- a/tests/sms/sms_test.ok +++ b/tests/sms/sms_test.ok @@ -26,4 +26,86 @@ Result: len(12) data(14 a1 21 43 65 87 09 21 43 65 87 19 ) Result: len(2) data(00 91 ) Result: len(9) data(0e d0 4f 78 d9 2d 9c 0e 01 ) Result: len(12) data(14 d0 4f 78 d9 2d 9c 0e c3 e2 31 19 ) + +Testing default validity time +Expected: 1970-01-03 00:00:00 +Decoded: 1970-01-03 00:00:00 + +Testing relative validity time +Expected: 1970-01-01 00:30:00 +Decoded: 1970-01-01 00:30:00 +Expected: 1970-01-01 15:30:00 +Decoded: 1970-01-01 15:30:00 +Expected: 1970-01-15 00:00:00 +Decoded: 1970-01-15 00:00:00 +Expected: 1971-02-11 00:00:00 +Decoded: 1971-02-11 00:00:00 +Expected: 1970-01-01 00:31:40 +Decoded: 1970-01-01 00:31:40 +Expected: 1970-01-01 15:31:40 +Decoded: 1970-01-01 15:31:40 +Expected: 1970-01-15 00:01:40 +Decoded: 1970-01-15 00:01:40 +Expected: 1971-02-11 00:01:40 +Decoded: 1971-02-11 00:01:40 + +Testing absolute validity time +Expected: 2013-05-15 12:24:36 +Decoded: 2013-05-15 12:24:36 +Expected: 1984-05-15 12:24:36 +Decoded: 1984-05-15 12:24:36 +Expected: 2013-05-15 08:24:36 +Decoded: 2013-05-15 08:24:36 +Expected: 2013-12-24 12:24:36 +Decoded: 2013-12-24 12:24:36 +Expected: 2013-05-15 16:24:36 +Decoded: 2013-05-15 16:24:36 +Expected: 2013-05-15 12:24:36 +Decoded: 2013-05-15 12:24:36 +Expected: 1984-05-15 12:24:36 +Decoded: 1984-05-15 12:24:36 +Expected: 2013-05-15 08:24:36 +Decoded: 2013-05-15 08:24:36 +Expected: 2013-12-24 12:24:36 +Decoded: 2013-12-24 12:24:36 +Expected: 2013-05-15 16:24:36 +Decoded: 2013-05-15 16:24:36 + +Testing enhanced validity time +Expected: 1970-01-03 00:00:00 +Decoded: 1970-01-03 00:00:00 +Expected: 1970-01-01 00:30:00 +Decoded: 1970-01-01 00:30:00 +Expected: 1970-01-01 15:30:00 +Decoded: 1970-01-01 15:30:00 +Expected: 1970-01-15 00:00:00 +Decoded: 1970-01-15 00:00:00 +Expected: 1971-02-11 00:00:00 +Decoded: 1971-02-11 00:00:00 +Expected: 1970-01-01 00:30:00 +Decoded: 1970-01-01 00:30:00 +Expected: 1970-01-01 00:02:03 +Decoded: 1970-01-01 00:02:03 +Expected: 1970-01-01 02:15:23 +Decoded: 1970-01-01 02:15:23 +Expected: 1970-01-03 00:00:00 +Decoded: 1970-01-03 00:00:00 +Expected: 1970-01-03 00:16:40 +Decoded: 1970-01-03 00:16:40 +Expected: 1970-01-01 00:46:40 +Decoded: 1970-01-01 00:46:40 +Expected: 1970-01-01 15:46:40 +Decoded: 1970-01-01 15:46:40 +Expected: 1970-01-15 00:16:40 +Decoded: 1970-01-15 00:16:40 +Expected: 1971-02-11 00:16:40 +Decoded: 1971-02-11 00:16:40 +Expected: 1970-01-01 00:46:40 +Decoded: 1970-01-01 00:46:40 +Expected: 1970-01-01 00:18:43 +Decoded: 1970-01-01 00:18:43 +Expected: 1970-01-01 02:32:03 +Decoded: 1970-01-01 02:32:03 +Expected: 1970-01-03 00:16:40 +Decoded: 1970-01-03 00:16:40 OK diff --git a/tests/testsuite.at b/tests/testsuite.at index 9124f25..d323d7d 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -33,7 +33,7 @@ endif AT_SETUP([sms]) AT_KEYWORDS([sms]) cat $abs_srcdir/sms/sms_test.ok > expout -AT_CHECK([$abs_top_builddir/tests/sms/sms_test], [0], [expout]) +AT_CHECK([$abs_top_builddir/tests/sms/sms_test], [0], [expout], [ignore]) AT_CLEANUP AT_SETUP([smscb]) -- 1.7.9.5
