More progress on osmo-sip-connector tests

Change-Id: I34a5d7929264c7f5f21d3868a5f919874ffa106c
diff --git a/library/MNCC_Types.ttcn b/library/MNCC_Types.ttcn
index 39f9dce..19af236 100644
--- a/library/MNCC_Types.ttcn
+++ b/library/MNCC_Types.ttcn
@@ -512,6 +512,39 @@
 		}
 	}
 };
+template MNCC_PDU tr_MNCC_SETUP_req(template uint32_t call_id := ?,
+				    template charstring called := ?,
+				    template charstring calling := *,
+				    template charstring imsi := ?) := {
+	msg_type := MNCC_SETUP_REQ,
+	u := {
+		signal := {	/* See 24.008 9.3.23.1 */
+			callref := call_id,
+			bearer_cap := *,				/* mandatory in CC */
+			called := tr_MNCC_number(called),		/* optional */
+			calling := tr_MNCC_number(calling),		/* optional */
+			redirecting := *,				/* optional */
+			connected := omit,
+			cause := omit,
+			progress := *,					/* optional */
+			useruser := *,					/* optional */
+			facility := *,					/* optional */
+			cccap := omit,
+			ssversion := omit,
+			clir_sup := 0,
+			clir_inv := 0,
+			signal := *,					/* optional */
+			keypad := omit,
+			more := 0,
+			notify := 0,
+			emergency := *,
+			imsi := imsi,
+			lchan_type := ?,
+			lchan_mode := ?
+		}
+	}
+};
+
 
 /* MO: MSC <- MNCC: Respons to SETUP.ind */
 template MNCC_PDU ts_MNCC_SETUP_rsp(uint32_t call_id, charstring imsi := "",
@@ -653,9 +686,9 @@
 			redirecting := omit,
 			connected := connected,
 			cause := omit,
-			progress := *,
-			useruser := *,
-			facility := *,
+			progress := omit,
+			useruser := omit,
+			facility := omit,
 			cccap := omit,
 			ssversion := omit,
 			clir_sup := 0,
@@ -664,10 +697,10 @@
 			keypad := omit,
 			more := 0,
 			notify := 0,
-			emergency := *,
+			emergency := omit,
 			imsi := "",
-			lchan_type := ?,
-			lchan_mode := ?
+			lchan_type := 0,
+			lchan_mode := 0
 		}
 	}
 }
@@ -807,6 +840,39 @@
 		}
 	}
 }
+template MNCC_PDU ts_MNCC_CALL_CONF_ind(uint32_t call_id,
+					template (omit) MNCC_bearer_cap bcap := omit,
+					template (omit) MNCC_cause cause := omit,
+					template (omit) MNCC_cccap cccap := omit) := {
+	msg_type := MNCC_CALL_CONF_IND,
+	u := {
+		signal := {	/* See 24.008 9.3.2 */
+			callref := call_id,
+			bearer_cap := bcap,
+			called := omit,
+			calling := omit,
+			redirecting := omit,
+			connected := omit,
+			cause := cause,
+			progress := omit,
+			useruser := omit,
+			facility := omit,
+			cccap := cccap,
+			ssversion := omit,
+			clir_sup := 0,
+			clir_inv := 0,
+			signal := omit,
+			keypad := omit,
+			more := 0,
+			notify := 0,
+			emergency := omit,
+			imsi := "",
+			lchan_type := 0,
+			lchan_mode := 0
+		}
+	}
+}
+
 
 /* MO: MSC <- MNCC: CALL_PROC.req; call establishment initiated in network */
 template MNCC_PDU ts_MNCC_CALL_PROC_req(uint32_t call_id, template MNCC_bearer_cap bcap := omit,
@@ -1007,6 +1073,39 @@
 		}
 	}
 }
+template (value) MNCC_PDU ts_MNCC_ALERT_ind(uint32_t call_id,
+				    template (omit) MNCC_progress prog := omit,
+				    template (omit) charstring fac := omit,
+				    template (omit) MNCC_useruser uu := omit) := {
+	msg_type := MNCC_ALERT_IND,
+	u := {
+		signal := {	/* See 24.008 9.3.1 */
+			callref := call_id,
+			bearer_cap := omit,
+			called := omit,
+			calling := omit,
+			redirecting := omit,
+			connected := omit,
+			cause := omit,
+			progress := prog,
+			useruser := uu,
+			facility := fac,
+			cccap := omit,
+			ssversion := omit,
+			clir_sup := 0,
+			clir_inv := 0,
+			signal := omit,
+			keypad := omit,
+			more := 0,
+			notify := 0,
+			emergency := omit,
+			imsi := "",
+			lchan_type := 0,
+			lchan_mode := 0
+		}
+	}
+}
+
 
 /*   : MSC <- MNCC: NOTIFY.req; request to send information pertaining to a call (such as user suspended) */
 template MNCC_PDU ts_MNCC_NOTIFY_req(uint32_t call_id, MNCC_notify notify) := {
@@ -1794,6 +1893,22 @@
 		}
 	}
 }
+template MNCC_PDU tr_MNCC_RTP_CONNECT(template uint32_t call_id,
+				      template uint32_t ip := ?,
+				      template uint32_t rtp_port := ?,
+				      template uint32_t pt := ?) := {
+	msg_type := MNCC_RTP_CONNECT,
+	u := {
+		rtp := {
+			callref := call_id,
+			ip := ip,
+			rtp_port := rtp_port,
+			payload_type := pt,
+			payload_msg_type := 0
+		}
+	}
+}
+
 
 /* MSC <- MNCC: RTP_FREE.req; request connect of RTP */
 template MNCC_PDU ts_MNCC_RTP_FREE(uint32_t call_id) := ts_MNCC_SIMPLE_RTP(MNCC_RTP_FREE, call_id);
diff --git a/library/SIP_Emulation.ttcn b/library/SIP_Emulation.ttcn
index 57ec704..3957b8f 100644
--- a/library/SIP_Emulation.ttcn
+++ b/library/SIP_Emulation.ttcn
@@ -70,7 +70,7 @@
 	sipVersion := ?
 }
 
-template PDU_SIP_Request tr_SIP_INVITE := {
+private template PDU_SIP_Request tr_SIP_INVITE := {
 	requestLine := tr_ReqLine(INVITE_E),
 	msgHeader := t_SIP_msgHeader_any,
 	messageBody := *,
diff --git a/library/SIP_Templates.ttcn b/library/SIP_Templates.ttcn
new file mode 100644
index 0000000..75681a9
--- /dev/null
+++ b/library/SIP_Templates.ttcn
@@ -0,0 +1,413 @@
+module SIP_Templates {
+
+import from SIPmsg_Types all;
+
+/* wrapper type to encapsulate the Addr_Union + parameter list used in From, To. ... */
+type record SipAddr {
+	Addr_Union 		addr,
+	SemicolonParam_List	params optional
+}
+
+const charstring c_SIP_VERSION := "SIP/2.0";
+
+template (value) SipUrl ts_SipUrl(charstring user_or_tel, charstring host, integer portnr) := {
+	scheme := "sip",
+	userInfo := {
+		userOrTelephoneSubscriber := user_or_tel,
+		password := omit
+	},
+	hostPort := {
+		host := host,
+		portField := portnr
+	},
+	urlParameters := omit,
+	headers := omit
+}
+template SipUrl tr_SipUrl(template charstring user_or_tel,
+			  template charstring host,
+			  template integer portnr) := {
+	scheme := "sip",
+	userInfo := {
+		userOrTelephoneSubscriber := user_or_tel,
+		password := *
+	},
+	hostPort := {
+		host := host,
+		portField := portnr
+	},
+	urlParameters := *,
+	headers := *
+}
+
+template (value) SipAddr ts_SipAddr(charstring user_or_tel, charstring host, integer portnr) := {
+	addr := {
+		nameAddr := {
+			displayName := omit,
+			addrSpec := ts_SipUrl(user_or_tel, host, portnr)
+		}
+	},
+	params := omit
+}
+template SipAddr tr_SipAddr(template charstring user_or_tel,
+				template charstring host,
+				template integer portnr) := {
+	addr := {
+		nameAddr := {
+			displayName := *,
+			addrSpec := tr_SipUrl(user_or_tel, host, portnr)
+		}
+	},
+	params := *
+}
+
+/* build a receive template from a value: substitute '*' for omit */
+function tr_SipAddr_from_val(SipAddr tin) return template SipAddr {
+	var template SipAddr ret := tin;
+	if (tin.addr.nameAddr.displayName == omit) {
+		ret.addr.nameAddr.displayName := *;
+	}
+	if (tin.addr.nameAddr.addrSpec.userInfo.password == omit) {
+		ret.addr.nameAddr.addrSpec.userInfo.password := *;
+	}
+	if (tin.params == omit) {
+		ret.params := *;
+	}
+	return ret;
+}
+
+
+function tr_HostPort(template HostPort hp) return template HostPort {
+	var template HostPort hpout := hp;
+	/* if the port number is 5060, it may be omitted */
+	if (isvalue(hp.portField) and valueof(hp.portField) == 5060) {
+		hpout.portField := 5060 ifpresent;
+	}
+	return hpout;
+}
+
+template (value) RequestLine ts_SIP_ReqLine(Method method, template (value) SipUrl uri,
+					    charstring ver := c_SIP_VERSION) := {
+	method := method,
+	requestUri := uri,
+	sipVersion := ver
+}
+template RequestLine tr_SIP_ReqLine(template Method method,
+				    template SipUrl uri,
+				    template charstring ver := c_SIP_VERSION) := {
+	method := method,
+	requestUri := uri,
+	sipVersion := ver
+}
+
+template (value) StatusLine ts_SIP_StatusLine(integer status_code, charstring reason) := {
+	sipVersion := "SIP/2.0",
+	statusCode := status_code,
+	reasonPhrase := reason
+}
+template StatusLine tr_SIP_StatusLine(template integer status_code, template charstring reason) := {
+	sipVersion := "SIP/2.0",
+	statusCode := status_code,
+	reasonPhrase := reason
+}
+
+
+template (value) PDU_SIP_Request ts_SIP_req(template (value) RequestLine rl) := {
+	requestLine := rl,
+	msgHeader := c_SIP_msgHeader_empty,
+	messageBody := omit,
+	payload := omit
+}
+
+const Method_List c_SIP_defaultMethods := {
+	"INVITE", "ACK", "BYE", "CANCEL", "OPTIONS", "PRACK", "MESSAGE", "SUBSCRIBE",
+	"NOTIFY", "REFER", "UPDATE" };
+
+private function f_ContentTypeOrOmit(template (omit) ContentType ct, template (omit) charstring body)
+return template (omit) ContentType {
+	/* if user explicitly stated no content type */
+	if (istemplatekind(ct, "omit")) {
+		return omit;
+	}
+	/* if there's no body, then there's no content-type either */
+	if (istemplatekind(body, "omit")) {
+		return omit;
+	}
+	return ct;
+}
+
+template (value) ContentType ts_CT_SDP := {
+	fieldName := CONTENT_TYPE_E,
+	mediaType := "application/sdp"
+};
+
+template (value) Via ts_Via_from(SipAddr from_addr) := {
+	fieldName := VIA_E,
+	viaBody := {
+		{
+			sentProtocol := { "SIP", "2.0", "UDP" },
+			sentBy := from_addr.addr.nameAddr.addrSpec.hostPort,
+			viaParams := omit
+		}
+	}
+}
+
+template (value) MessageHeader ts_SIP_msgHeader_empty :=c_SIP_msgHeader_empty;
+template (value) MessageHeader ts_SIP_msgh_std( CallidString call_id,
+						SipAddr from_addr,
+						SipAddr to_addr,
+						template (omit) SipAddr contact_addr,
+						charstring method,
+						integer seq_nr,
+						template (value) Via via,
+						template (omit) ContentType content_type := omit,
+						Method_List allow_methods := c_SIP_defaultMethods
+					) modifies ts_SIP_msgHeader_empty := {
+	allow := {
+		fieldName := ALLOW_E,
+		methods := allow_methods
+	},
+	callId := {
+		fieldName := CALL_ID_E,
+		callid := call_id
+	},
+	contact := ts_Contact(contact_addr),
+	contentType := content_type,
+	cSeq := {
+		fieldName := CSEQ_E,
+		seqNumber := seq_nr,
+		method := method
+	},
+	fromField := {
+		fieldName := FROM_E,
+		addressField := from_addr.addr,
+		fromParams := from_addr.params
+	},
+	toField := {
+		fieldName := TO_E,
+		addressField := to_addr.addr,
+		toParams := to_addr.params
+	},
+	userAgent := {
+		fieldName := USER_AGENT_E,
+		userAgentBody := {
+			"osmo-ttcn3-hacks/0.23"
+		}
+	},
+	via := via
+}
+
+private function tr_Contact(template SipAddr contact_addr) return template Contact
+{
+	if (istemplatekind(contact_addr, "omit")) {
+		return omit;
+	} else if (istemplatekind(contact_addr, "*")) {
+		return *;
+	} else if (istemplatekind(contact_addr, "?")) {
+		return ?;
+	}
+	var template Contact ret := {
+		fieldName := CONTACT_E,
+		contactBody := {
+			contactAddresses := {
+				{
+					addressField := contact_addr.addr,
+					contactParams := contact_addr.params
+				}
+			}
+		}
+	};
+	return ret;
+}
+
+private function ts_Contact(template (omit) SipAddr contact_addr) return template (omit) Contact
+{
+	if (istemplatekind(contact_addr, "omit")) {
+		return omit;
+	}
+	var template (omit) Contact ret := {
+		fieldName := CONTACT_E,
+		contactBody := {
+			contactAddresses := {
+				{
+					addressField := contact_addr.addr,
+					contactParams := contact_addr.params
+				}
+			}
+		}
+	};
+	return ret;
+}
+
+
+function tr_AllowMethods(template Method_List allow_methods) return template Allow {
+	if (istemplatekind(allow_methods, "omit")) {
+		return omit;
+	} else if (istemplatekind(allow_methods, "*")) {
+		return *;
+	} else if (istemplatekind(allow_methods, "?")) {
+		return ?;
+	}
+	var template Allow ret := {
+		fieldName := ALLOW_E,
+		methods := allow_methods
+	}
+	return ret
+}
+
+template MessageHeader tr_SIP_msgh_std( template CallidString call_id,
+					template SipAddr from_addr,
+					template SipAddr to_addr,
+					template SipAddr contact_addr,
+					template charstring method,
+					template ContentType content_type := *,
+					template integer seq_nr := ?,
+					template Method_List allow_methods := *
+				) modifies t_SIP_msgHeader_any := {
+	allow := tr_AllowMethods(allow_methods),
+	callId := {
+		fieldName := CALL_ID_E,
+		callid := call_id
+	},
+	contact := tr_Contact(contact_addr),
+	contentType := content_type,
+	cSeq := {
+		fieldName := CSEQ_E,
+		seqNumber := seq_nr,
+		method := method
+	},
+	fromField := {
+		fieldName := FROM_E,
+		addressField := from_addr.addr,
+		fromParams := from_addr.params
+	},
+	toField := {
+		fieldName := TO_E,
+		addressField := to_addr.addr,
+		toParams := to_addr.params
+	},
+	userAgent := *,
+	via := {
+		fieldName := VIA_E,
+		viaBody := {
+			{
+				sentProtocol := { "SIP", "2.0", "UDP" },
+				sentBy := tr_HostPort(from_addr.addr.nameAddr.addrSpec.hostPort),
+				viaParams := *
+			}
+		}
+	}
+}
+
+
+template (value) PDU_SIP_Request ts_SIP_INVITE( CallidString call_id,
+						SipAddr from_addr,
+						SipAddr to_addr,
+						integer seq_nr,
+						template (omit) charstring body
+						) := {
+	requestLine := ts_SIP_ReqLine(INVITE_E, to_addr.addr.nameAddr.addrSpec),
+	msgHeader := ts_SIP_msgh_std(call_id, from_addr, to_addr, from_addr, "INVITE", seq_nr,
+				     ts_Via_from(from_addr), f_ContentTypeOrOmit(ts_CT_SDP, body)),
+	messageBody := body,
+	payload := omit
+}
+template PDU_SIP_Request tr_SIP_INVITE( template CallidString call_id,
+					template SipAddr from_addr,
+					template SipAddr to_addr,
+					template integer seq_nr,
+					template charstring body
+						) := {
+	requestLine := tr_SIP_ReqLine(INVITE_E, to_addr.addr.nameAddr.addrSpec),
+	msgHeader := tr_SIP_msgh_std(call_id, from_addr, to_addr, ?, "INVITE", *, seq_nr),
+	messageBody := body,
+	payload := omit
+}
+
+template (value) PDU_SIP_Request ts_SIP_BYE( CallidString call_id,
+					     SipAddr from_addr,
+					     SipAddr to_addr,
+					     integer seq_nr,
+					     template (omit) charstring body
+						) := {
+	requestLine := ts_SIP_ReqLine(BYE_E, to_addr.addr.nameAddr.addrSpec),
+	msgHeader := ts_SIP_msgh_std(call_id, from_addr, to_addr, omit, "BYE", seq_nr,
+				     ts_Via_from(from_addr), f_ContentTypeOrOmit(ts_CT_SDP, body)),
+	messageBody := body,
+	payload := omit
+}
+
+template PDU_SIP_Request tr_SIP_BYE( template CallidString call_id,
+					template SipAddr from_addr,
+					template SipAddr to_addr,
+					template integer seq_nr,
+					template charstring body
+						) := {
+	requestLine := tr_SIP_ReqLine(BYE_E, to_addr.addr.nameAddr.addrSpec),
+	msgHeader := tr_SIP_msgh_std(call_id, from_addr, to_addr, omit, "BYE", *, seq_nr),
+	messageBody := body,
+	payload := omit
+}
+
+
+template (value) PDU_SIP_Request ts_SIP_ACK( CallidString call_id,
+						SipAddr from_addr,
+						SipAddr to_addr,
+						integer seq_nr,
+						template (omit) charstring body
+						) := {
+	requestLine := ts_SIP_ReqLine(ACK_E, to_addr.addr.nameAddr.addrSpec),
+	msgHeader := ts_SIP_msgh_std(call_id, from_addr, to_addr, from_addr, "ACK", seq_nr,
+				     ts_Via_from(from_addr), f_ContentTypeOrOmit(ts_CT_SDP, body)),
+	messageBody := body,
+	payload := omit
+}
+template PDU_SIP_Request tr_SIP_ACK( template CallidString call_id,
+				     template SipAddr from_addr,
+				     template SipAddr to_addr,
+				     template integer seq_nr,
+				     template charstring body
+						) := {
+	requestLine := tr_SIP_ReqLine(ACK_E, to_addr.addr.nameAddr.addrSpec),
+	msgHeader := tr_SIP_msgh_std(call_id, from_addr, to_addr, *, "ACK", *, seq_nr),
+	messageBody := body,
+	payload := omit
+}
+
+
+
+template (value) PDU_SIP_Response ts_SIP_Response( CallidString call_id,
+						   SipAddr from_addr,
+						   SipAddr to_addr,
+						   charstring method,
+						   integer status_code,
+						   integer seq_nr,
+						   charstring reason,
+						   Via via,
+						   template (omit) charstring body := omit
+							) := {
+	statusLine := ts_SIP_StatusLine(status_code, reason),
+	msgHeader := ts_SIP_msgh_std(call_id, from_addr, to_addr, omit, method, seq_nr,
+				     via, f_ContentTypeOrOmit(ts_CT_SDP, body)),
+	messageBody := body,
+	payload := omit
+}
+
+template PDU_SIP_Response tr_SIP_Response( template CallidString call_id,
+					   template SipAddr from_addr,
+					   template SipAddr to_addr,
+					   template SipAddr contact_addr,
+					   template charstring method,
+					   template integer status_code,
+					   template integer seq_nr := ?,
+					   template charstring reason := ?,
+					   template charstring body := ?
+						) := {
+	statusLine := tr_SIP_StatusLine(status_code, reason),
+	msgHeader := tr_SIP_msgh_std(call_id, from_addr, to_addr, contact_addr, method, *, seq_nr),
+	messageBody := body,
+	payload := omit
+}
+
+
+
+}