hlr: Add testcases for PURGE_MS procedure

Change-Id: I9d54d5e4b6fe24d3ee710b57e0c69a30b89d3450
diff --git a/hlr/HLR_Tests.ttcn b/hlr/HLR_Tests.ttcn
index 7efc2b7..c1e29d8 100644
--- a/hlr/HLR_Tests.ttcn
+++ b/hlr/HLR_Tests.ttcn
@@ -313,6 +313,45 @@
 	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 @@
 	}
 }
 
+/* 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 @@
 	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() );
 };
 
 };