===== test_subscr_create_update_sel_delete --- Create with valid / invalid IMSI db_subscr_create(dbc, imsi0, DB_SUBSCR_FLAG_NAM_CS | DB_SUBSCR_FLAG_NAM_PS) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', } db_subscr_create(dbc, imsi1, DB_SUBSCR_FLAG_NAM_CS | DB_SUBSCR_FLAG_NAM_PS) --> 0 db_subscr_get_by_imsi(dbc, imsi1, &g_subscr) --> 0 struct hlr_subscriber { .id = 2, .imsi = '123456789000001', } db_subscr_create(dbc, imsi2, DB_SUBSCR_FLAG_NAM_CS | DB_SUBSCR_FLAG_NAM_PS) --> 0 db_subscr_get_by_imsi(dbc, imsi2, &g_subscr) --> 0 struct hlr_subscriber { .id = 3, .imsi = '123456789000002', } db_subscr_create(dbc, imsi0, DB_SUBSCR_FLAG_NAM_CS | DB_SUBSCR_FLAG_NAM_PS) --> -EIO DAUC IMSI='123456789000000': Cannot create subscriber: SQL error: (2067) UNIQUE constraint failed: subscriber.imsi db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', } db_subscr_create(dbc, imsi1, DB_SUBSCR_FLAG_NAM_CS | DB_SUBSCR_FLAG_NAM_PS) --> -EIO DAUC IMSI='123456789000001': Cannot create subscriber: SQL error: (2067) UNIQUE constraint failed: subscriber.imsi db_subscr_create(dbc, imsi1, DB_SUBSCR_FLAG_NAM_CS | DB_SUBSCR_FLAG_NAM_PS) --> -EIO DAUC IMSI='123456789000001': Cannot create subscriber: SQL error: (2067) UNIQUE constraint failed: subscriber.imsi db_subscr_get_by_imsi(dbc, imsi1, &g_subscr) --> 0 struct hlr_subscriber { .id = 2, .imsi = '123456789000001', } db_subscr_create(dbc, imsi2, DB_SUBSCR_FLAG_NAM_CS | DB_SUBSCR_FLAG_NAM_PS) --> -EIO DAUC IMSI='123456789000002': Cannot create subscriber: SQL error: (2067) UNIQUE constraint failed: subscriber.imsi db_subscr_create(dbc, imsi2, DB_SUBSCR_FLAG_NAM_CS | DB_SUBSCR_FLAG_NAM_PS) --> -EIO DAUC IMSI='123456789000002': Cannot create subscriber: SQL error: (2067) UNIQUE constraint failed: subscriber.imsi db_subscr_get_by_imsi(dbc, imsi2, &g_subscr) --> 0 struct hlr_subscriber { .id = 3, .imsi = '123456789000002', } db_subscr_create(dbc, "123456789 000003", DB_SUBSCR_FLAG_NAM_CS | DB_SUBSCR_FLAG_NAM_PS) --> -EINVAL DAUC Cannot create subscriber: invalid IMSI: '123456789 000003' db_subscr_get_by_imsi(dbc, "123456789000003", &g_subscr) --> -ENOENT db_subscr_create(dbc, "123456789000002123456", DB_SUBSCR_FLAG_NAM_CS | DB_SUBSCR_FLAG_NAM_PS) --> -EINVAL DAUC Cannot create subscriber: invalid IMSI: '123456789000002123456' db_subscr_get_by_imsi(dbc, "123456789000002123456", &g_subscr) --> -ENOENT db_subscr_create(dbc, "foobar123", DB_SUBSCR_FLAG_NAM_CS | DB_SUBSCR_FLAG_NAM_PS) --> -EINVAL DAUC Cannot create subscriber: invalid IMSI: 'foobar123' db_subscr_get_by_imsi(dbc, "foobar123", &g_subscr) --> -ENOENT db_subscr_create(dbc, "123", DB_SUBSCR_FLAG_NAM_CS | DB_SUBSCR_FLAG_NAM_PS) --> -EINVAL DAUC Cannot create subscriber: invalid IMSI: '123' db_subscr_get_by_imsi(dbc, "123", &g_subscr) --> -ENOENT db_subscr_create(dbc, short_imsi, DB_SUBSCR_FLAG_NAM_CS | DB_SUBSCR_FLAG_NAM_PS) --> 0 db_subscr_get_by_imsi(dbc, short_imsi, &g_subscr) --> 0 struct hlr_subscriber { .id = 4, .imsi = '123456', } --- Check if subscriber exists (by IMSI) db_subscr_exists_by_imsi(dbc, imsi0) --> 0 db_subscr_exists_by_imsi(dbc, unknown_imsi) --> -ENOENT --- Set valid / invalid MSISDN db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', } db_subscr_update_msisdn_by_imsi(dbc, imsi0, "54321") --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '54321', } db_subscr_get_by_msisdn(dbc, "54321", &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '54321', } db_subscr_update_msisdn_by_imsi(dbc, imsi0, "54321012345678912345678") --> -EINVAL DAUC IMSI='123456789000000': Cannot update subscriber: invalid MSISDN: '54321012345678912345678' db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '54321', } db_subscr_get_by_msisdn(dbc, "54321", &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '54321', } db_subscr_get_by_msisdn(dbc, "54321012345678912345678", &g_subscr) --> -ENOENT db_subscr_update_msisdn_by_imsi(dbc, imsi0, "543 21") --> -EINVAL DAUC IMSI='123456789000000': Cannot update subscriber: invalid MSISDN: '543 21' db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '54321', } db_subscr_get_by_msisdn(dbc, "543 21", &g_subscr) --> -ENOENT db_subscr_update_msisdn_by_imsi(dbc, imsi0, "foobar123") --> -EINVAL DAUC IMSI='123456789000000': Cannot update subscriber: invalid MSISDN: 'foobar123' db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '54321', } db_subscr_get_by_msisdn(dbc, "foobar123", &g_subscr) --> -ENOENT db_subscr_update_msisdn_by_imsi(dbc, imsi0, "5") --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '5', } db_subscr_get_by_msisdn(dbc, "5", &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '5', } db_subscr_get_by_msisdn(dbc, "54321", &g_subscr) --> -ENOENT db_subscr_update_msisdn_by_imsi(dbc, imsi0, "543210123456789") --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', } db_subscr_get_by_msisdn(dbc, "543210123456789", &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', } db_subscr_update_msisdn_by_imsi(dbc, imsi0, "5432101234567891") --> -EINVAL DAUC IMSI='123456789000000': Cannot update subscriber: invalid MSISDN: '5432101234567891' db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', } db_subscr_get_by_msisdn(dbc, "5432101234567891", &g_subscr) --> -ENOENT --- Check if subscriber exists (by MSISDN) db_subscr_exists_by_msisdn(dbc, "543210123456789") --> 0 db_subscr_exists_by_msisdn(dbc, "5432101234567891") --> -ENOENT --- Set MSISDN on non-existent / invalid IMSI db_subscr_update_msisdn_by_imsi(dbc, unknown_imsi, "99") --> -ENOENT DAUC Cannot update MSISDN: no such subscriber: IMSI='999999999' db_subscr_get_by_msisdn(dbc, "99", &g_subscr) --> -ENOENT db_subscr_update_msisdn_by_imsi(dbc, "foobar", "99") --> -ENOENT DAUC Cannot update MSISDN: no such subscriber: IMSI='foobar' db_subscr_get_by_msisdn(dbc, "99", &g_subscr) --> -ENOENT --- Set valid / invalid IMEI db_subscr_update_imei_by_imsi(dbc, imsi0, "12345678901234") --> 0 db_subscr_get_by_imei(dbc, "12345678901234", &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .imei = '12345678901234', } db_subscr_update_imei_by_imsi(dbc, imsi0, "123456789012345") --> -EINVAL DAUC Cannot update subscriber IMSI='123456789000000': invalid IMEI: '123456789012345' db_subscr_get_by_imei(dbc, "12345678901234", &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .imei = '12345678901234', } db_subscr_get_by_imei(dbc, "123456789012345", &g_subscr) --> -ENOENT --- Set the same IMEI again db_subscr_update_imei_by_imsi(dbc, imsi0, "12345678901234") --> 0 db_subscr_get_by_imei(dbc, "12345678901234", &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .imei = '12345678901234', } --- Remove IMEI db_subscr_update_imei_by_imsi(dbc, imsi0, NULL) --> 0 db_subscr_get_by_imei(dbc, "12345678901234", &g_subscr) --> -ENOENT --- Set / unset nam_cs and nam_ps db_subscr_nam(dbc, imsi0, false, true) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .nam_ps = false, } db_subscr_nam(dbc, imsi0, false, false) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .nam_cs = false, .nam_ps = false, } db_subscr_nam(dbc, imsi0, true, false) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .nam_ps = false, } db_subscr_nam(dbc, imsi0, true, true) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', } --- Set / unset nam_cs and nam_ps *again* db_subscr_nam(dbc, imsi0, false, true) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .nam_ps = false, } db_subscr_nam(dbc, imsi0, false, true) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .nam_ps = false, } db_subscr_nam(dbc, imsi0, false, false) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .nam_cs = false, .nam_ps = false, } db_subscr_nam(dbc, imsi0, false, false) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .nam_cs = false, .nam_ps = false, } db_subscr_nam(dbc, imsi0, true, true) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .nam_cs = false, } db_subscr_nam(dbc, imsi0, true, true) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .nam_cs = false, } db_subscr_nam(dbc, imsi0, true, false) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', } db_subscr_nam(dbc, imsi0, true, false) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', } --- Set nam_cs and nam_ps on non-existent / invalid IMSI db_subscr_nam(dbc, unknown_imsi, false, true) --> -ENOENT DAUC Cannot disable PS: no such subscriber: IMSI='999999999' db_subscr_nam(dbc, unknown_imsi, false, false) --> -ENOENT DAUC Cannot disable CS: no such subscriber: IMSI='999999999' db_subscr_get_by_imsi(dbc, unknown_imsi, &g_subscr) --> -ENOENT db_subscr_nam(dbc, "foobar", false, true) --> -ENOENT DAUC Cannot disable PS: no such subscriber: IMSI='foobar' db_subscr_nam(dbc, "foobar", false, false) --> -ENOENT DAUC Cannot disable CS: no such subscriber: IMSI='foobar' --- Record LU for PS and CS (SGSN and VLR names) db_subscr_lu_str(dbc, id0, "5952", true) --> 0 db_subscr_get_by_id(dbc, id0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .sgsn_number = '5952', } db_subscr_lu_str(dbc, id0, "712", false) --> 0 db_subscr_get_by_id(dbc, id0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .vlr_number = '712', .sgsn_number = '5952', } --- Record LU for PS and CS (SGSN and VLR names) *again* db_subscr_lu_str(dbc, id0, "111", true) --> 0 db_subscr_get_by_id(dbc, id0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .vlr_number = '712', .sgsn_number = '111', } db_subscr_lu_str(dbc, id0, "111", true) --> 0 db_subscr_get_by_id(dbc, id0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .vlr_number = '712', .sgsn_number = '111', } db_subscr_lu_str(dbc, id0, "222", false) --> 0 db_subscr_get_by_id(dbc, id0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .vlr_number = '222', .sgsn_number = '111', } db_subscr_lu_str(dbc, id0, "222", false) --> 0 db_subscr_get_by_id(dbc, id0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .vlr_number = '222', .sgsn_number = '111', } --- Unset LU info for PS and CS (SGSN and VLR names) db_subscr_lu_str(dbc, id0, "", true) --> 0 db_subscr_get_by_id(dbc, id0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .vlr_number = '222', } db_subscr_lu_str(dbc, id0, "", false) --> 0 db_subscr_get_by_id(dbc, id0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', } db_subscr_lu_str(dbc, id0, "111", true) --> 0 db_subscr_lu_str(dbc, id0, "222", false) --> 0 db_subscr_get_by_id(dbc, id0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .vlr_number = '222', .sgsn_number = '111', } db_subscr_lu_str(dbc, id0, NULL, true) --> 0 db_subscr_get_by_id(dbc, id0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .vlr_number = '222', } db_subscr_lu_str(dbc, id0, NULL, false) --> 0 db_subscr_get_by_id(dbc, id0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', } --- Record LU for non-existent ID db_subscr_lu_str(dbc, 99999, "5952", true) --> -ENOENT DAUC Cannot update SGSN number for subscriber ID=99999: no such subscriber db_subscr_lu_str(dbc, 99999, "712", false) --> -ENOENT DAUC Cannot update VLR number for subscriber ID=99999: no such subscriber db_subscr_get_by_id(dbc, 99999, &g_subscr) --> -ENOENT --- Purge and un-purge PS and CS db_subscr_purge(dbc, imsi0, true, true) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .ms_purged_ps = true, } db_subscr_purge(dbc, imsi0, true, false) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .ms_purged_cs = true, .ms_purged_ps = true, } db_subscr_purge(dbc, imsi0, false, false) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .ms_purged_ps = true, } db_subscr_purge(dbc, imsi0, false, true) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', } --- Purge PS and CS *again* db_subscr_purge(dbc, imsi0, true, true) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .ms_purged_ps = true, } db_subscr_purge(dbc, imsi0, true, true) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .ms_purged_ps = true, } db_subscr_purge(dbc, imsi0, false, true) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', } db_subscr_purge(dbc, imsi0, false, true) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', } db_subscr_purge(dbc, imsi0, true, false) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .ms_purged_cs = true, } db_subscr_purge(dbc, imsi0, true, false) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', .ms_purged_cs = true, } db_subscr_purge(dbc, imsi0, false, false) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', } db_subscr_purge(dbc, imsi0, false, false) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', } --- Purge on non-existent / invalid IMSI db_subscr_purge(dbc, unknown_imsi, true, true) --> -ENOENT DAUC Cannot purge PS: no such subscriber: IMSI='999999999' db_subscr_get_by_imsi(dbc, unknown_imsi, &g_subscr) --> -ENOENT db_subscr_purge(dbc, unknown_imsi, true, false) --> -ENOENT DAUC Cannot purge CS: no such subscriber: IMSI='999999999' db_subscr_get_by_imsi(dbc, unknown_imsi, &g_subscr) --> -ENOENT --- Delete non-existent / invalid IDs db_subscr_delete_by_id(dbc, 999) --> -ENOENT DAUC Cannot delete: no such subscriber: ID=999 db_subscr_delete_by_id(dbc, -10) --> -ENOENT DAUC Cannot delete: no such subscriber: ID=-10 --- Delete subscribers db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .msisdn = '543210123456789', } db_subscr_delete_by_id(dbc, id0) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> -ENOENT db_subscr_delete_by_id(dbc, id0) --> -ENOENT DAUC Cannot delete: no such subscriber: ID=1 db_subscr_get_by_imsi(dbc, imsi1, &g_subscr) --> 0 struct hlr_subscriber { .id = 2, .imsi = '123456789000001', } db_subscr_delete_by_id(dbc, id1) --> 0 db_subscr_get_by_imsi(dbc, imsi1, &g_subscr) --> -ENOENT db_subscr_get_by_imsi(dbc, imsi2, &g_subscr) --> 0 struct hlr_subscriber { .id = 3, .imsi = '123456789000002', } db_subscr_delete_by_id(dbc, id2) --> 0 db_subscr_get_by_imsi(dbc, imsi2, &g_subscr) --> -ENOENT db_subscr_get_by_imsi(dbc, short_imsi, &g_subscr) --> 0 struct hlr_subscriber { .id = 4, .imsi = '123456', } db_subscr_delete_by_id(dbc, id_short) --> 0 db_subscr_get_by_imsi(dbc, short_imsi, &g_subscr) --> -ENOENT --- Create and delete subscribers with non-default nam_cs and nam_ps db_subscr_create(dbc, imsi0, 0x00) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', .nam_cs = false, .nam_ps = false, } db_subscr_create(dbc, imsi1, DB_SUBSCR_FLAG_NAM_CS) --> 0 db_subscr_get_by_imsi(dbc, imsi1, &g_subscr) --> 0 struct hlr_subscriber { .id = 2, .imsi = '123456789000001', .nam_ps = false, } db_subscr_create(dbc, imsi2, DB_SUBSCR_FLAG_NAM_PS) --> 0 db_subscr_get_by_imsi(dbc, imsi2, &g_subscr) --> 0 struct hlr_subscriber { .id = 3, .imsi = '123456789000002', .nam_cs = false, } db_subscr_delete_by_id(dbc, id0) --> 0 db_subscr_delete_by_id(dbc, id1) --> 0 db_subscr_delete_by_id(dbc, id2) --> 0 ===== test_subscr_create_update_sel_delete: SUCCESS ===== test_subscr_aud --- Get auth data for non-existent subscriber db_get_auth_data(dbc, unknown_imsi, &g_aud2g, &g_aud3g, &g_id) --> -2 DAUC IMSI='999999999': No such subscriber db_get_auc(dbc, imsi0, 3, vec, N_VECTORS, NULL, NULL, false) --> -2 DAUC IMSI='123456789000000': No such subscriber --- Create subscriber db_subscr_create(dbc, imsi0, DB_SUBSCR_FLAG_NAM_CS | DB_SUBSCR_FLAG_NAM_PS) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', } db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> -ENOKEY DAUC IMSI='123456789000000': No 2G Auth Data DAUC IMSI='123456789000000': No 3G Auth Data db_get_auc(dbc, imsi0, 3, vec, N_VECTORS, NULL, NULL, false) --> -ENOKEY DAUC IMSI='123456789000000': No 2G Auth Data DAUC IMSI='123456789000000': No 3G Auth Data --- Set auth data, 2G only db_subscr_update_aud_by_id(dbc, id, mk_aud_2g(OSMO_AUTH_ALG_COMP128v1, "0123456789abcdef0123456789abcdef")) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 DAUC IMSI='123456789000000': No 3G Auth Data 2G: struct osmo_sub_auth_data { .type = GSM, .algo = COMP128v1, .u.gsm.ki = '0123456789abcdef0123456789abcdef', } 3G: none db_get_auc(dbc, imsi0, 3, vec, N_VECTORS, NULL, NULL, false) --> 3 DAUC IMSI='123456789000000': No 3G Auth Data DAUC IMSI='123456789000000': Calling to generate 3 vectors DAUC IMSI='123456789000000': Generated 3 vectors db_subscr_update_aud_by_id(dbc, id, mk_aud_2g(OSMO_AUTH_ALG_COMP128v1, "0123456789abcdef0123456789abcdef")) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 DAUC IMSI='123456789000000': No 3G Auth Data 2G: struct osmo_sub_auth_data { .type = GSM, .algo = COMP128v1, .u.gsm.ki = '0123456789abcdef0123456789abcdef', } 3G: none db_subscr_update_aud_by_id(dbc, id, mk_aud_2g(OSMO_AUTH_ALG_COMP128v2, "BeadedBeeAced1EbbedDefacedFacade")) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 DAUC IMSI='123456789000000': No 3G Auth Data 2G: struct osmo_sub_auth_data { .type = GSM, .algo = COMP128v2, .u.gsm.ki = 'beadedbeeaced1ebbeddefacedfacade', } 3G: none db_subscr_update_aud_by_id(dbc, id, mk_aud_2g(OSMO_AUTH_ALG_COMP128v3, "DeafBeddedBabeAcceededFadedDecaf")) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 DAUC IMSI='123456789000000': No 3G Auth Data 2G: struct osmo_sub_auth_data { .type = GSM, .algo = COMP128v3, .u.gsm.ki = 'deafbeddedbabeacceededfadeddecaf', } 3G: none db_subscr_update_aud_by_id(dbc, id, mk_aud_2g(OSMO_AUTH_ALG_XOR, "CededEffacedAceFacedBadFadedBeef")) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 DAUC IMSI='123456789000000': No 3G Auth Data 2G: struct osmo_sub_auth_data { .type = GSM, .algo = XOR, .u.gsm.ki = 'cededeffacedacefacedbadfadedbeef', } 3G: none --- Remove 2G auth data db_subscr_update_aud_by_id(dbc, id, mk_aud_2g(OSMO_AUTH_ALG_NONE, NULL)) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> -ENOKEY DAUC IMSI='123456789000000': No 2G Auth Data DAUC IMSI='123456789000000': No 3G Auth Data db_get_auc(dbc, imsi0, 3, vec, N_VECTORS, NULL, NULL, false) --> -ENOKEY DAUC IMSI='123456789000000': No 2G Auth Data DAUC IMSI='123456789000000': No 3G Auth Data db_subscr_update_aud_by_id(dbc, id, mk_aud_2g(OSMO_AUTH_ALG_NONE, NULL)) --> -ENOENT db_subscr_update_aud_by_id(dbc, id, mk_aud_2g(OSMO_AUTH_ALG_XOR, "CededEffacedAceFacedBadFadedBeef")) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 DAUC IMSI='123456789000000': No 3G Auth Data 2G: struct osmo_sub_auth_data { .type = GSM, .algo = XOR, .u.gsm.ki = 'cededeffacedacefacedbadfadedbeef', } 3G: none db_subscr_update_aud_by_id(dbc, id, mk_aud_2g(OSMO_AUTH_ALG_NONE, "f000000000000f00000000000f000000")) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> -ENOKEY DAUC IMSI='123456789000000': No 2G Auth Data DAUC IMSI='123456789000000': No 3G Auth Data db_get_auc(dbc, imsi0, 3, vec, N_VECTORS, NULL, NULL, false) --> -ENOKEY DAUC IMSI='123456789000000': No 2G Auth Data DAUC IMSI='123456789000000': No 3G Auth Data --- Set auth data, 3G only db_subscr_update_aud_by_id(dbc, id, mk_aud_3g(OSMO_AUTH_ALG_MILENAGE, "BeefedCafeFaceAcedAddedDecadeFee", true, "C01ffedC1cadaeAc1d1f1edAcac1aB0a", 5)) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 DAUC IMSI='123456789000000': No 2G Auth Data 2G: none 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'beefedcafefaceacedaddeddecadefee', .u.umts.opc_is_op = 1, .u.umts.k = 'c01ffedc1cadaeac1d1f1edacac1ab0a', .u.umts.amf = '0000', .u.umts.ind_bitlen = 5, } db_get_auc(dbc, imsi0, 3, vec, N_VECTORS, NULL, NULL, false) --> 3 DAUC IMSI='123456789000000': No 2G Auth Data DAUC IMSI='123456789000000': Calling to generate 3 vectors DAUC IMSI='123456789000000': Generated 3 vectors DAUC IMSI='123456789000000': Updating SQN=0 in DB db_subscr_update_aud_by_id(dbc, id, mk_aud_3g(OSMO_AUTH_ALG_MILENAGE, "BeefedCafeFaceAcedAddedDecadeFee", true, "C01ffedC1cadaeAc1d1f1edAcac1aB0a", 5)) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 DAUC IMSI='123456789000000': No 2G Auth Data 2G: none 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'beefedcafefaceacedaddeddecadefee', .u.umts.opc_is_op = 1, .u.umts.k = 'c01ffedc1cadaeac1d1f1edacac1ab0a', .u.umts.amf = '0000', .u.umts.ind_bitlen = 5, } db_subscr_update_aud_by_id(dbc, id, mk_aud_3g(OSMO_AUTH_ALG_MILENAGE, "Deaf0ff1ceD0d0DabbedD1ced1ceF00d", true, "F1bbed0afD0eF0bD0ffed0ddF1fe0b0e", 0)) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 DAUC IMSI='123456789000000': No 2G Auth Data 2G: none 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'deaf0ff1ced0d0dabbedd1ced1cef00d', .u.umts.opc_is_op = 1, .u.umts.k = 'f1bbed0afd0ef0bd0ffed0ddf1fe0b0e', .u.umts.amf = '0000', } db_subscr_update_aud_by_id(dbc, id, mk_aud_3g(OSMO_AUTH_ALG_MILENAGE, "BeefedCafeFaceAcedAddedDecadeFee", false, "DeafBeddedBabeAcceededFadedDecaf", OSMO_MILENAGE_IND_BITLEN_MAX)) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 DAUC IMSI='123456789000000': No 2G Auth Data 2G: none 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'beefedcafefaceacedaddeddecadefee', .u.umts.opc_is_op = 0, .u.umts.k = 'deafbeddedbabeacceededfadeddecaf', .u.umts.amf = '0000', .u.umts.ind_bitlen = 28, } db_subscr_update_aud_by_id(dbc, id, mk_aud_3g(OSMO_AUTH_ALG_MILENAGE, "CededEffacedAceFacedBadFadedBeef", false, "BeefedCafeFaceAcedAddedDecadeFee", 5)) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 DAUC IMSI='123456789000000': No 2G Auth Data 2G: none 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'cededeffacedacefacedbadfadedbeef', .u.umts.opc_is_op = 0, .u.umts.k = 'beefedcafefaceacedaddeddecadefee', .u.umts.amf = '0000', .u.umts.ind_bitlen = 5, } --- Remove 3G auth data db_subscr_update_aud_by_id(dbc, id, mk_aud_3g(OSMO_AUTH_ALG_NONE, NULL, false, NULL, 0)) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> -ENOKEY DAUC IMSI='123456789000000': No 2G Auth Data DAUC IMSI='123456789000000': No 3G Auth Data db_get_auc(dbc, imsi0, 3, vec, N_VECTORS, NULL, NULL, false) --> -ENOKEY DAUC IMSI='123456789000000': No 2G Auth Data DAUC IMSI='123456789000000': No 3G Auth Data db_subscr_update_aud_by_id(dbc, id, mk_aud_3g(OSMO_AUTH_ALG_NONE, NULL, false, NULL, 0)) --> -ENOENT db_subscr_update_aud_by_id(dbc, id, mk_aud_3g(OSMO_AUTH_ALG_MILENAGE, "CededEffacedAceFacedBadFadedBeef", false, "BeefedCafeFaceAcedAddedDecadeFee", 5)) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 DAUC IMSI='123456789000000': No 2G Auth Data 2G: none 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'cededeffacedacefacedbadfadedbeef', .u.umts.opc_is_op = 0, .u.umts.k = 'beefedcafefaceacedaddeddecadefee', .u.umts.amf = '0000', .u.umts.ind_bitlen = 5, } db_get_auc(dbc, imsi0, 3, vec, N_VECTORS, NULL, NULL, false) --> 3 DAUC IMSI='123456789000000': No 2G Auth Data DAUC IMSI='123456789000000': Calling to generate 3 vectors DAUC IMSI='123456789000000': Generated 3 vectors DAUC IMSI='123456789000000': Updating SQN=0 in DB db_subscr_update_aud_by_id(dbc, id, mk_aud_3g(OSMO_AUTH_ALG_NONE, "asdfasdfasd", false, "asdfasdfasdf", 99999)) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> -ENOKEY DAUC IMSI='123456789000000': No 2G Auth Data DAUC IMSI='123456789000000': No 3G Auth Data db_get_auc(dbc, imsi0, 3, vec, N_VECTORS, NULL, NULL, false) --> -ENOKEY DAUC IMSI='123456789000000': No 2G Auth Data DAUC IMSI='123456789000000': No 3G Auth Data --- Set auth data, 2G and 3G db_subscr_update_aud_by_id(dbc, id, mk_aud_2g(OSMO_AUTH_ALG_COMP128v3, "CededEffacedAceFacedBadFadedBeef")) --> 0 db_subscr_update_aud_by_id(dbc, id, mk_aud_3g(OSMO_AUTH_ALG_MILENAGE, "BeefedCafeFaceAcedAddedDecadeFee", false, "DeafBeddedBabeAcceededFadedDecaf", 5)) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 2G: struct osmo_sub_auth_data { .type = GSM, .algo = COMP128v3, .u.gsm.ki = 'cededeffacedacefacedbadfadedbeef', } 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'beefedcafefaceacedaddeddecadefee', .u.umts.opc_is_op = 0, .u.umts.k = 'deafbeddedbabeacceededfadeddecaf', .u.umts.amf = '0000', .u.umts.ind_bitlen = 5, } db_get_auc(dbc, imsi0, 3, vec, N_VECTORS, NULL, NULL, false) --> 3 DAUC IMSI='123456789000000': Calling to generate 3 vectors DAUC IMSI='123456789000000': Generated 3 vectors DAUC IMSI='123456789000000': Updating SQN=0 in DB --- Set invalid auth data db_subscr_update_aud_by_id(dbc, id, mk_aud_2g(99999, "f000000000000f00000000000f000000")) --> -EINVAL DAUC Cannot update auth tokens: Unknown auth algo: 99999 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 2G: struct osmo_sub_auth_data { .type = GSM, .algo = COMP128v3, .u.gsm.ki = 'cededeffacedacefacedbadfadedbeef', } 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'beefedcafefaceacedaddeddecadefee', .u.umts.opc_is_op = 0, .u.umts.k = 'deafbeddedbabeacceededfadeddecaf', .u.umts.amf = '0000', .u.umts.ind_bitlen = 5, } db_subscr_update_aud_by_id(dbc, id, mk_aud_2g(OSMO_AUTH_ALG_XOR, "f000000000000f00000000000f000000f00000000")) --> -EINVAL DAUC Cannot update auth tokens: Invalid KI: 'f000000000000f00000000000f000000f00000000' db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 2G: struct osmo_sub_auth_data { .type = GSM, .algo = COMP128v3, .u.gsm.ki = 'cededeffacedacefacedbadfadedbeef', } 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'beefedcafefaceacedaddeddecadefee', .u.umts.opc_is_op = 0, .u.umts.k = 'deafbeddedbabeacceededfadeddecaf', .u.umts.amf = '0000', .u.umts.ind_bitlen = 5, } db_subscr_update_aud_by_id(dbc, id, mk_aud_2g(OSMO_AUTH_ALG_XOR, "f00")) --> -EINVAL DAUC Cannot update auth tokens: Invalid KI: 'f00' db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 2G: struct osmo_sub_auth_data { .type = GSM, .algo = COMP128v3, .u.gsm.ki = 'cededeffacedacefacedbadfadedbeef', } 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'beefedcafefaceacedaddeddecadefee', .u.umts.opc_is_op = 0, .u.umts.k = 'deafbeddedbabeacceededfadeddecaf', .u.umts.amf = '0000', .u.umts.ind_bitlen = 5, } db_subscr_update_aud_by_id(dbc, id, mk_aud_2g(OSMO_AUTH_ALG_MILENAGE, "0123456789abcdef0123456789abcdef")) --> -EINVAL DAUC Cannot update auth tokens: auth algo not suited for 2G: MILENAGE db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 2G: struct osmo_sub_auth_data { .type = GSM, .algo = COMP128v3, .u.gsm.ki = 'cededeffacedacefacedbadfadedbeef', } 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'beefedcafefaceacedaddeddecadefee', .u.umts.opc_is_op = 0, .u.umts.k = 'deafbeddedbabeacceededfadeddecaf', .u.umts.amf = '0000', .u.umts.ind_bitlen = 5, } db_subscr_update_aud_by_id(dbc, id, mk_aud_3g(OSMO_AUTH_ALG_MILENAGE, "0f000000000000f00000000000f000000", false, "f000000000000f00000000000f000000", 5)) --> -EINVAL DAUC Cannot update auth tokens: Invalid OP/OPC: '0f000000000000f00000000000f000000' db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 2G: struct osmo_sub_auth_data { .type = GSM, .algo = COMP128v3, .u.gsm.ki = 'cededeffacedacefacedbadfadedbeef', } 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'beefedcafefaceacedaddeddecadefee', .u.umts.opc_is_op = 0, .u.umts.k = 'deafbeddedbabeacceededfadeddecaf', .u.umts.amf = '0000', .u.umts.ind_bitlen = 5, } db_subscr_update_aud_by_id(dbc, id, mk_aud_3g(OSMO_AUTH_ALG_MILENAGE, "f000000000000f00000000000f000000", false, "000000000000f00000000000f000000", 5)) --> -EINVAL DAUC Cannot update auth tokens: Invalid K: '000000000000f00000000000f000000' db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 2G: struct osmo_sub_auth_data { .type = GSM, .algo = COMP128v3, .u.gsm.ki = 'cededeffacedacefacedbadfadedbeef', } 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'beefedcafefaceacedaddeddecadefee', .u.umts.opc_is_op = 0, .u.umts.k = 'deafbeddedbabeacceededfadeddecaf', .u.umts.amf = '0000', .u.umts.ind_bitlen = 5, } db_subscr_update_aud_by_id(dbc, id, mk_aud_3g(OSMO_AUTH_ALG_MILENAGE, "f000000000000f00000000000f000000", false, "f000000000000f00000000000f000000", OSMO_MILENAGE_IND_BITLEN_MAX + 1)) --> -EINVAL DAUC Cannot update auth tokens: Invalid ind_bitlen: 29 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 2G: struct osmo_sub_auth_data { .type = GSM, .algo = COMP128v3, .u.gsm.ki = 'cededeffacedacefacedbadfadedbeef', } 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'beefedcafefaceacedaddeddecadefee', .u.umts.opc_is_op = 0, .u.umts.k = 'deafbeddedbabeacceededfadeddecaf', .u.umts.amf = '0000', .u.umts.ind_bitlen = 5, } db_subscr_update_aud_by_id(dbc, id, mk_aud_3g(OSMO_AUTH_ALG_MILENAGE, "X000000000000f00000000000f000000", false, "f000000000000f00000000000f000000", 5)) --> -EINVAL DAUC Cannot update auth tokens: Invalid OP/OPC: 'X000000000000f00000000000f000000' db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 2G: struct osmo_sub_auth_data { .type = GSM, .algo = COMP128v3, .u.gsm.ki = 'cededeffacedacefacedbadfadedbeef', } 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'beefedcafefaceacedaddeddecadefee', .u.umts.opc_is_op = 0, .u.umts.k = 'deafbeddedbabeacceededfadeddecaf', .u.umts.amf = '0000', .u.umts.ind_bitlen = 5, } db_subscr_update_aud_by_id(dbc, id, mk_aud_3g(OSMO_AUTH_ALG_MILENAGE, "f000000000000f00000000000f000000", false, "f000000000000 f00000000000 f000000", 5)) --> -EINVAL DAUC Cannot update auth tokens: Invalid K: 'f000000000000 f00000000000 f000000' db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 2G: struct osmo_sub_auth_data { .type = GSM, .algo = COMP128v3, .u.gsm.ki = 'cededeffacedacefacedbadfadedbeef', } 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'beefedcafefaceacedaddeddecadefee', .u.umts.opc_is_op = 0, .u.umts.k = 'deafbeddedbabeacceededfadeddecaf', .u.umts.amf = '0000', .u.umts.ind_bitlen = 5, } --- Delete subscriber db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', } db_subscr_delete_by_id(dbc, id) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> -ENOENT --- Re-add subscriber and verify auth data didn't come back db_subscr_create(dbc, imsi0, DB_SUBSCR_FLAG_NAM_CS | DB_SUBSCR_FLAG_NAM_PS) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', } db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> -ENOKEY DAUC IMSI='123456789000000': No 2G Auth Data DAUC IMSI='123456789000000': No 3G Auth Data db_get_auc(dbc, imsi0, 3, vec, N_VECTORS, NULL, NULL, false) --> -ENOKEY DAUC IMSI='123456789000000': No 2G Auth Data DAUC IMSI='123456789000000': No 3G Auth Data db_subscr_delete_by_id(dbc, id) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> -ENOENT db_get_auc(dbc, imsi0, 3, vec, N_VECTORS, NULL, NULL, false) --> -2 DAUC IMSI='123456789000000': No such subscriber ===== test_subscr_aud: SUCCESS ===== test_subscr_aud_invalid_len --- Create subscriber db_subscr_create(dbc, imsi0, DB_SUBSCR_FLAG_NAM_CS | DB_SUBSCR_FLAG_NAM_PS) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', } --- Set auth data, 2G only, with invalid Ki length db_subscr_update_aud_by_id(dbc, id, mk_aud_2g(OSMO_AUTH_ALG_COMP128v1, "0123456789abcdef0123456789abcdef")) --> 0 raw SQL: UPDATE auc_2g SET ki = '0123456789abcdef0123456789abcde' sqlite3_prepare_v2(dbc->db, sql, -1, &stmt, NULL) --> SQLITE_OK sqlite3_step(stmt) --> SQLITE_DONE db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> -ENOKEY DAUC IMSI='123456789000000': Error reading Ki, expected length 16 but has length 15 DAUC IMSI='123456789000000': No 3G Auth Data --- Remove 2G auth data db_subscr_update_aud_by_id(dbc, id, mk_aud_2g(OSMO_AUTH_ALG_NONE, NULL)) --> 0 --- Set auth data, 3G only, with invalid K length db_subscr_update_aud_by_id(dbc, id, mk_aud_3g(OSMO_AUTH_ALG_MILENAGE, "BeefedCafeFaceAcedAddedDecadeFee", true, "C01ffedC1cadaeAc1d1f1edAcac1aB0a", 5)) --> 0 raw SQL: UPDATE auc_3g SET k = 'C01ffedC1cadaeAc1d1f1edAcac1aB0' sqlite3_prepare_v2(dbc->db, sql, -1, &stmt, NULL) --> SQLITE_OK sqlite3_step(stmt) --> SQLITE_DONE db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> -5 DAUC IMSI='123456789000000': No 2G Auth Data DAUC IMSI='123456789000000': Error reading K, expected length 16 but has length 15 --- Set auth data, 3G only, with invalid OP length db_subscr_update_aud_by_id(dbc, id, mk_aud_3g(OSMO_AUTH_ALG_MILENAGE, "BeefedCafeFaceAcedAddedDecadeFee", true, "C01ffedC1cadaeAc1d1f1edAcac1aB0a", 5)) --> 0 raw SQL: UPDATE auc_3g SET op = 'BeefedCafeFaceAcedAddedDecadeFe' sqlite3_prepare_v2(dbc->db, sql, -1, &stmt, NULL) --> SQLITE_OK sqlite3_step(stmt) --> SQLITE_DONE db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> -5 DAUC IMSI='123456789000000': No 2G Auth Data DAUC IMSI='123456789000000': Error reading OP, expected length 16 but has length 15 --- Set auth data, 3G only, with invalid OPC length db_subscr_update_aud_by_id(dbc, id, mk_aud_3g(OSMO_AUTH_ALG_MILENAGE, "BeefedCafeFaceAcedAddedDecadeFee", false, "C01ffedC1cadaeAc1d1f1edAcac1aB0a", 5)) --> 0 raw SQL: UPDATE auc_3g SET opc = 'BeefedCafeFaceAcedAddedDecadeFe' sqlite3_prepare_v2(dbc->db, sql, -1, &stmt, NULL) --> SQLITE_OK sqlite3_step(stmt) --> SQLITE_DONE db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> -5 DAUC IMSI='123456789000000': No 2G Auth Data DAUC IMSI='123456789000000': Error reading OPC, expected length 16 but has length 15 --- Delete subscriber db_subscr_delete_by_id(dbc, id) --> 0 ===== test_subscr_aud_invalid_len: SUCCESS ===== test_subscr_sqn --- Set SQN for unknown subscriber db_update_sqn(dbc, 99, 999) --> -ENOENT DAUC Cannot update SQN for subscriber ID=99: no auc_3g entry for such subscriber db_subscr_get_by_id(dbc, 99, &g_subscr) --> -ENOENT db_update_sqn(dbc, 9999, 99) --> -ENOENT DAUC Cannot update SQN for subscriber ID=9999: no auc_3g entry for such subscriber db_subscr_get_by_id(dbc, 9999, &g_subscr) --> -ENOENT --- Create subscriber db_subscr_create(dbc, imsi0, DB_SUBSCR_FLAG_NAM_CS | DB_SUBSCR_FLAG_NAM_PS) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', } db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> -ENOKEY DAUC IMSI='123456789000000': No 2G Auth Data DAUC IMSI='123456789000000': No 3G Auth Data --- Set SQN, but no 3G auth data present db_update_sqn(dbc, id, 123) --> -ENOENT DAUC Cannot update SQN for subscriber ID=1: no auc_3g entry for such subscriber db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> -ENOKEY DAUC IMSI='123456789000000': No 2G Auth Data DAUC IMSI='123456789000000': No 3G Auth Data db_update_sqn(dbc, id, 543) --> -ENOENT DAUC Cannot update SQN for subscriber ID=1: no auc_3g entry for such subscriber db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> -ENOKEY DAUC IMSI='123456789000000': No 2G Auth Data DAUC IMSI='123456789000000': No 3G Auth Data --- Set auth 3G data db_subscr_update_aud_by_id(dbc, id, mk_aud_3g(OSMO_AUTH_ALG_MILENAGE, "BeefedCafeFaceAcedAddedDecadeFee", true, "C01ffedC1cadaeAc1d1f1edAcac1aB0a", 5)) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 DAUC IMSI='123456789000000': No 2G Auth Data 2G: none 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'beefedcafefaceacedaddeddecadefee', .u.umts.opc_is_op = 1, .u.umts.k = 'c01ffedc1cadaeac1d1f1edacac1ab0a', .u.umts.amf = '0000', .u.umts.ind_bitlen = 5, } --- Set SQN db_update_sqn(dbc, id, 23315) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 DAUC IMSI='123456789000000': No 2G Auth Data 2G: none 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'beefedcafefaceacedaddeddecadefee', .u.umts.opc_is_op = 1, .u.umts.k = 'c01ffedc1cadaeac1d1f1edacac1ab0a', .u.umts.amf = '0000', .u.umts.sqn = 23315, .u.umts.sqn = 0x5b13, .u.umts.ind_bitlen = 5, } db_update_sqn(dbc, id, 23315) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 DAUC IMSI='123456789000000': No 2G Auth Data 2G: none 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'beefedcafefaceacedaddeddecadefee', .u.umts.opc_is_op = 1, .u.umts.k = 'c01ffedc1cadaeac1d1f1edacac1ab0a', .u.umts.amf = '0000', .u.umts.sqn = 23315, .u.umts.sqn = 0x5b13, .u.umts.ind_bitlen = 5, } db_update_sqn(dbc, id, 423) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 DAUC IMSI='123456789000000': No 2G Auth Data 2G: none 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'beefedcafefaceacedaddeddecadefee', .u.umts.opc_is_op = 1, .u.umts.k = 'c01ffedc1cadaeac1d1f1edacac1ab0a', .u.umts.amf = '0000', .u.umts.sqn = 423, .u.umts.sqn = 0x1a7, .u.umts.ind_bitlen = 5, } --- Set SQN: thru uint64_t range, using the int64_t SQLite bind db_update_sqn(dbc, id, 0) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 DAUC IMSI='123456789000000': No 2G Auth Data 2G: none 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'beefedcafefaceacedaddeddecadefee', .u.umts.opc_is_op = 1, .u.umts.k = 'c01ffedc1cadaeac1d1f1edacac1ab0a', .u.umts.amf = '0000', .u.umts.ind_bitlen = 5, } db_update_sqn(dbc, id, INT64_MAX) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 DAUC IMSI='123456789000000': No 2G Auth Data 2G: none 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'beefedcafefaceacedaddeddecadefee', .u.umts.opc_is_op = 1, .u.umts.k = 'c01ffedc1cadaeac1d1f1edacac1ab0a', .u.umts.amf = '0000', .u.umts.sqn = 9223372036854775807, .u.umts.sqn = 0x7fffffffffffffff, .u.umts.ind_bitlen = 5, } db_update_sqn(dbc, id, INT64_MIN) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 DAUC IMSI='123456789000000': No 2G Auth Data 2G: none 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'beefedcafefaceacedaddeddecadefee', .u.umts.opc_is_op = 1, .u.umts.k = 'c01ffedc1cadaeac1d1f1edacac1ab0a', .u.umts.amf = '0000', .u.umts.sqn = 9223372036854775808, .u.umts.sqn = 0x8000000000000000, .u.umts.ind_bitlen = 5, } db_update_sqn(dbc, id, UINT64_MAX) --> 0 db_get_auth_data(dbc, imsi0, &g_aud2g, &g_aud3g, &g_id) --> 0 DAUC IMSI='123456789000000': No 2G Auth Data 2G: none 3G: struct osmo_sub_auth_data { .type = UMTS, .algo = MILENAGE, .u.umts.opc = 'beefedcafefaceacedaddeddecadefee', .u.umts.opc_is_op = 1, .u.umts.k = 'c01ffedc1cadaeac1d1f1edacac1ab0a', .u.umts.amf = '0000', .u.umts.sqn = 18446744073709551615, .u.umts.sqn = 0xffffffffffffffff, .u.umts.ind_bitlen = 5, } --- Delete subscriber db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> 0 struct hlr_subscriber { .id = 1, .imsi = '123456789000000', } db_subscr_delete_by_id(dbc, id) --> 0 db_subscr_get_by_imsi(dbc, imsi0, &g_subscr) --> -ENOENT ===== test_subscr_sqn: SUCCESS ===== test_ind db_ind(dbc, &vlr, &ind) --> 0 "msc-23\0" ind = 1 db_ind(dbc, &vlr, &ind) --> 0 "sgsn-11\0" ind = 2 db_ind(dbc, &vlr, &ind) --> 0 "msc-42\0" ind = 3 db_ind(dbc, &vlr, &ind) --> 0 "sgsn-22\0" ind = 4 db_ind(dbc, &vlr, &ind) --> 0 "msc-0x17\0" ind = 5 db_ind(dbc, &vlr, &ind) --> 0 "sgsn-0xaa\0" ind = 6 db_ind(dbc, &vlr, &ind) --> 0 "msc-42\0" ind = 3 db_ind(dbc, &vlr, &ind) --> 0 "sgsn-22\0" ind = 4 db_ind(dbc, &vlr, &ind) --> 0 "msc-0x17\0" ind = 5 db_ind(dbc, &vlr, &ind) --> 0 "sgsn-0xaa\0" ind = 6 db_ind(dbc, &vlr, &ind) --> 0 "sgsn-0xbb\0" ind = 7 db_ind(dbc, &vlr, &ind) --> 0 "msc-0x2a\0" ind = 8 db_ind(dbc, &vlr, &ind) --> 0 "msc-42\0" ind = 3 db_ind(dbc, &vlr, &ind) --> 0 "sgsn-22\0" ind = 4 db_ind(dbc, &vlr, &ind) --> 0 "msc-23\0" ind = 1 db_ind(dbc, &vlr, &ind) --> 0 "sgsn-11\0" ind = 2 db_ind_del(dbc, &vlr) --> 0 "msc-0x17\0" ind deleted db_ind(dbc, &vlr, &ind) --> 0 "msc-0x2a\0" ind = 8 db_ind(dbc, &vlr, &ind) --> 0 "any-unknown\0" ind = 9 ===== test_ind: SUCCESS