///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2020 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:               CoapTestSuite_Fw.ttcn
//  Description:
//  Rev:                <RnXnn>
//  Prodnr:             CNL 113 910
//  Updated:            2020-02-06
//  Contact:            http://ttcn.ericsson.se
///////////////////////////////////////////////////////////////////////////////
module CoapTestSuite_Fw 
{

	import from IoT_FT_Framework_Definitions all;
	import from IoT_FT_Framework_Functions all;
	import from IFW_CoAP_Peer_TestSteps all;
	import from CoAP_Types all;

	testcase tc_example() runs on IFW_MAIN_CT
	{
	  setverdict(pass);
	  
	  var integer client := f_IFW_addComponent(COAP_PEER, "client");
	  var integer server := f_IFW_addComponent(COAP_PEER, "server");
	  
	  f_IFW_CoapPeer_setRemote(client, "server");
	  f_IFW_CoapPeer_setRemote(server, "client");
	  
	  f_IFW_initComponents();
	  
	  f_IFW_CoapPeer_setMessageToSend(client, valueof(t_coap));
	  f_IFW_CoapPeer_send(client);
	  
	  f_IFW_CoapPeer_receive(server);
	  if (not f_IFW_CoapPeer_check(server, valueof(t_coap)))
	  {
	  	setverdict(fail);
	  }
	}
	
	testcase tc_client() runs on IFW_MAIN_CT
	{
	  setverdict(pass);
	  
	  var integer client := f_IFW_addComponent(COAP_PEER, "client");
	  
	  f_IFW_CoapPeer_setRemote(client, "server");
	  
	  f_IFW_initComponents();
	  
	  f_IFW_CoapPeer_setMessageToSend(client, valueof(t_coap));
	  f_IFW_CoapPeer_send(client);
	  
	  f_IFW_CoapPeer_receive(client);
	  if (not f_IFW_CoapPeer_check(client, t_coap))
	  {
	  	setverdict(fail);
	  }
	}
	
	template CoAP_ReqResp t_coap :=
	{
	  	header := 
	  	{
    		version := 1,
    		msg_type := CONFIRMABLE,
    		code := METHOD_GET,
    		message_id := 0
	  	},
    	token := ''O,
    	options := omit,
    	payload := omit
	}
	
	testcase tc_block_encdec() runs on IFW_MAIN_CT
	{
	  var template CoAP_Message t_msg;
	  
	  log("1 byte long block options");
	  f_test_encdec(t_coap_block1(1, true, 1));	  
	  f_test_encdec(t_coap_block2(2, false, 3));
	  
	  log("2 bytes long block options");
  	  f_test_encdec(t_coap_block1(16, true, 1));
	  f_test_encdec(t_coap_block2(17, false, 3));
	  
 	  log("3 bytes long block options");
  	  f_test_encdec(t_coap_block1(1024, true, 1));
	  f_test_encdec(t_coap_block2(1025, false, 3));
	}
	
	function f_test_encdec(template CoAP_Message p_msg) {
	  var octetstring v_enc;
	  var CoAP_Message v_dec;
	  
	  f_CoAP_enc(valueof(p_msg), v_enc);
	  
	  log("Encoded: ", v_enc);
	  
	  f_CoAP_dec(v_enc, v_dec);
	  
	  if (not match(v_dec, p_msg)) {
	    setverdict(fail);
	  }
	  else {
	    setverdict(pass);
	  }
	}
	
	template CoAP_Message t_coap_block1(integer p_num, boolean p_m, integer p_szx) :=
	{
	  msg := {
	  	header := 
	  	{
    		version := 1,
    		msg_type := CONFIRMABLE,
    		code := METHOD_GET,
    		message_id := 0
	  	},
    	token := ''O,
    	options := {
    	  {
    	    block1 := {
    	      num := p_num,
    	      m := p_m,
    	      szx := p_szx
    	    }
		  }
    	},
    	payload := omit
	  }
	}
	
	template CoAP_Message t_coap_block2(integer p_num, boolean p_m, integer p_szx) :=
	{
	  msg := {
	  	header := 
	  	{
    		version := 1,
    		msg_type := CONFIRMABLE,
    		code := METHOD_GET,
    		message_id := 0
	  	},
    	token := ''O,
    	options := {
    	  {
    	    block2 := {
    	      num := p_num,
    	      m := p_m,
    	      szx := p_szx
    	    }
		  }
    	},
    	payload := omit
	  }
	}
}
