aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2018-03-01 23:40:17 +0100
committerHarald Welte <laforge@gnumonks.org>2018-03-02 08:56:59 +0000
commit958f8b4fa4e85d753644c8964809547ac01e8bbc (patch)
treec58a17a8864bef9e5938aee6e63583f69c4285bb
parent8f0c933c2b06042dfff7074d16fef16f4ecda585 (diff)
hlr: Add testcases for PURGE_MS procedure
-rw-r--r--hlr/HLR_Tests.ttcn95
-rw-r--r--library/GSUP_Types.ttcn19
2 files changed, 114 insertions, 0 deletions
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)" }