Change in osmo-ttcn3-hacks[master]: HLR: Actual USSD test cases

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Harald Welte gerrit-no-reply at lists.osmocom.org
Wed Aug 8 09:07:52 UTC 2018


Harald Welte has submitted this change and it was merged. ( https://gerrit.osmocom.org/10405 )

Change subject: HLR: Actual USSD test cases
......................................................................

HLR: Actual USSD test cases

Change-Id: I74a3419140179b1625e82d1298864e424fb81398
---
M hlr/HLR_Tests.ttcn
1 file changed, 338 insertions(+), 3 deletions(-)

Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved



diff --git a/hlr/HLR_Tests.ttcn b/hlr/HLR_Tests.ttcn
index 2bf5e57..29af522 100644
--- a/hlr/HLR_Tests.ttcn
+++ b/hlr/HLR_Tests.ttcn
@@ -8,6 +8,12 @@
 import from Osmocom_Types all;
 import from Osmocom_CTRL_Adapter all;
 
+import from TCCEncoding_Functions all;
+import from SS_Types all;
+import from SS_Templates all;
+import from MAP_Errors all;
+import from USSD_Helpers all;
+
 import from Osmocom_VTY_Functions all;
 import from TELNETasp_PortType all;
 
@@ -60,7 +66,12 @@
 }
 
 type record HLR_ConnHdlrPars {
-	HlrSubscriber sub
+	HlrSubscriber sub,
+	HLR_ConnHdlrParsUssd ussd optional
+}
+
+type record HLR_ConnHdlrParsUssd {
+	OCT4 sid
 }
 
 template (value) HLR_ConnHdlrPars t_Pars(hexstring imsi, hexstring msisdn := ''H) := {
@@ -69,11 +80,13 @@
 		msisdn := msisdn,
 		aud2g := omit,
 		aud3g := omit
-	}
+	},
+	ussd := omit
 }
 
 template (value) HLR_ConnHdlrPars t_Pars_sub(HlrSubscriber sub) := {
-	sub := sub
+	sub := sub,
+	ussd := omit
 }
 
 type function void_fn() runs on HLR_ConnHdlr;
@@ -450,6 +463,91 @@
 	return ret;
 }
 
+function f_SS_xceive(hexstring imsi, OCT4 sid, GSUP_SessionState state, octetstring ss,
+			 template (omit) integer exp_err_cause := omit)
+runs on HLR_ConnHdlr 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_PROC_SS_REQ(imsi, sid, state, ss)));
+	T.start;
+	alt {
+	[exp_fail] GSUP.receive(tr_GSUP_PROC_SS_ERR(imsi, sid, exp_err_cause)) -> value ret {
+		setverdict(pass);
+		}
+	[exp_fail] GSUP.receive(tr_GSUP_PROC_SS_ERR(imsi, sid, ?)) -> value ret {
+		setverdict(fail, "Unexpected PROC_SS ERROR Cause");
+		}
+	[exp_fail] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, ?, ?)) -> value ret {
+		setverdict(fail, "Unexpected PROC_SS.res for unknown IMSI");
+		}
+	[not exp_fail] GSUP.receive(tr_GSUP_PROC_SS_ERR(imsi, sid, ?)) -> value ret {
+		setverdict(fail, "Unexpected PROC_SS ERROR");
+		}
+	[not exp_fail] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, ?, ?)) -> value ret {
+		setverdict(pass);
+		}
+	[] GSUP.receive { repeat; }
+	[] T.timeout {
+		setverdict(fail, "Timeout waiting for PROC_SS response");
+		self.stop;
+		}
+	}
+	return ret;
+}
+
+private function f_SS_expect(hexstring imsi, OCT4 sid, GSUP_SessionState state,
+			     template SS_FacilityInformation facility := *)
+runs on HLR_ConnHdlr return GSUP_PDU {
+	var GSUP_PDU ret;
+	timer T := 3.0;
+	var boolean exp_ss := true;
+	if (istemplatekind(facility, "omit")) {
+		exp_ss := false;
+	}
+	T.start;
+	alt {
+	[] GSUP.receive(tr_GSUP_PROC_SS_ERR(imsi, sid, ?)) -> value ret {
+		setverdict(fail, "Unexpected PROC_SS ERROR Cause");
+		}
+	[not exp_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, omit)) -> value ret {
+		setverdict(pass);
+		}
+	[exp_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, omit)) -> value ret {
+		setverdict(fail, "Unexpected PROC_SS.res without SS IE");
+		}
+/*
+	[exp_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, decmatch facility)) -> value ret {
+		setverdict(pass);
+		}
+*/
+
+	[exp_ss] GSUP.receive(tr_GSUP_PROC_SS_RES(imsi, sid, state, ?)) -> value ret {
+		var GSUP_IeValue ss_ie;
+		f_gsup_find_ie(ret, OSMO_GSUP_SS_INFO_IE, ss_ie);
+		var SS_FacilityInformation dec_fac := dec_SS_FacilityInformation(ss_ie.ss_info);
+		log("pattern: ", facility);
+		if (match(dec_fac, facility)) {
+			setverdict(pass);
+		} else {
+			setverdict(fail, "Unexpected PROC_SS.res with non-matching facility IE");
+		}
+		}
+	[] GSUP.receive { repeat; }
+	[] T.timeout {
+		setverdict(fail, "Timeout waiting for PROC_SS response");
+		self.stop;
+		}
+	}
+
+	return ret;
+}
+
+
 
 /***********************************************************************
  * Testcases
@@ -675,6 +773,235 @@
 	setverdict(pass);
 }
 
+import from HLR_EUSE all;
+
+/* Test for USSD request to undefined/unrouted short-code. Expect ss-NotAvailable(18) */
+private function f_TC_mo_ussd_unknown() runs on HLR_ConnHdlr {
+	var GSUP_PDU res;
+	var octetstring ss := f_USSD_FACILITY_IE_INVOKE(
+					op_code := SS_OP_CODE_PROCESS_USS_REQ,
+					ussd_string := "*#200#");
+	GSUP.send(valueof(ts_GSUP_PROC_SS_REQ(g_pars.sub.imsi, g_pars.ussd.sid,
+						OSMO_GSUP_SESSION_STATE_BEGIN, ss)));
+	f_SS_expect(g_pars.sub.imsi, g_pars.ussd.sid, OSMO_GSUP_SESSION_STATE_END,
+		    tr_SS_FACILITY_RETURN_ERROR(1, 18));
+}
+testcase TC_mo_ussd_unknown() runs on test_CT {
+	var HlrSubscriberList sl;
+	var HLR_ConnHdlr vc_conn;
+
+	f_init(false);
+	sl := f_gen_subs();
+	for (var integer i := 0; i < sizeof(sl); i := i+1) {
+		var HLR_ConnHdlrPars pars := valueof(t_Pars_sub(sl[i]));
+		pars.ussd.sid := f_rnd_octstring(4);
+		f_vty_subscr_create(VTY, pars.sub);
+		vc_conn := f_start_handler(refers(f_TC_mo_ussd_unknown), pars);
+		vc_conn.done;
+	}
+}
+
+/* Test for USSD request to currently disconnected EUSE. Expect ss-SystemFailure(34) */
+private function f_TC_mo_ussd_euse_disc() runs on HLR_ConnHdlr {
+	var GSUP_PDU res;
+	var octetstring ss := f_USSD_FACILITY_IE_INVOKE(
+					op_code := SS_OP_CODE_PROCESS_USS_REQ,
+					ussd_string := "*100#");
+	GSUP.send(valueof(ts_GSUP_PROC_SS_REQ(g_pars.sub.imsi, g_pars.ussd.sid,
+						OSMO_GSUP_SESSION_STATE_BEGIN, ss)));
+	f_SS_expect(g_pars.sub.imsi, g_pars.ussd.sid, OSMO_GSUP_SESSION_STATE_END,
+		    tr_SS_FACILITY_RETURN_ERROR(1, 34));
+}
+testcase TC_mo_ussd_euse_disc() runs on test_CT {
+	var HlrSubscriberList sl;
+	var HLR_ConnHdlr vc_conn;
+
+	f_init(false);
+	sl := f_gen_subs();
+	for (var integer i := 0; i < sizeof(sl); i := i+1) {
+		var HLR_ConnHdlrPars pars := valueof(t_Pars_sub(sl[i]));
+		pars.ussd.sid := f_rnd_octstring(4);
+		f_vty_subscr_create(VTY, pars.sub);
+		vc_conn := f_start_handler(refers(f_TC_mo_ussd_euse_disc), pars);
+		vc_conn.done;
+	}
+}
+
+/* Test for USSD request to internal own-imsi IUSE. */
+private function f_TC_mo_ussd_iuse_imsi() runs on HLR_ConnHdlr {
+	var GSUP_PDU res;
+	var charstring resp_str;
+	var octetstring ss := f_USSD_FACILITY_IE_INVOKE(
+					op_code := SS_OP_CODE_PROCESS_USS_REQ,
+					ussd_string := "*#101#");
+	GSUP.send(valueof(ts_GSUP_PROC_SS_REQ(g_pars.sub.imsi, g_pars.ussd.sid,
+						OSMO_GSUP_SESSION_STATE_BEGIN, ss)));
+	resp_str := "Your IMSI is " & hex2str(g_pars.sub.imsi);
+	f_SS_expect(g_pars.sub.imsi, g_pars.ussd.sid, OSMO_GSUP_SESSION_STATE_END,
+		    tr_SS_USSD_FACILITY_RETURN_RESULT(1, 59, SS_USSD_DEFAULT_DCS, f_encGSM7bit(resp_str)));
+}
+testcase TC_mo_ussd_iuse_imsi() runs on test_CT {
+	var HlrSubscriberList sl;
+	var HLR_ConnHdlr vc_conn;
+
+	f_init(false);
+	sl := f_gen_subs();
+	for (var integer i := 0; i < sizeof(sl); i := i+1) {
+		var HLR_ConnHdlrPars pars := valueof(t_Pars_sub(sl[i]));
+		pars.ussd.sid := f_rnd_octstring(4);
+		f_vty_subscr_create(VTY, pars.sub);
+		vc_conn := f_start_handler(refers(f_TC_mo_ussd_iuse_imsi), pars);
+		vc_conn.done;
+	}
+}
+
+/* Test for USSD request to internal own-msisdn IUSE. */
+private function f_TC_mo_ussd_iuse_msisdn() runs on HLR_ConnHdlr {
+	var GSUP_PDU res;
+	var charstring resp_str;
+	var octetstring ss := f_USSD_FACILITY_IE_INVOKE(
+					op_code := SS_OP_CODE_PROCESS_USS_REQ,
+					ussd_string := "*#100#");
+	GSUP.send(valueof(ts_GSUP_PROC_SS_REQ(g_pars.sub.imsi, g_pars.ussd.sid,
+						OSMO_GSUP_SESSION_STATE_BEGIN, ss)));
+	resp_str := "Your extension is " & hex2str(g_pars.sub.msisdn);
+	f_SS_expect(g_pars.sub.imsi, g_pars.ussd.sid, OSMO_GSUP_SESSION_STATE_END,
+		    tr_SS_USSD_FACILITY_RETURN_RESULT(1, 59, SS_USSD_DEFAULT_DCS, f_encGSM7bit(resp_str)));
+}
+testcase TC_mo_ussd_iuse_msisdn() runs on test_CT {
+	var HlrSubscriberList sl;
+	var HLR_ConnHdlr vc_conn;
+
+	f_init(false);
+	sl := f_gen_subs();
+	for (var integer i := 0; i < sizeof(sl); i := i+1) {
+		var HLR_ConnHdlrPars pars := valueof(t_Pars_sub(sl[i]));
+		pars.ussd.sid := f_rnd_octstring(4);
+		f_vty_subscr_create(VTY, pars.sub);
+		vc_conn := f_start_handler(refers(f_TC_mo_ussd_iuse_msisdn), pars);
+		vc_conn.done;
+	}
+}
+
+/* Test routing of USSD to EUSE by a specific route */
+private function f_TC_mo_ussd_100() runs on HLR_ConnHdlr {
+	var GSUP_PDU res;
+	/* invoke / invoke id 1 / processUSS-req */
+	//var octetstring ss := 'a11202010102013b300a04010f0405aa180c3602'O;
+	var octetstring ss := f_USSD_FACILITY_IE_INVOKE(
+					op_code := SS_OP_CODE_PROCESS_USS_REQ,
+					ussd_string := "*100#");
+	GSUP.send(valueof(ts_GSUP_PROC_SS_REQ(g_pars.sub.imsi, g_pars.ussd.sid,
+						OSMO_GSUP_SESSION_STATE_BEGIN, ss)));
+	f_SS_expect(g_pars.sub.imsi, g_pars.ussd.sid, OSMO_GSUP_SESSION_STATE_END,
+		    tr_SS_USSD_FACILITY_RETURN_RESULT(1, 59, SS_USSD_DEFAULT_DCS, f_encGSM7bit("*100#")));
+}
+testcase TC_mo_ussd_euse() runs on test_CT {
+	var HlrSubscriberList sl;
+	var HLR_ConnHdlr vc_conn;
+
+	var HLR_EUSE_CT vc_EUSE := HLR_EUSE_CT.create("EUSE-" & testcasename());
+	vc_EUSE.start(HLR_EUSE.f_main_mo(mp_hlr_ip, mp_hlr_gsup_port, "foobar", refers(f_ss_echo)));
+
+	f_init(false);
+	sl := f_gen_subs();
+	for (var integer i := 0; i < sizeof(sl); i := i+1) {
+		var HLR_ConnHdlrPars pars := valueof(t_Pars_sub(sl[i]));
+		pars.ussd.sid := f_rnd_octstring(4);
+		f_vty_subscr_create(VTY, pars.sub);
+		vc_conn := f_start_handler(refers(f_TC_mo_ussd_100), pars);
+		vc_conn.done;
+	}
+
+	vc_EUSE.stop;
+}
+
+/* Test routing of USSD to EUSE by a specific route, with CONTINUE */
+private function f_TC_mo_ussd_100_continue() runs on HLR_ConnHdlr {
+	var GSUP_PDU res;
+	/* Simulate BEGIN from MS/MSC */
+	var octetstring ss := f_USSD_FACILITY_IE_INVOKE(op_code := SS_OP_CODE_PROCESS_USS_REQ,
+							ussd_string := "*100#");
+	GSUP.send(valueof(ts_GSUP_PROC_SS_REQ(g_pars.sub.imsi, g_pars.ussd.sid,
+						OSMO_GSUP_SESSION_STATE_BEGIN, ss)));
+	/* expect echo response from EUSE */
+	f_SS_expect(g_pars.sub.imsi, g_pars.ussd.sid, OSMO_GSUP_SESSION_STATE_CONTINUE,
+		    tr_SS_USSD_FACILITY_RETURN_RESULT(1, 59, SS_USSD_DEFAULT_DCS, f_encGSM7bit("*100#")));
+
+	/* Simulate CONTINUE from MS/MSC */
+	ss := f_USSD_FACILITY_IE_INVOKE(op_code := SS_OP_CODE_PROCESS_USS_REQ,
+					ussd_string := "mahlzeit");
+	GSUP.send(valueof(ts_GSUP_PROC_SS_REQ(g_pars.sub.imsi, g_pars.ussd.sid,
+						OSMO_GSUP_SESSION_STATE_CONTINUE, ss)));
+
+	/* expect echo response from EUSE */
+	f_SS_expect(g_pars.sub.imsi, g_pars.ussd.sid, OSMO_GSUP_SESSION_STATE_END,
+		    tr_SS_USSD_FACILITY_RETURN_RESULT(1, 59, SS_USSD_DEFAULT_DCS,
+						      f_encGSM7bit("mahlzeit")));
+}
+testcase TC_mo_ussd_euse_continue() runs on test_CT {
+	var HlrSubscriberList sl;
+	var HLR_ConnHdlr vc_conn;
+
+	var HLR_EUSE_CT vc_EUSE := HLR_EUSE_CT.create("EUSE-" & testcasename());
+	vc_EUSE.start(HLR_EUSE.f_main_mo(mp_hlr_ip, mp_hlr_gsup_port, "foobar",
+					 refers(f_ss_echo_continue)));
+
+	f_init(false);
+	sl := f_gen_subs();
+	for (var integer i := 0; i < sizeof(sl); i := i+1) {
+		var HLR_ConnHdlrPars pars := valueof(t_Pars_sub(sl[i]));
+		pars.ussd.sid := f_rnd_octstring(4);
+		f_vty_subscr_create(VTY, pars.sub);
+		vc_conn := f_start_handler(refers(f_TC_mo_ussd_100_continue), pars);
+		vc_conn.done;
+	}
+
+	vc_EUSE.stop;
+}
+
+
+/* Test routing of USSD to EUSE by default-route */
+private function f_TC_mo_ussd_999() runs on HLR_ConnHdlr {
+	var GSUP_PDU res;
+	var octetstring ss := f_USSD_FACILITY_IE_INVOKE(
+					op_code := SS_OP_CODE_PROCESS_USS_REQ,
+					ussd_string := "*999#");
+	GSUP.send(valueof(ts_GSUP_PROC_SS_REQ(g_pars.sub.imsi, g_pars.ussd.sid,
+						OSMO_GSUP_SESSION_STATE_BEGIN, ss)));
+	f_SS_expect(g_pars.sub.imsi, g_pars.ussd.sid, OSMO_GSUP_SESSION_STATE_END,
+		    tr_SS_USSD_FACILITY_RETURN_RESULT(1, 59, SS_USSD_DEFAULT_DCS, f_encGSM7bit("*999#")));
+}
+testcase TC_mo_ussd_euse_defaultroute() runs on test_CT {
+	var HlrSubscriberList sl;
+	var HLR_ConnHdlr vc_conn;
+
+	var HLR_EUSE_CT vc_EUSE := HLR_EUSE_CT.create("EUSE-" & testcasename());
+	vc_EUSE.start(HLR_EUSE.f_main_mo(mp_hlr_ip, mp_hlr_gsup_port, "foobar", refers(f_ss_echo)));
+
+	f_init(false);
+	f_vty_config(VTY, "hlr", "ussd default-route external foobar");
+
+	sl := f_gen_subs();
+	for (var integer i := 0; i < sizeof(sl); i := i+1) {
+		var HLR_ConnHdlrPars pars := valueof(t_Pars_sub(sl[i]));
+		pars.ussd.sid := f_rnd_octstring(4);
+		f_vty_subscr_create(VTY, pars.sub);
+		vc_conn := f_start_handler(refers(f_TC_mo_ussd_999), pars);
+		vc_conn.done;
+	}
+
+	f_vty_config(VTY, "hlr", "no ussd default-route");
+	vc_EUSE.stop;
+}
+
+
+/* TODO USSD:
+   * MO USSD for IMSI of non-existant subscriber
+   * MT USSD from EUSE
+   * timeout cases
+ */
+
 /* TODO:
   * UL with ISD error
   * UL with ISD timeout
@@ -700,6 +1027,14 @@
 	execute( TC_gsup_purge_cs() );
 	execute( TC_gsup_purge_ps() );
 	execute( TC_gsup_purge_unknown() );
+
+	execute( TC_mo_ussd_unknown() );
+	execute( TC_mo_ussd_euse_disc() );
+	execute( TC_mo_ussd_iuse_imsi() );
+	execute( TC_mo_ussd_iuse_msisdn() );
+	execute( TC_mo_ussd_euse() );
+	execute( TC_mo_ussd_euse_continue() );
+	execute( TC_mo_ussd_euse_defaultroute() );
 };
 
 };

-- 
To view, visit https://gerrit.osmocom.org/10405
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: I74a3419140179b1625e82d1298864e424fb81398
Gerrit-Change-Number: 10405
Gerrit-PatchSet: 2
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Jenkins Builder
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20180808/f8dd83f7/attachment.htm>


More information about the gerrit-log mailing list