///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2017 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:                R1A
//  Prodnr:             LPA 108 661
//  Updated:            2017-09-01
//  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
	  }
	}
}
