mgw: properly clean up endpoint by use of DLCX at end of each testcase
diff --git a/mgw/MGCP_Test.ttcn b/mgw/MGCP_Test.ttcn
index 07086c9..21460d0 100644
--- a/mgw/MGCP_Test.ttcn
+++ b/mgw/MGCP_Test.ttcn
@@ -334,10 +334,60 @@
 		}
 	}
 
+	function extract_conn_id(MgcpResponse resp) return MgcpConnectionId {
+		var integer i;
+		for (i := 0; i < lengthof(resp.params); i := i + 1) {
+			var MgcpParameter par := resp.params[i];
+			if (par.code == "I") {
+				return str2hex(par.val);
+			}
+		}
+		setverdict(fail);
+		return '00000000'H;
+	}
+
+	/* Send DLCX and expect OK response */
+	function f_dlcx_ok(MgcpEndpoint ep, MgcpCallId call_id,
+			   template MgcpConnectionId conn_id := omit) runs on dummy_CT {
+		var template MgcpCommand cmd;
+		var MgcpResponse resp;
+		var template MgcpResponse rtmpl := {
+			line := {
+				code := "200",
+				string := "OK"
+			},
+			params := *,
+			sdp := *
+		};
+		cmd := ts_DLCX(get_next_trans_id(), ep, call_id);
+		/* FIXME: add conn_id if present */
+		resp := mgcp_transceive_mgw(cmd, rtmpl);
+	}
+
+	/* Send DLCX and accept any response */
+	function f_dlcx_ignore(MgcpEndpoint ep, MgcpCallId call_id,
+				template MgcpConnectionId conn_id := omit) runs on dummy_CT {
+		var template MgcpCommand cmd;
+		var MgcpResponse resp;
+		var template MgcpResponse rtmpl := {
+			line := {
+				code := ?,
+				string := ?
+			},
+			params := *,
+			sdp := *
+		};
+		cmd := ts_DLCX(get_next_trans_id(), ep, call_id);
+		/* FIXME: add conn_id if present */
+		resp := mgcp_transceive_mgw(cmd, rtmpl);
+	}
+
 	/* test valid CRCX without SDP */
 	testcase TC_crcx() runs on dummy_CT {
 		var template MgcpCommand cmd;
 		var MgcpResponse resp;
+		var MgcpEndpoint ep := "2@mgw";
+		var MgcpCallId call_id := '1234'H;
 		var template MgcpResponse rtmpl := {
 			line := {
 				code := "200",
@@ -349,8 +399,14 @@
 
 		f_init();
 
-		cmd := ts_CRCX(get_next_trans_id(), "2@mgw", "sendrecv", '1234'H);
+		/* create the connection on the MGW */
+		cmd := ts_CRCX(get_next_trans_id(), ep, "recvonly", call_id);
 		resp := mgcp_transceive_mgw(cmd, rtmpl);
+		extract_conn_id(resp);
+
+		/* clean-up */
+		f_dlcx_ok(ep, call_id);
+
 		setverdict(pass);
 	}
 
@@ -358,13 +414,17 @@
 	testcase TC_crcx_unsupp_mode() runs on dummy_CT {
 		var template MgcpCommand cmd;
 		var MgcpResponse resp;
+		var MgcpEndpoint ep := "2@mgw";
+		var MgcpCallId call_id := '1233'H;
 		var template MgcpResponse rtmpl := tr_MgcpResp_Err("517");
 
 		f_init();
 
-		cmd := ts_CRCX(get_next_trans_id(), "2@mgw", "netwtest", '1234'H);
+		cmd := ts_CRCX(get_next_trans_id(), ep, "netwtest", call_id);
 		resp := mgcp_transceive_mgw(cmd, rtmpl);
 		setverdict(pass);
+
+		f_dlcx_ignore(ep, call_id);
 	}
 
 	/* test CRCX with early bi-directional mode, expect 527 as
@@ -373,110 +433,134 @@
 	testcase TC_crcx_early_bidir_mode() runs on dummy_CT {
 		var template MgcpCommand cmd;
 		var MgcpResponse resp;
+		var MgcpEndpoint ep := "2@mgw";
+		var MgcpCallId call_id := '1232'H;
 		var template MgcpResponse rtmpl := tr_MgcpResp_Err("527");
 
 		f_init();
 
-		cmd := ts_CRCX(get_next_trans_id(), "2@mgw", "sendrecv", '1234'H);
+		cmd := ts_CRCX(get_next_trans_id(), ep, "sendrecv", call_id);
 		resp := mgcp_transceive_mgw(cmd, rtmpl);
 		setverdict(pass);
+
+		f_dlcx_ignore(ep, call_id);
 	}
 
 	/* test CRCX with unsupported Parameters */
 	testcase TC_crcx_unsupp_param() runs on dummy_CT {
 		var template MgcpCommand cmd;
 		var MgcpResponse resp;
+		var MgcpEndpoint ep := "2@mgw";
+		var MgcpCallId call_id := '1231'H;
 		var template MgcpResponse rtmpl := tr_MgcpResp_Err("539");
 
 		f_init();
 
-		cmd := ts_CRCX(get_next_trans_id(), "2@mgw", "recvonly", '1234'H);
+		cmd := ts_CRCX(get_next_trans_id(), ep, "recvonly", call_id);
 		cmd.params := {
 			t_MgcpParConnMode("recvonly"),
-			ts_MgcpParCallId('1234'H),
+			ts_MgcpParCallId(call_id),
 			t_MgcpParLocConnOpt("p:20"),
 			/* osmo-bsc_mgcp/mgw doesn't implement notifications */
 			{ "N", "foobar" }
 		}
 		resp := mgcp_transceive_mgw(cmd, rtmpl);
 		setverdict(pass);
+
+		f_dlcx_ignore(ep, call_id);
 	}
 
 	/* test CRCX with missing CallId */
 	testcase TC_crcx_missing_callid() runs on dummy_CT {
 		var template MgcpCommand cmd;
 		var MgcpResponse resp;
+		var MgcpEndpoint ep := "2@mgw";
 		var template MgcpResponse rtmpl := tr_MgcpResp_Err("400");
 
 		f_init();
 
-		cmd := ts_CRCX(get_next_trans_id(), "2@mgw", "recvonly", '1234'H);
+		cmd := ts_CRCX(get_next_trans_id(), ep, "recvonly", '1230'H);
 		cmd.params := {
 			t_MgcpParConnMode("recvonly"),
 			t_MgcpParLocConnOpt("p:20")
 		}
 		resp := mgcp_transceive_mgw(cmd, rtmpl);
 		setverdict(pass);
+
 	}
 
 	/* test CRCX with missing Mode */
 	testcase TC_crcx_missing_mode() runs on dummy_CT {
 		var template MgcpCommand cmd;
 		var MgcpResponse resp;
+		var MgcpEndpoint ep := "2@mgw";
+		var MgcpCallId call_id := '1229'H;
 		var template MgcpResponse rtmpl := tr_MgcpResp_Err("400");
 
 		f_init();
 
-		cmd := ts_CRCX(get_next_trans_id(), "2@mgw", "recvonly", '1234'H);
+		cmd := ts_CRCX(get_next_trans_id(), ep, "recvonly", call_id);
 		cmd.params := {
-			ts_MgcpParCallId('1234'H),
+			ts_MgcpParCallId(call_id),
 			t_MgcpParLocConnOpt("p:20")
 		}
 		resp := mgcp_transceive_mgw(cmd, rtmpl);
 		setverdict(pass);
+
+		f_dlcx_ignore(ep, call_id);
 	}
 
 	/* test CRCX with unsupported packetization interval */
 	testcase TC_crcx_unsupp_packet_intv() runs on dummy_CT {
 		var template MgcpCommand cmd;
 		var MgcpResponse resp;
+		var MgcpEndpoint ep := "2@mgw";
+		var MgcpCallId call_id := '1228'H;
 		var template MgcpResponse rtmpl := tr_MgcpResp_Err("532");
 
 		f_init();
 
-		cmd := ts_CRCX(get_next_trans_id(), "2@mgw", "recvonly", '1234'H);
+		cmd := ts_CRCX(get_next_trans_id(), ep, "recvonly", call_id);
 		cmd.params := {
 			t_MgcpParConnMode("recvonly"),
-			ts_MgcpParCallId('1234'H),
+			ts_MgcpParCallId(call_id),
 			t_MgcpParLocConnOpt("p:111")
 		}
 		resp := mgcp_transceive_mgw(cmd, rtmpl);
 		setverdict(pass);
+
+		f_dlcx_ignore(ep, call_id);
 	}
 
 	/* test CRCX with illegal double presence of local connection option */
 	testcase TC_crcx_illegal_double_lco() runs on dummy_CT {
 		var template MgcpCommand cmd;
 		var MgcpResponse resp;
+		var MgcpEndpoint ep := "2@mgw";
+		var MgcpCallId call_id := '1227'H;
 		var template MgcpResponse rtmpl := tr_MgcpResp_Err("524");
 
 		f_init();
 
-		cmd := ts_CRCX(get_next_trans_id(), "2@mgw", "recvonly", '1234'H);
+		cmd := ts_CRCX(get_next_trans_id(), ep, "recvonly", call_id);
 		cmd.params := {
 			t_MgcpParConnMode("recvonly"),
-			ts_MgcpParCallId('1234'H),
+			ts_MgcpParCallId(call_id),
 			/* p:20 is permitted only once and not twice! */
 			t_MgcpParLocConnOpt("p:20, a:AMR, p:20")
 		}
 		resp := mgcp_transceive_mgw(cmd, rtmpl);
 		setverdict(pass);
+
+		f_dlcx_ignore(ep, call_id);
 	}
 
 	/* test valid CRCX with valid SDP */
 	testcase TC_crcx_sdp() runs on dummy_CT {
 		var template MgcpCommand cmd;
 		var MgcpResponse resp;
+		var MgcpEndpoint ep := "2@mgw";
+		var MgcpCallId call_id := '1226'H;
 		var template MgcpResponse rtmpl := {
 			line := {
 				code := "200",
@@ -488,12 +572,14 @@
 
 		f_init();
 
-		cmd := ts_CRCX(get_next_trans_id(), "2@mgw", "sendrecv", '1234'H);
+		cmd := ts_CRCX(get_next_trans_id(), ep, "sendrecv", call_id);
 		cmd.sdp := ts_SDP("127.0.0.1", "127.0.0.2", "23", "42", 2344, { "98" },
 				  { valueof(ts_SDP_rtpmap(98, "AMR/8000")),
 				    valueof(ts_SDP_ptime(20)) });
 		resp := mgcp_transceive_mgw(cmd, rtmpl);
 		setverdict(pass);
+
+		f_dlcx_ignore(ep, call_id);
 	}
 
 	/* TODO: various SDP related bits */
@@ -508,6 +594,8 @@
 	testcase TC_mdcx_without_crcx() runs on dummy_CT {
 		var template MgcpCommand cmd;
 		var MgcpResponse resp;
+		var MgcpEndpoint ep := "3@mgw";
+		var MgcpCallId call_id := '1225'H;
 		var template MgcpResponse rtmpl := {
 			line := {
 				/* TODO: accept/enforce better error? */
@@ -520,12 +608,14 @@
 
 		f_init();
 
-		cmd := ts_MDCX(get_next_trans_id(), "3@mgw", "sendrecv", '31234'H);
+		cmd := ts_MDCX(get_next_trans_id(), ep, "sendrecv", call_id);
 		cmd.sdp := ts_SDP("127.0.0.1", "127.0.0.2", "23", "42", 2344, { "98" },
 				  { valueof(ts_SDP_rtpmap(98, "AMR/8000")),
 				    valueof(ts_SDP_ptime(20)) });
 		resp := mgcp_transceive_mgw(cmd, rtmpl);
 		setverdict(pass);
+
+		f_dlcx_ignore(ep, call_id);
 	}
 
 	/* DLCX without CRCX first */
@@ -553,6 +643,8 @@
 	testcase TC_crcx_and_dlcx() runs on dummy_CT {
 		var template MgcpCommand cmd;
 		var MgcpResponse resp;
+		var MgcpEndpoint ep := "5@mgw";
+		var MgcpCallId call_id := '51234'H;
 		var template MgcpResponse rtmpl := {
 			line := {
 				code := ("200", "250"),
@@ -564,15 +656,14 @@
 
 		f_init();
 
-		cmd := ts_CRCX(get_next_trans_id(), "5@mgw", "sendrecv", '51234'H);
+		cmd := ts_CRCX(get_next_trans_id(), ep, "recvonly", call_id);
 		resp := mgcp_transceive_mgw(cmd, rtmpl);
 
-		cmd := ts_DLCX(get_next_trans_id(), "5@mgw", '51234'H);
-		rtmpl.sdp := omit;
-		rtmpl.params := *;
-		resp := mgcp_transceive_mgw(cmd, rtmpl);
+		f_dlcx_ok(ep, call_id);
 
 		setverdict(pass);
+
+		f_dlcx_ignore(ep, call_id);
 	}
 
 	/* TODO: DLCX of valid endpoint but invalid call-id */