From 958f8b4fa4e85d753644c8964809547ac01e8bbc Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Thu, 1 Mar 2018 23:40:17 +0100 Subject: hlr: Add testcases for PURGE_MS procedure Change-Id: I9d54d5e4b6fe24d3ee710b57e0c69a30b89d3450 --- hlr/HLR_Tests.ttcn | 95 +++++++++++++++++++++++++++++++++++++++++++++++++ library/GSUP_Types.ttcn | 19 ++++++++++ 2 files changed, 114 insertions(+) diff --git a/hlr/HLR_Tests.ttcn b/hlr/HLR_Tests.ttcn index 7efc2b71..c1e29d8a 100644 --- a/hlr/HLR_Tests.ttcn +++ b/hlr/HLR_Tests.ttcn @@ -313,6 +313,45 @@ runs on test_CT return GSUP_PDU { return ret; } +/* perform PurgeMS for given imsi, return the GSUP response/error */ +function f_perform_PURGE(hexstring imsi, GSUP_CnDomain cn_dom, + template (omit) integer exp_err_cause := omit) +runs on test_CT return GSUP_PDU { + var GSUP_PDU ret; + timer T := 3.0; + var boolean exp_fail := false; + if (not istemplatekind(exp_err_cause, "omit")) { + exp_fail := true; + } + + GSUP.send(valueof(ts_GSUP_PURGE_MS_REQ(imsi, cn_dom))); + T.start; + alt { + [exp_fail] GSUP.receive(tr_GSUP_PURGE_MS_ERR(imsi, exp_err_cause)) -> value ret { + setverdict(pass); + } + [exp_fail] GSUP.receive(tr_GSUP_PURGE_MS_ERR(imsi, ?)) -> value ret { + setverdict(fail, "Unexpected PURGE ERROR Cause"); + } + [exp_fail] GSUP.receive(tr_GSUP_PURGE_MS_RES(imsi)) -> value ret { + setverdict(fail, "Unexpected PURGE.res for unknown IMSI"); + } + [not exp_fail] GSUP.receive(tr_GSUP_PURGE_MS_ERR(imsi, ?)) -> value ret { + setverdict(fail, "Unexpected PURGE ERROR"); + } + [not exp_fail] GSUP.receive(tr_GSUP_PURGE_MS_RES(imsi)) -> value ret { + setverdict(pass); + } + [] GSUP.receive { repeat; } + [] T.timeout { + setverdict(fail, "Timeout waiting for PURGE response"); + self.stop; + } + } + return ret; +} + + testcase TC_gsup_sai_err_invalid_imsi() runs on test_CT { var hexstring imsi := '01234'H; var GSUP_PDU res; @@ -435,6 +474,59 @@ testcase TC_vty_msisdn_isd() runs on test_CT { } } +/* Test PURGE MS for CS services */ +testcase TC_gsup_purge_cs() runs on test_CT { + var HlrSubscriberList sl; + var GSUP_PDU res; + + f_init(); + + sl := f_gen_subs(); + for (var integer i := 0; i < sizeof(sl); i := i+1) { + var HlrSubscriber sub := sl[i]; + log("Testing CS Purge for ", sub); + f_vty_subscr_create(sub); + res := f_perform_UL(sub.imsi, sub.msisdn); + res := f_perform_PURGE(sub.imsi, OSMO_GSUP_CN_DOMAIN_CS); + f_vty_subscr_delete(sub); + } + + setverdict(pass); +} + +/* Test PURGE MS for PS services */ +testcase TC_gsup_purge_ps() runs on test_CT { + var HlrSubscriberList sl; + var GSUP_PDU res; + + f_init(); + + sl := f_gen_subs(); + for (var integer i := 0; i < sizeof(sl); i := i+1) { + var HlrSubscriber sub := sl[i]; + log("Testing PS Purge for ", sub); + f_vty_subscr_create(sub); + res := f_perform_UL(sub.imsi, sub.msisdn); + res := f_perform_PURGE(sub.imsi, OSMO_GSUP_CN_DOMAIN_PS); + f_vty_subscr_delete(sub); + } + + setverdict(pass); +} + +/* Test PURGEG MS procedure for unknown IMSI */ +testcase TC_gsup_purge_unknown() runs on test_CT { + var hexstring imsi := '2345743413463'H; + var GSUP_PDU res; + + f_init(); + + res := f_perform_PURGE(imsi, OSMO_GSUP_CN_DOMAIN_CS, 2); + + setverdict(pass); +} + + /* TODO: * UL with ISD error * UL with ISD timeout @@ -457,6 +549,9 @@ control { execute( TC_gsup_ul() ); execute( TC_vty() ); execute( TC_vty_msisdn_isd() ); + execute( TC_gsup_purge_cs() ); + execute( TC_gsup_purge_ps() ); + execute( TC_gsup_purge_unknown() ); }; }; diff --git a/library/GSUP_Types.ttcn b/library/GSUP_Types.ttcn index 3fb8d8e8..57c0a396 100644 --- a/library/GSUP_Types.ttcn +++ b/library/GSUP_Types.ttcn @@ -343,6 +343,10 @@ template GSUP_PDU tr_GSUP_CL_ERR(template hexstring imsi, template integer cause tr_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR, { tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) }); +template (value) GSUP_PDU ts_GSUP_PURGE_MS_REQ(hexstring imsi, GSUP_CnDomain dom) := + ts_GSUP(OSMO_GSUP_MSGT_PURGE_MS_REQUEST, { + valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_CnDomain(dom)) }); + template GSUP_PDU tr_GSUP_PURGE_MS_REQ(template hexstring imsi, template GSUP_CnDomain dom := ?) := tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_REQUEST, { tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE_CnDomain(dom) }); @@ -351,6 +355,14 @@ template (value) GSUP_PDU ts_GSUP_PURGE_MS_RES(hexstring imsi) := ts_GSUP(OSMO_GSUP_MSGT_PURGE_MS_RESULT, { valueof(ts_GSUP_IE_IMSI(imsi)) }); +template GSUP_PDU tr_GSUP_PURGE_MS_RES(template hexstring imsi) := + tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_RESULT, { + tr_GSUP_IE_IMSI(imsi), * }); + +template GSUP_PDU tr_GSUP_PURGE_MS_ERR(template hexstring imsi, template integer cause) := + tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_ERROR, { + tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) }); + template (value) GSUP_IE ts_GSUP_IE_CancelType(GSUP_CancelType ctype) := { tag := OSMO_GSUP_CANCEL_TYPE_IE, @@ -493,6 +505,13 @@ template (value) GSUP_IE ts_GSUP_IE_APN(octetstring apn) := { } } +template (value) GSUP_IE ts_GSUP_IE_CnDomain(GSUP_CnDomain dom) := { + tag := OSMO_GSUP_CN_DOMAIN_IE, + len := 0, /* overwritten */ + val := { + cn_domain := dom + } +} } with { encode "RAW"; variant "FIELDORDER(msb)" } -- cgit v1.2.3