HTTP_Server component added

Signed-off-by: eantwuh <antal.wu-hen-chang@ericsson.com>
diff --git a/IFW_HTTP_Server_Definitions.ttcn b/IFW_HTTP_Server_Definitions.ttcn
new file mode 100644
index 0000000..4d8a3f6
--- /dev/null
+++ b/IFW_HTTP_Server_Definitions.ttcn
@@ -0,0 +1,63 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2000-2019 Ericsson Telecom AB
+//
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v2.0
+// which accompanies this distribution, and is available at
+// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+///////////////////////////////////////////////////////////////////////////////
+//  File:               IFW_HTTP_Server_Definitions.ttcn
+//  Description:
+//  Rev:                R1A
+//  Prodnr:             LPA 108 661
+//  Updated:            2019-07-30
+//  Contact:            http://ttcn.ericsson.se
+///////////////////////////////////////////////////////////////////////////////
+module IFW_HTTP_Server_Definitions
+{
+
+  import from HTTPmsg_Types all;
+  import from IPL4asp_PortType all;
+  import from IFW_Common all;
+
+  type component IFW_HTTP_Server_CT extends IFW_BASE_CT
+  {
+    var HttpServerContext ctx := c_HttpServerContext_empty; 
+
+    var HTTPMessage msgToSend := c_HTTPMessage_empty;
+    var HTTPMessage lastReceived := c_HTTPMessage_empty;
+
+    port IPL4asp_PT IPL4_PCO;
+  }
+
+  type record HttpServerContext
+  {
+    integer serverConnId,
+    integer clientConnId,
+    charstring localHost,
+    integer localPort,
+    charstring remoteHost,
+    integer remotePort
+  }	
+  with { extension "done" }
+
+  const HttpServerContext c_HttpServerContext_empty :=
+  {
+    serverConnId := -1,
+    clientConnId := -1,
+    localHost := "",
+    localPort := -1,
+    remoteHost := "",
+    remotePort := -1
+  }
+
+  const HTTPMessage c_HTTPMessage_empty :=
+  {
+    erronous_msg :=
+    {
+      client_id := omit,
+      msg := ""
+    }
+  }
+}
diff --git a/IFW_HTTP_Server_Functions.ttcn b/IFW_HTTP_Server_Functions.ttcn
new file mode 100644
index 0000000..4f1574b
--- /dev/null
+++ b/IFW_HTTP_Server_Functions.ttcn
@@ -0,0 +1,162 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2000-2019 Ericsson Telecom AB
+//
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v2.0
+// which accompanies this distribution, and is available at
+// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+///////////////////////////////////////////////////////////////////////////////
+//  File:               IFW_HTTP_Server_Functions.ttcn
+//  Description:
+//  Rev:                R1A
+//  Prodnr:             LPA 108 661
+//  Updated:            2019-07-30
+//  Contact:            http://ttcn.ericsson.se
+///////////////////////////////////////////////////////////////////////////////
+module IFW_HTTP_Server_Functions
+{
+  import from IFW_HTTP_Server_Definitions all;
+  import from HTTPmsg_Types all;
+  import from IPL4asp_Types all;
+  import from IPL4asp_PortType all;
+  import from IFW_Common all;
+  import from TCCMessageHandling_Functions all;
+  import from HTTPmsg_MessageLen all;
+
+  function f_HTTP_Server_init() runs on IFW_HTTP_Server_CT
+  {
+    log(%definitionId, " started");
+    var Result vl_result;
+
+    log("Mapping started");
+    map(self:IPL4_PCO,system:IPL4_PCO);
+    var f_IPL4_getMsgLen vl_f := refers(f_HTTP_Server_getMessageLength);
+    f_IPL4_setGetMsgLen(IPL4_PCO, -1, vl_f, {});
+
+    log("Creating the server socket");
+    vl_result := f_IPL4_listen(IPL4_PCO, ctx.localHost, ctx.localPort, {tcp := {}}, {{reuseAddress := {enable := true}}});
+    f_checkResult(vl_result);
+    ctx.serverConnId := vl_result.connId;
+
+    log(%definitionId, " finished");
+  }	
+
+  function f_HTTP_Server_cleanUp() runs on IFW_HTTP_Server_CT
+  {
+    log(%definitionId, " started");
+    var Result vl_result;
+
+    log("Closing connection");
+    if (ctx.serverConnId >= 0)
+    {
+      vl_result := f_IPL4_close(IPL4_PCO, ctx.serverConnId, {tcp := {}});
+      //f_checkResult(vl_result);		  
+    }
+
+    log(%definitionId, " finished");
+  }
+	
+  function f_HTTP_Server_getContext() runs on IFW_HTTP_Server_CT
+  return HttpServerContext
+  {
+    return ctx;
+  }
+	
+  function f_HTTP_Server_setContext(in HttpServerContext p_ctx) runs on IFW_HTTP_Server_CT
+  {
+    ctx := p_ctx;
+  }
+	
+  function f_HTTP_Server_setMessageToSend(in HTTPMessage p_msg) runs on IFW_HTTP_Server_CT
+  {
+    msgToSend := p_msg;
+  }	
+	
+  function f_HTTP_Server_send() runs on IFW_HTTP_Server_CT
+  {
+    var octetstring v_encoded;
+
+    v_encoded := enc_HTTPMessage(msgToSend);
+
+    var ASP_SendTo vl_send;
+
+    vl_send.connId := ctx.clientConnId;
+    vl_send.remName := ctx.remoteHost;
+    vl_send.remPort := ctx.remotePort;
+    vl_send.proto := {tcp := {}}
+
+    vl_send.msg := v_encoded;
+
+    log("HTTP PDU: ", msgToSend);
+    log("IPL4 PDU: ", vl_send);
+    IPL4_PCO.send(vl_send);
+  }
+	
+  function f_HTTP_Server_receive(in float p_maxWait := 10.0) runs on IFW_HTTP_Server_CT
+  {
+    timer t_Timeout := p_maxWait;
+    if (p_maxWait > 0.0) { t_Timeout.start; }
+
+    var ASP_RecvFrom v_ipl4Recv;
+    var ASP_Event v_ipl4Event;
+
+    alt
+    {
+      [] IPL4_PCO.receive(ASP_RecvFrom:?) -> value v_ipl4Recv
+      {
+        log("Received: ", v_ipl4Recv);
+
+        if (ispresent(v_ipl4Recv.connId)) { ctx.clientConnId := v_ipl4Recv.connId; }
+
+	var HTTPMessage v_httpMsg;
+	dec_HTTPMessage(v_ipl4Recv.msg, v_httpMsg);
+
+        lastReceived := v_httpMsg;
+        ctx.remoteHost := v_ipl4Recv.remName;
+        ctx.remotePort := v_ipl4Recv.remPort;
+        log("IPL4 PDU: ", lastReceived);
+        log("HTTP PDU: ", v_httpMsg);
+      }
+      [] IPL4_PCO.receive(ASP_Event:?) -> value v_ipl4Event
+      {
+	log("Received: ", v_ipl4Event);
+	repeat;
+      }
+      [] t_Timeout.timeout
+      {
+	lastReceived := c_HTTPMessage_empty;
+      }
+    }
+  }
+  
+  function f_HTTP_Server_check(in template HTTPMessage p_expected) runs on IFW_HTTP_Server_CT
+  return ReturnBoolean
+  {
+    if (not match(lastReceived, p_expected)) 
+    {
+      log("CHECK: last received is not matching with expected template");
+      return false;
+    }
+
+    log("CHECK: return true");
+    return true;
+  }
+	
+  function f_HTTP_Server_getMessageLength(in octetstring stream, inout ro_integer args)
+  return integer
+  {
+    // return f_TCCMessageHandling_getMessageLength(stream)
+    return f_HTTPMessage_len(stream);
+  }
+    
+  function f_HTTP_lookupHeader(charstring p_headerName, in HeaderLines p_headers)
+  return integer
+  {
+    for (var integer i:=0; i<sizeof(p_headers); i:=i+1)
+    {
+      if (p_headers[i].header_name == p_headerName) { return i; }
+    }
+    return -1;
+  }
+}
diff --git a/IFW_HTTP_Server_TestSteps.ttcn b/IFW_HTTP_Server_TestSteps.ttcn
new file mode 100644
index 0000000..8024807
--- /dev/null
+++ b/IFW_HTTP_Server_TestSteps.ttcn
@@ -0,0 +1,130 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2000-2019 Ericsson Telecom AB
+//
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v2.0
+// which accompanies this distribution, and is available at
+// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
+///////////////////////////////////////////////////////////////////////////////
+//  File:               IFW_HTTP_Server_TestSteps.ttcn
+//  Description:
+//  Rev:                R1A
+//  Prodnr:             LPA 108 661
+//  Updated:            2019-07-30
+//  Contact:            http://ttcn.ericsson.se
+///////////////////////////////////////////////////////////////////////////////
+module IFW_HTTP_Server_TestSteps 
+{
+
+ import from IoT_FT_Framework_Definitions all;
+ import from IFW_Common all;
+ import from IFW_HTTP_Server_Definitions all;
+ import from IFW_HTTP_Server_Functions all;
+ import from HTTPmsg_Types all;
+	
+  function f_IFW_HttpServer_init(in integer p_serverIdx) runs on IFW_MAIN_CT
+  return boolean
+  {
+    var IFW_HTTP_Server_CT v_server := httpServers[p_serverIdx];	  
+    if (v_server == null) { log("IFW: No http server found"); return false; }
+    f_isRunningGuard(v_server);
+
+    v_server.start(f_HTTP_Server_init());
+    v_server.done;
+
+    return true;	  
+  }
+	
+  function f_IFW_HttpServer_cleanUp(in integer p_serverIdx) runs on IFW_MAIN_CT
+  return boolean
+  {
+    var IFW_HTTP_Server_CT v_server := httpServers[p_serverIdx];
+    if (v_server == null) { log("IFW: No http server found"); return false; }
+    f_isRunningGuard(v_server);
+
+    v_server.start(f_HTTP_Server_cleanUp());
+    v_server.done;
+
+    return true;	  
+  }
+	
+  function f_IFW_HttpServer_getContext(in integer p_serverIdx, out HttpServerContext p_httpServerContext) runs on IFW_MAIN_CT
+  return boolean
+  {
+    var IFW_HTTP_Server_CT v_server := httpServers[p_serverIdx];
+    if (v_server == null) { log("IFW: No http server found"); return false; }	  
+    f_isRunningGuard(v_server);
+
+    v_server.start(f_HTTP_Server_getContext());
+    v_server.done(HttpServerContext:?) -> value p_httpServerContext;
+
+    return true;
+  }
+	
+  function f_IFW_HttpServer_setContext(in integer p_serverIdx, in HttpServerContext p_httpServerContext) runs on IFW_MAIN_CT
+  return boolean
+  {
+    var IFW_HTTP_Server_CT v_server := httpServers[p_serverIdx];	  
+    if (v_server == null) { log("IFW: No http server found"); return false; }	  
+    f_isRunningGuard(v_server);
+
+    v_server.start(f_HTTP_Server_setContext(p_httpServerContext));
+    v_server.done;
+
+    return true;
+  }	
+	
+  function f_IFW_HttpServer_setMessageToSend(in integer p_serverIdx, HTTPMessage p_msg) runs on IFW_MAIN_CT
+  return boolean
+  {
+    var IFW_HTTP_Server_CT v_server := httpServers[p_serverIdx];	  
+    if (v_server == null) { log("IFW: No http server found"); return false; }	  
+    f_isRunningGuard(v_server);
+
+    v_server.start(f_HTTP_Server_setMessageToSend(p_msg));
+    v_server.done;
+
+    return true;
+  }
+	
+  function f_IFW_HttpServer_send(in integer p_serverIdx) runs on IFW_MAIN_CT
+  return boolean
+  {
+    var IFW_HTTP_Server_CT v_server := httpServers[p_serverIdx];	  
+    if (v_server == null) { log("IFW: No http server found"); return false; }	  
+    f_isRunningGuard(v_server);
+
+    v_server.start(f_HTTP_Server_send());
+    v_server.done;
+
+    return true;
+  }
+
+  function f_IFW_HttpServer_receive(in integer p_serverIdx) runs on IFW_MAIN_CT
+  return boolean
+  {
+    var IFW_HTTP_Server_CT v_server := httpServers[p_serverIdx];	  
+    if (v_server == null) { log("IFW: No http server found"); return false; }	  
+    f_isRunningGuard(v_server);
+
+    v_server.start(f_HTTP_Server_receive());
+    v_server.done;
+
+    return true;
+  }
+
+  function f_IFW_HttpServer_check(in integer p_serverIdx, template HTTPMessage p_msg) runs on IFW_MAIN_CT
+  return boolean
+  {
+    var boolean v_ret;
+    var IFW_HTTP_Server_CT v_server := httpServers[p_serverIdx];	  
+    if (v_server == null) { log("IFW: No http server found"); return false; }	  
+    f_isRunningGuard(v_server);
+
+    v_server.start(f_HTTP_Server_check(p_msg));
+    v_server.done(ReturnBoolean:?) -> value v_ret; 
+
+    return v_ret;
+  }	
+}
diff --git a/IoT_FT_Framework_Definitions.ttcn b/IoT_FT_Framework_Definitions.ttcn
index 499f936..6beb4c8 100644
--- a/IoT_FT_Framework_Definitions.ttcn
+++ b/IoT_FT_Framework_Definitions.ttcn
@@ -11,34 +11,38 @@
 //  Description:
 //  Rev:                R1A
 //  Prodnr:             LPA 108 661
-//  Updated:            2017-09-01
+//  Updated:            2019-08-28
 //  Contact:            http://ttcn.ericsson.se
 ///////////////////////////////////////////////////////////////////////////////
 module IoT_FT_Framework_Definitions
 {
-    import from IFW_Common all;
-	import from IFW_CoAP_Peer_Definitions all;
-	import from IFW_HTTP_Client_Definitions all;
-	import from IFW_MQTT_Client_Definitions all;
+  import from IFW_Common all;
+  import from IFW_CoAP_Peer_Definitions all;
+  import from IFW_HTTP_Client_Definitions all;
+  import from IFW_HTTP_Server_Definitions all;
+  import from IFW_MQTT_Client_Definitions all;
 
-	type component IFW_MAIN_CT
-	extends IFW_BASE_CT
-	{
-		var IFW_COAP_CT_List coapPeers := {};
-		var IFW_HTTP_Client_CT_List httpClients := {};
-		var IFW_MQTT_Client_CT_List mqttClients := {};
+  type component IFW_MAIN_CT
+  extends IFW_BASE_CT
+  {
+    var IFW_COAP_CT_List coapPeers := {};
+    var IFW_HTTP_Client_CT_List httpClients := {};
+    var IFW_HTTP_Server_CT_List httpServers := {};
+    var IFW_MQTT_Client_CT_List mqttClients := {};
 		
-		var integer mid := 0;
-	}
+    var integer mid := 0;
+  }
 	
-	type record of IFW_COAP_CT IFW_COAP_CT_List;
-	type record of IFW_HTTP_Client_CT IFW_HTTP_Client_CT_List;
-	type record of IFW_MQTT_Client_CT IFW_MQTT_Client_CT_List;
+  type record of IFW_COAP_CT IFW_COAP_CT_List;
+  type record of IFW_HTTP_Client_CT IFW_HTTP_Client_CT_List;
+  type record of IFW_HTTP_Server_CT IFW_HTTP_Server_CT_List;
+  type record of IFW_MQTT_Client_CT IFW_MQTT_Client_CT_List;
 	
-	type enumerated IFW_ComponentTypes
-	{
-	  COAP_PEER,
-	  HTTP_CLIENT,
-	  MQTT_CLIENT
-	}
+  type enumerated IFW_ComponentTypes
+  {
+    COAP_PEER,
+    HTTP_CLIENT,
+    HTTP_SERVER,
+    MQTT_CLIENT
+  }
 }
diff --git a/IoT_FT_Framework_Functions.ttcn b/IoT_FT_Framework_Functions.ttcn
index 3d31535..4960d5f 100644
--- a/IoT_FT_Framework_Functions.ttcn
+++ b/IoT_FT_Framework_Functions.ttcn
@@ -11,129 +11,164 @@
 //  Description:
 //  Rev:                R1A
 //  Prodnr:             LPA 108 661
-//  Updated:            2017-09-01
+//  Updated:            2019-07-30
 //  Contact:            http://ttcn.ericsson.se
 ///////////////////////////////////////////////////////////////////////////////
 module IoT_FT_Framework_Functions
 {
-    import from IoT_FT_Framework_Definitions all;
-	import from IFW_CoAP_Peer_Definitions all;
-	import from IFW_CoAP_Peer_TestSteps all;
-	import from IFW_HTTP_Client_Definitions all;
-	import from IFW_HTTP_Client_TestSteps all;
-	import from IFW_MQTT_Client_Definitions all;
-	import from IFW_MQTT_Client_TestSteps all;
-	import from IFW_Common all;
+  import from IoT_FT_Framework_Definitions all;
+  import from IFW_CoAP_Peer_Definitions all;
+  import from IFW_CoAP_Peer_TestSteps all;
+  import from IFW_HTTP_Client_Definitions all;
+  import from IFW_HTTP_Client_TestSteps all;
+  import from IFW_HTTP_Server_Definitions all;
+  import from IFW_HTTP_Server_TestSteps all;
+  import from IFW_MQTT_Client_Definitions all;
+  import from IFW_MQTT_Client_TestSteps all;
+  import from IFW_Common all;
 	
-	function f_IFW_addComponent(IFW_ComponentTypes p_componentType, charstring p_addrId := "")
-	runs on IFW_MAIN_CT
-	return integer
-	{
-	  if (p_componentType == COAP_PEER) {
-	    return f_IFW_addCoapPeerComponent(p_addrId);
-	  }
-	  else if (p_componentType == HTTP_CLIENT)
-	  {
-	    return f_IFW_addHttpClientComponent(p_addrId);
-	  }
-	  else if (p_componentType == MQTT_CLIENT)
-	  {
-	    return f_IFW_addMqttClientComponent(p_addrId);
-	  }
-	  
-	  return -1;
-	}
+  function f_IFW_addComponent(IFW_ComponentTypes p_componentType, charstring p_addrId := "")
+  runs on IFW_MAIN_CT
+  return integer
+  {
+    if (p_componentType == COAP_PEER)
+    {
+      return f_IFW_addCoapPeerComponent(p_addrId);
+    }
+    else if (p_componentType == HTTP_CLIENT)
+    {
+      return f_IFW_addHttpClientComponent(p_addrId);
+    }
+    else if (p_componentType == HTTP_SERVER)
+    {
+      return f_IFW_addHttpServerComponent(p_addrId);
+    }
+    else if (p_componentType == MQTT_CLIENT)
+    {
+      return f_IFW_addMqttClientComponent(p_addrId);
+    }
+
+    return -1;
+  }
 	
-	function f_IFW_addCoapPeerComponent(charstring p_addrId := "") runs on IFW_MAIN_CT
-	return integer
-	{
-		var IFW_COAP_CT v_peer := IFW_COAP_CT.create alive;
-		var integer v_peerIdx := sizeof(coapPeers);
-		
-		coapPeers[v_peerIdx] := v_peer;
-		
-		var NamedHostPort v_addr;
-		if (f_lookupAddress(p_addrId, v_addr))
-		{
-			var CoapContext v_ctx;
-			f_IFW_CoapPeer_getContext(v_peerIdx, v_ctx);
-			v_ctx.localHost := v_addr.hostName;
-			v_ctx.localPort := v_addr.portNumber;
-			
-			f_IFW_CoapPeer_setContext(v_peerIdx, v_ctx);
-		}
-	  
-		return v_peerIdx;
-	}
+  function f_IFW_addCoapPeerComponent(charstring p_addrId := "") runs on IFW_MAIN_CT
+  return integer
+  {
+    var IFW_COAP_CT v_peer := IFW_COAP_CT.create alive;
+    var integer v_peerIdx := sizeof(coapPeers);
+
+    coapPeers[v_peerIdx] := v_peer;
+
+    var NamedHostPort v_addr;
+    if (f_lookupAddress(p_addrId, v_addr))
+    {
+      var CoapContext v_ctx;
+      f_IFW_CoapPeer_getContext(v_peerIdx, v_ctx);
+      v_ctx.localHost := v_addr.hostName;
+      v_ctx.localPort := v_addr.portNumber;
+
+      f_IFW_CoapPeer_setContext(v_peerIdx, v_ctx);
+    }
+
+    return v_peerIdx;
+  }
 	
-	function f_IFW_addHttpClientComponent(charstring p_addrId := "") runs on IFW_MAIN_CT
-	return integer
-	{
-		var IFW_HTTP_Client_CT v_client := IFW_HTTP_Client_CT.create alive;
-		var integer v_clientIdx := sizeof(httpClients);
-		
-		httpClients[v_clientIdx] := v_client;
-		
-		var NamedHostPort v_addr;
-		if (f_lookupAddress(p_addrId, v_addr))
-		{
-			var HttpClientContext v_ctx;
-			f_IFW_HttpClient_getContext(v_clientIdx, v_ctx);
-			v_ctx.localHost := v_addr.hostName;
-			v_ctx.localPort := v_addr.portNumber;
-			
-			f_IFW_HttpClient_setContext(v_clientIdx, v_ctx);
-		}
-	  
-		return v_clientIdx;
-	}
+  function f_IFW_addHttpClientComponent(charstring p_addrId := "") runs on IFW_MAIN_CT
+  return integer
+  {
+    var IFW_HTTP_Client_CT v_client := IFW_HTTP_Client_CT.create alive;
+    var integer v_clientIdx := sizeof(httpClients);
+
+    httpClients[v_clientIdx] := v_client;
+
+    var NamedHostPort v_addr;
+    if (f_lookupAddress(p_addrId, v_addr))
+    {
+      var HttpClientContext v_ctx;
+      f_IFW_HttpClient_getContext(v_clientIdx, v_ctx);
+      v_ctx.localHost := v_addr.hostName;
+      v_ctx.localPort := v_addr.portNumber;
+
+      f_IFW_HttpClient_setContext(v_clientIdx, v_ctx);
+    }
+
+    return v_clientIdx;
+  }
 	
-	function f_IFW_addMqttClientComponent(charstring p_addrId := "") runs on IFW_MAIN_CT
-	return integer
-	{
-		var IFW_MQTT_Client_CT v_client := IFW_MQTT_Client_CT.create alive;
-		var integer v_clientIdx := sizeof(mqttClients);
-		
-		mqttClients[v_clientIdx] := v_client;
-		
-		var NamedHostPort v_addr;
-		if (f_lookupAddress(p_addrId, v_addr))
-		{
-			var MqttClientContext v_ctx;
-			f_IFW_MqttClient_getContext(v_clientIdx, v_ctx);
-			v_ctx.localHost := v_addr.hostName;
-			v_ctx.localPort := v_addr.portNumber;
-			
-			f_IFW_MqttClient_setContext(v_clientIdx, v_ctx);
-		}
-	  
-		return v_clientIdx;
-	}
+  function f_IFW_addHttpServerComponent(charstring p_addrId := "") runs on IFW_MAIN_CT
+  return integer
+  {
+    var IFW_HTTP_Server_CT v_server := IFW_HTTP_Server_CT.create alive;
+    var integer v_serverIdx := sizeof(httpServers);
+
+    httpServers[v_serverIdx] := v_server;
+
+    var NamedHostPort v_addr;
+    if (f_lookupAddress(p_addrId, v_addr))
+    {
+      var HttpServerContext v_ctx;
+      f_IFW_HttpServer_getContext(v_serverIdx, v_ctx);
+      v_ctx.localHost := v_addr.hostName;
+      v_ctx.localPort := v_addr.portNumber;
+
+      f_IFW_HttpServer_setContext(v_serverIdx, v_ctx);
+    }
+
+    return v_serverIdx;
+  }
 	
-	function f_IFW_initComponents() runs on IFW_MAIN_CT
-	{
-	  setverdict(pass);
-	  mid := float2int(int2float(65000)*rnd());
-	  
-	  for (var integer i:=0; i<sizeof(coapPeers); i:=i+1) {
-	    f_IFW_CoapPeer_init(i);
-	  }
-	  for (var integer i:=0; i<sizeof(httpClients); i:=i+1) {
-	    f_IFW_HttpClient_init(i);
-	  }
-	  for (var integer i:=0; i<sizeof(mqttClients); i:=i+1) {
-	    f_IFW_MqttClient_init(i);
-	  }
-	}
+  function f_IFW_addMqttClientComponent(charstring p_addrId := "") runs on IFW_MAIN_CT
+  return integer
+  {
+    var IFW_MQTT_Client_CT v_client := IFW_MQTT_Client_CT.create alive;
+    var integer v_clientIdx := sizeof(mqttClients);
+
+    mqttClients[v_clientIdx] := v_client;
+
+    var NamedHostPort v_addr;
+    if (f_lookupAddress(p_addrId, v_addr))
+    {
+      var MqttClientContext v_ctx;
+      f_IFW_MqttClient_getContext(v_clientIdx, v_ctx);
+      v_ctx.localHost := v_addr.hostName;
+      v_ctx.localPort := v_addr.portNumber;
+
+      f_IFW_MqttClient_setContext(v_clientIdx, v_ctx);
+    }
+
+    return v_clientIdx;
+  }
 	
-	function f_IFW_cleanUp() runs on IFW_MAIN_CT
-	{
-	  for (var integer i:=0; i<sizeof(httpClients); i:=i+1) {
-	    f_IFW_HttpClient_cleanUp(i);
-	  }
-	  for (var integer i:=0; i<sizeof(mqttClients); i:=i+1) {
-	    f_IFW_MqttClient_cleanUp(i);
-	  }
-	  stop;
-	}
+  function f_IFW_initComponents() runs on IFW_MAIN_CT
+  {
+    setverdict(pass);
+    mid := float2int(int2float(65000)*rnd());
+
+    for (var integer i:=0; i<sizeof(coapPeers); i:=i+1) {
+      f_IFW_CoapPeer_init(i);
+    }
+    for (var integer i:=0; i<sizeof(httpClients); i:=i+1) {
+      f_IFW_HttpClient_init(i);
+    }
+    for (var integer i:=0; i<sizeof(httpServers); i:=i+1) {
+      f_IFW_HttpServer_init(i);
+    }
+    for (var integer i:=0; i<sizeof(mqttClients); i:=i+1) {
+      f_IFW_MqttClient_init(i);
+    }
+  }
+	
+  function f_IFW_cleanUp() runs on IFW_MAIN_CT
+  {
+    for (var integer i:=0; i<sizeof(httpClients); i:=i+1) {
+      f_IFW_HttpClient_cleanUp(i);
+    }
+    for (var integer i:=0; i<sizeof(httpServers); i:=i+1) {
+      f_IFW_HttpServer_cleanUp(i);
+    }
+    for (var integer i:=0; i<sizeof(mqttClients); i:=i+1) {
+      f_IFW_MqttClient_cleanUp(i);
+    }
+    stop;
+  }
 }
diff --git a/IoT_Functiontest_Framework.tpd b/IoT_Functiontest_Framework.tpd
index ceba740..bc7b688 100644
--- a/IoT_Functiontest_Framework.tpd
+++ b/IoT_Functiontest_Framework.tpd
@@ -11,7 +11,7 @@
   Description:        tpd project file
   Rev:                <RnXnn>
   Prodnr:             LPA108661
-  Updated:            2018-05-31
+  Updated:            2019-08-28
   Contact:            http://ttcn.ericsson.se
 -->
   <ProjectName>IoT_Functiontest_Framework</ProjectName>
@@ -31,6 +31,9 @@
     <FileResource projectRelativePath="IFW_HTTP_Client_Definitions.ttcn" relativeURI="IFW_HTTP_Client_Definitions.ttcn"/>
     <FileResource projectRelativePath="IFW_HTTP_Client_Functions.ttcn" relativeURI="IFW_HTTP_Client_Functions.ttcn"/>
     <FileResource projectRelativePath="IFW_HTTP_Client_TestSteps.ttcn" relativeURI="IFW_HTTP_Client_TestSteps.ttcn"/>
+    <FileResource projectRelativePath="IFW_HTTP_Server_Definitions.ttcn" relativeURI="IFW_HTTP_Server_Definitions.ttcn"/>
+    <FileResource projectRelativePath="IFW_HTTP_Server_Functions.ttcn" relativeURI="IFW_HTTP_Server_Functions.ttcn"/>
+    <FileResource projectRelativePath="IFW_HTTP_Server_TestSteps.ttcn" relativeURI="IFW_HTTP_Server_TestSteps.ttcn"/>
     <FileResource projectRelativePath="IFW_MQTT_Client_Definitions.ttcn" relativeURI="IFW_MQTT_Client_Definitions.ttcn"/>
     <FileResource projectRelativePath="IFW_MQTT_Client_Functions.ttcn" relativeURI="IFW_MQTT_Client_Functions.ttcn"/>
     <FileResource projectRelativePath="IFW_MQTT_Client_TestSteps.ttcn" relativeURI="IFW_MQTT_Client_TestSteps.ttcn"/>