diff options
Diffstat (limited to 'openbsc/tests')
-rw-r--r-- | openbsc/tests/Makefile.am | 4 | ||||
-rw-r--r-- | openbsc/tests/channel/Makefile.am | 1 | ||||
-rw-r--r-- | openbsc/tests/channel/channel_test.c | 74 | ||||
-rw-r--r-- | openbsc/tests/channel/channel_test.ok | 2 | ||||
-rw-r--r-- | openbsc/tests/db/db_test.c | 7 | ||||
-rw-r--r-- | openbsc/tests/mm_auth/mm_auth_test.c | 266 | ||||
-rw-r--r-- | openbsc/tests/mm_auth/mm_auth_test.ok | 41 | ||||
-rw-r--r-- | openbsc/tests/sms_queue/Makefile.am | 45 | ||||
-rw-r--r-- | openbsc/tests/sms_queue/sms_queue_test.c | 215 | ||||
-rw-r--r-- | openbsc/tests/sms_queue/sms_queue_test.err | 0 | ||||
-rw-r--r-- | openbsc/tests/sms_queue/sms_queue_test.ok | 98 | ||||
-rw-r--r-- | openbsc/tests/subscr/Makefile.am | 18 | ||||
-rw-r--r-- | openbsc/tests/subscr/subscr_test.c | 117 | ||||
-rw-r--r-- | openbsc/tests/subscr/subscr_test.ok | 3 | ||||
-rw-r--r-- | openbsc/tests/testsuite.at | 21 | ||||
-rw-r--r-- | openbsc/tests/vty_test_runner.py | 150 |
16 files changed, 403 insertions, 659 deletions
diff --git a/openbsc/tests/Makefile.am b/openbsc/tests/Makefile.am index 9cbc1c172..609cbab01 100644 --- a/openbsc/tests/Makefile.am +++ b/openbsc/tests/Makefile.am @@ -1,6 +1,5 @@ SUBDIRS = \ gsm0408 \ - db \ channel \ mgcp \ gprs \ @@ -10,6 +9,9 @@ SUBDIRS = \ subscr \ mm_auth \ nanobts_omlattr \ + vlr \ + subscr_conn \ + sms_queue \ $(NULL) if BUILD_NAT diff --git a/openbsc/tests/channel/Makefile.am b/openbsc/tests/channel/Makefile.am index ca470ace4..c7164b475 100644 --- a/openbsc/tests/channel/Makefile.am +++ b/openbsc/tests/channel/Makefile.am @@ -26,6 +26,7 @@ channel_test_SOURCES = \ channel_test_LDADD = \ $(top_builddir)/src/libmsc/libmsc.a \ $(top_builddir)/src/libbsc/libbsc.a \ + $(top_builddir)/src/libvlr/libvlr.a \ $(top_builddir)/src/libcommon-cs/libcommon-cs.a \ $(top_builddir)/src/libcommon/libcommon.a \ $(LIBOSMOCORE_LIBS) \ diff --git a/openbsc/tests/channel/channel_test.c b/openbsc/tests/channel/channel_test.c index 88293d0a8..f6869691c 100644 --- a/openbsc/tests/channel/channel_test.c +++ b/openbsc/tests/channel/channel_test.c @@ -29,68 +29,7 @@ #include <openbsc/abis_rsl.h> #include <openbsc/debug.h> #include <openbsc/gsm_subscriber.h> - -static int s_end = 0; -static struct gsm_subscriber_connection s_conn; -static void *s_data; -static gsm_cbfn *s_cbfn = NULL; - -/* our handler */ -static int subscr_cb(unsigned int hook, unsigned int event, struct msgb *msg, void *data, void *param) -{ - assert(hook == 101); - assert(event == 200); - assert(msg == (void*)0x1323L); - assert(data == &s_conn); - assert(param == (void*)0x2342L); - printf("Reached, didn't crash, test passed\n"); - s_end = true; - return 0; -} - -/* mock object for testing, directly invoke the cb... maybe later through the timer */ -int paging_request(struct gsm_bts *bts, struct bsc_subscr *bsub, int type, gsm_cbfn *cbfn, void *data) -{ - s_data = data; - s_cbfn = cbfn; - - /* claim we have patched */ - return 1; -} - - -void test_request_chan(void) -{ - struct gsm_network *network; - struct gsm_bts *bts; - - printf("Testing the gsm_subscriber chan logic\n"); - - /* Create a dummy network */ - network = bsc_network_init(tall_bsc_ctx, 1, 1, NULL); - if (!network) - exit(1); - bts = gsm_bts_alloc(network); - bts->location_area_code = 23; - s_conn.network = network; - - /* Create a dummy subscriber */ - struct gsm_subscriber *subscr = subscr_alloc(); - subscr->lac = 23; - subscr->group = network->subscr_group; - - OSMO_ASSERT(subscr->group); - OSMO_ASSERT(subscr->group->net == network); - - /* Ask for a channel... */ - struct subscr_request *sr; - sr = subscr_request_channel(subscr, RSL_CHANNEED_TCH_F, subscr_cb, (void*)0x2342L); - OSMO_ASSERT(sr); - OSMO_ASSERT(s_cbfn); - s_cbfn(101, 200, (void*)0x1323L, &s_conn, s_data); - - OSMO_ASSERT(s_end); -} +#include <openbsc/vlr.h> void test_dyn_ts_subslots(void) { @@ -126,7 +65,6 @@ int main(int argc, char **argv) { osmo_init_logging(&log_info); - test_request_chan(); test_dyn_ts_subslots(); return EXIT_SUCCESS; @@ -140,5 +78,13 @@ void gsm48_secure_channel() {} void paging_request_stop() {} void vty_out() {} -struct tlv_definition nm_att_tlvdef; +void ipa_client_conn_clear_queue() {} +void ipa_client_conn_close() {} +void ipa_client_conn_create() {} +void ipa_client_conn_destroy() {} +void ipa_client_conn_open() {} +void ipa_client_conn_send() {} +void ipa_msg_push_header() {} +void ipaccess_bts_handle_ccm() {} +struct tlv_definition nm_att_tlvdef; diff --git a/openbsc/tests/channel/channel_test.ok b/openbsc/tests/channel/channel_test.ok index 33c819350..e4d625a65 100644 --- a/openbsc/tests/channel/channel_test.ok +++ b/openbsc/tests/channel/channel_test.ok @@ -1,3 +1 @@ -Testing the gsm_subscriber chan logic -Reached, didn't crash, test passed Testing subslot numbers for pchan types diff --git a/openbsc/tests/db/db_test.c b/openbsc/tests/db/db_test.c index 755a6e9eb..a54f11b26 100644 --- a/openbsc/tests/db/db_test.c +++ b/openbsc/tests/db/db_test.c @@ -254,3 +254,10 @@ int main() /* stubs */ void vty_out() {} +void vlr_subscr_disconnected() {} +void vlr_subscr_rx_tmsi_reall_compl() {} +void vlr_subscr_rx_id_resp() {} +void vlr_subscr_rx_auth_resp() {} +void vlr_loc_update() {} +void vlr_proc_acc_req() {} +void vlr_init() {} diff --git a/openbsc/tests/mm_auth/mm_auth_test.c b/openbsc/tests/mm_auth/mm_auth_test.c index b8777a8c5..f620385f9 100644 --- a/openbsc/tests/mm_auth/mm_auth_test.c +++ b/openbsc/tests/mm_auth/mm_auth_test.c @@ -10,6 +10,7 @@ #define min(A,B) ((A)>(B)? (B) : (A)) +#if 0 static char *auth_tuple_str(struct gsm_auth_tuple *atuple) { static char buf[256]; @@ -60,10 +61,7 @@ static bool auth_tuple_is(struct gsm_auth_tuple *atuple, } return same; } - -/* override, requires '-Wl,--wrap=db_get_authinfo_for_subscr' */ -int __real_db_get_authinfo_for_subscr(struct gsm_auth_info *ainfo, - struct gsm_subscriber *subscr); +#endif int test_get_authinfo_rc = 0; struct gsm_auth_info test_auth_info = {0}; @@ -73,268 +71,14 @@ struct gsm_auth_info default_auth_info = { .a3a8_ki = { 0 } }; -int __wrap_db_get_authinfo_for_subscr(struct gsm_auth_info *ainfo, - struct gsm_subscriber *subscr) -{ - *ainfo = test_auth_info; - printf("wrapped: db_get_authinfo_for_subscr(): rc = %d\n", test_get_authinfo_rc); - return test_get_authinfo_rc; -} - -/* override, requires '-Wl,--wrap=db_get_lastauthtuple_for_subscr' */ -int __real_db_get_lastauthtuple_for_subscr(struct gsm_auth_tuple *atuple, - struct gsm_subscriber *subscr); - -int test_get_lastauthtuple_rc = 0; -struct gsm_auth_tuple test_last_auth_tuple = { 0 }; -struct gsm_auth_tuple default_auth_tuple = { 0 }; - -int __wrap_db_get_lastauthtuple_for_subscr(struct gsm_auth_tuple *atuple, - struct gsm_subscriber *subscr) -{ - *atuple = test_last_auth_tuple; - printf("wrapped: db_get_lastauthtuple_for_subscr(): rc = %d\n", test_get_lastauthtuple_rc); - return test_get_lastauthtuple_rc; -} - -/* override, requires '-Wl,--wrap=db_sync_lastauthtuple_for_subscr' */ -int __real_db_sync_lastauthtuple_for_subscr(struct gsm_auth_tuple *atuple, - struct gsm_subscriber *subscr); -int test_sync_lastauthtuple_rc = 0; -int __wrap_db_sync_lastauthtuple_for_subscr(struct gsm_auth_tuple *atuple, - struct gsm_subscriber *subscr) -{ - test_last_auth_tuple = *atuple; - printf("wrapped: db_sync_lastauthtuple_for_subscr(): rc = %d\n", test_sync_lastauthtuple_rc); - return test_sync_lastauthtuple_rc; -} - -int auth_get_tuple_for_subscr_verbose(struct gsm_auth_tuple *atuple, - struct gsm_subscriber *subscr, - int key_seq) -{ - int auth_action; - auth_action = auth_get_tuple_for_subscr(atuple, subscr, key_seq); - printf("auth_get_tuple_for_subscr(key_seq=%d) --> auth_action == %s\n", - key_seq, auth_action_str(auth_action)); - return auth_action; -} - -/* override libssl RAND_bytes() to get testable crypto results */ -int RAND_bytes(uint8_t *rand, int len) -{ - memset(rand, 23, len); - return 1; -} - -static void test_error() -{ - int auth_action; - - struct gsm_auth_tuple atuple = {0}; - struct gsm_subscriber subscr = {0}; - int key_seq = 0; - - printf("\n* test_error()\n"); - - /* any error (except -ENOENT) */ - test_get_authinfo_rc = -EIO; - auth_action = auth_get_tuple_for_subscr_verbose(&atuple, &subscr, - key_seq); - OSMO_ASSERT(auth_action == AUTH_ERROR); -} - -static void test_auth_not_avail() -{ - int auth_action; - - struct gsm_auth_tuple atuple = {0}; - struct gsm_subscriber subscr = {0}; - int key_seq = 0; - - printf("\n* test_auth_not_avail()\n"); - - /* no entry */ - test_get_authinfo_rc = -ENOENT; - auth_action = auth_get_tuple_for_subscr_verbose(&atuple, &subscr, - key_seq); - OSMO_ASSERT(auth_action == AUTH_NOT_AVAIL); -} - -static void test_auth_then_ciph1() -{ - int auth_action; - - struct gsm_auth_tuple atuple = {0}; - struct gsm_subscriber subscr = {0}; - int key_seq; - - printf("\n* test_auth_then_ciph1()\n"); - - /* Ki entry, but no auth tuple negotiated yet */ - test_auth_info = default_auth_info; - test_last_auth_tuple = default_auth_tuple; - test_get_authinfo_rc = 0; - test_get_lastauthtuple_rc = -ENOENT; - key_seq = 0; - auth_action = auth_get_tuple_for_subscr_verbose(&atuple, &subscr, - key_seq); - OSMO_ASSERT(auth_action == AUTH_DO_AUTH_THEN_CIPH); - OSMO_ASSERT(auth_tuple_is(&atuple, - "gsm_auth_tuple {\n" - " .use_count = 1\n" - " .key_seq = 0\n" - " .rand = 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 \n" - " .sres = a1 ab c6 90 \n" - " .kc = 0f 27 ed f3 ac 97 ac 00 \n" - "}\n" - )); - - /* With a different last saved key_seq stored in the out-arg of - * db_get_lastauthtuple_for_subscr() by coincidence, expect absolutely - * the same as above. */ - test_auth_info = default_auth_info; - test_last_auth_tuple = default_auth_tuple; - test_last_auth_tuple.key_seq = 3; - test_get_authinfo_rc = 0; - test_get_lastauthtuple_rc = -ENOENT; - key_seq = 0; - auth_action = auth_get_tuple_for_subscr_verbose(&atuple, &subscr, - key_seq); - OSMO_ASSERT(auth_action == AUTH_DO_AUTH_THEN_CIPH); - OSMO_ASSERT(auth_tuple_is(&atuple, - "gsm_auth_tuple {\n" - " .use_count = 1\n" - " .key_seq = 0\n" - " .rand = 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 \n" - " .sres = a1 ab c6 90 \n" - " .kc = 0f 27 ed f3 ac 97 ac 00 \n" - "}\n" - )); -} - -static void test_auth_then_ciph2() -{ - int auth_action; - - struct gsm_auth_tuple atuple = {0}; - struct gsm_subscriber subscr = {0}; - int key_seq; - - printf("\n* test_auth_then_ciph2()\n"); - - /* Ki entry, auth tuple negotiated, but invalid incoming key_seq */ - test_auth_info = default_auth_info; - test_last_auth_tuple = default_auth_tuple; - test_last_auth_tuple.key_seq = 2; - test_get_authinfo_rc = 0; - test_get_lastauthtuple_rc = 0; - key_seq = GSM_KEY_SEQ_INVAL; - auth_action = auth_get_tuple_for_subscr_verbose(&atuple, &subscr, - key_seq); - OSMO_ASSERT(auth_action == AUTH_DO_AUTH_THEN_CIPH); - OSMO_ASSERT(auth_tuple_is(&atuple, - "gsm_auth_tuple {\n" - " .use_count = 1\n" - " .key_seq = 3\n" - " .rand = 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 \n" - " .sres = a1 ab c6 90 \n" - " .kc = 0f 27 ed f3 ac 97 ac 00 \n" - "}\n" - )); - - /* Change the last saved key_seq, expect last_auth_tuple.key_seq + 1 */ - test_auth_info = default_auth_info; - test_last_auth_tuple = default_auth_tuple; - test_last_auth_tuple.key_seq = 3; - test_get_authinfo_rc = 0; - test_get_lastauthtuple_rc = 0; - key_seq = GSM_KEY_SEQ_INVAL; - auth_action = auth_get_tuple_for_subscr_verbose(&atuple, &subscr, - key_seq); - OSMO_ASSERT(auth_action == AUTH_DO_AUTH_THEN_CIPH); - OSMO_ASSERT(auth_tuple_is(&atuple, - "gsm_auth_tuple {\n" - " .use_count = 1\n" - " .key_seq = 4\n" - " .rand = 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 \n" - " .sres = a1 ab c6 90 \n" - " .kc = 0f 27 ed f3 ac 97 ac 00 \n" - "}\n" - )); -} - -static void test_auth_reuse() -{ - int auth_action; - struct gsm_auth_tuple atuple = {0}; - struct gsm_subscriber subscr = {0}; - int key_seq; - - printf("\n* test_auth_reuse()\n"); - - /* Ki entry, auth tuple negotiated, valid+matching incoming key_seq */ - test_auth_info = default_auth_info; - test_last_auth_tuple = default_auth_tuple; - test_last_auth_tuple.key_seq = key_seq = 3; - test_last_auth_tuple.use_count = 1; - test_get_authinfo_rc = 0; - test_get_lastauthtuple_rc = 0; - auth_action = auth_get_tuple_for_subscr_verbose(&atuple, &subscr, - key_seq); - OSMO_ASSERT(auth_action == AUTH_DO_CIPH); - OSMO_ASSERT(auth_tuple_is(&atuple, - "gsm_auth_tuple {\n" - " .use_count = 2\n" - " .key_seq = 3\n" - " .rand = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 \n" - " .sres = 00 00 00 00 \n" - " .kc = 00 00 00 00 00 00 00 00 \n" - "}\n" - )); -} - -static void test_auth_reuse_key_seq_mismatch() -{ - int auth_action; - struct gsm_auth_tuple atuple = {0}; - struct gsm_subscriber subscr = {0}; - int key_seq; - - printf("\n* test_auth_reuse_key_seq_mismatch()\n"); - - /* Ki entry, auth tuple negotiated, valid+matching incoming key_seq */ - test_auth_info = default_auth_info; - test_last_auth_tuple = default_auth_tuple; - test_last_auth_tuple.key_seq = 3; - key_seq = 4; - test_last_auth_tuple.use_count = 1; - test_get_authinfo_rc = 0; - test_get_lastauthtuple_rc = 0; - auth_action = auth_get_tuple_for_subscr_verbose(&atuple, &subscr, - key_seq); - OSMO_ASSERT(auth_action == AUTH_DO_AUTH_THEN_CIPH); - OSMO_ASSERT(auth_tuple_is(&atuple, - "gsm_auth_tuple {\n" - " .use_count = 1\n" - " .key_seq = 4\n" - " .rand = 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 \n" - " .sres = a1 ab c6 90 \n" - " .kc = 0f 27 ed f3 ac 97 ac 00 \n" - "}\n" - )); -} int main(void) { osmo_init_logging(&log_info); log_set_log_level(osmo_stderr_target, LOGL_INFO); - test_error(); - test_auth_not_avail(); - test_auth_then_ciph1(); - test_auth_then_ciph2(); - test_auth_reuse(); - test_auth_reuse_key_seq_mismatch(); + printf("Nothing being tested!\n"); + + /* TODO auth_get_tuple_for_subscr() no longer exists ... test auth somehow?? */ return 0; } diff --git a/openbsc/tests/mm_auth/mm_auth_test.ok b/openbsc/tests/mm_auth/mm_auth_test.ok index 6c49f97b7..37b1289be 100644 --- a/openbsc/tests/mm_auth/mm_auth_test.ok +++ b/openbsc/tests/mm_auth/mm_auth_test.ok @@ -1,40 +1 @@ - -* test_error() -wrapped: db_get_authinfo_for_subscr(): rc = -5 -auth_get_tuple_for_subscr(key_seq=0) --> auth_action == AUTH_ERROR - -* test_auth_not_avail() -wrapped: db_get_authinfo_for_subscr(): rc = -2 -auth_get_tuple_for_subscr(key_seq=0) --> auth_action == AUTH_NOT_AVAIL - -* test_auth_then_ciph1() -wrapped: db_get_authinfo_for_subscr(): rc = 0 -wrapped: db_get_lastauthtuple_for_subscr(): rc = -2 -wrapped: db_sync_lastauthtuple_for_subscr(): rc = 0 -auth_get_tuple_for_subscr(key_seq=0) --> auth_action == AUTH_DO_AUTH_THEN_CIPH -wrapped: db_get_authinfo_for_subscr(): rc = 0 -wrapped: db_get_lastauthtuple_for_subscr(): rc = -2 -wrapped: db_sync_lastauthtuple_for_subscr(): rc = 0 -auth_get_tuple_for_subscr(key_seq=0) --> auth_action == AUTH_DO_AUTH_THEN_CIPH - -* test_auth_then_ciph2() -wrapped: db_get_authinfo_for_subscr(): rc = 0 -wrapped: db_get_lastauthtuple_for_subscr(): rc = 0 -wrapped: db_sync_lastauthtuple_for_subscr(): rc = 0 -auth_get_tuple_for_subscr(key_seq=7) --> auth_action == AUTH_DO_AUTH_THEN_CIPH -wrapped: db_get_authinfo_for_subscr(): rc = 0 -wrapped: db_get_lastauthtuple_for_subscr(): rc = 0 -wrapped: db_sync_lastauthtuple_for_subscr(): rc = 0 -auth_get_tuple_for_subscr(key_seq=7) --> auth_action == AUTH_DO_AUTH_THEN_CIPH - -* test_auth_reuse() -wrapped: db_get_authinfo_for_subscr(): rc = 0 -wrapped: db_get_lastauthtuple_for_subscr(): rc = 0 -wrapped: db_sync_lastauthtuple_for_subscr(): rc = 0 -auth_get_tuple_for_subscr(key_seq=3) --> auth_action == AUTH_DO_CIPH - -* test_auth_reuse_key_seq_mismatch() -wrapped: db_get_authinfo_for_subscr(): rc = 0 -wrapped: db_get_lastauthtuple_for_subscr(): rc = 0 -wrapped: db_sync_lastauthtuple_for_subscr(): rc = 0 -auth_get_tuple_for_subscr(key_seq=4) --> auth_action == AUTH_DO_AUTH_THEN_CIPH +Nothing being tested! diff --git a/openbsc/tests/sms_queue/Makefile.am b/openbsc/tests/sms_queue/Makefile.am new file mode 100644 index 000000000..b2266ebb8 --- /dev/null +++ b/openbsc/tests/sms_queue/Makefile.am @@ -0,0 +1,45 @@ +AM_CPPFLAGS = \ + $(all_includes) \ + -I$(top_srcdir)/include \ + $(NULL) + +AM_CFLAGS = \ + -Wall \ + -ggdb3 \ + $(LIBOSMOCORE_CFLAGS) \ + $(LIBOSMOGSM_CFLAGS) \ + $(NULL) + +EXTRA_DIST = \ + sms_queue_test.ok \ + sms_queue_test.err \ + $(NULL) + +noinst_PROGRAMS = \ + sms_queue_test \ + $(NULL) + +sms_queue_test_SOURCES = \ + sms_queue_test.c \ + $(NULL) + +sms_queue_test_LDADD = \ + $(top_builddir)/src/libmsc/libmsc.a \ + $(top_builddir)/src/libvlr/libvlr.a \ + $(top_builddir)/src/libbsc/libbsc.a \ + $(top_builddir)/src/libtrau/libtrau.a \ + $(top_builddir)/src/libcommon/libcommon.a \ + $(top_builddir)/src/libcommon-cs/libcommon-cs.a \ + $(LIBSMPP34_LIBS) \ + $(LIBOSMOCORE_LIBS) \ + $(LIBOSMOGSM_LIBS) \ + $(LIBCRYPTO_LIBS) \ + $(LIBOSMOVTY_LIBS) \ + $(LIBOSMOABIS_LIBS) \ + -ldbi \ + -lrt \ + $(NULL) + +sms_queue_test_LDFLAGS = \ + -Wl,--wrap=db_sms_get_next_unsent_rr_msisdn \ + $(NULL) diff --git a/openbsc/tests/sms_queue/sms_queue_test.c b/openbsc/tests/sms_queue/sms_queue_test.c new file mode 100644 index 000000000..af25b0645 --- /dev/null +++ b/openbsc/tests/sms_queue/sms_queue_test.c @@ -0,0 +1,215 @@ +/* Test Osmocom SMS queue */ + +/* + * (C) 2017 by sysmocom s.f.m.c. GmbH + * All Rights Reserved + * + * Author: Neels Hofmeyr <nhofmeyr@sysmocom.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +#include <osmocom/core/application.h> + +#include <openbsc/debug.h> +#include <openbsc/vlr.h> + +static void *talloc_ctx = NULL; + +struct gsm_sms *smsq_take_next_sms(struct gsm_network *net, + char *last_msisdn, + size_t last_msisdn_buflen); + +static void _test_take_next_sms_print(int i, + struct gsm_sms *sms, + const char *last_msisdn) +{ + printf("#%d: ", i); + if (sms) + printf("sending SMS to %s", sms->text); + else + printf("no SMS to send"); + printf(" (last_msisdn='%s')\n", last_msisdn? last_msisdn : "NULL"); +} + +static struct gsm_sms fake_sms = { 0 }; + +struct { + const char *msisdn; + int nr_of_sms; + int failed_attempts; + bool vsub_attached; +} fake_sms_db[] = { + { + .msisdn = "1111", + .nr_of_sms = 0, + .vsub_attached = true, + }, + { + .msisdn = "2222", + .nr_of_sms = 2, + .failed_attempts = 2, + .vsub_attached = true, + }, + { + .msisdn = "3333", + .nr_of_sms = 2, + .failed_attempts = 3, + .vsub_attached = true, + }, + { + .msisdn = "4444", + .nr_of_sms = 0, + .vsub_attached = true, + }, + { + .msisdn = "5555", + .nr_of_sms = 2, + .failed_attempts = 5, + .vsub_attached = false, + }, +}; + +/* override, requires '-Wl,--wrap=db_sms_get_next_unsent_rr_msisdn' */ +struct gsm_sms *__real_db_sms_get_next_unsent_rr_msisdn(struct gsm_network *net, + const char *last_msisdn, + unsigned int max_failed); +struct gsm_sms *__wrap_db_sms_get_next_unsent_rr_msisdn(struct gsm_network *net, + const char *last_msisdn, + unsigned int max_failed) +{ + static struct vlr_subscr arbitrary_vsub = { .lu_complete = true }; + int i; + printf(" hitting database: looking for MSISDN > '%s', failed_attempts <= %d\n", + last_msisdn, max_failed); + + for (i = 0; i < ARRAY_SIZE(fake_sms_db); i++) { + if (!fake_sms_db[i].nr_of_sms) + continue; + if (strcmp(fake_sms_db[i].msisdn, last_msisdn) <= 0) + continue; + if (fake_sms_db[i].failed_attempts > max_failed) + continue; + osmo_strlcpy(fake_sms.dst.addr, fake_sms_db[i].msisdn, + sizeof(fake_sms.dst.addr)); + fake_sms.receiver = fake_sms_db[i].vsub_attached? &arbitrary_vsub : NULL; + osmo_strlcpy(fake_sms.text, fake_sms_db[i].msisdn, sizeof(fake_sms.text)); + if (fake_sms_db[i].vsub_attached) + fake_sms_db[i].nr_of_sms --; + return &fake_sms; + } + return NULL; +} + +void show_fake_sms_db() +{ + int i; + for (i = 0; i < ARRAY_SIZE(fake_sms_db); i++) { + printf(" %s%s has %u SMS pending, %u failed attempts\n", + fake_sms_db[i].msisdn, + fake_sms_db[i].vsub_attached ? "" : " (NOT attached)", + fake_sms_db[i].nr_of_sms, + fake_sms_db[i].failed_attempts); + } + printf("-->\n"); +} + +static void test_next_sms() +{ + int i; + char last_msisdn[GSM_EXTENSION_LENGTH+1] = ""; + + printf("Testing smsq_take_next_sms()\n"); + + printf("\n- vsub 2, 3 and 5 each have 2 SMS pending, but 5 is not attached\n"); + last_msisdn[0] = '\0'; + show_fake_sms_db(); + for (i = 0; i < 7; i++) { + struct gsm_sms *sms = smsq_take_next_sms(NULL, last_msisdn, sizeof(last_msisdn)); + _test_take_next_sms_print(i, sms, last_msisdn); + OSMO_ASSERT(i >= 4 || sms); + } + + printf("\n- SMS are pending at various nr failed attempts (cutoff at >= 10)\n"); + last_msisdn[0] = '\0'; + for (i = 0; i < ARRAY_SIZE(fake_sms_db); i++) { + fake_sms_db[i].vsub_attached = true; + fake_sms_db[i].nr_of_sms = 1 + i; + fake_sms_db[i].failed_attempts = i*5; + + } + show_fake_sms_db(); + for (i = 0; i < 7; i++) { + struct gsm_sms *sms = smsq_take_next_sms(NULL, last_msisdn, sizeof(last_msisdn)); + _test_take_next_sms_print(i, sms, last_msisdn); + OSMO_ASSERT(i >= 2 || sms); + } + + printf("\n- iterate the SMS DB at most once\n"); + osmo_strlcpy(last_msisdn, "2345", sizeof(last_msisdn)); + for (i = 0; i < ARRAY_SIZE(fake_sms_db); i++) { + fake_sms_db[i].vsub_attached = false; + fake_sms_db[i].nr_of_sms = 1; + fake_sms_db[i].failed_attempts = 0; + } + show_fake_sms_db(); + for (i = 0; i < 3; i++) { + struct gsm_sms *sms = smsq_take_next_sms(NULL, last_msisdn, sizeof(last_msisdn)); + _test_take_next_sms_print(i, sms, last_msisdn); + OSMO_ASSERT(!sms); + } + + printf("\n- there are no SMS in the DB\n"); + last_msisdn[0] = '\0'; + for (i = 0; i < ARRAY_SIZE(fake_sms_db); i++) { + fake_sms_db[i].vsub_attached = true; + fake_sms_db[i].nr_of_sms = 0; + fake_sms_db[i].failed_attempts = 0; + } + show_fake_sms_db(); + for (i = 0; i < 3; i++) { + struct gsm_sms *sms = smsq_take_next_sms(NULL, last_msisdn, sizeof(last_msisdn)); + _test_take_next_sms_print(i, sms, last_msisdn); + OSMO_ASSERT(!sms); + } +} + + +static struct log_info_cat sms_queue_test_categories[] = { +}; + +static struct log_info info = { + .cat = sms_queue_test_categories, + .num_cat = ARRAY_SIZE(sms_queue_test_categories), +}; + +int main(int argc, char **argv) +{ + talloc_ctx = talloc_named_const(NULL, 1, "sms_queue_test"); + msgb_talloc_ctx_init(talloc_ctx, 0); + osmo_init_logging(&info); + + OSMO_ASSERT(osmo_stderr_target); + log_set_use_color(osmo_stderr_target, 0); + log_set_print_timestamp(osmo_stderr_target, 0); + log_set_print_filename(osmo_stderr_target, 0); + log_set_print_category(osmo_stderr_target, 1); + log_parse_category_mask(osmo_stderr_target, "DLOAP,1"); + + test_next_sms(); + printf("Done\n"); + + return 0; +} diff --git a/openbsc/tests/sms_queue/sms_queue_test.err b/openbsc/tests/sms_queue/sms_queue_test.err new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/openbsc/tests/sms_queue/sms_queue_test.err diff --git a/openbsc/tests/sms_queue/sms_queue_test.ok b/openbsc/tests/sms_queue/sms_queue_test.ok new file mode 100644 index 000000000..146400d21 --- /dev/null +++ b/openbsc/tests/sms_queue/sms_queue_test.ok @@ -0,0 +1,98 @@ +Testing smsq_take_next_sms() + +- vsub 2, 3 and 5 each have 2 SMS pending, but 5 is not attached + 1111 has 0 SMS pending, 0 failed attempts + 2222 has 2 SMS pending, 2 failed attempts + 3333 has 2 SMS pending, 3 failed attempts + 4444 has 0 SMS pending, 0 failed attempts + 5555 (NOT attached) has 2 SMS pending, 5 failed attempts +--> + hitting database: looking for MSISDN > '', failed_attempts <= 9 +#0: sending SMS to 2222 (last_msisdn='2222') + hitting database: looking for MSISDN > '2222', failed_attempts <= 9 +#1: sending SMS to 3333 (last_msisdn='3333') + hitting database: looking for MSISDN > '3333', failed_attempts <= 9 + hitting database: looking for MSISDN > '5555', failed_attempts <= 9 + hitting database: looking for MSISDN > '', failed_attempts <= 9 +#2: sending SMS to 2222 (last_msisdn='2222') + hitting database: looking for MSISDN > '2222', failed_attempts <= 9 +#3: sending SMS to 3333 (last_msisdn='3333') + hitting database: looking for MSISDN > '3333', failed_attempts <= 9 + hitting database: looking for MSISDN > '5555', failed_attempts <= 9 + hitting database: looking for MSISDN > '', failed_attempts <= 9 +#4: no SMS to send (last_msisdn='5555') + hitting database: looking for MSISDN > '5555', failed_attempts <= 9 + hitting database: looking for MSISDN > '', failed_attempts <= 9 +#5: no SMS to send (last_msisdn='5555') + hitting database: looking for MSISDN > '5555', failed_attempts <= 9 + hitting database: looking for MSISDN > '', failed_attempts <= 9 +#6: no SMS to send (last_msisdn='5555') + +- SMS are pending at various nr failed attempts (cutoff at >= 10) + 1111 has 1 SMS pending, 0 failed attempts + 2222 has 2 SMS pending, 5 failed attempts + 3333 has 3 SMS pending, 10 failed attempts + 4444 has 4 SMS pending, 15 failed attempts + 5555 has 5 SMS pending, 20 failed attempts +--> + hitting database: looking for MSISDN > '', failed_attempts <= 9 +#0: sending SMS to 1111 (last_msisdn='1111') + hitting database: looking for MSISDN > '1111', failed_attempts <= 9 +#1: sending SMS to 2222 (last_msisdn='2222') + hitting database: looking for MSISDN > '2222', failed_attempts <= 9 + hitting database: looking for MSISDN > '', failed_attempts <= 9 +#2: sending SMS to 2222 (last_msisdn='2222') + hitting database: looking for MSISDN > '2222', failed_attempts <= 9 + hitting database: looking for MSISDN > '', failed_attempts <= 9 +#3: no SMS to send (last_msisdn='') + hitting database: looking for MSISDN > '', failed_attempts <= 9 +#4: no SMS to send (last_msisdn='') + hitting database: looking for MSISDN > '', failed_attempts <= 9 +#5: no SMS to send (last_msisdn='') + hitting database: looking for MSISDN > '', failed_attempts <= 9 +#6: no SMS to send (last_msisdn='') + +- iterate the SMS DB at most once + 1111 (NOT attached) has 1 SMS pending, 0 failed attempts + 2222 (NOT attached) has 1 SMS pending, 0 failed attempts + 3333 (NOT attached) has 1 SMS pending, 0 failed attempts + 4444 (NOT attached) has 1 SMS pending, 0 failed attempts + 5555 (NOT attached) has 1 SMS pending, 0 failed attempts +--> + hitting database: looking for MSISDN > '2345', failed_attempts <= 9 + hitting database: looking for MSISDN > '3333', failed_attempts <= 9 + hitting database: looking for MSISDN > '4444', failed_attempts <= 9 + hitting database: looking for MSISDN > '5555', failed_attempts <= 9 + hitting database: looking for MSISDN > '', failed_attempts <= 9 + hitting database: looking for MSISDN > '1111', failed_attempts <= 9 + hitting database: looking for MSISDN > '2222', failed_attempts <= 9 +#0: no SMS to send (last_msisdn='3333') + hitting database: looking for MSISDN > '3333', failed_attempts <= 9 + hitting database: looking for MSISDN > '4444', failed_attempts <= 9 + hitting database: looking for MSISDN > '5555', failed_attempts <= 9 + hitting database: looking for MSISDN > '', failed_attempts <= 9 + hitting database: looking for MSISDN > '1111', failed_attempts <= 9 + hitting database: looking for MSISDN > '2222', failed_attempts <= 9 +#1: no SMS to send (last_msisdn='3333') + hitting database: looking for MSISDN > '3333', failed_attempts <= 9 + hitting database: looking for MSISDN > '4444', failed_attempts <= 9 + hitting database: looking for MSISDN > '5555', failed_attempts <= 9 + hitting database: looking for MSISDN > '', failed_attempts <= 9 + hitting database: looking for MSISDN > '1111', failed_attempts <= 9 + hitting database: looking for MSISDN > '2222', failed_attempts <= 9 +#2: no SMS to send (last_msisdn='3333') + +- there are no SMS in the DB + 1111 has 0 SMS pending, 0 failed attempts + 2222 has 0 SMS pending, 0 failed attempts + 3333 has 0 SMS pending, 0 failed attempts + 4444 has 0 SMS pending, 0 failed attempts + 5555 has 0 SMS pending, 0 failed attempts +--> + hitting database: looking for MSISDN > '', failed_attempts <= 9 +#0: no SMS to send (last_msisdn='') + hitting database: looking for MSISDN > '', failed_attempts <= 9 +#1: no SMS to send (last_msisdn='') + hitting database: looking for MSISDN > '', failed_attempts <= 9 +#2: no SMS to send (last_msisdn='') +Done diff --git a/openbsc/tests/subscr/Makefile.am b/openbsc/tests/subscr/Makefile.am index 6342444ff..5b770bcb2 100644 --- a/openbsc/tests/subscr/Makefile.am +++ b/openbsc/tests/subscr/Makefile.am @@ -18,32 +18,14 @@ AM_LDFLAGS = \ $(NULL) EXTRA_DIST = \ - subscr_test.ok \ bsc_subscr_test.ok \ bsc_subscr_test.err \ $(NULL) noinst_PROGRAMS = \ - subscr_test \ bsc_subscr_test \ $(NULL) -subscr_test_SOURCES = \ - subscr_test.c \ - $(NULL) - -subscr_test_LDADD = \ - $(top_builddir)/src/libbsc/libbsc.a \ - $(top_builddir)/src/libcommon-cs/libcommon-cs.a \ - $(top_builddir)/src/libtrau/libtrau.a \ - $(top_builddir)/src/libcommon/libcommon.a \ - $(LIBOSMOCORE_LIBS) \ - $(LIBOSMOABIS_LIBS) \ - $(LIBOSMOGSM_LIBS) \ - $(LIBSMPP34_LIBS) \ - $(LIBOSMOVTY_LIBS) \ - $(NULL) - bsc_subscr_test_SOURCES = \ bsc_subscr_test.c \ $(NULL) diff --git a/openbsc/tests/subscr/subscr_test.c b/openbsc/tests/subscr/subscr_test.c deleted file mode 100644 index 2a5d0e1c2..000000000 --- a/openbsc/tests/subscr/subscr_test.c +++ /dev/null @@ -1,117 +0,0 @@ -/* (C) 2008 by Jan Luebbe <jluebbe@debian.org> - * (C) 2009 by Holger Hans Peter Freyther <zecke@selfish.org> - * (C) 2014 by Alexander Chemeris <Alexander.Chemeris@fairwaves.co> - * All Rights Reserved - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include <openbsc/debug.h> -#include <openbsc/db.h> -#include <openbsc/gsm_subscriber.h> -#include <openbsc/gsm_04_11.h> - -#include <osmocom/core/application.h> - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <inttypes.h> - -static struct gsm_network dummy_net; -static struct gsm_subscriber_group dummy_sgrp; - -static void test_subscr(void) -{ - struct gsm_subscriber *subscr; - const char *imsi = "1234567890"; - - printf("Test subscriber allocation and deletion\n"); - - /* Don't keep subscr */ - - dummy_sgrp.keep_subscr = 0; - - OSMO_ASSERT(llist_empty(&active_subscribers)); - - subscr = subscr_get_or_create(&dummy_sgrp, imsi); - - OSMO_ASSERT(!llist_empty(&active_subscribers)); - OSMO_ASSERT(subscr->use_count == 1); - - subscr_put(subscr); - - OSMO_ASSERT(llist_empty(&active_subscribers)); - - /* Keep subscr */ - - dummy_sgrp.keep_subscr = 1; - - subscr = subscr_get_or_create(&dummy_sgrp, imsi); - - OSMO_ASSERT(!llist_empty(&active_subscribers)); - OSMO_ASSERT(subscr->use_count == 1); - - subscr_put(subscr); - OSMO_ASSERT(!llist_empty(&active_subscribers)); - OSMO_ASSERT(subscr->use_count == 0); - - subscr_get(subscr); - OSMO_ASSERT(subscr->use_count == 1); - - subscr_purge_inactive(&dummy_sgrp); - - OSMO_ASSERT(!llist_empty(&active_subscribers)); - OSMO_ASSERT(subscr->use_count == 1); - - subscr_put(subscr); - OSMO_ASSERT(!llist_empty(&active_subscribers)); - OSMO_ASSERT(subscr->use_count == 0); - - subscr_purge_inactive(&dummy_sgrp); - - OSMO_ASSERT(llist_empty(&active_subscribers)); - - /* Test force_no_keep */ - - dummy_sgrp.keep_subscr = 0; - - subscr = subscr_get_or_create(&dummy_sgrp, imsi); - OSMO_ASSERT(subscr); - subscr->keep_in_ram = 1; - - OSMO_ASSERT(!llist_empty(&active_subscribers)); - OSMO_ASSERT(subscr->use_count == 1); - - subscr->keep_in_ram = 0; - - subscr_put(subscr); - OSMO_ASSERT(llist_empty(&active_subscribers)); -} - -int main() -{ - printf("Testing subscriber core code.\n"); - osmo_init_logging(&log_info); - log_set_print_filename(osmo_stderr_target, 0); - - dummy_net.subscr_group = &dummy_sgrp; - dummy_sgrp.net = &dummy_net; - - test_subscr(); - - printf("Done\n"); - return 0; -} diff --git a/openbsc/tests/subscr/subscr_test.ok b/openbsc/tests/subscr/subscr_test.ok deleted file mode 100644 index 72a376944..000000000 --- a/openbsc/tests/subscr/subscr_test.ok +++ /dev/null @@ -1,3 +0,0 @@ -Testing subscriber core code. -Test subscriber allocation and deletion -Done diff --git a/openbsc/tests/testsuite.at b/openbsc/tests/testsuite.at index 280aeb2ed..5f0471d69 100644 --- a/openbsc/tests/testsuite.at +++ b/openbsc/tests/testsuite.at @@ -7,12 +7,6 @@ cat $abs_srcdir/gsm0408/gsm0408_test.ok > expout AT_CHECK([$abs_top_builddir/tests/gsm0408/gsm0408_test], [], [expout], [ignore]) AT_CLEANUP -AT_SETUP([subscr]) -AT_KEYWORDS([subscr]) -cat $abs_srcdir/subscr/subscr_test.ok > expout -AT_CHECK([$abs_top_builddir/tests/subscr/subscr_test], [], [expout], [ignore]) -AT_CLEANUP - AT_SETUP([bsc_subscr]) AT_KEYWORDS([bsc_subscr]) cat $abs_srcdir/subscr/bsc_subscr_test.ok > expout @@ -20,14 +14,6 @@ cat $abs_srcdir/subscr/bsc_subscr_test.err > experr AT_CHECK([$abs_top_builddir/tests/subscr/bsc_subscr_test], [], [expout], [experr]) AT_CLEANUP -AT_SETUP([db]) -AT_KEYWORDS([db]) -cat $abs_srcdir/db/db_test.ok > expout -cat $abs_srcdir/db/db_test.err > experr -cat $abs_srcdir/db/hlr.sqlite3 > hlr.sqlite3 -AT_CHECK([$abs_top_builddir/tests/db/db_test], [], [expout], [experr]) -AT_CLEANUP - AT_SETUP([channel]) AT_KEYWORDS([channel]) cat $abs_srcdir/channel/channel_test.ok > expout @@ -165,3 +151,10 @@ AT_KEYWORDS([nanobts_omlattr]) cat $abs_srcdir/nanobts_omlattr/nanobts_omlattr_test.ok > expout AT_CHECK([$abs_top_builddir/tests/nanobts_omlattr/nanobts_omlattr_test], [], [expout], [ignore]) AT_CLEANUP + +AT_SETUP([sms_queue_test]) +AT_KEYWORDS([sms_queue_test]) +cat $abs_srcdir/sms_queue/sms_queue_test.ok > expout +cat $abs_srcdir/sms_queue/sms_queue_test.err > experr +AT_CHECK([$abs_top_builddir/tests/sms_queue/sms_queue_test], [], [expout], [experr]) +AT_CLEANUP diff --git a/openbsc/tests/vty_test_runner.py b/openbsc/tests/vty_test_runner.py index 305c956d7..c921518c7 100644 --- a/openbsc/tests/vty_test_runner.py +++ b/openbsc/tests/vty_test_runner.py @@ -250,8 +250,10 @@ class TestVTYNITB(TestVTYGenericBSC): self.vty.command("end") self.vty.command("configure terminal") self.vty.command("nitb") - self.assertTrue(self.vty.verify("subscriber-create-on-demand", [''])) - self.assertTrue(self.vty.verify("subscriber-create-on-demand no-extension", [''])) + self.assertTrue(self.vty.verify('subscriber-create-on-demand', + ["% 'subscriber-create-on-demand' is no longer supported.", '% This is now up to osmo-hlr.'])) + self.assertTrue(self.vty.verify("subscriber-create-on-demand no-extension", + ["% 'subscriber-create-on-demand' is no longer supported.", '% This is now up to osmo-hlr.'])) self.vty.command("end") def testSi2Q(self): @@ -367,42 +369,6 @@ class TestVTYNITB(TestVTYGenericBSC): if classNum != 10: self.assertEquals(res.find("rach access-control-class " + str(classNum) + " barred"), -1) - def testSubscriberCreateDeleteTwice(self): - """ - OS#1657 indicates that there might be an issue creating the - same subscriber twice. This test will use the VTY command to - create a subscriber and then issue a second create command - with the same IMSI. The test passes if the VTY continues to - respond to VTY commands. - """ - self.vty.enable() - - imsi = "204300854013739" - - # Initially we don't have this subscriber - self.vty.verify('show subscriber imsi '+imsi, ['% No subscriber found for imsi '+imsi]) - - # Lets create one - res = self.vty.command('subscriber create imsi '+imsi) - self.assert_(res.find(" IMSI: "+imsi) > 0) - # And now create one again. - res2 = self.vty.command('subscriber create imsi '+imsi) - self.assert_(res2.find(" IMSI: "+imsi) > 0) - self.assertEqual(res, res2) - - # Verify it has been created - res = self.vty.command('show subscriber imsi '+imsi) - self.assert_(res.find(" IMSI: "+imsi) > 0) - - # Delete it - res = self.vty.command('subscriber imsi ' + imsi + ' delete') - self.assert_("" == res) - - # Now it should not be there anymore - res = self.vty.command('show subscriber imsi '+imsi) - self.assert_(('% No subscriber found for imsi ' + imsi) == res) - - def testSubscriberCreateDelete(self): self.vty.enable() @@ -412,118 +378,24 @@ class TestVTYNITB(TestVTYGenericBSC): imsi4 = "444583744053764" # Initially we don't have this subscriber - self.vty.verify('show subscriber imsi '+imsi, ['% No subscriber found for imsi '+imsi]) - - # Lets create one - res = self.vty.command('subscriber create imsi '+imsi) - self.assert_(res.find(" IMSI: "+imsi) > 0) - self.assert_(res.find("Extension") > 0) - - # Now we have it - res = self.vty.command('show subscriber imsi '+imsi) - self.assert_(res.find(" IMSI: "+imsi) > 0) + self.assertTrue(self.vty.verify('show subscriber imsi '+imsi, ['% No subscriber found for imsi '+imsi])) - # With narrow random interval - self.vty.command("configure terminal") - self.vty.command("nitb") - self.assertTrue(self.vty.verify("subscriber-create-on-demand", [''])) - # wrong interval - res = self.vty.command("subscriber-create-on-demand random 221 122") - # error string will contain arguments - self.assert_(res.find("122") > 0) - self.assert_(res.find("221") > 0) - # correct interval - silent ok - self.assertTrue(self.vty.verify("subscriber-create-on-demand random 221 222", [''])) - self.vty.command("end") - - res = self.vty.command('subscriber create imsi ' + imsi2) - self.assert_(res.find(" IMSI: " + imsi2) > 0) - self.assert_(res.find("221") > 0 or res.find("222") > 0) - self.assert_(res.find(" Extension: ") > 0) - - # Without extension - self.vty.command("configure terminal") - self.vty.command("nitb") - self.assertTrue(self.vty.verify("subscriber-create-on-demand no-extension", [''])) - self.vty.command("end") - res = self.vty.command('subscriber create imsi ' + imsi3) - self.assert_(res.find(" IMSI: " + imsi3) > 0) - self.assertEquals(res.find("Extension"), -1) - - # With extension again - self.vty.command("configure terminal") - self.vty.command("nitb") - self.assertTrue(self.vty.verify("no subscriber-create-on-demand", [''])) - self.assertTrue(self.vty.verify("subscriber-create-on-demand", [''])) - self.assertTrue(self.vty.verify("subscriber-create-on-demand random 221 666", [''])) - self.vty.command("end") - - res = self.vty.command('subscriber create imsi ' + imsi4) - self.assert_(res.find(" IMSI: " + imsi4) > 0) - self.assert_(res.find(" Extension: ") > 0) - - # Delete it - res = self.vty.command('subscriber imsi ' + imsi + ' delete') - self.assert_("" == res) - res = self.vty.command('subscriber imsi ' + imsi2 + ' delete') - self.assert_("" == res) - res = self.vty.command('subscriber imsi ' + imsi3 + ' delete') - self.assert_("" == res) - res = self.vty.command('subscriber imsi ' + imsi4 + ' delete') - self.assert_("" == res) - - # Now it should not be there anymore - res = self.vty.command('show subscriber imsi '+imsi) - self.assert_(('% No subscriber found for imsi ' + imsi) == res) + # deprecated + self.assertTrue(self.vty.verify('subscriber create imsi '+imsi, ["% 'subscriber create' now needs to be done at osmo-hlr"])) def testSubscriberSettings(self): self.vty.enable() imsi = "204300854013739" - imsi2 = "204301824913769" - wrong_imsi = "204300999999999" - - # Lets create one - res = self.vty.command('subscriber create imsi '+imsi) - self.assert_(res.find(" IMSI: "+imsi) > 0) - self.assert_(res.find("Extension") > 0) - - self.vty.verify('subscriber imsi '+wrong_imsi+' name wrong', ['% No subscriber found for imsi '+wrong_imsi]) - res = self.vty.command('subscriber imsi '+imsi+' name '+('X' * 160)) - self.assert_(res.find("NAME is too long") > 0) - self.vty.verify('subscriber imsi '+imsi+' name '+('G' * 159), ['']) - - self.vty.verify('subscriber imsi '+wrong_imsi+' extension 840', ['% No subscriber found for imsi '+wrong_imsi]) - res = self.vty.command('subscriber imsi '+imsi+' extension '+('9' * 15)) - self.assert_(res.find("EXTENSION is too long") > 0) - - self.vty.verify('subscriber imsi '+imsi+' extension '+('1' * 14), ['']) + self.assertTrue(self.vty.verify('subscriber imsi '+imsi+' name foo', ["% 'subscriber name' is no longer supported.", '% This is now up to osmo-hlr.'])) + self.assertTrue(self.vty.verify('subscriber imsi '+imsi+' extension 1234', ["% 'subscriber extension' is no longer supported.", '% This is now up to osmo-hlr.'])) + self.assertTrue(self.vty.verify('subscriber imsi '+imsi+' delete', ["% 'subscriber delete' is no longer supported.", '% This is now up to osmo-hlr.'])) # With narrow random interval self.vty.command("configure terminal") self.vty.command("nitb") - self.assertTrue(self.vty.verify("subscriber-create-on-demand", [''])) - # wrong interval - res = self.vty.command("subscriber-create-on-demand random 221 122") - self.assert_(res.find("122") > 0) - self.assert_(res.find("221") > 0) - # correct interval - self.assertTrue(self.vty.verify("subscriber-create-on-demand random 221 222", [''])) - self.vty.command("end") - - # create subscriber with extension in a configured interval - res = self.vty.command('subscriber create imsi ' + imsi2) - self.assert_(res.find(" IMSI: " + imsi2) > 0) - self.assert_(res.find("221") > 0 or res.find("222") > 0) - self.assert_(res.find(" Extension: ") > 0) - - # Delete it - res = self.vty.command('subscriber imsi ' + imsi + ' delete') - self.assert_(res != "") - # imsi2 is inactive so deletion should succeed - res = self.vty.command('subscriber imsi ' + imsi2 + ' delete') - self.assert_("" == res) + self.assertTrue(self.vty.verify('subscriber-create-on-demand', ["% 'subscriber-create-on-demand' is no longer supported.", '% This is now up to osmo-hlr.'])) def testShowPagingGroup(self): res = self.vty.command("show paging-group 255 1234567") |