<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-hlr/+/15913">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add db_upgrade test<br><br>We have a database schema upgrade path, but so far nothing that verifies that<br>we don't break it. It almost seems like the user data weren't important to us!?<br><br>Add a db upgrade test:<br>- Create a db with an .sql dump taken from a db created with an old osmo-hlr,<br>  producing DB schema version 0.<br>- Run osmo-hlr --db-upgrade --db-check<br>- Verify that the upgrade exited successfully.<br>- Verify that restarting with the upgraded DB works.<br><br>If python tests are enabled, also:<br>- create a new database using the new osmo-hlr (just built).<br>- replay a VTY transcript to create subscribers as in the old snapshot.<br>- replay some sql modifications as done in the old snapshot.<br>- Get a list of sorted table names,<br>- a list of their sorted columns with all their properties,<br>- and dump the table contents in a column- and value-sorted way.<br>- Compare the resulting dumps and error if there are any diffs.<br>(This is how I found the difference in the imei column that was fixed in<br>I68a00014a3d603fcba8781470bc5285f78b538d0)<br><br>Change-Id: I0961bab0e17cfde5b030576c5bc243c2b51d9dc4<br>---<br>M configure.ac<br>M src/hlr.c<br>M tests/Makefile.am<br>A tests/db_upgrade/Makefile.am<br>A tests/db_upgrade/create_subscribers.vty<br>A tests/db_upgrade/create_subscribers_step2.sql<br>A tests/db_upgrade/db_upgrade_test.err<br>A tests/db_upgrade/db_upgrade_test.ok<br>A tests/db_upgrade/db_upgrade_test.sh<br>A tests/db_upgrade/hlr_db_v0.sql<br>A tests/db_upgrade/osmo-hlr.cfg<br>M tests/testsuite.at<br>12 files changed, 434 insertions(+), 6 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-hlr refs/changes/13/15913/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 993d4d5..ca78f38 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -186,4 +186,5 @@</span><br><span>      tests/gsup_server/Makefile</span><br><span>   tests/gsup/Makefile</span><br><span>  tests/db/Makefile</span><br><span style="color: hsl(120, 100%, 40%);">+     tests/db_upgrade/Makefile</span><br><span>    )</span><br><span>diff --git a/src/hlr.c b/src/hlr.c</span><br><span>index f9cc2f5..6bfc141 100644</span><br><span>--- a/src/hlr.c</span><br><span>+++ b/src/hlr.c</span><br><span>@@ -862,12 +862,6 @@</span><br><span>            return rc;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* start telnet after reading config for vty_get_bind_addr() */</span><br><span style="color: hsl(0, 100%, 40%);">- rc = telnet_init_dynif(hlr_ctx, NULL, vty_get_bind_addr(),</span><br><span style="color: hsl(0, 100%, 40%);">-                             OSMO_VTY_PORT_HLR);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>   LOGP(DMAIN, LOGL_NOTICE, "hlr starting\n");</span><br><span> </span><br><span>    rc = rand_init();</span><br><span>@@ -895,6 +889,13 @@</span><br><span>             exit(0);</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* start telnet after reading config for vty_get_bind_addr() */</span><br><span style="color: hsl(120, 100%, 40%);">+       rc = telnet_init_dynif(hlr_ctx, NULL, vty_get_bind_addr(),</span><br><span style="color: hsl(120, 100%, 40%);">+                           OSMO_VTY_PORT_HLR);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       g_hlr->gs = osmo_gsup_server_create(hlr_ctx, g_hlr->gsup_bind_addr, OSMO_GSUP_PORT,</span><br><span>                                        read_cb, &g_lu_ops, g_hlr);</span><br><span>  if (!g_hlr->gs) {</span><br><span>diff --git a/tests/Makefile.am b/tests/Makefile.am</span><br><span>index 4da8ab1..357fbac 100644</span><br><span>--- a/tests/Makefile.am</span><br><span>+++ b/tests/Makefile.am</span><br><span>@@ -3,6 +3,7 @@</span><br><span>      gsup_server \</span><br><span>        db \</span><br><span>         gsup \</span><br><span style="color: hsl(120, 100%, 40%);">+        db_upgrade \</span><br><span>         $(NULL)</span><br><span> </span><br><span> # The `:;' works around a Bash 3.2 bug when the output is not writeable.</span><br><span>@@ -44,6 +45,7 @@</span><br><span> # don't run vty and ctrl tests concurrently so that the ports don't conflict</span><br><span>      $(MAKE) vty-test</span><br><span>     $(MAKE) ctrl-test</span><br><span style="color: hsl(120, 100%, 40%);">+     $(MAKE) db-upgrade-equivalence-test</span><br><span> else</span><br><span> python-tests:</span><br><span>         echo "Not running python-based external tests (determined at configure-time)"</span><br><span>@@ -81,6 +83,9 @@</span><br><span>  -rm -f $(CTRL_TEST_DB)</span><br><span>       -rm $(CTRL_TEST_DB)-*</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+db-upgrade-equivalence-test:</span><br><span style="color: hsl(120, 100%, 40%);">+       $(MAKE) -C db_upgrade upgrade-equivalence-test</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> check-local: atconfig $(TESTSUITE)</span><br><span>       $(SHELL) '$(TESTSUITE)' $(TESTSUITEFLAGS)</span><br><span>    $(MAKE) $(AM_MAKEFLAGS) python-tests</span><br><span>diff --git a/tests/db_upgrade/Makefile.am b/tests/db_upgrade/Makefile.am</span><br><span>new file mode 100644</span><br><span>index 0000000..79136c9</span><br><span>--- /dev/null</span><br><span>+++ b/tests/db_upgrade/Makefile.am</span><br><span>@@ -0,0 +1,14 @@</span><br><span style="color: hsl(120, 100%, 40%);">+EXTRA_DIST = \</span><br><span style="color: hsl(120, 100%, 40%);">+       db_upgrade_test.sh \</span><br><span style="color: hsl(120, 100%, 40%);">+  db_upgrade_test.err \</span><br><span style="color: hsl(120, 100%, 40%);">+ db_upgrade_test.ok \</span><br><span style="color: hsl(120, 100%, 40%);">+  hlr_db_v0.sql \</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo-hlr.cfg \</span><br><span style="color: hsl(120, 100%, 40%);">+        create_subscribers.vty \</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%);">+update_exp:</span><br><span style="color: hsl(120, 100%, 40%);">+        $(srcdir)/db_upgrade_test.sh $(srcdir) $(builddir) >"$(srcdir)/db_upgrade_test.ok" 2>"$(srcdir)/db_upgrade_test.err"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+upgrade-equivalence-test:</span><br><span style="color: hsl(120, 100%, 40%);">+   $(srcdir)/db_upgrade_test.sh $(srcdir) $(builddir) do-equivalence-test</span><br><span>diff --git a/tests/db_upgrade/create_subscribers.vty b/tests/db_upgrade/create_subscribers.vty</span><br><span>new file mode 100644</span><br><span>index 0000000..30eeba6</span><br><span>--- /dev/null</span><br><span>+++ b/tests/db_upgrade/create_subscribers.vty</span><br><span>@@ -0,0 +1,47 @@</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR> enable</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 123456789012345 create</span><br><span style="color: hsl(120, 100%, 40%);">+% Created subscriber 123456789012345</span><br><span style="color: hsl(120, 100%, 40%);">+    ID: 1</span><br><span style="color: hsl(120, 100%, 40%);">+    IMSI: 123456789012345</span><br><span style="color: hsl(120, 100%, 40%);">+    MSISDN: none</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 123456789012345 update msisdn 098765432109876</span><br><span style="color: hsl(120, 100%, 40%);">+% Updated subscriber IMSI='123456789012345' to MSISDN='098765432109876'</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 123456789012345 update aud2g comp128v1 ki BeefedCafeFaceAcedAddedDecadeFee</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 123456789012345 update aud3g milenage k C01ffedC1cadaeAc1d1f1edAcac1aB0a opc CededEffacedAceFacedBadFadedBeef</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 111111111 create</span><br><span style="color: hsl(120, 100%, 40%);">+% Created subscriber 111111111</span><br><span style="color: hsl(120, 100%, 40%);">+    ID: 2</span><br><span style="color: hsl(120, 100%, 40%);">+    IMSI: 111111111</span><br><span style="color: hsl(120, 100%, 40%);">+    MSISDN: none</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 222222222 create</span><br><span style="color: hsl(120, 100%, 40%);">+% Created subscriber 222222222</span><br><span style="color: hsl(120, 100%, 40%);">+    ID: 3</span><br><span style="color: hsl(120, 100%, 40%);">+    IMSI: 222222222</span><br><span style="color: hsl(120, 100%, 40%);">+    MSISDN: none</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 222222222 update msisdn 22222</span><br><span style="color: hsl(120, 100%, 40%);">+% Updated subscriber IMSI='222222222' to MSISDN='22222'</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 333333 create</span><br><span style="color: hsl(120, 100%, 40%);">+% Created subscriber 333333</span><br><span style="color: hsl(120, 100%, 40%);">+    ID: 4</span><br><span style="color: hsl(120, 100%, 40%);">+    IMSI: 333333</span><br><span style="color: hsl(120, 100%, 40%);">+    MSISDN: none</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 333333 update msisdn 3</span><br><span style="color: hsl(120, 100%, 40%);">+% Updated subscriber IMSI='333333' to MSISDN='3'</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 333333 update aud2g comp128v2 ki 33333333333333333333333333333333</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 444444444444444 create</span><br><span style="color: hsl(120, 100%, 40%);">+% Created subscriber 444444444444444</span><br><span style="color: hsl(120, 100%, 40%);">+    ID: 5</span><br><span style="color: hsl(120, 100%, 40%);">+    IMSI: 444444444444444</span><br><span style="color: hsl(120, 100%, 40%);">+    MSISDN: none</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 444444444444444 update msisdn 4444</span><br><span style="color: hsl(120, 100%, 40%);">+% Updated subscriber IMSI='444444444444444' to MSISDN='4444'</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 444444444444444 update aud3g milenage k 44444444444444444444444444444444 op 44444444444444444444444444444444</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 5555555 create</span><br><span style="color: hsl(120, 100%, 40%);">+% Created subscriber 5555555</span><br><span style="color: hsl(120, 100%, 40%);">+    ID: 6</span><br><span style="color: hsl(120, 100%, 40%);">+    IMSI: 5555555</span><br><span style="color: hsl(120, 100%, 40%);">+    MSISDN: none</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 5555555 update msisdn 55555555555555</span><br><span style="color: hsl(120, 100%, 40%);">+% Updated subscriber IMSI='5555555' to MSISDN='55555555555555'</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 5555555 update aud2g xor ki 55555555555555555555555555555555</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoHLR# subscriber imsi 5555555 update aud3g milenage k 55555555555555555555555555555555 opc 55555555555555555555555555555555</span><br><span>diff --git a/tests/db_upgrade/create_subscribers_step2.sql b/tests/db_upgrade/create_subscribers_step2.sql</span><br><span>new file mode 100644</span><br><span>index 0000000..7933e25</span><br><span>--- /dev/null</span><br><span>+++ b/tests/db_upgrade/create_subscribers_step2.sql</span><br><span>@@ -0,0 +1,6 @@</span><br><span style="color: hsl(120, 100%, 40%);">+update subscriber set vlr_number = 'MSC-1' where id = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+update subscriber set ms_purged_cs = 1 where id = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+update subscriber set ms_purged_ps = 1 where id = 3;</span><br><span style="color: hsl(120, 100%, 40%);">+update subscriber set nam_cs = 0 where id = 4;</span><br><span style="color: hsl(120, 100%, 40%);">+update subscriber set nam_ps = 0 where id = 5;</span><br><span style="color: hsl(120, 100%, 40%);">+update subscriber set nam_cs = 0, nam_ps = 0 where id = 6;</span><br><span>diff --git a/tests/db_upgrade/db_upgrade_test.err b/tests/db_upgrade/db_upgrade_test.err</span><br><span>new file mode 100644</span><br><span>index 0000000..e69de29</span><br><span>--- /dev/null</span><br><span>+++ b/tests/db_upgrade/db_upgrade_test.err</span><br><span>diff --git a/tests/db_upgrade/db_upgrade_test.ok b/tests/db_upgrade/db_upgrade_test.ok</span><br><span>new file mode 100644</span><br><span>index 0000000..7fa1258</span><br><span>--- /dev/null</span><br><span>+++ b/tests/db_upgrade/db_upgrade_test.ok</span><br><span>@@ -0,0 +1,180 @@</span><br><span style="color: hsl(120, 100%, 40%);">+Creating db in schema version 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Version 0 db:</span><br><span style="color: hsl(120, 100%, 40%);">+PRAGMA foreign_keys=OFF;</span><br><span style="color: hsl(120, 100%, 40%);">+BEGIN TRANSACTION;</span><br><span style="color: hsl(120, 100%, 40%);">+CREATE TABLE subscriber (</span><br><span style="color: hsl(120, 100%, 40%);">+-- OsmoHLR's DB scheme is modelled roughly after TS 23.008 version 13.3.0</span><br><span style="color: hsl(120, 100%, 40%);">+     id              INTEGER PRIMARY KEY,</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.1.1.1</span><br><span style="color: hsl(120, 100%, 40%);">+    imsi            VARCHAR(15) UNIQUE NOT NULL,</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.1.2</span><br><span style="color: hsl(120, 100%, 40%);">+      msisdn          VARCHAR(15) UNIQUE,</span><br><span style="color: hsl(120, 100%, 40%);">+   -- Chapter 2.2.3: Most recent / current IMEI</span><br><span style="color: hsl(120, 100%, 40%);">+  imeisv          VARCHAR,</span><br><span style="color: hsl(120, 100%, 40%);">+      -- Chapter 2.4.5</span><br><span style="color: hsl(120, 100%, 40%);">+      vlr_number      VARCHAR(15),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.4.6</span><br><span style="color: hsl(120, 100%, 40%);">+      hlr_number      VARCHAR(15),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.4.8.1</span><br><span style="color: hsl(120, 100%, 40%);">+    sgsn_number     VARCHAR(15),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.13.10</span><br><span style="color: hsl(120, 100%, 40%);">+    sgsn_address    VARCHAR,</span><br><span style="color: hsl(120, 100%, 40%);">+      -- Chapter 2.4.8.2</span><br><span style="color: hsl(120, 100%, 40%);">+    ggsn_number     VARCHAR(15),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.4.9.2</span><br><span style="color: hsl(120, 100%, 40%);">+    gmlc_number     VARCHAR(15),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.4.23</span><br><span style="color: hsl(120, 100%, 40%);">+     smsc_number     VARCHAR(15),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.4.24</span><br><span style="color: hsl(120, 100%, 40%);">+     periodic_lu_tmr INTEGER,</span><br><span style="color: hsl(120, 100%, 40%);">+      -- Chapter 2.13.115</span><br><span style="color: hsl(120, 100%, 40%);">+   periodic_rau_tau_tmr INTEGER,</span><br><span style="color: hsl(120, 100%, 40%);">+ -- Chapter 2.1.1.2: network access mode</span><br><span style="color: hsl(120, 100%, 40%);">+       nam_cs          BOOLEAN NOT NULL DEFAULT 1,</span><br><span style="color: hsl(120, 100%, 40%);">+   nam_ps          BOOLEAN NOT NULL DEFAULT 1,</span><br><span style="color: hsl(120, 100%, 40%);">+   -- Chapter 2.1.8</span><br><span style="color: hsl(120, 100%, 40%);">+      lmsi            INTEGER,</span><br><span style="color: hsl(120, 100%, 40%);">+      -- The below purged flags might not even be stored non-volatile,</span><br><span style="color: hsl(120, 100%, 40%);">+      -- refer to TS 23.012 Chapter 3.6.1.4</span><br><span style="color: hsl(120, 100%, 40%);">+ -- Chapter 2.7.5</span><br><span style="color: hsl(120, 100%, 40%);">+      ms_purged_cs    BOOLEAN NOT NULL DEFAULT 0,</span><br><span style="color: hsl(120, 100%, 40%);">+   -- Chapter 2.7.6</span><br><span style="color: hsl(120, 100%, 40%);">+      ms_purged_ps    BOOLEAN NOT NULL DEFAULT 0</span><br><span style="color: hsl(120, 100%, 40%);">+);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO subscriber VALUES(1,'123456789012345','098765432109876',NULL,'MSC-1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,1,NULL,0,0);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO subscriber VALUES(2,'111111111',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,1,NULL,1,0);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO subscriber VALUES(3,'222222222','22222',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,1,NULL,0,1);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO subscriber VALUES(4,'333333','3',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,1,NULL,0,0);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO subscriber VALUES(5,'444444444444444','4444',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,0,NULL,0,0);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO subscriber VALUES(6,'5555555','55555555555555',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,NULL,0,0);</span><br><span style="color: hsl(120, 100%, 40%);">+CREATE TABLE subscriber_apn (</span><br><span style="color: hsl(120, 100%, 40%);">+        subscriber_id   INTEGER,                -- subscriber.id</span><br><span style="color: hsl(120, 100%, 40%);">+      apn             VARCHAR(256) NOT NULL</span><br><span style="color: hsl(120, 100%, 40%);">+);</span><br><span style="color: hsl(120, 100%, 40%);">+CREATE TABLE subscriber_multi_msisdn (</span><br><span style="color: hsl(120, 100%, 40%);">+-- Chapter 2.1.3</span><br><span style="color: hsl(120, 100%, 40%);">+   subscriber_id   INTEGER,                -- subscriber.id</span><br><span style="color: hsl(120, 100%, 40%);">+      msisdn          VARCHAR(15) NOT NULL</span><br><span style="color: hsl(120, 100%, 40%);">+);</span><br><span style="color: hsl(120, 100%, 40%);">+CREATE TABLE auc_2g (</span><br><span style="color: hsl(120, 100%, 40%);">+       subscriber_id   INTEGER PRIMARY KEY,    -- subscriber.id</span><br><span style="color: hsl(120, 100%, 40%);">+      algo_id_2g      INTEGER NOT NULL,       -- enum osmo_auth_algo value</span><br><span style="color: hsl(120, 100%, 40%);">+  ki              VARCHAR(32) NOT NULL    -- hex string: subscriber's secret key (128bit)</span><br><span style="color: hsl(120, 100%, 40%);">+);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO auc_2g VALUES(1,1,'BeefedCafeFaceAcedAddedDecadeFee');</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO auc_2g VALUES(4,2,'33333333333333333333333333333333');</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO auc_2g VALUES(6,4,'55555555555555555555555555555555');</span><br><span style="color: hsl(120, 100%, 40%);">+CREATE TABLE auc_3g (</span><br><span style="color: hsl(120, 100%, 40%);">+    subscriber_id   INTEGER PRIMARY KEY,    -- subscriber.id</span><br><span style="color: hsl(120, 100%, 40%);">+      algo_id_3g      INTEGER NOT NULL,       -- enum osmo_auth_algo value</span><br><span style="color: hsl(120, 100%, 40%);">+  k               VARCHAR(32) NOT NULL,   -- hex string: subscriber's secret key (128bit)</span><br><span style="color: hsl(120, 100%, 40%);">+   op              VARCHAR(32),            -- hex string: operator's secret key (128bit)</span><br><span style="color: hsl(120, 100%, 40%);">+     opc             VARCHAR(32),            -- hex string: derived from OP and K (128bit)</span><br><span style="color: hsl(120, 100%, 40%);">+ sqn             INTEGER NOT NULL DEFAULT 0,     -- sequence number of key usage</span><br><span style="color: hsl(120, 100%, 40%);">+       ind_bitlen      INTEGER NOT NULL DEFAULT 5      -- nr of index bits at lower SQN end</span><br><span style="color: hsl(120, 100%, 40%);">+);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO auc_3g VALUES(1,5,'C01ffedC1cadaeAc1d1f1edAcac1aB0a',NULL,'CededEffacedAceFacedBadFadedBeef',0,5);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO auc_3g VALUES(5,5,'44444444444444444444444444444444','44444444444444444444444444444444',NULL,0,5);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO auc_3g VALUES(6,5,'55555555555555555555555555555555',NULL,'55555555555555555555555555555555',0,5);</span><br><span style="color: hsl(120, 100%, 40%);">+CREATE UNIQUE INDEX idx_subscr_imsi ON subscriber (imsi)</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+COMMIT;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Launching osmo-hlr to upgrade db:</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-hlr --database $db --db-upgrade --db-check --config-file $srcdir/osmo-hlr.cfg</span><br><span style="color: hsl(120, 100%, 40%);">+rc = 0</span><br><span style="color: hsl(120, 100%, 40%);">+DMAIN hlr starting</span><br><span style="color: hsl(120, 100%, 40%);">+DDB using database: <PATH>test.db</span><br><span style="color: hsl(120, 100%, 40%);">+DDB Database <PATH>test.db' has HLR DB schema version 0</span><br><span style="color: hsl(120, 100%, 40%);">+DDB Database <PATH>test.db' has been upgraded to HLR DB schema version 2</span><br><span style="color: hsl(120, 100%, 40%);">+DMAIN Cmdline option --db-check: Database was opened successfully, quitting.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Resulting db:</span><br><span style="color: hsl(120, 100%, 40%);">+PRAGMA foreign_keys=OFF;</span><br><span style="color: hsl(120, 100%, 40%);">+BEGIN TRANSACTION;</span><br><span style="color: hsl(120, 100%, 40%);">+CREATE TABLE subscriber (</span><br><span style="color: hsl(120, 100%, 40%);">+-- OsmoHLR's DB scheme is modelled roughly after TS 23.008 version 13.3.0</span><br><span style="color: hsl(120, 100%, 40%);">+    id              INTEGER PRIMARY KEY,</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.1.1.1</span><br><span style="color: hsl(120, 100%, 40%);">+    imsi            VARCHAR(15) UNIQUE NOT NULL,</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.1.2</span><br><span style="color: hsl(120, 100%, 40%);">+      msisdn          VARCHAR(15) UNIQUE,</span><br><span style="color: hsl(120, 100%, 40%);">+   -- Chapter 2.2.3: Most recent / current IMEI</span><br><span style="color: hsl(120, 100%, 40%);">+  imeisv          VARCHAR,</span><br><span style="color: hsl(120, 100%, 40%);">+      -- Chapter 2.4.5</span><br><span style="color: hsl(120, 100%, 40%);">+      vlr_number      VARCHAR(15),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.4.6</span><br><span style="color: hsl(120, 100%, 40%);">+      hlr_number      VARCHAR(15),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.4.8.1</span><br><span style="color: hsl(120, 100%, 40%);">+    sgsn_number     VARCHAR(15),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.13.10</span><br><span style="color: hsl(120, 100%, 40%);">+    sgsn_address    VARCHAR,</span><br><span style="color: hsl(120, 100%, 40%);">+      -- Chapter 2.4.8.2</span><br><span style="color: hsl(120, 100%, 40%);">+    ggsn_number     VARCHAR(15),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.4.9.2</span><br><span style="color: hsl(120, 100%, 40%);">+    gmlc_number     VARCHAR(15),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.4.23</span><br><span style="color: hsl(120, 100%, 40%);">+     smsc_number     VARCHAR(15),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.4.24</span><br><span style="color: hsl(120, 100%, 40%);">+     periodic_lu_tmr INTEGER,</span><br><span style="color: hsl(120, 100%, 40%);">+      -- Chapter 2.13.115</span><br><span style="color: hsl(120, 100%, 40%);">+   periodic_rau_tau_tmr INTEGER,</span><br><span style="color: hsl(120, 100%, 40%);">+ -- Chapter 2.1.1.2: network access mode</span><br><span style="color: hsl(120, 100%, 40%);">+       nam_cs          BOOLEAN NOT NULL DEFAULT 1,</span><br><span style="color: hsl(120, 100%, 40%);">+   nam_ps          BOOLEAN NOT NULL DEFAULT 1,</span><br><span style="color: hsl(120, 100%, 40%);">+   -- Chapter 2.1.8</span><br><span style="color: hsl(120, 100%, 40%);">+      lmsi            INTEGER,</span><br><span style="color: hsl(120, 100%, 40%);">+      -- The below purged flags might not even be stored non-volatile,</span><br><span style="color: hsl(120, 100%, 40%);">+      -- refer to TS 23.012 Chapter 3.6.1.4</span><br><span style="color: hsl(120, 100%, 40%);">+ -- Chapter 2.7.5</span><br><span style="color: hsl(120, 100%, 40%);">+      ms_purged_cs    BOOLEAN NOT NULL DEFAULT 0,</span><br><span style="color: hsl(120, 100%, 40%);">+   -- Chapter 2.7.6</span><br><span style="color: hsl(120, 100%, 40%);">+      ms_purged_ps    BOOLEAN NOT NULL DEFAULT 0</span><br><span style="color: hsl(120, 100%, 40%);">+, last_lu_seen TIMESTAMP default NULL, imei VARCHAR(14));</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO subscriber VALUES(1,'123456789012345','098765432109876',NULL,'MSC-1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,1,NULL,0,0,NULL,NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO subscriber VALUES(2,'111111111',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,1,NULL,1,0,NULL,NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO subscriber VALUES(3,'222222222','22222',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,1,NULL,0,1,NULL,NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO subscriber VALUES(4,'333333','3',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,1,NULL,0,0,NULL,NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO subscriber VALUES(5,'444444444444444','4444',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,0,NULL,0,0,NULL,NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO subscriber VALUES(6,'5555555','55555555555555',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,NULL,0,0,NULL,NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+CREATE TABLE subscriber_apn (</span><br><span style="color: hsl(120, 100%, 40%);">+     subscriber_id   INTEGER,                -- subscriber.id</span><br><span style="color: hsl(120, 100%, 40%);">+      apn             VARCHAR(256) NOT NULL</span><br><span style="color: hsl(120, 100%, 40%);">+);</span><br><span style="color: hsl(120, 100%, 40%);">+CREATE TABLE subscriber_multi_msisdn (</span><br><span style="color: hsl(120, 100%, 40%);">+-- Chapter 2.1.3</span><br><span style="color: hsl(120, 100%, 40%);">+   subscriber_id   INTEGER,                -- subscriber.id</span><br><span style="color: hsl(120, 100%, 40%);">+      msisdn          VARCHAR(15) NOT NULL</span><br><span style="color: hsl(120, 100%, 40%);">+);</span><br><span style="color: hsl(120, 100%, 40%);">+CREATE TABLE auc_2g (</span><br><span style="color: hsl(120, 100%, 40%);">+       subscriber_id   INTEGER PRIMARY KEY,    -- subscriber.id</span><br><span style="color: hsl(120, 100%, 40%);">+      algo_id_2g      INTEGER NOT NULL,       -- enum osmo_auth_algo value</span><br><span style="color: hsl(120, 100%, 40%);">+  ki              VARCHAR(32) NOT NULL    -- hex string: subscriber's secret key (128bit)</span><br><span style="color: hsl(120, 100%, 40%);">+);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO auc_2g VALUES(1,1,'BeefedCafeFaceAcedAddedDecadeFee');</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO auc_2g VALUES(4,2,'33333333333333333333333333333333');</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO auc_2g VALUES(6,4,'55555555555555555555555555555555');</span><br><span style="color: hsl(120, 100%, 40%);">+CREATE TABLE auc_3g (</span><br><span style="color: hsl(120, 100%, 40%);">+    subscriber_id   INTEGER PRIMARY KEY,    -- subscriber.id</span><br><span style="color: hsl(120, 100%, 40%);">+      algo_id_3g      INTEGER NOT NULL,       -- enum osmo_auth_algo value</span><br><span style="color: hsl(120, 100%, 40%);">+  k               VARCHAR(32) NOT NULL,   -- hex string: subscriber's secret key (128bit)</span><br><span style="color: hsl(120, 100%, 40%);">+   op              VARCHAR(32),            -- hex string: operator's secret key (128bit)</span><br><span style="color: hsl(120, 100%, 40%);">+     opc             VARCHAR(32),            -- hex string: derived from OP and K (128bit)</span><br><span style="color: hsl(120, 100%, 40%);">+ sqn             INTEGER NOT NULL DEFAULT 0,     -- sequence number of key usage</span><br><span style="color: hsl(120, 100%, 40%);">+       ind_bitlen      INTEGER NOT NULL DEFAULT 5      -- nr of index bits at lower SQN end</span><br><span style="color: hsl(120, 100%, 40%);">+);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO auc_3g VALUES(1,5,'C01ffedC1cadaeAc1d1f1edAcac1aB0a',NULL,'CededEffacedAceFacedBadFadedBeef',0,5);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO auc_3g VALUES(5,5,'44444444444444444444444444444444','44444444444444444444444444444444',NULL,0,5);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO auc_3g VALUES(6,5,'55555555555555555555555555555555',NULL,'55555555555555555555555555555555',0,5);</span><br><span style="color: hsl(120, 100%, 40%);">+CREATE UNIQUE INDEX idx_subscr_imsi ON subscriber (imsi)</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+COMMIT;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Verify that osmo-hlr can open it:</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-hlr --database $db --db-check --config-file $srcdir/osmo-hlr.cfg</span><br><span style="color: hsl(120, 100%, 40%);">+rc = 0</span><br><span style="color: hsl(120, 100%, 40%);">+DMAIN hlr starting</span><br><span style="color: hsl(120, 100%, 40%);">+DDB using database: <PATH>test.db</span><br><span style="color: hsl(120, 100%, 40%);">+DDB Database <PATH>test.db' has HLR DB schema version 2</span><br><span style="color: hsl(120, 100%, 40%);">+DMAIN Cmdline option --db-check: Database was opened successfully, quitting.</span><br><span>diff --git a/tests/db_upgrade/db_upgrade_test.sh b/tests/db_upgrade/db_upgrade_test.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..189ebf3</span><br><span>--- /dev/null</span><br><span>+++ b/tests/db_upgrade/db_upgrade_test.sh</span><br><span>@@ -0,0 +1,82 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/sh</span><br><span style="color: hsl(120, 100%, 40%);">+srcdir="${1:-.}"</span><br><span style="color: hsl(120, 100%, 40%);">+builddir="${2:-.}"</span><br><span style="color: hsl(120, 100%, 40%);">+do_equivalence_test="$3"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+set -e</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+db="$builddir/test.db"</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_hlr="$builddir/../../src/osmo-hlr"</span><br><span style="color: hsl(120, 100%, 40%);">+cfg="$srcdir/osmo-hlr.cfg"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+rm -f "$db"</span><br><span style="color: hsl(120, 100%, 40%);">+echo "Creating db in schema version 0"</span><br><span style="color: hsl(120, 100%, 40%);">+sqlite3 "$db" < "$srcdir/hlr_db_v0.sql"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+echo</span><br><span style="color: hsl(120, 100%, 40%);">+echo "Version 0 db:"</span><br><span style="color: hsl(120, 100%, 40%);">+sqlite3 "$db" .dump</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+set +e</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+echo</span><br><span style="color: hsl(120, 100%, 40%);">+echo "Launching osmo-hlr to upgrade db:"</span><br><span style="color: hsl(120, 100%, 40%);">+echo osmo-hlr --database '$db' --db-upgrade --db-check --config-file '$srcdir/osmo-hlr.cfg'</span><br><span style="color: hsl(120, 100%, 40%);">+"$osmo_hlr" --database "$db" --db-upgrade --db-check --config-file "$cfg" >log 2>&1</span><br><span style="color: hsl(120, 100%, 40%);">+echo "rc = $?"</span><br><span style="color: hsl(120, 100%, 40%);">+cat log | sed 's@[^ "]*/@<PATH>@g'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+echo</span><br><span style="color: hsl(120, 100%, 40%);">+echo "Resulting db:"</span><br><span style="color: hsl(120, 100%, 40%);">+sqlite3 "$db" .dump</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+echo</span><br><span style="color: hsl(120, 100%, 40%);">+echo "Verify that osmo-hlr can open it:"</span><br><span style="color: hsl(120, 100%, 40%);">+echo osmo-hlr --database '$db' --db-check --config-file '$srcdir/osmo-hlr.cfg'</span><br><span style="color: hsl(120, 100%, 40%);">+"$osmo_hlr" --database "$db" --db-check --config-file "$cfg" >log 2>&1</span><br><span style="color: hsl(120, 100%, 40%);">+echo "rc = $?"</span><br><span style="color: hsl(120, 100%, 40%);">+cat log | sed 's@[^ "]*/@<PATH>@g'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+dump_sorted_schema(){</span><br><span style="color: hsl(120, 100%, 40%);">+      db_file="$1"</span><br><span style="color: hsl(120, 100%, 40%);">+        tables="$(sqlite3 "$db_file" "SELECT name FROM sqlite_master WHERE type = 'table' order by name")"</span><br><span style="color: hsl(120, 100%, 40%);">+      for table in $tables; do</span><br><span style="color: hsl(120, 100%, 40%);">+              echo</span><br><span style="color: hsl(120, 100%, 40%);">+          echo "Table: $table"</span><br><span style="color: hsl(120, 100%, 40%);">+                sqlite3 -header "$db_file" "SELECT name,type,\"notnull\",dflt_value,pk FROM PRAGMA_TABLE_INFO('$table') order by name;"</span><br><span style="color: hsl(120, 100%, 40%);">+         echo</span><br><span style="color: hsl(120, 100%, 40%);">+          echo "Table $table contents:"</span><br><span style="color: hsl(120, 100%, 40%);">+               columns="$(sqlite3 "$db_file" "SELECT name FROM PRAGMA_TABLE_INFO('$table') order by name;")"</span><br><span style="color: hsl(120, 100%, 40%);">+           sqlite3 -header "$db_file" "SELECT $(echo $columns | sed 's/ /,/g') from $table;"</span><br><span style="color: hsl(120, 100%, 40%);">+ done</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 [ -n "$do_equivalence_test" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+   # this part requires osmo_interact_vty.py, so this test is not part of the normal run</span><br><span style="color: hsl(120, 100%, 40%);">+ set -e -x</span><br><span style="color: hsl(120, 100%, 40%);">+     mint_db="$builddir/mint.db"</span><br><span style="color: hsl(120, 100%, 40%);">+ rm -f "$mint_db"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_verify_transcript_vty.py -v \</span><br><span style="color: hsl(120, 100%, 40%);">+            -n OsmoHLR -p 4258 \</span><br><span style="color: hsl(120, 100%, 40%);">+          -r "$osmo_hlr -c $cfg -l $mint_db" \</span><br><span style="color: hsl(120, 100%, 40%);">+                "$srcdir/create_subscribers.vty"</span><br><span style="color: hsl(120, 100%, 40%);">+    sqlite3 "$mint_db" < "$srcdir/create_subscribers_step2.sql"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  set +x</span><br><span style="color: hsl(120, 100%, 40%);">+        test_dump="$builddir/test.dump"</span><br><span style="color: hsl(120, 100%, 40%);">+     mint_dump="$builddir/mint.dump"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   dump_sorted_schema "$db" > "$test_dump"</span><br><span style="color: hsl(120, 100%, 40%);">+        dump_sorted_schema "$mint_db" > "$mint_dump"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ echo</span><br><span style="color: hsl(120, 100%, 40%);">+  echo "Newly created sorted schema is:"</span><br><span style="color: hsl(120, 100%, 40%);">+      cat "$mint_dump"</span><br><span style="color: hsl(120, 100%, 40%);">+    echo</span><br><span style="color: hsl(120, 100%, 40%);">+  echo "Diff to upgraded schema:"</span><br><span style="color: hsl(120, 100%, 40%);">+     diff -u "$mint_dump" "$test_dump"</span><br><span style="color: hsl(120, 100%, 40%);">+ echo "rc=$?"</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+rm -f "$db"</span><br><span>diff --git a/tests/db_upgrade/hlr_db_v0.sql b/tests/db_upgrade/hlr_db_v0.sql</span><br><span>new file mode 100644</span><br><span>index 0000000..87fcfd3</span><br><span>--- /dev/null</span><br><span>+++ b/tests/db_upgrade/hlr_db_v0.sql</span><br><span>@@ -0,0 +1,79 @@</span><br><span style="color: hsl(120, 100%, 40%);">+PRAGMA foreign_keys=OFF;</span><br><span style="color: hsl(120, 100%, 40%);">+BEGIN TRANSACTION;</span><br><span style="color: hsl(120, 100%, 40%);">+CREATE TABLE subscriber (</span><br><span style="color: hsl(120, 100%, 40%);">+-- OsmoHLR's DB scheme is modelled roughly after TS 23.008 version 13.3.0</span><br><span style="color: hsl(120, 100%, 40%);">+  id              INTEGER PRIMARY KEY,</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.1.1.1</span><br><span style="color: hsl(120, 100%, 40%);">+    imsi            VARCHAR(15) UNIQUE NOT NULL,</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.1.2</span><br><span style="color: hsl(120, 100%, 40%);">+      msisdn          VARCHAR(15) UNIQUE,</span><br><span style="color: hsl(120, 100%, 40%);">+   -- Chapter 2.2.3: Most recent / current IMEI</span><br><span style="color: hsl(120, 100%, 40%);">+  imeisv          VARCHAR,</span><br><span style="color: hsl(120, 100%, 40%);">+      -- Chapter 2.4.5</span><br><span style="color: hsl(120, 100%, 40%);">+      vlr_number      VARCHAR(15),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.4.6</span><br><span style="color: hsl(120, 100%, 40%);">+      hlr_number      VARCHAR(15),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.4.8.1</span><br><span style="color: hsl(120, 100%, 40%);">+    sgsn_number     VARCHAR(15),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.13.10</span><br><span style="color: hsl(120, 100%, 40%);">+    sgsn_address    VARCHAR,</span><br><span style="color: hsl(120, 100%, 40%);">+      -- Chapter 2.4.8.2</span><br><span style="color: hsl(120, 100%, 40%);">+    ggsn_number     VARCHAR(15),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.4.9.2</span><br><span style="color: hsl(120, 100%, 40%);">+    gmlc_number     VARCHAR(15),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.4.23</span><br><span style="color: hsl(120, 100%, 40%);">+     smsc_number     VARCHAR(15),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Chapter 2.4.24</span><br><span style="color: hsl(120, 100%, 40%);">+     periodic_lu_tmr INTEGER,</span><br><span style="color: hsl(120, 100%, 40%);">+      -- Chapter 2.13.115</span><br><span style="color: hsl(120, 100%, 40%);">+   periodic_rau_tau_tmr INTEGER,</span><br><span style="color: hsl(120, 100%, 40%);">+ -- Chapter 2.1.1.2: network access mode</span><br><span style="color: hsl(120, 100%, 40%);">+       nam_cs          BOOLEAN NOT NULL DEFAULT 1,</span><br><span style="color: hsl(120, 100%, 40%);">+   nam_ps          BOOLEAN NOT NULL DEFAULT 1,</span><br><span style="color: hsl(120, 100%, 40%);">+   -- Chapter 2.1.8</span><br><span style="color: hsl(120, 100%, 40%);">+      lmsi            INTEGER,</span><br><span style="color: hsl(120, 100%, 40%);">+      -- The below purged flags might not even be stored non-volatile,</span><br><span style="color: hsl(120, 100%, 40%);">+      -- refer to TS 23.012 Chapter 3.6.1.4</span><br><span style="color: hsl(120, 100%, 40%);">+ -- Chapter 2.7.5</span><br><span style="color: hsl(120, 100%, 40%);">+      ms_purged_cs    BOOLEAN NOT NULL DEFAULT 0,</span><br><span style="color: hsl(120, 100%, 40%);">+   -- Chapter 2.7.6</span><br><span style="color: hsl(120, 100%, 40%);">+      ms_purged_ps    BOOLEAN NOT NULL DEFAULT 0</span><br><span style="color: hsl(120, 100%, 40%);">+);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO subscriber VALUES(1,'123456789012345','098765432109876',NULL,'MSC-1',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,1,NULL,0,0);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO subscriber VALUES(2,'111111111',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,1,NULL,1,0);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO subscriber VALUES(3,'222222222','22222',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,1,NULL,0,1);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO subscriber VALUES(4,'333333','3',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,1,NULL,0,0);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO subscriber VALUES(5,'444444444444444','4444',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,0,NULL,0,0);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO subscriber VALUES(6,'5555555','55555555555555',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,NULL,0,0);</span><br><span style="color: hsl(120, 100%, 40%);">+CREATE TABLE subscriber_apn (</span><br><span style="color: hsl(120, 100%, 40%);">+        subscriber_id   INTEGER,                -- subscriber.id</span><br><span style="color: hsl(120, 100%, 40%);">+      apn             VARCHAR(256) NOT NULL</span><br><span style="color: hsl(120, 100%, 40%);">+);</span><br><span style="color: hsl(120, 100%, 40%);">+CREATE TABLE subscriber_multi_msisdn (</span><br><span style="color: hsl(120, 100%, 40%);">+-- Chapter 2.1.3</span><br><span style="color: hsl(120, 100%, 40%);">+   subscriber_id   INTEGER,                -- subscriber.id</span><br><span style="color: hsl(120, 100%, 40%);">+      msisdn          VARCHAR(15) NOT NULL</span><br><span style="color: hsl(120, 100%, 40%);">+);</span><br><span style="color: hsl(120, 100%, 40%);">+CREATE TABLE auc_2g (</span><br><span style="color: hsl(120, 100%, 40%);">+       subscriber_id   INTEGER PRIMARY KEY,    -- subscriber.id</span><br><span style="color: hsl(120, 100%, 40%);">+      algo_id_2g      INTEGER NOT NULL,       -- enum osmo_auth_algo value</span><br><span style="color: hsl(120, 100%, 40%);">+  ki              VARCHAR(32) NOT NULL    -- hex string: subscriber's secret key (128bit)</span><br><span style="color: hsl(120, 100%, 40%);">+);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO auc_2g VALUES(1,1,'BeefedCafeFaceAcedAddedDecadeFee');</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO auc_2g VALUES(4,2,'33333333333333333333333333333333');</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO auc_2g VALUES(6,4,'55555555555555555555555555555555');</span><br><span style="color: hsl(120, 100%, 40%);">+CREATE TABLE auc_3g (</span><br><span style="color: hsl(120, 100%, 40%);">+    subscriber_id   INTEGER PRIMARY KEY,    -- subscriber.id</span><br><span style="color: hsl(120, 100%, 40%);">+      algo_id_3g      INTEGER NOT NULL,       -- enum osmo_auth_algo value</span><br><span style="color: hsl(120, 100%, 40%);">+  k               VARCHAR(32) NOT NULL,   -- hex string: subscriber's secret key (128bit)</span><br><span style="color: hsl(120, 100%, 40%);">+   op              VARCHAR(32),            -- hex string: operator's secret key (128bit)</span><br><span style="color: hsl(120, 100%, 40%);">+     opc             VARCHAR(32),            -- hex string: derived from OP and K (128bit)</span><br><span style="color: hsl(120, 100%, 40%);">+ sqn             INTEGER NOT NULL DEFAULT 0,     -- sequence number of key usage</span><br><span style="color: hsl(120, 100%, 40%);">+       ind_bitlen      INTEGER NOT NULL DEFAULT 5      -- nr of index bits at lower SQN end</span><br><span style="color: hsl(120, 100%, 40%);">+);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO auc_3g VALUES(1,5,'C01ffedC1cadaeAc1d1f1edAcac1aB0a',NULL,'CededEffacedAceFacedBadFadedBeef',0,5);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO auc_3g VALUES(5,5,'44444444444444444444444444444444','44444444444444444444444444444444',NULL,0,5);</span><br><span style="color: hsl(120, 100%, 40%);">+INSERT INTO auc_3g VALUES(6,5,'55555555555555555555555555555555',NULL,'55555555555555555555555555555555',0,5);</span><br><span style="color: hsl(120, 100%, 40%);">+CREATE UNIQUE INDEX idx_subscr_imsi ON subscriber (imsi)</span><br><span style="color: hsl(120, 100%, 40%);">+;</span><br><span style="color: hsl(120, 100%, 40%);">+COMMIT;</span><br><span>diff --git a/tests/db_upgrade/osmo-hlr.cfg b/tests/db_upgrade/osmo-hlr.cfg</span><br><span>new file mode 100644</span><br><span>index 0000000..7fb12c1</span><br><span>--- /dev/null</span><br><span>+++ b/tests/db_upgrade/osmo-hlr.cfg</span><br><span>@@ -0,0 +1,6 @@</span><br><span style="color: hsl(120, 100%, 40%);">+log stderr</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level db notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging print category-hex 0</span><br><span style="color: hsl(120, 100%, 40%);">+ logging print file 0</span><br><span style="color: hsl(120, 100%, 40%);">+ logging print category 1</span><br><span style="color: hsl(120, 100%, 40%);">+ logging color 0</span><br><span>diff --git a/tests/testsuite.at b/tests/testsuite.at</span><br><span>index 70ae7ae..a8efe42 100644</span><br><span>--- a/tests/testsuite.at</span><br><span>+++ b/tests/testsuite.at</span><br><span>@@ -36,3 +36,10 @@</span><br><span> sqlite3 db_test.db < $abs_top_srcdir/sql/hlr.sql</span><br><span> AT_CHECK([$abs_top_builddir/tests/db/db_test], [], [expout], [experr])</span><br><span> AT_CLEANUP</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AT_SETUP([db_upgrade])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_KEYWORDS([db_upgrade])</span><br><span style="color: hsl(120, 100%, 40%);">+cat $abs_srcdir/db_upgrade/db_upgrade_test.ok > expout</span><br><span style="color: hsl(120, 100%, 40%);">+cat $abs_srcdir/db_upgrade/db_upgrade_test.err > experr</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CHECK([$abs_srcdir/db_upgrade/db_upgrade_test.sh $abs_srcdir/db_upgrade $abs_builddir/db_upgrade], [], [expout], [experr])</span><br><span style="color: hsl(120, 100%, 40%);">+AT_CLEANUP</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-hlr/+/15913">change 15913</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/c/osmo-hlr/+/15913"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-hlr </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I0961bab0e17cfde5b030576c5bc243c2b51d9dc4 </div>
<div style="display:none"> Gerrit-Change-Number: 15913 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>