s1gw: add TC_conn_term_{by_mme,mme_unavail}

Change-Id: I5ac2020160c914db0882f148469570cfb142b18d
Related: SYS#6772
diff --git a/s1gw/S1GW_Tests.ttcn b/s1gw/S1GW_Tests.ttcn
index 6237557..30dcd46 100644
--- a/s1gw/S1GW_Tests.ttcn
+++ b/s1gw/S1GW_Tests.ttcn
@@ -90,8 +90,10 @@
 	var ConnHdlr vc_conn;
 
 	vc_conn := ConnHdlr.create("ConnHdlr-" & testcasename());
-	connect(vc_conn:S1AP_CONN, vc_S1APSRV:S1AP_CLIENT);
-	connect(vc_conn:S1AP_PROC, vc_S1APSRV:S1AP_PROC);
+	if (vc_S1APSRV.running) {
+		connect(vc_conn:S1AP_CONN, vc_S1APSRV:S1AP_CLIENT);
+		connect(vc_conn:S1AP_PROC, vc_S1APSRV:S1AP_PROC);
+	}
 	vc_conn.start(derefers(fn)(pars));
 
 	return vc_conn;
@@ -214,9 +216,65 @@
 	}
 }
 
+
+/* MME terminates connection, expect S1GW to terminate the eNB connection */
+function f_TC_conn_term_by_mme(ConnHdlrPars pars) runs on ConnHdlr {
+	var Global_ENB_ID genb_id := valueof(ts_Global_ENB_ID(pars.seed));
+
+	f_ConnHdlr_register(genb_id);
+
+	f_ConnHdlr_connect();
+	f_ConnHdlr_setup(genb_id);
+	f_sleep(0.5); /* keep the connection idle for some time */
+
+	/* MME (S1AP_Server_CT) terminates connection */
+	f_ConnHdlr_close_conn(genb_id);
+	/* expect our eNB connection to be released gracefully */
+	S1AP_ENB.receive(tr_SctpShutDownEvent(g_s1ap_conn_id));
+	S1AP_ENB.receive(tr_SctpAssocChange(SCTP_SHUTDOWN_COMP, g_s1ap_conn_id));
+	S1AP_ENB.receive(PortEvent:{connClosed := ?});
+
+	f_ConnHdlr_unregister(genb_id);
+}
+testcase TC_conn_term_by_mme() runs on test_CT {
+	var ConnHdlrPars pars := { seed := 0 };
+	var ConnHdlr vc_conn;
+
+	f_init();
+	f_init_s1ap_srv();
+
+	vc_conn := f_ConnHdlr_spawn(refers(f_TC_conn_term_by_mme), pars);
+	vc_conn.done;
+}
+
+
+/* MME is not available, expect S1GW to terminate the eNB connection */
+function f_TC_conn_term_mme_unavail(ConnHdlrPars pars) runs on ConnHdlr {
+	/* establish an eNB connection to the S1GW */
+	f_ConnHdlr_connect();
+	/* expect our eNB connection to be released gracefully */
+	S1AP_ENB.receive(tr_SctpShutDownEvent(g_s1ap_conn_id));
+	S1AP_ENB.receive(tr_SctpAssocChange(SCTP_SHUTDOWN_COMP, g_s1ap_conn_id));
+	S1AP_ENB.receive(PortEvent:{connClosed := ?});
+	setverdict(pass);
+}
+testcase TC_conn_term_mme_unavail() runs on test_CT {
+	var ConnHdlrPars pars := { seed := 0 };
+	var ConnHdlr vc_conn;
+
+	f_init();
+	f_init_s1ap_srv();
+	vc_S1APSRV.stop;
+
+	vc_conn := f_ConnHdlr_spawn(refers(f_TC_conn_term_mme_unavail), pars);
+	vc_conn.done;
+}
+
 control {
 	execute( TC_setup() );
 	execute( TC_setup_multi() );
+	execute( TC_conn_term_by_mme() );
+	execute( TC_conn_term_mme_unavail() );
 }
 
 }