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