<p>Vadim Yanitskiy has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/13629">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Introduce initial unit test for db_sms_* API<br><br>Since OsmoMSC has built-in SMSC, it needs to store the messages<br>somewhere. Currently we use libdbi and SQLite3 back-end for that.<br><br>For a long time, the db_sms_* API remained uncovered by unit tests.<br>This change aims to fix that, and does cover the following:<br><br>  - db_sms_store(),<br>  - db_sms_get(),<br><br>  - db_sms_get_next_unsent(),<br>  - db_sms_mark_delivered(),<br><br>  - db_sms_delete_sent_message_by_id(),<br>  - db_sms_delete_by_msisdn(),<br>  - db_sms_delete_oldest_expired_message().<br><br>Due to performance reasons, the test database is initialized in<br>RAM using the magic filename ':memory:'. This is a feature of<br>SQLite3 (and not libdbi), see:<br><br>  https://www.sqlite.org/inmemorydb.html<br><br>Of course, this unit test helped to discover some problems:<br><br>  1) Storing an SMS with empty TP-User-Data (TP-UDL=0) causes<br>     buffer overruns in both db_sms_store() and db_sms_get().<br><br>  2) TP-User-Data-Length is always being interpreted in octets,<br>     regardless of DCS (Data Coding Scheme). This results in<br>     storing garbage in the database if the default 7-bit<br>     encoding is used. Fortunately, the 'user_data' buffer<br>     in structure 'gsm_sms' is large emough, so we don't<br>     experience buffer overruns.<br><br>  3) db_sms_delete_oldest_expired_message() doesn't work<br>     as expected. Instead of removing the *oldest* expired<br>     message, it tries to remove the *newest* one.<br><br>The current test expectations do reflect these problems.<br>All of them will be fixed in the follow-up patches.<br><br>Change-Id: Id94ad35b6f78f839137db2e17010fbf9b40111a3<br>---<br>M configure.ac<br>M src/libmsc/db.c<br>M tests/Makefile.am<br>A tests/db_sms/Makefile.am<br>A tests/db_sms/db_sms_test.c<br>A tests/db_sms/db_sms_test.err<br>A tests/db_sms/db_sms_test.ok<br>M tests/testsuite.at<br>8 files changed, 724 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/29/13629/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/configure.ac b/configure.ac</span><br><span>index f8787cf..15e6e07 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -268,6 +268,7 @@</span><br><span>     tests/Makefile</span><br><span>     tests/atlocal</span><br><span>     tests/smpp/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+    tests/db_sms/Makefile</span><br><span>     tests/sms_queue/Makefile</span><br><span>     tests/msc_vlr/Makefile</span><br><span>     doc/Makefile</span><br><span>diff --git a/src/libmsc/db.c b/src/libmsc/db.c</span><br><span>index 0384320..423787b 100644</span><br><span>--- a/src/libmsc/db.c</span><br><span>+++ b/src/libmsc/db.c</span><br><span>@@ -769,7 +769,10 @@</span><br><span>     daddr = dbi_result_get_string(result, "dest_addr");</span><br><span>        if (daddr)</span><br><span>           OSMO_STRLCPY_ARRAY(sms->dst.addr, daddr);</span><br><span style="color: hsl(0, 100%, 40%);">-    sms->receiver = vlr_subscr_find_by_msisdn(net->vlr, sms->dst.addr, VSUB_USE_SMS_RECEIVER);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (net != NULL) /* db_sms_test passes NULL, so we need to be tolerant */</span><br><span style="color: hsl(120, 100%, 40%);">+             sms->receiver = vlr_subscr_find_by_msisdn(net->vlr, sms->dst.addr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     VSUB_USE_SMS_RECEIVER);</span><br><span> </span><br><span>        sms->src.npi = dbi_result_get_ulonglong(result, "src_npi");</span><br><span>     sms->src.ton = dbi_result_get_ulonglong(result, "src_ton");</span><br><span>diff --git a/tests/Makefile.am b/tests/Makefile.am</span><br><span>index dc5194c..9f758f1 100644</span><br><span>--- a/tests/Makefile.am</span><br><span>+++ b/tests/Makefile.am</span><br><span>@@ -1,6 +1,7 @@</span><br><span> SUBDIRS = \</span><br><span>   sms_queue \</span><br><span>  msc_vlr \</span><br><span style="color: hsl(120, 100%, 40%);">+     db_sms \</span><br><span>     $(NULL)</span><br><span> </span><br><span> if BUILD_SMPP</span><br><span>diff --git a/tests/db_sms/Makefile.am b/tests/db_sms/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..5e1f48b</span><br><span>--- /dev/null</span><br><span>+++ b/tests/db_sms/Makefile.am</span><br><span>@@ -0,0 +1,48 @@</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CPPFLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(all_includes) \</span><br><span style="color: hsl(120, 100%, 40%);">+     -I$(top_srcdir)/include \</span><br><span style="color: hsl(120, 100%, 40%);">+     $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CFLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+      -Wall \</span><br><span style="color: hsl(120, 100%, 40%);">+       -ggdb3 \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(LIBOSMOCORE_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+       $(LIBOSMOGSM_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+        $(LIBOSMOVTY_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+        $(LIBOSMOABIS_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+       $(LIBOSMOSIGTRAN_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+    $(LIBOSMORANAP_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(LIBASN1C_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(LIBOSMOMGCPCLIENT_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOGSUPCLIENT_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+EXTRA_DIST = \</span><br><span style="color: hsl(120, 100%, 40%);">+     db_sms_test.ok \</span><br><span style="color: hsl(120, 100%, 40%);">+      db_sms_test.err \</span><br><span style="color: hsl(120, 100%, 40%);">+     $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+noinst_PROGRAMS = \</span><br><span style="color: hsl(120, 100%, 40%);">+        db_sms_test \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_sms_test_SOURCES = \</span><br><span style="color: hsl(120, 100%, 40%);">+    db_sms_test.c \</span><br><span style="color: hsl(120, 100%, 40%);">+       $(NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db_sms_test_LDADD = \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(top_builddir)/src/libmsc/libmsc.a \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/libvlr/libvlr.a \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBSMPP34_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+   $(LIBOSMOCORE_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOGSM_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(LIBOSMOVTY_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(LIBOSMOABIS_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOSIGTRAN_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(LIBOSMORANAP_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+        $(LIBOSMOMGCPCLIENT_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+   $(LIBOSMOGSUPCLIENT_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+   $(LIBRARY_GSM) \</span><br><span style="color: hsl(120, 100%, 40%);">+      -ldbi \</span><br><span style="color: hsl(120, 100%, 40%);">+       -lrt \</span><br><span style="color: hsl(120, 100%, 40%);">+        $(NULL)</span><br><span>diff --git a/tests/db_sms/db_sms_test.c b/tests/db_sms/db_sms_test.c</span><br><span>new file mode 100644</span><br><span>index 0000000..e78bb53</span><br><span>--- /dev/null</span><br><span>+++ b/tests/db_sms/db_sms_test.c</span><br><span>@@ -0,0 +1,593 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Test the storage API of the internal SMS Centre.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2019 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <inttypes.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdbool.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/application.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/protocol/gsm_03_40.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/msc/gsm_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/msc/debug.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/msc/vlr.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/msc/db.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Talloc context of this unit test */</span><br><span style="color: hsl(120, 100%, 40%);">+static void *talloc_ctx = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct sms_tp_ud {</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Data Coding Scheme */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t dcs;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* TP User-Data-Length (depends on DCS) */</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t length;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Static TP User-Data filler (0 means disabled) */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t filler_byte;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* TP User-Data */</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t data[GSM340_UDL_OCT_MAX];</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Decoded text (for 7-bit default alphabet only) */</span><br><span style="color: hsl(120, 100%, 40%);">+  char dec_text[GSM340_UDL_SPT_MAX + 1];</span><br><span style="color: hsl(120, 100%, 40%);">+} sms_tp_ud_set[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+             .dcs = 0x00, /* Default GSM 7-bit alphabet */</span><br><span style="color: hsl(120, 100%, 40%);">+         .length = 9, /* in septets */</span><br><span style="color: hsl(120, 100%, 40%);">+         .dec_text = "Mahlzeit!",</span><br><span style="color: hsl(120, 100%, 40%);">+            .data = {</span><br><span style="color: hsl(120, 100%, 40%);">+                     0xcd, 0x30, 0x9a, 0xad, 0x2f, 0xa7, 0xe9, 0x21,</span><br><span style="color: hsl(120, 100%, 40%);">+               },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .dcs = 0x08, /* UCS-2 (16-bit) / UTF-16 */</span><br><span style="color: hsl(120, 100%, 40%);">+            .length = 120, /* in octets */</span><br><span style="color: hsl(120, 100%, 40%);">+                .data = {</span><br><span style="color: hsl(120, 100%, 40%);">+                     0x04, 0x23, 0x04, 0x32, 0x04, 0x30, 0x04, 0x36,</span><br><span style="color: hsl(120, 100%, 40%);">+                       0x04, 0x30, 0x04, 0x35, 0x04, 0x3c, 0x04, 0x4b,</span><br><span style="color: hsl(120, 100%, 40%);">+                       0x04, 0x39, 0x00, 0x20, 0x04, 0x3a, 0x04, 0x3b,</span><br><span style="color: hsl(120, 100%, 40%);">+                       0x04, 0x38, 0x04, 0x35, 0x04, 0x3d, 0x04, 0x42,</span><br><span style="color: hsl(120, 100%, 40%);">+                       0x00, 0x21, 0x00, 0x20, 0x04, 0x1d, 0x04, 0x30,</span><br><span style="color: hsl(120, 100%, 40%);">+                       0x04, 0x41, 0x04, 0x42, 0x04, 0x40, 0x04, 0x3e,</span><br><span style="color: hsl(120, 100%, 40%);">+                       0x04, 0x39, 0x04, 0x3a, 0x04, 0x38, 0x00, 0x20,</span><br><span style="color: hsl(120, 100%, 40%);">+                       0x00, 0x49, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65,</span><br><span style="color: hsl(120, 100%, 40%);">+                       0x00, 0x72, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x74,</span><br><span style="color: hsl(120, 100%, 40%);">+                       0x00, 0x20, 0x04, 0x38, 0x00, 0x20, 0x00, 0x4d,</span><br><span style="color: hsl(120, 100%, 40%);">+                       0x00, 0x4d, 0x00, 0x53, 0x00, 0x20, 0x04, 0x31,</span><br><span style="color: hsl(120, 100%, 40%);">+                       0x04, 0x43, 0x04, 0x34, 0x04, 0x43, 0x04, 0x42,</span><br><span style="color: hsl(120, 100%, 40%);">+                       0x00, 0x20, 0x04, 0x34, 0x04, 0x3e, 0x04, 0x41,</span><br><span style="color: hsl(120, 100%, 40%);">+                       0x04, 0x42, 0x04, 0x30, 0x04, 0x32, 0x04, 0x3b,</span><br><span style="color: hsl(120, 100%, 40%);">+                       0x04, 0x35, 0x04, 0x3d, 0x04, 0x4b, 0x00, 0x2e,</span><br><span style="color: hsl(120, 100%, 40%);">+               },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .dcs = 0x04, /* 8-bit data */</span><br><span style="color: hsl(120, 100%, 40%);">+         .length = 12, /* in octets */</span><br><span style="color: hsl(120, 100%, 40%);">+         .data = {</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* User-Data-Header */</span><br><span style="color: hsl(120, 100%, 40%);">+                        0x1e, /* Buffer-overflow! (should be 0x05) */</span><br><span style="color: hsl(120, 100%, 40%);">+                 /* Concatenated SM, 8-bit reference number */</span><br><span style="color: hsl(120, 100%, 40%);">+                 0x00, 0x03, 0x5a, 0x05, 0x01,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* Dummy payload... */</span><br><span style="color: hsl(120, 100%, 40%);">+                        0x05, 0x04, 0x0b, 0x84, 0x0b, 0x84,</span><br><span style="color: hsl(120, 100%, 40%);">+           },</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .dcs = 0x00, /* Default GSM 7-bit alphabet */</span><br><span style="color: hsl(120, 100%, 40%);">+         .length = 160, /* maximum, in septets */</span><br><span style="color: hsl(120, 100%, 40%);">+              .filler_byte = 0x41,</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .dcs = 0x04, /* 8-bit data */</span><br><span style="color: hsl(120, 100%, 40%);">+         .length = 140, /* maximum, in octets */</span><br><span style="color: hsl(120, 100%, 40%);">+               .filler_byte = 0x42,</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .dcs = 0x00, /* Default GSM 7-bit alphabet */</span><br><span style="color: hsl(120, 100%, 40%);">+         .length = 200, /* invalid, buffer overflow */</span><br><span style="color: hsl(120, 100%, 40%);">+         .filler_byte = 0x41,</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .dcs = 0x04, /* 8-bit data */</span><br><span style="color: hsl(120, 100%, 40%);">+         .length = 0xff, /* invalid, buffer overflow */</span><br><span style="color: hsl(120, 100%, 40%);">+                .filler_byte = 0x42,</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define SMS_ADDR(addr) \</span><br><span style="color: hsl(120, 100%, 40%);">+    { 0x00, 0x00, addr }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct sms_test {</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Human-readable name of particular test message */</span><br><span style="color: hsl(120, 100%, 40%);">+  const char *name;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Whether we expect db_sms_store() to fail */</span><br><span style="color: hsl(120, 100%, 40%);">+        bool exp_db_sms_store_fail;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Whether we expect db_sms_get() to fail */</span><br><span style="color: hsl(120, 100%, 40%);">+  bool exp_db_sms_get_fail;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* SM TP-User-Data from sms_tp_ud_set[] */</span><br><span style="color: hsl(120, 100%, 40%);">+    const struct sms_tp_ud *ud;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* The message itself */</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_sms sms;</span><br><span style="color: hsl(120, 100%, 40%);">+} sms_test_set[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+     {</span><br><span style="color: hsl(120, 100%, 40%);">+             .name = "Regular MO SMS",</span><br><span style="color: hsl(120, 100%, 40%);">+           .sms = {</span><br><span style="color: hsl(120, 100%, 40%);">+                      .msg_ref = 0xde,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .src = SMS_ADDR("123456"),</span><br><span style="color: hsl(120, 100%, 40%);">+                  .dst = SMS_ADDR("654321"),</span><br><span style="color: hsl(120, 100%, 40%);">+                  .validity_minutes = 10,</span><br><span style="color: hsl(120, 100%, 40%);">+                       .protocol_id = 0x00,</span><br><span style="color: hsl(120, 100%, 40%);">+                  /* SM TP-User-Data is taken from sms_tp_ud_set[] */</span><br><span style="color: hsl(120, 100%, 40%);">+           },</span><br><span style="color: hsl(120, 100%, 40%);">+            .ud = &sms_tp_ud_set[0],</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .name = "Regular MT SMS",</span><br><span style="color: hsl(120, 100%, 40%);">+           .sms = {</span><br><span style="color: hsl(120, 100%, 40%);">+                      .msg_ref = 0xbe,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .src = SMS_ADDR("654321"),</span><br><span style="color: hsl(120, 100%, 40%);">+                  .dst = SMS_ADDR("123456"),</span><br><span style="color: hsl(120, 100%, 40%);">+                  .validity_minutes = 180,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .protocol_id = 0x00,</span><br><span style="color: hsl(120, 100%, 40%);">+                  /* SM TP-User-Data is taken from sms_tp_ud_set[] */</span><br><span style="color: hsl(120, 100%, 40%);">+           },</span><br><span style="color: hsl(120, 100%, 40%);">+            .ud = &sms_tp_ud_set[1],</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .name = "Complete TP-UD (160 septets, 7-bit encoding)",</span><br><span style="color: hsl(120, 100%, 40%);">+             .sms = {</span><br><span style="color: hsl(120, 100%, 40%);">+                      .msg_ref = 0xee,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .src = SMS_ADDR("266753837248772"),</span><br><span style="color: hsl(120, 100%, 40%);">+                 .dst = SMS_ADDR("266753837248378"),</span><br><span style="color: hsl(120, 100%, 40%);">+                 .validity_minutes = 360,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .protocol_id = 0x00,</span><br><span style="color: hsl(120, 100%, 40%);">+                  /* SM TP-User-Data is taken from sms_tp_ud_set[] */</span><br><span style="color: hsl(120, 100%, 40%);">+           },</span><br><span style="color: hsl(120, 100%, 40%);">+            .ud = &sms_tp_ud_set[3],</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .name = "Complete TP-UD (140 octets, 8-bit encoding)",</span><br><span style="color: hsl(120, 100%, 40%);">+              .sms = {</span><br><span style="color: hsl(120, 100%, 40%);">+                      .msg_ref = 0xee,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .src = SMS_ADDR("266753838248772"),</span><br><span style="color: hsl(120, 100%, 40%);">+                 .dst = SMS_ADDR("266753838248378"),</span><br><span style="color: hsl(120, 100%, 40%);">+                 .validity_minutes = 360,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .protocol_id = 0xaa,</span><br><span style="color: hsl(120, 100%, 40%);">+                  /* SM TP-User-Data is taken from sms_tp_ud_set[] */</span><br><span style="color: hsl(120, 100%, 40%);">+           },</span><br><span style="color: hsl(120, 100%, 40%);">+            .ud = &sms_tp_ud_set[4],</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .name = "TP-UD buffer overflow (UDH-Length > UD-Length)",</span><br><span style="color: hsl(120, 100%, 40%);">+                .sms = {</span><br><span style="color: hsl(120, 100%, 40%);">+                      .msg_ref = 0x88,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .src = SMS_ADDR("834568373569772"),</span><br><span style="color: hsl(120, 100%, 40%);">+                 .dst = SMS_ADDR("834568373569378"),</span><br><span style="color: hsl(120, 100%, 40%);">+                 .validity_minutes = 200,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .protocol_id = 0xbb,</span><br><span style="color: hsl(120, 100%, 40%);">+                  .ud_hdr_ind = 0x01,</span><br><span style="color: hsl(120, 100%, 40%);">+                   /* SM TP-User-Data is taken from sms_tp_ud_set[] */</span><br><span style="color: hsl(120, 100%, 40%);">+           },</span><br><span style="color: hsl(120, 100%, 40%);">+            .ud = &sms_tp_ud_set[2],</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .name = "Truncated TP-UD (200 septets, 7-bit encoding)",</span><br><span style="color: hsl(120, 100%, 40%);">+            .sms = {</span><br><span style="color: hsl(120, 100%, 40%);">+                      .msg_ref = 0xee,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .src = { 0x01, 0x00, "8786228337248772" },</span><br><span style="color: hsl(120, 100%, 40%);">+                  .dst = { 0x00, 0x01, "8786228337248378" },</span><br><span style="color: hsl(120, 100%, 40%);">+                  .validity_minutes = 360,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .protocol_id = 0xcc,</span><br><span style="color: hsl(120, 100%, 40%);">+                  /* SM TP-User-Data is taken from sms_tp_ud_set[] */</span><br><span style="color: hsl(120, 100%, 40%);">+           },</span><br><span style="color: hsl(120, 100%, 40%);">+            .ud = &sms_tp_ud_set[5],</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .name = "Truncated TP-UD (255 octets, 8-bit encoding)",</span><br><span style="color: hsl(120, 100%, 40%);">+             .sms = {</span><br><span style="color: hsl(120, 100%, 40%);">+                      .msg_ref = 0xee,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .src = { 0x01, 0x01, "8786228338248772" },</span><br><span style="color: hsl(120, 100%, 40%);">+                  .dst = { 0xaa, 0xff, "8786228338248378" },</span><br><span style="color: hsl(120, 100%, 40%);">+                  .validity_minutes = 360,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .protocol_id = 0xbb,</span><br><span style="color: hsl(120, 100%, 40%);">+                  /* SM TP-User-Data is taken from sms_tp_ud_set[] */</span><br><span style="color: hsl(120, 100%, 40%);">+           },</span><br><span style="color: hsl(120, 100%, 40%);">+            .ud = &sms_tp_ud_set[6],</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .name = "Same MSISDN #1",</span><br><span style="color: hsl(120, 100%, 40%);">+           .sms = {</span><br><span style="color: hsl(120, 100%, 40%);">+                      .msg_ref = 0x11,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .src = SMS_ADDR("72631"),</span><br><span style="color: hsl(120, 100%, 40%);">+                   .dst = SMS_ADDR("72632"),</span><br><span style="color: hsl(120, 100%, 40%);">+                   .validity_minutes = 10,</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* SM TP-User-Data is taken from sms_tp_ud_set[] */</span><br><span style="color: hsl(120, 100%, 40%);">+           },</span><br><span style="color: hsl(120, 100%, 40%);">+            .ud = &sms_tp_ud_set[0],</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .name = "Same MSISDN #2",</span><br><span style="color: hsl(120, 100%, 40%);">+           .sms = {</span><br><span style="color: hsl(120, 100%, 40%);">+                      .msg_ref = 0x12,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .src = SMS_ADDR("72632"),</span><br><span style="color: hsl(120, 100%, 40%);">+                   .dst = SMS_ADDR("72631"),</span><br><span style="color: hsl(120, 100%, 40%);">+                   .validity_minutes = 10,</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* SM TP-User-Data is taken from sms_tp_ud_set[] */</span><br><span style="color: hsl(120, 100%, 40%);">+           },</span><br><span style="color: hsl(120, 100%, 40%);">+            .ud = &sms_tp_ud_set[0],</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .name = "Expired SMS",</span><br><span style="color: hsl(120, 100%, 40%);">+              .sms = {</span><br><span style="color: hsl(120, 100%, 40%);">+                      .msg_ref = 0xde,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .src = SMS_ADDR("3974733772"),</span><br><span style="color: hsl(120, 100%, 40%);">+                      .dst = SMS_ADDR("3974733378"),</span><br><span style="color: hsl(120, 100%, 40%);">+                      .validity_minutes = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                        /* SM TP-User-Data is taken from sms_tp_ud_set[] */</span><br><span style="color: hsl(120, 100%, 40%);">+           },</span><br><span style="color: hsl(120, 100%, 40%);">+            .ud = &sms_tp_ud_set[0],</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+#if 0</span><br><span style="color: hsl(120, 100%, 40%);">+     /* FIXME: there is a bug that causes ASAN / Valgrind to complain */</span><br><span style="color: hsl(120, 100%, 40%);">+   {</span><br><span style="color: hsl(120, 100%, 40%);">+             .name = "Empty TP-UD",</span><br><span style="color: hsl(120, 100%, 40%);">+              .sms = {</span><br><span style="color: hsl(120, 100%, 40%);">+                      .msg_ref = 0x38,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .src = SMS_ADDR("3678983772"),</span><br><span style="color: hsl(120, 100%, 40%);">+                      .dst = SMS_ADDR("3678983378"),</span><br><span style="color: hsl(120, 100%, 40%);">+                      .validity_minutes = 450,</span><br><span style="color: hsl(120, 100%, 40%);">+                      .is_report = true,</span><br><span style="color: hsl(120, 100%, 40%);">+                    .reply_path_req = 0x01,</span><br><span style="color: hsl(120, 100%, 40%);">+                       .status_rep_req = 0x01,</span><br><span style="color: hsl(120, 100%, 40%);">+                       .protocol_id = 0x55,</span><br><span style="color: hsl(120, 100%, 40%);">+                  .data_coding_scheme = 0x08,</span><br><span style="color: hsl(120, 100%, 40%);">+                   .ud_hdr_ind = 0x00,</span><br><span style="color: hsl(120, 100%, 40%);">+                   .user_data_len = 0x00,</span><br><span style="color: hsl(120, 100%, 40%);">+                        /* No TP-User-Data */</span><br><span style="color: hsl(120, 100%, 40%);">+         },</span><br><span style="color: hsl(120, 100%, 40%);">+            .ud = NULL,</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void prepare_sms_test_set(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      for (i = 0; i < ARRAY_SIZE(sms_test_set); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+           struct sms_test *test = sms_test_set + i;</span><br><span style="color: hsl(120, 100%, 40%);">+             const struct sms_tp_ud *ud = test->ud;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* ID auto-increment */</span><br><span style="color: hsl(120, 100%, 40%);">+               test->sms.id = i + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (ud == NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+                       continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           test->sms.data_coding_scheme = ud->dcs;</span><br><span style="color: hsl(120, 100%, 40%);">+         test->sms.user_data_len = ud->length;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         if (ud->filler_byte) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     memset(test->sms.user_data, ud->filler_byte,</span><br><span style="color: hsl(120, 100%, 40%);">+                           sizeof(test->sms.user_data));</span><br><span style="color: hsl(120, 100%, 40%);">+               } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      memcpy(test->sms.user_data, ud->data, sizeof(ud->data));</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (ud->dec_text[0] != '\0')</span><br><span style="color: hsl(120, 100%, 40%);">+                               strcpy(test->sms.text, ud->dec_text);</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_db_sms_store(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        int rc, i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  LOGP(DDB, LOGL_INFO, "Testing db_sms_store()...\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Store test SMS messages */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < ARRAY_SIZE(sms_test_set); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+           struct sms_test *test = &sms_test_set[i];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGP(DDB, LOGL_NOTICE, "%s('%s'): ", __func__, test->name);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            rc = db_sms_store(&test->sms);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (!test->exp_db_sms_store_fail && rc == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                       LOGPC(DDB, LOGL_INFO, "success, as expected\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            else if (test->exp_db_sms_store_fail && rc != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                   LOGPC(DDB, LOGL_INFO, "failure, as expected\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            else</span><br><span style="color: hsl(120, 100%, 40%);">+                  LOGPC(DDB, LOGL_ERROR, "unexpected rc=%d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int verify_sms(const struct sms_test *test, const struct gsm_sms *sms)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGP(DDB, LOGL_NOTICE, "%s('%s'): ", __func__, test->name);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define MATCH_SMS_ADDR(ADDR) \</span><br><span style="color: hsl(120, 100%, 40%);">+    if (strcmp(sms->ADDR.addr, test->sms.ADDR.addr) \</span><br><span style="color: hsl(120, 100%, 40%);">+           || sms->ADDR.npi != test->sms.ADDR.npi        \</span><br><span style="color: hsl(120, 100%, 40%);">+         || sms->ADDR.ton != test->sms.ADDR.ton) {     \</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGPC(DDB, LOGL_ERROR, #ADDR " address mismatch\n"); \</span><br><span style="color: hsl(120, 100%, 40%);">+              return -EINVAL; \</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   MATCH_SMS_ADDR(src);</span><br><span style="color: hsl(120, 100%, 40%);">+  MATCH_SMS_ADDR(dst);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define MATCH_SMS_PARAM(PARAM, FMT) \</span><br><span style="color: hsl(120, 100%, 40%);">+ if (sms->PARAM != test->sms.PARAM) { \</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPC(DDB, LOGL_ERROR, \</span><br><span style="color: hsl(120, 100%, 40%);">+                    #PARAM " mismatch: E%" FMT " vs A%" FMT "\n", \</span><br><span style="color: hsl(120, 100%, 40%);">+                 test->sms.PARAM, sms->PARAM); \</span><br><span style="color: hsl(120, 100%, 40%);">+           return -EINVAL; \</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   MATCH_SMS_PARAM(id, "llu");</span><br><span style="color: hsl(120, 100%, 40%);">+ MATCH_SMS_PARAM(validity_minutes, "lu");</span><br><span style="color: hsl(120, 100%, 40%);">+    MATCH_SMS_PARAM(is_report, "i");</span><br><span style="color: hsl(120, 100%, 40%);">+    MATCH_SMS_PARAM(reply_path_req, PRIu8);</span><br><span style="color: hsl(120, 100%, 40%);">+       MATCH_SMS_PARAM(status_rep_req, PRIu8);</span><br><span style="color: hsl(120, 100%, 40%);">+       MATCH_SMS_PARAM(ud_hdr_ind, PRIu8);</span><br><span style="color: hsl(120, 100%, 40%);">+   MATCH_SMS_PARAM(protocol_id, PRIu8);</span><br><span style="color: hsl(120, 100%, 40%);">+  MATCH_SMS_PARAM(data_coding_scheme, PRIu8);</span><br><span style="color: hsl(120, 100%, 40%);">+   MATCH_SMS_PARAM(msg_ref, PRIu8);</span><br><span style="color: hsl(120, 100%, 40%);">+      MATCH_SMS_PARAM(user_data_len, PRIu8);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Compare TP-User-Data */</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = memcmp(sms->user_data, test->sms.user_data,</span><br><span style="color: hsl(120, 100%, 40%);">+                    sizeof(sms->user_data));</span><br><span style="color: hsl(120, 100%, 40%);">+       if (rc) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGPC(DDB, LOGL_ERROR, "TP-User-Data mismatch (diff=%d/%zu)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                   rc, sizeof(sms->user_data));</span><br><span style="color: hsl(120, 100%, 40%);">+         return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Compare decoded text */</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = strncmp(sms->text, test->sms.text, sizeof(sms->text));</span><br><span style="color: hsl(120, 100%, 40%);">+  if (rc) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGPC(DDB, LOGL_ERROR, "TP-User-Data (text) mismatch (diff=%d/%zu)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                    rc, sizeof(sms->text));</span><br><span style="color: hsl(120, 100%, 40%);">+              return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGPC(DDB, LOGL_NOTICE, "match\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_db_sms_get(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_sms *sms;</span><br><span style="color: hsl(120, 100%, 40%);">+  int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      LOGP(DDB, LOGL_INFO, "Testing db_sms_get()...\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Retrieve stored SMS messages */</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i = 0; i < ARRAY_SIZE(sms_test_set); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+           const struct sms_test *test = &sms_test_set[i];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGP(DDB, LOGL_NOTICE, "%s('%s'): ", __func__, test->name);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            sms = db_sms_get(NULL, test->sms.id);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (!test->exp_db_sms_get_fail && sms != NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGPC(DDB, LOGL_INFO, "success, as expected\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            else if (test->exp_db_sms_get_fail && sms == NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+                 LOGPC(DDB, LOGL_INFO, "failure, as expected\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            else</span><br><span style="color: hsl(120, 100%, 40%);">+                  LOGPC(DDB, LOGL_ERROR, "unexpected result\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (sms) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    verify_sms(test, sms);</span><br><span style="color: hsl(120, 100%, 40%);">+                        talloc_free(sms);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_db_sms_delivery(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm_sms *sms1, *sms2;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_sms *sms;</span><br><span style="color: hsl(120, 100%, 40%);">+  int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGP(DDB, LOGL_INFO, "Testing db_sms_get_next_unsent() "</span><br><span style="color: hsl(120, 100%, 40%);">+                         "and db_sms_mark_delivered()...\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Retrieve both #1 and #2 */</span><br><span style="color: hsl(120, 100%, 40%);">+ sms1 = db_sms_get_next_unsent(NULL, 1, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGP(DDB, LOGL_NOTICE, "db_sms_get_next_unsent(#1): %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+       sms1 ? "found" : "not found");</span><br><span style="color: hsl(120, 100%, 40%);">+       if (sms1 != NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+             verify_sms(&sms_test_set[0], sms1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     sms2 = db_sms_get_next_unsent(NULL, 2, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGP(DDB, LOGL_NOTICE, "db_sms_get_next_unsent(#2): %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+       sms2 ? "found" : "not found");</span><br><span style="color: hsl(120, 100%, 40%);">+       if (sms2 != NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+             verify_sms(&sms_test_set[1], sms2);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Mark both #1 and #2 and delivered, release memory */</span><br><span style="color: hsl(120, 100%, 40%);">+       if (sms1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DDB, LOGL_DEBUG, "Marking #%llu as delivered: ", sms1->id);</span><br><span style="color: hsl(120, 100%, 40%);">+         rc = db_sms_mark_delivered(sms1);</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGPC(DDB, LOGL_DEBUG, "rc=%d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+              talloc_free(sms1);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (sms2) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DDB, LOGL_DEBUG, "Marking #%llu as delivered: ", sms2->id);</span><br><span style="color: hsl(120, 100%, 40%);">+         rc = db_sms_mark_delivered(sms2);</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGPC(DDB, LOGL_DEBUG, "rc=%d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+              talloc_free(sms2);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Expect #3 as the next undelivered */</span><br><span style="color: hsl(120, 100%, 40%);">+       sms = db_sms_get_next_unsent(NULL, 1, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGP(DDB, LOGL_NOTICE, "db_sms_get_next_unsent(starting from #1): %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+         sms ? "found" : "not found");</span><br><span style="color: hsl(120, 100%, 40%);">+        if (sms) {</span><br><span style="color: hsl(120, 100%, 40%);">+            verify_sms(&sms_test_set[2], sms);</span><br><span style="color: hsl(120, 100%, 40%);">+                talloc_free(sms);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_db_sms_delete(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGP(DDB, LOGL_INFO, "Testing db_sms_delete_sent_message_by_id()...\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Delete #1, which is marked as sent */</span><br><span style="color: hsl(120, 100%, 40%);">+      LOGP(DDB, LOGL_NOTICE, "db_sms_delete_sent_message_by_id(#1, sent): ");</span><br><span style="color: hsl(120, 100%, 40%);">+     rc = db_sms_delete_sent_message_by_id(1);</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGPC(DDB, LOGL_NOTICE, "rc=%d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Don't expect to retrieve this message anymore */</span><br><span style="color: hsl(120, 100%, 40%);">+       sms_test_set[0].exp_db_sms_get_fail = true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Try to delete #3, which is not marked as sent */</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGP(DDB, LOGL_NOTICE, "db_sms_delete_sent_message_by_id(#3, not sent): ");</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = db_sms_delete_sent_message_by_id(3);</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGPC(DDB, LOGL_NOTICE, "rc=%d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Do expect to retrieve this message anyway */</span><br><span style="color: hsl(120, 100%, 40%);">+       sms_test_set[2].exp_db_sms_get_fail = false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGP(DDB, LOGL_INFO, "Testing db_sms_delete_by_msisdn()...\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGP(DDB, LOGL_NOTICE, "db_sms_delete_by_msisdn('72631'): ");</span><br><span style="color: hsl(120, 100%, 40%);">+       rc = db_sms_delete_by_msisdn("72631");</span><br><span style="color: hsl(120, 100%, 40%);">+      LOGPC(DDB, LOGL_NOTICE, "rc=%d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Don't expect both #8 and #9 anymore */</span><br><span style="color: hsl(120, 100%, 40%);">+ sms_test_set[7].exp_db_sms_get_fail = true;</span><br><span style="color: hsl(120, 100%, 40%);">+   sms_test_set[8].exp_db_sms_get_fail = true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DDB, LOGL_INFO, "Testing db_sms_delete_oldest_expired_message()...\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      LOGP(DDB, LOGL_NOTICE, "db_sms_delete_oldest_expired_message()\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ db_sms_delete_oldest_expired_message();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Don't expect #10 anymore */</span><br><span style="color: hsl(120, 100%, 40%);">+    sms_test_set[9].exp_db_sms_get_fail = true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* We need to make sure that we removed exactly what we expected to remove */</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DDB, LOGL_INFO, "Expectations updated, retrieving all messages again\n");</span><br><span style="color: hsl(120, 100%, 40%);">+      test_db_sms_get();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct log_info_cat db_sms_test_categories[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+      [DDB] = {</span><br><span style="color: hsl(120, 100%, 40%);">+             .name = "DDB",</span><br><span style="color: hsl(120, 100%, 40%);">+              .description = "Database Layer",</span><br><span style="color: hsl(120, 100%, 40%);">+            .enabled = 1, .loglevel = LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct log_info info = {</span><br><span style="color: hsl(120, 100%, 40%);">+     .cat = db_sms_test_categories,</span><br><span style="color: hsl(120, 100%, 40%);">+        .num_cat = ARRAY_SIZE(db_sms_test_categories),</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int main(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      void *logging_ctx;</span><br><span style="color: hsl(120, 100%, 40%);">+    int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Track the use of talloc NULL memory contexts */</span><br><span style="color: hsl(120, 100%, 40%);">+    talloc_enable_null_tracking();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      talloc_ctx = talloc_named_const(NULL, 0, "db_sms_test");</span><br><span style="color: hsl(120, 100%, 40%);">+    logging_ctx = talloc_named_const(talloc_ctx, 0, "logging");</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_init_logging2(logging_ctx, &info);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(osmo_stderr_target);</span><br><span style="color: hsl(120, 100%, 40%);">+      log_set_use_color(osmo_stderr_target, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     log_set_print_timestamp(osmo_stderr_target, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       log_set_print_filename(osmo_stderr_target, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+        log_set_print_category(osmo_stderr_target, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        log_set_print_level(osmo_stderr_target, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#if 0</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Having the database stored in a regular file may be useful</span><br><span style="color: hsl(120, 100%, 40%);">+  * for debugging, but this comes at the price of performance. */</span><br><span style="color: hsl(120, 100%, 40%);">+      FILE *dbf = fopen("db_sms_test.db", "wb");</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(dbf != NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+     fclose(dbf);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Init a volatile database in RAM */</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DDB, LOGL_DEBUG, "Init a new database\n");</span><br><span style="color: hsl(120, 100%, 40%);">+     rc = db_init(":memory:");</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(rc == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Prepare some tables */</span><br><span style="color: hsl(120, 100%, 40%);">+     rc = db_prepare();</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(rc == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DDB, LOGL_DEBUG, "Init complete\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Prepare the test set */</span><br><span style="color: hsl(120, 100%, 40%);">+    prepare_sms_test_set();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     test_db_sms_store();</span><br><span style="color: hsl(120, 100%, 40%);">+  test_db_sms_get();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  test_db_sms_delivery();</span><br><span style="color: hsl(120, 100%, 40%);">+       test_db_sms_delete();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Close the database */</span><br><span style="color: hsl(120, 100%, 40%);">+      db_fini();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Deinit logging */</span><br><span style="color: hsl(120, 100%, 40%);">+  log_fini();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Check for memory leaks */</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = talloc_total_blocks(talloc_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(rc == 2); /* db_sms_test + logging */</span><br><span style="color: hsl(120, 100%, 40%);">+     talloc_free(talloc_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    talloc_report_full(NULL, stderr);</span><br><span style="color: hsl(120, 100%, 40%);">+     talloc_disable_null_tracking();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void osmo_stream_srv_link_set_data(struct osmo_stream_srv_link *link, void *data) {}</span><br><span style="color: hsl(120, 100%, 40%);">+struct osmo_fd *osmo_stream_srv_get_ofd(struct osmo_stream_srv *srv) { return NULL; }</span><br><span style="color: hsl(120, 100%, 40%);">+void osmo_stream_srv_destroy(struct osmo_stream_srv *conn) {}</span><br><span style="color: hsl(120, 100%, 40%);">+struct osmo_stream_srv *osmo_stream_srv_create(void *ctx, struct osmo_stream_srv_link *link,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             int fd, int (*cb)(struct osmo_stream_srv *conn),</span><br><span style="color: hsl(120, 100%, 40%);">+                                              int (*closed_cb)(struct osmo_stream_srv *conn),</span><br><span style="color: hsl(120, 100%, 40%);">+                                               void *data) { return NULL; }</span><br><span style="color: hsl(120, 100%, 40%);">+void osmo_stream_srv_send(struct osmo_stream_srv *conn, struct msgb *msg) {}</span><br><span style="color: hsl(120, 100%, 40%);">+void osmo_stream_srv_link_set_proto(struct osmo_stream_srv_link *link, uint16_t proto) {}</span><br><span style="color: hsl(120, 100%, 40%);">+struct osmo_fd *osmo_stream_srv_link_get_ofd(struct osmo_stream_srv_link *link) { return NULL; }</span><br><span style="color: hsl(120, 100%, 40%);">+struct osmo_stream_srv_link *osmo_stream_srv_link_create(void *ctx) { return NULL; }</span><br><span style="color: hsl(120, 100%, 40%);">+void *osmo_stream_srv_get_data(struct osmo_stream_srv *conn) { return NULL; }</span><br><span style="color: hsl(120, 100%, 40%);">+void osmo_stream_srv_link_set_nodelay(struct osmo_stream_srv_link *link, bool nodelay) {}</span><br><span style="color: hsl(120, 100%, 40%);">+void osmo_stream_srv_link_set_accept_cb(struct osmo_stream_srv_link *link, int (*accept_cb)</span><br><span style="color: hsl(120, 100%, 40%);">+                                   (struct osmo_stream_srv_link *link, int fd)) {}</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_stream_srv_link_open(struct osmo_stream_srv_link *link) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+void *osmo_stream_srv_link_get_data(struct osmo_stream_srv_link *link) { return NULL; }</span><br><span style="color: hsl(120, 100%, 40%);">+void osmo_stream_srv_link_set_port(struct osmo_stream_srv_link *link, uint16_t port) {}</span><br><span style="color: hsl(120, 100%, 40%);">+void osmo_stream_srv_link_set_addr(struct osmo_stream_srv_link *link, const char *addr) {}</span><br><span style="color: hsl(120, 100%, 40%);">+int sctp_recvmsg(int sd, void *msg, size_t len, void *from, void *fromlen, void *info, int *msg_flags) { return 0; }</span><br><span>diff --git a/tests/db_sms/db_sms_test.err b/tests/db_sms/db_sms_test.err</span><br><span>new file mode 100644</span><br><span>index 0000000..73dbd8e</span><br><span>--- /dev/null</span><br><span>+++ b/tests/db_sms/db_sms_test.err</span><br><span>@@ -0,0 +1,70 @@</span><br><span style="color: hsl(120, 100%, 40%);">+DDB DEBUG Init a new database</span><br><span style="color: hsl(120, 100%, 40%);">+DDB DEBUG Init complete</span><br><span style="color: hsl(120, 100%, 40%);">+DDB INFO Testing db_sms_store()...</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_store('Regular MO SMS'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_store('Regular MT SMS'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_store('Complete TP-UD (160 septets, 7-bit encoding)'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_store('Complete TP-UD (140 octets, 8-bit encoding)'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_store('TP-UD buffer overflow (UDH-Length > UD-Length)'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_store('Truncated TP-UD (200 septets, 7-bit encoding)'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_store('Truncated TP-UD (255 octets, 8-bit encoding)'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_store('Same MSISDN #1'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_store('Same MSISDN #2'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_store('Expired SMS'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB INFO Testing db_sms_get()...</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_get('Regular MO SMS'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE verify_sms('Regular MO SMS'): match</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_get('Regular MT SMS'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE verify_sms('Regular MT SMS'): match</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_get('Complete TP-UD (160 septets, 7-bit encoding)'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE verify_sms('Complete TP-UD (160 septets, 7-bit encoding)'): TP-User-Data mismatch (diff=-65/256)</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_get('Complete TP-UD (140 octets, 8-bit encoding)'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE verify_sms('Complete TP-UD (140 octets, 8-bit encoding)'): TP-User-Data mismatch (diff=-66/256)</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_get('TP-UD buffer overflow (UDH-Length > UD-Length)'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE verify_sms('TP-UD buffer overflow (UDH-Length > UD-Length)'): match</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_get('Truncated TP-UD (200 septets, 7-bit encoding)'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE verify_sms('Truncated TP-UD (200 septets, 7-bit encoding)'): TP-User-Data mismatch (diff=-65/256)</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_get('Truncated TP-UD (255 octets, 8-bit encoding)'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE verify_sms('Truncated TP-UD (255 octets, 8-bit encoding)'): TP-User-Data mismatch (diff=-16896/256)</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_get('Same MSISDN #1'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE verify_sms('Same MSISDN #1'): match</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_get('Same MSISDN #2'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE verify_sms('Same MSISDN #2'): match</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_get('Expired SMS'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE verify_sms('Expired SMS'): match</span><br><span style="color: hsl(120, 100%, 40%);">+DDB INFO Testing db_sms_get_next_unsent() and db_sms_mark_delivered()...</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE db_sms_get_next_unsent(#1): found</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE verify_sms('Regular MO SMS'): match</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE db_sms_get_next_unsent(#2): found</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE verify_sms('Regular MT SMS'): match</span><br><span style="color: hsl(120, 100%, 40%);">+DDB DEBUG Marking #1 as delivered: rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+DDB DEBUG Marking #2 as delivered: rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE db_sms_get_next_unsent(starting from #1): found</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE verify_sms('Complete TP-UD (160 septets, 7-bit encoding)'): TP-User-Data mismatch (diff=-65/256)</span><br><span style="color: hsl(120, 100%, 40%);">+DDB INFO Testing db_sms_delete_sent_message_by_id()...</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE db_sms_delete_sent_message_by_id(#1, sent): rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE db_sms_delete_sent_message_by_id(#3, not sent): rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+DDB INFO Testing db_sms_delete_by_msisdn()...</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE db_sms_delete_by_msisdn('72631'): rc=0</span><br><span style="color: hsl(120, 100%, 40%);">+DDB INFO Testing db_sms_delete_oldest_expired_message()...</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE db_sms_delete_oldest_expired_message()</span><br><span style="color: hsl(120, 100%, 40%);">+DDB INFO Expectations updated, retrieving all messages again</span><br><span style="color: hsl(120, 100%, 40%);">+DDB INFO Testing db_sms_get()...</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_get('Regular MO SMS'): failure, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_get('Regular MT SMS'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE verify_sms('Regular MT SMS'): match</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_get('Complete TP-UD (160 septets, 7-bit encoding)'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE verify_sms('Complete TP-UD (160 septets, 7-bit encoding)'): TP-User-Data mismatch (diff=-65/256)</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_get('Complete TP-UD (140 octets, 8-bit encoding)'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE verify_sms('Complete TP-UD (140 octets, 8-bit encoding)'): TP-User-Data mismatch (diff=-66/256)</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_get('TP-UD buffer overflow (UDH-Length > UD-Length)'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE verify_sms('TP-UD buffer overflow (UDH-Length > UD-Length)'): match</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_get('Truncated TP-UD (200 septets, 7-bit encoding)'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE verify_sms('Truncated TP-UD (200 septets, 7-bit encoding)'): TP-User-Data mismatch (diff=-65/256)</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_get('Truncated TP-UD (255 octets, 8-bit encoding)'): success, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE verify_sms('Truncated TP-UD (255 octets, 8-bit encoding)'): TP-User-Data mismatch (diff=-16896/256)</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_get('Same MSISDN #1'): failure, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_get('Same MSISDN #2'): failure, as expected</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE test_db_sms_get('Expired SMS'): unexpected result</span><br><span style="color: hsl(120, 100%, 40%);">+DDB NOTICE verify_sms('Expired SMS'): match</span><br><span style="color: hsl(120, 100%, 40%);">+full talloc report on 'null_context' (total      0 bytes in   1 blocks)</span><br><span>diff --git a/tests/db_sms/db_sms_test.ok b/tests/db_sms/db_sms_test.ok</span><br><span>new file mode 100644</span><br><span>index 0000000..e69de29</span><br><span>--- /dev/null</span><br><span>+++ b/tests/db_sms/db_sms_test.ok</span><br><span>diff --git a/tests/testsuite.at b/tests/testsuite.at</span><br><span>index f27b60c..cd01bf1 100644</span><br><span>--- a/tests/testsuite.at</span><br><span>+++ b/tests/testsuite.at</span><br><span>@@ -16,6 +16,13 @@</span><br><span> AT_CHECK([$abs_top_builddir/tests/sms_queue/sms_queue_test], [], [expout], [experr])</span><br><span> AT_CLEANUP</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+AT_SETUP([db_sms_test])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_KEYWORDS([db_sms_test])</span><br><span style="color: hsl(120, 100%, 40%);">+cat $abs_srcdir/db_sms/db_sms_test.ok > expout</span><br><span style="color: hsl(120, 100%, 40%);">+cat $abs_srcdir/db_sms/db_sms_test.err > experr</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CHECK([$abs_top_builddir/tests/db_sms/db_sms_test], [], [expout], [experr])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CLEANUP</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> AT_SETUP([msc_vlr_test_no_authen])</span><br><span> AT_KEYWORDS([msc_vlr_test_no_authen])</span><br><span> cat $abs_srcdir/msc_vlr/msc_vlr_test_no_authen.ok > expout</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13629">change 13629</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/13629"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-msc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Id94ad35b6f78f839137db2e17010fbf9b40111a3 </div>
<div style="display:none"> Gerrit-Change-Number: 13629 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>