sip: Add SIP_Emulation and first osmo-sip-connector test case

Change-Id: Ifd47b0d48c609b4a678ea47aa7f89f5c12e6c0d2
diff --git a/library/MNCC_Emulation.ttcn b/library/MNCC_Emulation.ttcn
index 60ec58b..856575e 100644
--- a/library/MNCC_Emulation.ttcn
+++ b/library/MNCC_Emulation.ttcn
@@ -193,7 +193,7 @@
 }
 
 
-function f_connect(charstring sock) runs on MNCC_Emulation_CT {
+private function f_connect(charstring sock) runs on MNCC_Emulation_CT {
 	var UD_connect_result res;
 	timer T := 5.0;
 
@@ -215,6 +215,40 @@
 	}
 }
 
+private function f_listen(charstring sock) runs on MNCC_Emulation_CT {
+	var UD_listen_result res;
+	var UD_connected udc;
+	timer T := 5.0;
+
+	T.start;
+	MNCC.send(UD_listen:{sock});
+	alt {
+	[] MNCC.receive(UD_listen_result:?) -> value res {
+		if (ispresent(res.result) and ispresent(res.result.result_code) and res.result.result_code == ERROR) {
+			setverdict(fail, "Error listening to MNCC socket", res);
+			self.stop;
+		} else {
+			g_mncc_ud_id := res.id;
+		}
+		}
+	[] T.timeout {
+		setverdict(fail, "Timeout listening to MNCC socket");
+		self.stop;
+		}
+	}
+
+	T.start;
+	alt {
+	[] MNCC.receive(UD_connected:?) -> value udc {
+		g_mncc_ud_id := res.id;
+		}
+	[] T.timeout {
+		setverdict(fail, "Timeout waiting for MNCC connection");
+		self.stop;
+		}
+	}
+}
+
 /* call-back type, to be provided by specific implementation; called when new SCCP connection
  * arrives */
 type function MnccCreateCallback(MNCC_PDU conn_ind, charstring id)
@@ -228,9 +262,14 @@
 	MnccUnitdataCallback unitdata_cb
 }
 
-function main(MnccOps ops, charstring id, charstring sock) runs on MNCC_Emulation_CT {
+function main(MnccOps ops, charstring id, charstring sock, boolean role_server := false)
+runs on MNCC_Emulation_CT {
 
-	f_connect(sock);
+	if (role_server) {
+		f_listen(sock);
+	} else {
+		f_connect(sock);
+	}
 	f_expect_table_init();
 	f_call_table_init();
 
@@ -289,15 +328,19 @@
 			f_call_table_del(call_id);
 			}
 
-		/* Client -> MNCC Socket: SETUP.req: forward + add call table entry */
-		[] MNCC_CLIENT.receive(MNCC_PDU:{msg_type := MNCC_SETUP_REQ, u:=?}) -> value mncc sender vc_conn {
-			/* add to call table */
-			f_call_table_add(vc_conn, f_mncc_get_call_id(mncc));
+		/* Client -> MNCC Socket: Normal message */
+		[] MNCC_CLIENT.receive(MNCC_PDU:?) -> value mncc sender vc_conn {
+			if (mncc.msg_type == MNCC_SETUP_REQ and not role_server) {
+				/* ConnHdlr -> MNCC Server: SETUP.req: add to call table */
+				f_call_table_add(vc_conn, f_mncc_get_call_id(mncc));
+			} else if (mncc.msg_type == MNCC_SETUP_IND and role_server) {
+				/* ConnHdlr -> MNCC Client: SETUP.ind: add to call table */
+				f_call_table_add(vc_conn, f_mncc_get_call_id(mncc));
+			}
 			/* forward to MNCC socket */
 			MNCC.send(t_SD_MNCC(g_mncc_ud_id, mncc));
 			}
 
-		/* Client -> MNCC Socket: Normal message */
 		[] MNCC_CLIENT.receive(MNCC_PDU:?) -> value mncc sender vc_conn {
 			/* forward to MNCC socket */
 			MNCC.send(t_SD_MNCC(g_mncc_ud_id, mncc));