diff options
Diffstat (limited to 'openbsc/tests')
-rw-r--r-- | openbsc/tests/sgsn/sgsn_test.c | 92 | ||||
-rw-r--r-- | openbsc/tests/sgsn/sgsn_test.ok | 1 |
2 files changed, 93 insertions, 0 deletions
diff --git a/openbsc/tests/sgsn/sgsn_test.c b/openbsc/tests/sgsn/sgsn_test.c index 818106190..d419f0a92 100644 --- a/openbsc/tests/sgsn/sgsn_test.c +++ b/openbsc/tests/sgsn/sgsn_test.c @@ -546,6 +546,97 @@ static void test_subscriber_gsup(void) update_subscriber_data_cb = __real_sgsn_update_subscriber_data; } +int my_gprs_gsup_client_send_dummy(struct gprs_gsup_client *gsupc, struct msgb *msg) +{ + msgb_free(msg); + return 0; +}; + + +static void test_subscriber_blocking(void) +{ + struct gsm_subscriber *s1; + const char *imsi1 = "1234567890"; + struct sgsn_mm_ctx *ctx; + struct gprs_ra_id raid = { 0, }; + uint32_t local_tlli = 0xffeeddcc; + struct gprs_llc_llme *llme; + int rc; + + printf("Testing subcriber procedure blocking\n"); + + gprs_gsup_client_send_cb = my_gprs_gsup_client_send_dummy; + sgsn->gsup_client = talloc_zero(tall_bsc_ctx, struct gprs_gsup_client); + + /* Check for emptiness */ + OSMO_ASSERT(gprs_subscr_get_by_imsi(imsi1) == NULL); + + /* Create a context */ + OSMO_ASSERT(count(gprs_llme_list()) == 0); + ctx = alloc_mm_ctx(local_tlli, &raid); + llme = ctx->llme; + strncpy(ctx->imsi, imsi1, sizeof(ctx->imsi) - 1); + + /* Allocate and attach a subscriber */ + s1 = gprs_subscr_get_or_create_by_mmctx(ctx); + assert_subscr(s1, imsi1); + + /* Start SendAuthInfoRequest procedure */ + rc = gprs_subscr_query_auth_info(s1); + /* Not blocking */ + OSMO_ASSERT(rc == 0); + + /* Start UpdateLocation procedure */ + rc = gprs_subscr_location_update(s1); + /* Blocking */ + OSMO_ASSERT(rc == 0); + + /* Start PurgeMS procedure */ + rc = gprs_subscr_purge(s1); + /* Not blocking */ + OSMO_ASSERT(rc == 0); + OSMO_ASSERT(s1->sgsn_data->blocked_by == SGSN_SUBSCR_PROC_PURGE); + + /* Start PurgeMS procedure (retry) */ + rc = gprs_subscr_purge(s1); + /* Not blocking */ + OSMO_ASSERT(rc == 0); + + /* Start SendAuthInfoRequest procedure */ + rc = gprs_subscr_query_auth_info(s1); + /* Blocking */ + OSMO_ASSERT(rc == -EAGAIN); + + /* Start UpdateLocation procedure */ + rc = gprs_subscr_location_update(s1); + /* Blocking */ + OSMO_ASSERT(rc == -EAGAIN); + + /* Unblock manually (normally done by the caller of gprs_subscr_purge) */ + s1->sgsn_data->blocked_by = SGSN_SUBSCR_PROC_NONE; + + /* Start SendAuthInfoRequest procedure */ + rc = gprs_subscr_query_auth_info(s1); + /* Not blocking */ + OSMO_ASSERT(rc == 0); + + /* Start UpdateLocation procedure */ + rc = gprs_subscr_location_update(s1); + /* Blocking */ + OSMO_ASSERT(rc == 0); + + subscr_put(s1); + sgsn_mm_ctx_free(ctx); + gprs_llgmm_assign(llme, local_tlli, 0xffffffff, GPRS_ALGO_GEA0, NULL); + + assert_no_subscrs(); + + gprs_gsup_client_send_cb = __real_gprs_gsup_client_send; + talloc_free(sgsn->gsup_client); + sgsn->gsup_client = NULL; +} + + /* * Test that a GMM Detach will remove the MMCTX and the * associated LLME. @@ -1710,6 +1801,7 @@ int main(int argc, char **argv) test_subscriber(); test_auth_triplets(); test_subscriber_gsup(); + test_subscriber_blocking(); test_gmm_detach(); test_gmm_detach_power_off(); test_gmm_detach_no_mmctx(); diff --git a/openbsc/tests/sgsn/sgsn_test.ok b/openbsc/tests/sgsn/sgsn_test.ok index cff29205d..e5df50482 100644 --- a/openbsc/tests/sgsn/sgsn_test.ok +++ b/openbsc/tests/sgsn/sgsn_test.ok @@ -2,6 +2,7 @@ Testing LLME allocations Testing core subscriber data API Testing authentication triplet handling Testing subcriber GSUP handling +Testing subcriber procedure blocking Testing GMM detach Testing GMM detach (power off) Testing GMM detach (no MMCTX) |