///////////////////////////////////////////////////////////////////////////////
//
// 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:               EPTF_LwM2M_Tests.ttcn
//  Description:
//  Rev:                R1A
//  Prodnr:             CNL 113 859
//  Updated:            2019-08-27
//  Contact:            http://ttcn.ericsson.se
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////
//  Module: EPTF_LwM2M_Tests
// 
//  Purpose:
//    This module contains the component tests for the EPTF COAP Applib
// 
//  Module Parameters:
//    tsp_SUT_localHost - *charstring* - Hostname of the tested LwM2M entity
//    tsp_SUT_localPort - *integer* - Port number of the tested LwM2M entity
//    tsp_SUT_remoteHost - *charstring* - Hostname of the tester component
//    tsp_SUT_remotePort - *integer* - Port number of the tester component
//    tsp_Leshan_host - *charstring* - Hostname of the Leshan server used as SUT
//    tsp_Leshan_coapPort - *integer* - Port number (unencyprted) of the Leshan server used as SUT
//    tsp_Leshan_coapsPort - *integer* - Port number (DTLS) of the Leshan server used as SUT
//
///////////////////////////////////////////////////////////////
module EPTF_LwM2M_Tests 
{
  import from EPTF_MBT_LGen_Definitions all;
  import from EPTF_MBT_LGen_Functions all;
  import from EPTF_COAP_LGen_Definitions all;
  import from EPTF_COAP_LGen_Functions all;
  import from EPTF_COAP_LocalTransport_Definitions all;
  import from EPTF_COAP_LocalTransport_Functions all;
  import from EPTF_LwM2M_LGen_Definitions all;
  import from EPTF_LwM2M_LGen_Functions all;
  import from EPTF_LwM2M_CoapApplibTransport_Definitions all;
  import from EPTF_LwM2M_CoapApplibTransport_Functions all;
  import from EPTF_LwM2M_Object_Definitions all;
  import from EPTF_CLL_Base_Functions all;
  import from CoAP_Types all;
  import from LightweightM2M_Types all;
  import from LWM2M_TLV_Types all;
  import from LWM2M_TLV_EncDec all;
  import from LWM2M_JSON_Types all;
  import from LWM2M_JSON_EncDec all;
  import from IoT_FT_Framework_Definitions all;
  import from IoT_FT_Framework_Functions all;
  import from IFW_CoAP_Peer_Definitions all;
  import from IFW_CoAP_Peer_TestSteps all;
  import from EPTF_COAP_Transport_Definitions all;
  
  modulepar charstring tsp_SUT_localHost := "127.0.0.1";
  modulepar integer    tsp_SUT_localPort := 31111;
  modulepar charstring tsp_SUT_remoteHost := "127.0.0.1";
  modulepar integer    tsp_SUT_remotePort := 5683;
  
  modulepar charstring tsp_Leshan_host := "127.0.0.1";
  modulepar integer    tsp_Leshan_coapPort := 5683;
  modulepar integer    tsp_Leshan_coapsPort := 5684;

  // SUT: LwM2M LGen
  type component LWM2M_Applib_CT extends
    EPTF_MBT_LGen_CT,
    EPTF_COAP_LGen_CT, EPTF_COAP_LocalTransport_CT ,
    EPTF_LwM2M_LGen_CT, EPTF_LwM2M_CoapApplibTransport_CT
  {}

  // Tester_CT
  type component LWM2M_FSM_CT extends EPTF_MBT_Tester_CT, IFW_MAIN_CT {}

  function f_LWM2M_Tests_begin(in boolean p_useDTLS := false) runs on LWM2M_FSM_CT
  {
    log(%definitionId, " started");
    setverdict(pass);
    
    f_EPTF_Base_init_CT("mtc");

    log(%definitionId, " Creating SUT");
    
    var LWM2M_Applib_CT vc_sut := LWM2M_Applib_CT.create;
    connect(self:EPTF_MBT_TESTER_PCO, vc_sut:EPTF_MBT_PCO);
    vc_sut.start(f_LWM2M_Applib_behavior(p_useDTLS)); 
    EPTF_MBT_TESTER_PCO.receive(EPTF_MBT_CommandResponse:?) from vc_sut;
  
    EPTF_MBT_TESTER_PCO.send(EPTF_MBT_ConfigRequest:
      {
        entityGroupName := "SUT_EntityType",
        noEntities := 1,
        behaviors := {c_EPTF_MBT_myBName, c_COAP_behaviorType, c_LwM2M_behaviorType},
        fsmName := "FSM_MBT"
      }
    ) to vc_sut;
    EPTF_MBT_TESTER_PCO.receive(EPTF_MBT_ConfigResponse:?) from vc_sut;
  
    log(%definitionId, " SUT ready");

    log(%definitionId, " finished");
  }

  function f_LWM2M_Tests_end() runs on LWM2M_FSM_CT
  {
    log("### MAIN: END TESTCASE started");

    f_EPTF_Base_stopAll(none, true);

    log("### MAIN: END TESTCASE finished");
  }
  
  function f_handleVerdict(in boolean p_verdict)
  {
    if (p_verdict) { setverdict(pass) }
    else { action("Setting verdict to fail"); setverdict(fail) }
  }

  function f_LWM2M_Applib_behavior(in boolean p_useDTLS := false) runs on LWM2M_Applib_CT
  {
    var charstring vl_selfName := "SUT_LGen";
    
    // Init
    f_EPTF_MBT_init(vl_selfName,0, "SUT_");

    //////////////////////
    // COAP applib init

    f_EPTF_COAP_LGen_init(vl_selfName);
    f_EPTF_COAP_LocalTransport_init();

    vf_EPTF_COAP_Transport_send := refers(f_EPTF_COAP_LocalTransport_send);
    vf_EPTF_COAP_Transport_receiveMessage := refers(f_EPTF_COAP_LGen_receiveMessage);
    vf_EPTF_COAP_Transport_receiveEvent := refers(f_EPTF_COAP_LGen_receiveEvent);
    vf_EPTF_COAP_Transport_apiRequest := refers(f_EPTF_COAP_LocalTransport_transportApiRequest);
    vf_EPTF_COAP_Transport_apiResponse := refers(f_EPTF_COAP_LGen_transportApiResponse);
    
    //////////////////////
    // LWM2M applib init
    
    f_EPTF_LwM2M_LGen_init(vl_selfName);
    f_EPTF_LwM2M_CoapApplibTransport_init(vl_selfName);
    
    vf_COAP_msgReceived := refers(f_EPTF_LwM2M_CoapApplibTransport_messageReceived);
    vf_COAP_eventIndication := refers(f_EPTF_LwM2M_CoapApplibTransport_eventIndication);
    vf_EPTF_LwM2M_Transport_send := refers(f_EPTF_LwM2M_CoapApplibTransport_send);
    vf_EPTF_LwM2M_Transport_receiveMessage := refers(f_EPTF_LwM2M_LGen_receiveMessage);
    vf_EPTF_LwM2M_Transport_receiveEvent := refers(f_EPTF_LwM2M_LGen_receiveEvent);
    
    var integer vl_addrIdx;
    var EPTF_COAP_Transport vl_proto := { ip := { udp := {} } };
    
    if (p_useDTLS) {
      vl_proto := { ip := { dtls := { udp := {} } } };
    }    
    
    f_EPTF_COAP_transportEndpointDB_add({ socket := {tsp_SUT_localHost, tsp_SUT_localPort}, proto := vl_proto }, vl_addrIdx);
    f_EPTF_COAP_transportEndpointDB_add({ socket := {tsp_SUT_remoteHost, tsp_SUT_remotePort}, proto := vl_proto }, vl_addrIdx);
    f_EPTF_COAP_transportEndpointDB_add({ socket := {tsp_Leshan_host, tsp_Leshan_coapPort}, proto := vl_proto }, vl_addrIdx);
    f_EPTF_COAP_transportEndpointDB_add({ socket := {tsp_Leshan_host, tsp_Leshan_coapsPort}, proto := vl_proto }, vl_addrIdx);
    
    var integer v_tempIdx;
    v_tempIdx := f_EPTF_LwM2M_TemplateDB_add({id:= "t_LWM2M_register", msg:=valueof(t_LWM2M_register)});
    v_tempIdx := f_EPTF_LwM2M_TemplateDB_add({id:= "t_LWM2M_update", msg:=valueof(t_LWM2M_update)});
    v_tempIdx := f_EPTF_LwM2M_TemplateDB_add({id:= "t_LWM2M_deregister", msg:=valueof(t_LWM2M_deregister)});
    v_tempIdx := f_EPTF_LwM2M_TemplateDB_add({id:= "t_LWM2M_register_psk", msg:=valueof(t_LWM2M_register_psk)});

    f_EPTF_MBT_initLGenFsm(null, null);  
    EPTF_MBT_PCO.send(EPTF_MBT_CommandResponse:{ ready := {}}) to mtc;

    // Loop  
    f_EPTF_Base_wait4Shutdown();
  }
  
  template EPTF_MBT_LGen_Definitions.FsmAddr t_addr(integer eIdx, template integer fIdx := 0) :=
  {
    entityGroupName := "SUT_EntityType",
    eIdx := eIdx,
    fIdx := fIdx
  }

  function f_delay(in float p_time)
  {
    timer t:= p_time;
    t.start;
    t.timeout;
  }
  

  template LWM2M_PDU t_LWM2M_register := 
  {
    Register := 
    {
      endpointClientName := "eantwuh_SimDev",
      lifetime := 30,
      version := omit,
      bindingMode := U,
      smsNumber := omit,
      objectsAndObjectInstances := {}
    }
  }  

  template LWM2M_PDU t_LWM2M_register_psk := 
  {
    Register := 
    {
      endpointClientName := "client1",
      lifetime := 30,
      version := omit,
      bindingMode := U,
      smsNumber := omit,
      objectsAndObjectInstances := {}
    }
  }

  template LWM2M_PDU t_LWM2M_update :=
  {
    Update := 
    {
      location := {},
      lifetime := 30,
      bindingMode := U,
      smsNumber := omit,
      objectsAndObjectInstances := {}
    }
  }
  
  template LWM2M_PDU t_LWM2M_deregister :=
  {
    Deregister :=
    {
      location := {}
    }
  }
  
  const integer c_localAddr := 0;
  const integer c_remoteAddr := 1;
  const integer c_LeshanCoapAddr := 2;
  const integer c_LeshanCoapsAddr := 3;

  const integer c_t_Register := 0;
  const integer c_t_Update := 1;
  const integer c_t_Deregister := 2;
  const integer c_t_Register_psk := 3;
  
  const integer c_psk_identityIdx := 0;
  
  template CoAP_ReqResp tr_COAP(Code p_code) :=
  {  
    header := 
    {
      version := 1,
      msg_type := ?,
      code := p_code,
      message_id := ?
    },
    token := ?,
    options := *,
    payload := *
  }
  
  template CoAP_ReqResp tr_COAP_payload(Code p_code, template octetstring p_payload) :=
  {  
    header := 
    {
      version := 1,
      msg_type := ?,
      code := p_code,
      message_id := ?
    },
    token := ?,
    options := *,
    payload := p_payload
  }
  
  template CoAP_ReqResp t_COAP_registered   :=
  {  
    header := 
    {
      version := 1,
      msg_type := ACKNOWLEDGEMENT,
      code := RESPONSE_CODE_Created,
      message_id := 0
    },
    token := ''O,
    options := 
    {
      { location_path := "rd" },
      { location_path := "unique" }
    },
    payload := omit
  }
  
  template CoAP_ReqResp t_COAP_deregistered   :=
  {  
    header := 
    {
      version := 1,
      msg_type := ACKNOWLEDGEMENT,
      code := RESPONSE_CODE_Deleted,
      message_id := 0
    },
    token := ''O,
    options :=  {},
    payload := omit
  }
  
  template CoAP_ReqResp t_COAP_read_resource_3303_0_5700(in integer p_accept) :=
  {
    header := 
    {
      version := 1,
      msg_type := CONFIRMABLE,
      code := METHOD_GET,
      message_id := 0
    },
    token := ''O,
    options :=  
    {
      { uri_path := "3303" },
      { uri_path := "0" },
      { uri_path := "5700" },
      { accept := p_accept }
    },
    payload := omit
  }
  
  template CoAP_ReqResp t_COAP_read_resource_5_0_3(in integer p_accept) :=
  {
    header := 
    {
      version := 1,
      msg_type := CONFIRMABLE,
      code := METHOD_GET,
      message_id := 0
    },
    token := ''O,
    options :=  
    {
      { uri_path := "5" },
      { uri_path := "0" },
      { uri_path := "3" },
      { accept := p_accept }
    },
    payload := omit
  }
  
  template CoAP_ReqResp t_COAP_read_resource_1_0_7(in integer p_accept) :=
  {
    header := 
    {
      version := 1,
      msg_type := CONFIRMABLE,
      code := METHOD_GET,
      message_id := 0
    },
    token := ''O,
    options :=  
    {
      { uri_path := "1" },
      { uri_path := "0" },
      { uri_path := "7" },
      { accept := p_accept }
    },
    payload := omit
  }
  
  template CoAP_ReqResp t_COAP_read_object_instance(in integer p_accept) :=
  {
    header := 
    {
      version := 1,
      msg_type := CONFIRMABLE,
      code := METHOD_GET,
      message_id := 0
    },
    token := ''O,
    options :=  
    {
      { uri_path := "5" },
      { uri_path := "0" },
      { accept := p_accept }
    },
    payload := omit
  }
  
  template CoAP_ReqResp t_COAP_read_object(in integer p_accept) :=
  {
    header := 
    {
      version := 1,
      msg_type := CONFIRMABLE,
      code := METHOD_GET,
      message_id := 0
    },
    token := ''O,
    options :=  
    {
      { uri_path := "5" },
      { accept := p_accept }
    },
    payload := omit
  }
  
  template CoAP_ReqResp t_COAP_write_3305_0_5806(integer p_format, octetstring p_payload) :=
  {
    header := 
    {
      version := 1,
      msg_type := CONFIRMABLE,
      code := METHOD_PUT,
      message_id := 0
    },
    token := ''O,
    options :=  
    {
      { uri_path := "3305" },
      { uri_path := "0" },
      { uri_path := "5806" },
      { content_format := p_format }
    },
    payload := p_payload
  }
  
  template CoAP_ReqResp t_COAP_write_1_0_1(integer p_format, octetstring p_payload) :=
  {
    header := 
    {
      version := 1,
      msg_type := CONFIRMABLE,
      code := METHOD_PUT,
      message_id := 0
    },
    token := ''O,
    options :=  
    {
      { uri_path := "1" },
      { uri_path := "0" },
      { uri_path := "1" },
      { content_format := p_format }
    },
    payload := p_payload
  }
  
  template CoAP_ReqResp t_COAP_write_1_0_7(integer p_format, octetstring p_payload) :=
  {
    header := 
    {
      version := 1,
      msg_type := CONFIRMABLE,
      code := METHOD_PUT,
      message_id := 0
    },
    token := ''O,
    options :=  
    {
      { uri_path := "1" },
      { uri_path := "0" },
      { uri_path := "7" },
      { content_format := p_format }
    },
    payload := p_payload
  }
  
  template CoAP_ReqResp t_COAP_execute :=
  {
    header := 
    {
      version := 1,
      msg_type := CONFIRMABLE,
      code := METHOD_POST,
      message_id := 0
    },
    token := ''O,
    options :=  
    {
      { uri_path := "3303" },
      { uri_path := "0" },
      { uri_path := "5605" },
      { accept := 11542 }
    },
    payload := omit
  }
  
  template CoAP_ReqResp t_COAP_observe :=
  {
    header := 
    {
      version := 1,
      msg_type := CONFIRMABLE,
      code := METHOD_GET,
      message_id := 0
    },
    token := ''O,
    options :=  
    {      
      { observe := 0 },
      { uri_path := "3303" },
      { uri_path := "0" },
      { uri_path := "5700" },
      { accept := 11542 }
    },
    payload := omit
  }

  template CoAP_ReqResp t_CON_PUT_Block1_FwUg_num0 :=
  { 
    header := 
    { 
      version := 1, 
      msg_type := CONFIRMABLE, 
      code := { class := 0, detail := 3 }, 
      message_id := 42919
    }, 
    token := '088042E55D354B17'O, 
    options := 
    { 
      { uri_path := "5" },
      { uri_path := "0" }, 
      { uri_path := "0" }, 
      { content_format := 11542 }, 
      { block1 := { num := 0, m := true, szx := 5 } }, 
      { size1 := 1889 }
    }, 
    payload := 'D000075D2E8ADE9A2A6CBA6768968AEC8AD6A67AD7289EC79CB5EB6EADA762A62B1C8A781E962B4C6AEAE2B2D8A772276E9ED9A296282E95AB1E76F7ACB626EE96E99EB2D6E26DE9DDBA6AAE8AC36E9656A29EC6A989E9EC7A6A5EADD8A09E2B2C8A6A1D8A87AD8A6A5EADD89EB677AAB9E4AEB297A7762B2C7AEB5DA25A2B76E885BAC71E8A785E9DDADEAE2B5DA25A2B328ADB89AB6EAE98ACB5E9A9BAC96E72DBAC9EE96569EB5F7AE8226AD7A58AD36E9DC7AB6ADBAB9DA7A57A27DE9DDBE2B5A7A2A6CBA6BE2B5A79E95E89F7A776B8689DCBAC7ACB5279D96E72DBAC6E56A7762B5E95E89F7A774F7A595E9ED7ACAAE79EB5CBABB2EB1DA25A2B328ADB8A7BA595A99A8276AD7A6A6EB2779C6AE72DA2BA6569C7AB6AD9A89658ACB22B5A99EB6B8ACBAC0AB6ACBAD99EB6EB1CA27B1E72D7ADBABB2896589C8ADB9D8A79EE9DC69D8A09E2B2C8A68EEB2DA157ACB626EE96E9A275A71CBA6B1A9DDBA2AAE8AC9A895EB2D89EB6EAE98AC0AB6AC89A72E962B2DA2BB68ADEB9EC6F6AB8AEB28AE76AB79279DB1A822B6D8ACA68AEDB62B68AE7BA77229EF7A189CBA56A66A09DA6E26DE9DDBA6B22B5A99EB44B626A69686E8AED8ACB1E99A72589B7ABA1FAE29E08A595A8A6A5EADD89EB42ADAB2779CA6EAEEB2789B8407A779A9EEB5E7DF89C8ADBAB6AB72E3EB69EB1E9EDBDE96F7A58ADAAE8AC6A7B5E7AE8AC9A'O 
  }

  template CoAP_ReqResp t_CON_PUT_Block1_FwUg_num1 :=
  { 
    header := 
    { 
      version := 1, 
      msg_type := CONFIRMABLE,
      code := { class := 0, detail := 3 }, 
      message_id := 42920 
    }, 
    token := '088042E55D354B17'O, 
    options := 
    { 
      { uri_path := "5" }, 
      { uri_path := "0" }, 
      { uri_path := "0" }, 
      { content_format := 11542 }, 
      { block1 := { num := 1, m := true, szx := 5 } }
    }, 
    payload := '876995A71EADAB42ADAB2D7A6A6EB2F8AF7ABADA99AB2C6ABBADAEE9AD8A772276E9ED7ABA2CB2875A95EB22750BA2B2AB9E7AE8AC9A8769BABBACAAE8AC7A78A6A6E96F8A76ABBAD75AA626EEB268AC71E95EAE2B2AB9E35A9AABA2B2579CB6EB2F7A576E8AE96DAE27227AC95AA2B79EB54B5DBA295EA1CA269A87689E89DEAE8B2779C89A72E962B229ED7AB76E9ADA2BB68AC2ADAB2779C7DAB9C89BBAC95EA05BAC71EA6569C7AB6AD95AA2B79EB68762A27A27BEE969BAD6AD7AC7A68A7B5EADDBA689D42E8ACAAE7A9A2BB6D8ADA2BBA595A99CA2BA5EAE569CBACB22B5A99EB666B18A6BAC9EE9656AD7A6A6EB2C8AD6A67AD0EE8AC7289DD8A67A7B6E9A78AC96C8AD6A67AD7289DD8A67A7B6E99FAE29E08A595A7626A67A58ADA68B2E7AB79AADCBAC8AD6A67ADB5E9A9A2BB1AA627A7B1E99EB666ACB1A4AEB297A7762B2C7A789B85E9E29AF8AF7ABADA7AE99AC629AEB2C79D69C72E9AC6A79E89EDA2BB68AD57ACB626EE96E9A29DEAE8B1CBABB2EB2E9656A6728AE97AB9E26E1BDE95CA27BDA9658AC96282E95A12D89A9A66B18A6BACB2896589C8ADB9D8A77ACB5F8A789BBAC79F7E2722B6EACC6AEAE2B1EB9B95A9DD8AD99AB2C69279DA68AED6A78AC9629E78AC969A2CB9EADE7AEBDAAE2BAC9A27DAB9C89BBAC36E9656AE96DAE27227ACBDAAE2BAC99A82769AA6E96F8A76AB96282E95A9A8965'O 
  }

  template CoAP_ReqResp t_CON_PUT_Block1_FwUg_num2 :=
  {
    header :=
    { 
      version := 1, 
      msg_type := CONFIRMABLE,
      code := { class := 0, detail := 3 }, 
      message_id := 42921 
    },
    token := '088042E55D354B17'O, 
    options := {
      { uri_path := "5" },
      { uri_path := "0" },
      { uri_path := "0" },
      { content_format := 11542 },
      { block1 := { num := 2, m := true, szx := 5 } }
    },
    payload := '8AC7DA722962B22B05BAC71EBDE86272E95A99AC629AEB229A97AB7627AD49E76E9656A6728AE97AB8A7B5EADDBA67ABA2C7AE8AC9A876E9656A6728AE97AB31ABAB8ACAAE8ACA6E96F8A76AB7ACB6C79DA2B9DAADE95EA089DEBAD7A6A68AE57A831ABAB8AC69C72E9AC6A795E72DBAC89D6AE82E7A29ED7AB76E99E81EB5E7DF89C8ADBAB99ABAB8AC9686E8AED8AC3E16AC7A596EB1A962AAE6A6A6E96F8A76ABBDE86272E95A4AEB297A7762B2C79F69C8A58AC8AC8A6A5EADD89EB5ABA0B9EB22B5A99EB5A962AAE7AD562BDA9AEB2985AADEB6B69EB678AC89E81EB66A257ACB6278D6A699A82769EAE8B2C7A6A5EAEF7A57A07ACB5AB2779CBDEB2D89BBA5BA67AE76E8889ED7A07ABB2EB1C8A98AD9EE9DC9DE71CA27B1EAAE6AD96E72DBAC31A79C7A76ACB6EAE98AC99A8276A269CBA58ACBADBAB9DA8A77289EC7AAB9AB5F7AE8226AD76E88C6AEAE2B2ABA2B1EC6F8AD69E8A9B2E99CBABB2EB2985AADEB6B6957ACB626EE96E99AB6EAE98AC89DBDE962B617A776B7AB8AD7DEAE67A7B6E98CA2B6E2AE1A2772EB1CA269A876899AB2C6889E9A2BB6D8ADA2B95A72EB2EB5B89B7A776E99A71CBA6B1A9D4B67A279626DEAE8B1E7657A89A895EB2D89E7289EF6A5962B10BA2B2AB9E6E26DE9DDBA6B5E965BAC89DAAE6A67289EC7AAB9AB69A2BB5A36E9656A58A0BA56AB8ACBACB2EB1C8A98ADBAD99ABAB8'O
  }
  
  template CoAP_ReqResp t_CON_PUT_Block1_FwUg_num3 :=
  { 
    header := 
    { 
      version := 1, 
      msg_type := CONFIRMABLE,
      code := { class := 0, detail := 3 }, 
      message_id := 42922 
    },
    token := '088042E55D354B17'O,
    options := 
    { 
      { uri_path := "5" },
      { uri_path := "0" },
      { uri_path := "0" },
      { content_format := 11542 },
      { block1 := { num := 3, m := false, szx := 5 } }
    },
    payload := 'ACB22B5A99EB5D8A09E2B2C8A6AEEB6BBA6B6EAE98AC328ADB89EB9E962B5A95E72DBACA68B2E7AB79E95E99E9EDBA67AEB1E767BA7703A2779CBEE969BAD6AD79A962AAE6A699A8276AF7A58A6A5EADD89EB40962AAE6A6B1A822B6D8AC7A58ADB1E75FAE29E08A595A7289EC7AAB9AB4FADA7AC7A7B666A57ACB9A75A7A78A6B5E9A9A2B9A28A7B5EADDBA6AEEB6BBA6A5E9657A7B5EB2AB9E9A2A6E96F8A76AB0AEADA6E2B6EAE56A8ADE7AD76272DBA67AE8AC9A874DBA595A89D9A89658AC95A72EB229E985AADEB6B69DA25A2B562BDA9AEB27A27AEEB6BBA69626DEAE8328ADB8A29DD89A99F7AE8226ADBE2BDEAEB6A589B7ABA1A7229ED7AB76E99D89A98D6A6A68AEDB62B68AEC7A67A07AD9A895EB2D89EB629DC89DBA7B489EF8AD69E8A6A5EADD89EB6688EADC8AF6AB8AEB276ADA2AB9EA5E9DAB626EEB1EB666A09E2B1D8ACA5AAEDBAB89E9ED9A89ED7AC9DAB1C7ADBABAE276272E96EB26BA'O
  }
  
  template CoAP_ReqResp t_RST_Empty :=
  {
    header := 
    {
      version := 1,
      msg_type := RESET,
      code := EMPTY_MESSAGE,
      message_id := 0
    },
    token := ''O,
    options := omit,
    payload := omit
  }

  template CoAP_ReqResp t_CON_PUT_Block1(template BlockOption p_block1) :=
  {  
    header := 
    {
      version := 1,
      msg_type := CONFIRMABLE,
      code := METHOD_PUT,
      message_id := 0
    },
    token := ''O,
    options := 
    {
      { uri_path := "5" },
      { uri_path := "0" },
      { uri_path := "0" },
      { content_format := 11542 },
      { block1 := p_block1 }, 
      { size1 := 8863 }
    },
    payload := 'D000229B504B03041400000008008DA0A64E479244B258010000F0040000130000005B436F6E74656E745F54797065735D2E786D6CAD944D4EC3301085F79C22F216256E5920849A7641610995280730F6A4B1EAD89667FA777B26690B088940D56E6245F67BDFF879ECD164DBB86C0D096DF0A51816039181D7C158BF28C5DBFC29BF131992F246B9E0A1143B4031195F8DE6BB0898B1D863296AA2782F25EA1A1A854588E079A60AA951C4BF6921A3D24BB500793318DC4A1D3C81A79C5A0F311EBD303F5903D94C257A560D63E4D6496237D87F8705FB89EC612F6CD9A550313AAB1571E172EDCD0F6A1EAACA6A3041AF1A96149DCD75EB227F0522ED1CE0D9288C0994C11A801A57EC4D8FE429546AE5287BDCB2FB3EF3040E4FE31DC22C58D9ADC1DAC63E42FF867ED7ADCF0C82F5D3A436DC4A3DA16F425ABE87B0BC74ECED5834CAFABE4367F12C858892516717006D72064C1ED91212D9AF63EF65EB90E074F8B1095AF53F8987B4BB685076C3F0C2B17FFAFF75D56A95C0BC52E2E6B8F88DFBEE7DAC43760FD6F803504B03041400000008008DA0A64E17B63738E90000004B0200000B0000005F72656C732F2E72656C73AD92CD6AC3300C80EF7B0AA37BA3B48531469D5ECAA0B732B207D06CE5872496B1BD2D7DFB7987B105BAD2C38E96A54F9F8476FB791AD53B87D88BD3B02E4A50EC8CD8DEB51A5EEAA7D5'O
  }
    
  template CoAP_ReqResp tr_Changed_withBlock1(Type p_msgType, template BlockOption p_block1) :=
  {
    header := 
    {
      version := 1,
      msg_type := p_msgType,
      code := RESPONSE_CODE_Changed,
      message_id := ?
    },
    token := ?,
    options := 
    {
      { block1 := p_block1 }
    },
    payload := omit
  }
    
  template CoAP_ReqResp tr_Continue_withBlock1(Type p_msgType, template BlockOption p_block1) :=
  {
    header := 
    {
      version := 1,
      msg_type := p_msgType,
      code := { class := 2, detail := 31},
      message_id := ?
    },
    token := ?,
    options := 
    {
      { block1 := p_block1 }
    },
    payload := omit
  }
  
  function f_initialization(in integer p_remoteAddr := c_remoteAddr) runs on LWM2M_FSM_CT
  {
    f_MBT_execute(c_COAP_stepName_init, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_COAP_stepName_setLocalAddress, valueof(t_addr(0, 0)), {c_localAddr}, false);
    f_MBT_execute(c_COAP_stepName_setRemoteAddress_byIntIdx, valueof(t_addr(0, 0)), {p_remoteAddr}, false);
    f_MBT_execute(c_COAP_stepName_reportCoapEventForEntity, valueof(t_addr(0, 0)), {c_COAP_stepParam_false}, false);
    
    f_MBT_execute(c_LwM2M_stepName_createDevice, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_createObject, valueof(t_addr(0, 0)), {c_LwM2M_Server_obj_id}, false);
    f_MBT_execute(c_LwM2M_stepName_createObjectInstance, valueof(t_addr(0, 0)), {c_LwM2M_Server_obj_id}, false);
    f_MBT_execute(c_LwM2M_stepName_createObject, valueof(t_addr(0, 0)), {c_LwM2M_FirmwareUpdate_obj_id}, false);
    f_MBT_execute(c_LwM2M_stepName_createObjectInstance, valueof(t_addr(0, 0)), {c_LwM2M_FirmwareUpdate_obj_id}, false);
    f_MBT_execute(c_LwM2M_stepName_createObject, valueof(t_addr(0, 0)), {c_LwM2M_Temperature_obj_id}, false);
    f_MBT_execute(c_LwM2M_stepName_createObjectInstance, valueof(t_addr(0, 0)), {c_LwM2M_Temperature_obj_id}, false);
    f_MBT_execute(c_LwM2M_stepName_createObject, valueof(t_addr(0, 0)), {c_LwM2M_PowerMeasurement_obj_id}, false);
    f_MBT_execute(c_LwM2M_stepName_createObjectInstance, valueof(t_addr(0, 0)), {c_LwM2M_PowerMeasurement_obj_id}, false);
    
    // content formats: text, senml json, lwm2m json:
    f_MBT_execute(c_LwM2M_stepName_setContentFormats, valueof(t_addr(0, 0)), {0, 110, 11543}, false);
  }
  
  function f_registration(integer peer) runs on LWM2M_FSM_CT
  {
    f_MBT_execute(c_LwM2M_stepName_loadTemplate_byIntIdx, valueof(t_addr(0, 0)), {c_t_Register}, false);
    f_MBT_execute(c_LwM2M_stepName_send, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP(METHOD_POST)));
    
    f_IFW_CoapPeer_setMessageToSend(peer,valueof(t_COAP_registered), USE_LAST_RECEIVED_MID, USE_LAST_RECEIVED_TOKEN);
    f_IFW_CoapPeer_send(peer);
    
    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, valueof(c_LwM2M_eventName(201)), valueof(t_addr(0, 0)), 3.0));
    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, valueof(c_LwM2M_eventName_2xx), valueof(t_addr(0, 0)), 3.0));
  }
  
  function f_registration_againstLeshan(in integer p_t_register := c_t_Register) runs on LWM2M_FSM_CT
  {
    f_MBT_execute(c_LwM2M_stepName_loadTemplate_byIntIdx, valueof(t_addr(0, 0)), {p_t_register}, false);
    f_MBT_execute(c_LwM2M_stepName_send, valueof(t_addr(0, 0)), {}, false);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, valueof(c_LwM2M_eventName(201)), valueof(t_addr(0, 0)), 3.0));
    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, valueof(c_LwM2M_eventName_2xx), valueof(t_addr(0, 0)), 3.0));
  }
  
  function f_deregistration(integer peer) runs on LWM2M_FSM_CT
  {
    f_MBT_execute(c_LwM2M_stepName_loadTemplate_byIntIdx, valueof(t_addr(0, 0)), {c_t_Deregister}, false);
    f_MBT_execute(c_LwM2M_stepName_send, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP(METHOD_DELETE)));
    
    f_IFW_CoapPeer_setMessageToSend(peer,valueof(t_COAP_deregistered), USE_LAST_RECEIVED_MID, USE_LAST_RECEIVED_TOKEN);
    f_IFW_CoapPeer_send(peer);
    
    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, valueof(c_LwM2M_eventName(202)), valueof(t_addr(0, 0)), 3.0));
    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, valueof(c_LwM2M_eventName_2xx), valueof(t_addr(0, 0)), 3.0));
  }
  
  function f_deregistration_againstLeshan() runs on LWM2M_FSM_CT
  {
    f_MBT_execute(c_LwM2M_stepName_loadTemplate_byIntIdx, valueof(t_addr(0, 0)), {c_t_Deregister}, false);
    f_MBT_execute(c_LwM2M_stepName_send, valueof(t_addr(0, 0)), {}, false);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, valueof(c_LwM2M_eventName(202)), valueof(t_addr(0, 0)), 3.0));
    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, valueof(c_LwM2M_eventName_2xx), valueof(t_addr(0, 0)), 3.0));
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_initialization
  //
  // Purpose:
  //     Testcase for setting up a LWM2M device
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_initialization.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_initialization.jpg
  *     FSM -> Applib: c_COAP_stepName_init()
  *     FSM -> Applib: c_COAP_stepName_setLocalAddress(c_localAddr)
  *     FSM -> Applib: c_COAP_stepName_setRemoteAddress_byIntIdx(c_remoteAddr)
  *     FSM -> Applib: c_COAP_stepName_reportCoapEventForEntity(c_COAP_stepParam_false)
  *     FSM -> Applib: c_LwM2M_stepName_createDevice
  *     FSM -> Applib: c_LwM2M_stepName_createObject(c_LwM2M_Temperature_obj_id)
  *     FSM -> Applib: c_LwM2M_stepName_createObjectInstance(c_LwM2M_Temperature_obj_id)
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_initialization() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_registration
  //
  // Purpose:
  //     Testcase for registering an LWM2M device
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_registration.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_registration.jpg
  *     ref over Applib, Peer: tc_initialization
  *     FSM -> Applib: c_LwM2M_stepName_loadTemplate_byIntIdx(c_t_Register)
  *     FSM -> Applib: c_LwM2M_stepName_send()
  *     Peer <- Applib: CON-POST
  *     Peer -> Applib: ACK-registered with location /rd/unique
  *     FSM <- Applib: c_LwM2M_eventName(201)
  *     FSM <- Applib: c_LwM2M_eventName_2xx
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_registration() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();

    f_registration(peer);

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_registration_dtls.jpg
  *     ref over Applib, Peer: tc_initialization
  *     FSM -> Applib: c_LwM2M_stepName_loadTemplate_byIntIdx(c_t_Register)
  *     FSM -> Applib: c_LwM2M_stepName_send()
  *     Peer <- Applib: DTLS establishment
  *     Peer -> Applib: DTLS established
  *     Peer <- Applib: CON-POST
  *     Peer -> Applib: ACK-registered with location /rd/unique
  *     FSM <- Applib: c_LwM2M_eventName(201)
  *     FSM <- Applib: c_LwM2M_eventName_2xx
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  /*
  testcase tc_registration_dtls() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin(p_useDTLS := true);

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");

    f_IFW_CoapPeer_setRemote(peer, "sut");
    var CoapContext v_ctx;
    f_IFW_CoapPeer_getContext(peer, v_ctx);
    v_ctx.listeningProtocol := { dtls := { udp := {} } };
    f_IFW_CoapPeer_setContext(peer, v_ctx);

    f_IFW_initComponents();

    f_initialization();

    f_registration(peer);

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }
  */

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_deregistration
  //
  // Purpose:
  //     Testcase for registering and deregistering an LWM2M device
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_deregistration.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_deregistration.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     FSM -> Applib: c_LwM2M_stepName_loadTemplate_byIntIdx(c_t_Deregister)
  *     FSM -> Applib: c_LwM2M_stepName_send()
  *     Peer <- Applib: CON-DELETE
  *     Peer -> Applib: ACK-deregistered
  *     FSM <- Applib: c_LwM2M_eventName(202)
  *     FSM <- Applib: c_LwM2M_eventName_2xx
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_deregistration() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);
    f_deregistration(peer);

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_read_resource_float_using_text
  //
  // Purpose:
  //     Testcase for reading a float resource value with LwM2M JSON encoding
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_read_resource_float_using_text.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_read_resource_float_using_text.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP GET 3303/0/5700 (plain/text)
  *     FSM <- Applib: c_LwM2M_eventName_Read
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleReadRequest
  *     Peer <- Applib: COAP 205 content (float, plain/text)
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_read_resource_float_using_text() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_read_resource_3303_0_5700(0)), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Read, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleReadRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP_payload(RESPONSE_CODE_Content, ?)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_read_resource_float_using_lwm2m_json
  //
  // Purpose:
  //     Testcase for reading a float resource value with LwM2M JSON encoding
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_read_resource_float_using_lwm2m_json.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_read_resource_float_using_lwm2m_json.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP GET 3303/0/5700 (LwM2M JSON)
  *     FSM <- Applib: c_LwM2M_eventName_Read
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleReadRequest
  *     Peer <- Applib: COAP 205 content (float, LwM2M JSON)
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_read_resource_float_using_lwm2m_json() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_read_resource_3303_0_5700(11543)), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Read, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleReadRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP_payload(RESPONSE_CODE_Content, ?)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_read_resource_float_using_senml_json
  //
  // Purpose:
  //     Testcase for reading a float resource value with SenML JSON encoding
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_read_resource_float_using_senml_json.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_read_resource_float_using_senml_json.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP GET 3303/0/5700 (SenML JSON)
  *     FSM <- Applib: c_LwM2M_eventName_Read
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleReadRequest
  *     Peer <- Applib: COAP 205 content (float, SenML JSON)
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_read_resource_float_using_senml_json() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_read_resource_3303_0_5700(110)), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Read, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleReadRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP_payload(RESPONSE_CODE_Content, ?)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_read_resource_int_using_text
  //
  // Purpose:
  //     Testcase for reading an integer resource value with text encoding
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_read_resource_int_using_text.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_read_resource_int_using_text.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP GET 5/0/3 (plain/text)
  *     FSM <- Applib: c_LwM2M_eventName_Read
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleReadRequest
  *     Peer <- Applib: COAP 205 content (int, plain/text)
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_read_resource_int_using_text() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_read_resource_5_0_3(0)), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Read, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleReadRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP_payload(RESPONSE_CODE_Content, char2oct("0"))));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_read_resource_int_using_lwm2m_json
  //
  // Purpose:
  //     Testcase for reading an integer resource value with lwm2m json encoding
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_read_resource_int_using_lwm2m_json.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_read_resource_int_using_lwm2m_json.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP GET 5/0/3 (LwM2M JSON)
  *     FSM <- Applib: c_LwM2M_eventName_Read
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleReadRequest
  *     Peer <- Applib: COAP 205 content (int, LwM2M JSON)
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_read_resource_int_using_lwm2m_json() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_read_resource_5_0_3(11543)), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Read, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleReadRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP_payload(RESPONSE_CODE_Content, ?)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_read_resource_int_using_senml_json
  //
  // Purpose:
  //     Testcase for reading an integer resource value with SenML json encoding
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_read_resource_int_using_senml_json.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_read_resource_int_using_senml_json.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP GET 5/0/3 (SenML JSON)
  *     FSM <- Applib: c_LwM2M_eventName_Read
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleReadRequest
  *     Peer <- Applib: COAP 205 content (int, SenML JSON)
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_read_resource_int_using_senml_json() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_read_resource_5_0_3(110)), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Read, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleReadRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP_payload(RESPONSE_CODE_Content, ?)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_read_resource_string_using_text
  //
  // Purpose:
  //     Testcase for reading a string resource value with text/plain encoding
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_read_resource_string_using_text.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_read_resource_string_using_text.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP GET 1/0/7 (text plain)
  *     FSM <- Applib: c_LwM2M_eventName_Read
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleReadRequest
  *     Peer <- Applib: COAP 205 content (string, text plain)
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_read_resource_string_using_text() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_read_resource_1_0_7(0)), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Read, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleReadRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP(RESPONSE_CODE_Content)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_read_resource_string_lwm2m_json
  //
  // Purpose:
  //     Testcase for reading a string resource value with LwM2M JSON encoding
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_read_resource_string_lwm2m_json.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_read_resource_string_lwm2m_json.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP GET 1/0/7 (LwM2M JSON)
  *     FSM <- Applib: c_LwM2M_eventName_Read
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleReadRequest
  *     Peer <- Applib: COAP 205 content (string, LwM2M JSON)
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_read_resource_string_lwm2m_json() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_read_resource_1_0_7(11543)), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Read, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleReadRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP_payload(RESPONSE_CODE_Content, ?)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_read_resource_string_senlm_json
  //
  // Purpose:
  //     Testcase for reading a string resource value with SenML JSON encoding
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_read_resource_string_senlm_json.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_read_resource_string_senlm_json.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP GET 1/0/7 (SenML JSON)
  *     FSM <- Applib: c_LwM2M_eventName_Read
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleReadRequest
  *     Peer <- Applib: COAP 205 content (string, SenML JSON)
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_read_resource_string_senlm_json() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_read_resource_1_0_7(110)), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Read, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleReadRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP_payload(RESPONSE_CODE_Content, ?)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_write_resource_float_using_text
  //
  // Purpose:
  //     Testcase for writing a float resource value using plain/text
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_write_resource_float_using_text.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_write_resource_float_using_text.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP PUT 3305/0/5806 36.2 (text)
  *     FSM <- Applib: c_LwM2M_eventName_Write
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleWriteRequest
  *     Peer <- Applib: COAP Response 204 changed
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_write_resource_float_using_text() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_write_3305_0_5806(
    0,
    char2oct("36.2")
    )), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Write, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleWriteRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP(RESPONSE_CODE_Changed)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_write_resource_float_using_lwm2m_json
  //
  // Purpose:
  //     Testcase for writing a float resource value using LwM2M JSON
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_write_resource_float_using_lwm2m_json.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_write_resource_float_using_lwm2m_json.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP PUT 3305/0/5806 36.2 (LwM2M JSON)
  *     FSM <- Applib: c_LwM2M_eventName_Write
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleWriteRequest
  *     Peer <- Applib: COAP Response 204 changed
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_write_resource_float_using_lwm2m_json() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_write_3305_0_5806(
    11543,
    char2oct("{\"e\":[ {\"n\":\"\", \"v\": 36.2 } ] }")
    )), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Write, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleWriteRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP(RESPONSE_CODE_Changed)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_write_resource_float_using_senml_json
  //
  // Purpose:
  //     Testcase for writing a float resource value using SenML JSON
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_write_resource_float_using_senml_json.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_write_resource_float_using_senml_json.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP PUT 3305/0/5806 36.2 (SenML JSON)
  *     FSM <- Applib: c_LwM2M_eventName_Write
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleWriteRequest
  *     Peer <- Applib: COAP Response 204 changed
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_write_resource_float_using_senml_json() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_write_3305_0_5806(
    110,
    char2oct("[{\"n\":\"/3305/0/5806\", \"v\": 36.2 } ] }")
    )), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Write, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleWriteRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP(RESPONSE_CODE_Changed)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_write_resource_int_using_text
  //
  // Purpose:
  //     Testcase for writing an integer resource value using plain/text
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_write_resource_int_using_text.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_write_resource_int_using_text.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP PUT 1/0/1 60 (text)
  *     FSM <- Applib: c_LwM2M_eventName_Write
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleWriteRequest
  *     Peer <- Applib: COAP Response 204 changed
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_write_resource_int_using_text() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_write_1_0_1(
    0,
    char2oct("60")
    )), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Write, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleWriteRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP(RESPONSE_CODE_Changed)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_write_resource_int_using_lwm2m_json
  //
  // Purpose:
  //     Testcase for writing an int resource value using LwM2M JSON
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_write_resource_int_using_lwm2m_json.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_write_resource_int_using_lwm2m_json.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP PUT 1/0/1 60 (LwM2M JSON)
  *     FSM <- Applib: c_LwM2M_eventName_Write
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleWriteRequest
  *     Peer <- Applib: COAP Response 204 changed
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_write_resource_int_using_lwm2m_json() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_write_1_0_1(
    11543,
    char2oct("{\"e\":[ {\"n\":\"\", \"v\": 60 } ] }")
    )), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Write, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleWriteRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP(RESPONSE_CODE_Changed)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_write_resource_int_using_senml_json
  //
  // Purpose:
  //     Testcase for writing an int resource value using SenML JSON
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_write_resource_int_using_senml_json.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_write_resource_int_using_senml_json.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP PUT 1/0/1 60 (SenML JSON)
  *     FSM <- Applib: c_LwM2M_eventName_Write
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleWriteRequest
  *     Peer <- Applib: COAP Response 204 changed
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_write_resource_int_using_senml_json() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_write_1_0_1(
    110,
    char2oct("[{\"n\":\"/1/0/1\", \"v\": 60 } ] }")
    )), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Write, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleWriteRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP(RESPONSE_CODE_Changed)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_write_resource_string_using_text
  //
  // Purpose:
  //     Testcase for writing a string resource value using plain/text
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_write_resource_string_using_text.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_write_resource_string_using_text.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP PUT 1/0/7 UQ (text)
  *     FSM <- Applib: c_LwM2M_eventName_Write
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleWriteRequest
  *     Peer <- Applib: COAP Response 204 changed
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_write_resource_string_using_text() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_write_1_0_7(
    0,
    char2oct("UQ")
    )), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Write, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleWriteRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP(RESPONSE_CODE_Changed)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_write_resource_string_using_lwm2m_json
  //
  // Purpose:
  //     Testcase for writing a string resource value using LwM2M JSON
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_write_resource_string_using_lwm2m_json.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_write_resource_string_using_lwm2m_json.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP PUT 1/0/7 UQ (LwM2M JSON)
  *     FSM <- Applib: c_LwM2M_eventName_Write
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleWriteRequest
  *     Peer <- Applib: COAP Response 204 changed
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_write_resource_string_using_lwm2m_json() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_write_1_0_7(
    11543,
    char2oct("{\"e\":[ {\"n\":\"\", \"sv\": \"UQ\" } ] }")
    )), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Write, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleWriteRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP(RESPONSE_CODE_Changed)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_write_resource_string_using_senml_json
  //
  // Purpose:
  //     Testcase for writing a string resource value using SenML JSON
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_write_resource_string_using_senml_json.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_write_resource_string_using_senml_json.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP PUT 1/0/7 UQ (SenML JSON)
  *     FSM <- Applib: c_LwM2M_eventName_Write
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleWriteRequest
  *     Peer <- Applib: COAP Response 204 changed
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_write_resource_string_using_senml_json() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_write_1_0_7(
    110,
    char2oct("[{\"n\":\"/1/0/7\", \"vs\": \"UQ\" } ] }")
    )), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Write, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleWriteRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP(RESPONSE_CODE_Changed)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_execute_resource
  //
  // Purpose:
  //     Testcase for writing a resource value
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_execute_resource.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_execute_resource.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP POST 3303/0/5605 (Reset min max values executable resource)
  *     FSM <- Applib: c_LwM2M_eventName_Execute
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleExecuteRequest
  *     Peer <- Applib: COAP Response 204 changed
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_execute_resource() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_execute), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Execute, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleExecuteRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP(RESPONSE_CODE_Changed)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_read_object_instance_using_lwm2m_json
  //
  // Purpose:
  //     Testcase for reading an object instance using LwM2M JSON
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_read_object_instance_using_lwm2m_json.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_read_object_instance_using_lwm2m_json.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP GET 5/0
  *     FSM <- Applib: c_LwM2M_eventName_Read
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleReadRequest
  *     Peer <- Applib: COAP 205 content
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_read_object_instance_using_lwm2m_json() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_read_object_instance(11543)), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Read, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleReadRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP_payload(RESPONSE_CODE_Content, ?)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_read_object_instance_using_senml_json
  //
  // Purpose:
  //     Testcase for reading an object instance using SenML JSON
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_read_object_instance_using_senml_json.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_read_object_instance_using_senml_json.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP GET 5/0
  *     FSM <- Applib: c_LwM2M_eventName_Read
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleReadRequest
  *     Peer <- Applib: COAP 205 content
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_read_object_instance_using_senml_json() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_read_object_instance(110)), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Read, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleReadRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP_payload(RESPONSE_CODE_Content, ?)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_read_object_using_lwm2m_json
  //
  // Purpose:
  //     Testcase for reading an object using LwM2M JSON
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_read_object_using_lwm2m_json.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_read_object_using_lwm2m_json.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP GET /5
  *     FSM <- Applib: c_LwM2M_eventName_Read
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleReadRequest
  *     Peer <- Applib: COAP 205 content
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_read_object_using_lwm2m_json() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_read_object(11543)), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Read, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleReadRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP_payload(RESPONSE_CODE_Content, ?)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_read_object_using_senml_json
  //
  // Purpose:
  //     Testcase for reading an object using SenML JSON
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_read_object_using_senml_json.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_read_object_using_senml_json.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP GET /5
  *     FSM <- Applib: c_LwM2M_eventName_Read
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleReadRequest
  *     Peer <- Applib: COAP 205 content
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_read_object_using_senml_json() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_read_object(110)), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Read, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleReadRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP_payload(RESPONSE_CODE_Content, ?)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_observe_subscription
  //
  // Purpose:
  //     Testcase for subscribing to a resource value
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_observe_subscription.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_observe_subscription.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP GET 3303/0/5700 Observe:0
  *     FSM <- Applib: c_LwM2M_eventName_Read
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleReadRequest
  *     Peer <- Applib: COAP Content
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_observe_subscription() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_observe), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Read, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleReadRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP(RESPONSE_CODE_Content)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_observe_notification
  //
  // Purpose:
  //     Testcase for sending notification for an observed resource
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_observe_notification.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_observe_notification.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP GET 3303/0/5700 Observe:0
  *     FSM <- Applib: c_LwM2M_eventName_Read
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleReadRequest
  *     Peer <- Applib: COAP Content with Observe
  *     FSM -> Applib: c_LwM2M_stepName_sendNotificationForObservedResources
  *     Peer <- Applib: COAP Content with Observe
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_observe_notification() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_observe), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Read, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleReadRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP(RESPONSE_CODE_Content)));

    f_MBT_execute(c_LwM2M_stepName_sendNotificationForObservedResources, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP(RESPONSE_CODE_Content)));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_observe_unsubscribe
  //
  // Purpose:
  //     Testcase for unsubscribing from a resource value
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_observe_unsubscribe.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_observe_unsubscribe.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     Peer -> Applib: COAP GET 3303/0/5700 Observe:0
  *     FSM <- Applib: c_LwM2M_eventName_Read
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleReadRequest
  *     Peer <- Applib: COAP Content with Observe
  *     FSM -> Applib: c_LwM2M_stepName_sendNotificationForObservedResources
  *     Peer <- Applib: COAP Content with Observe
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_observe_unsubscribe() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_COAP_observe), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Read, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleReadRequest, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP(RESPONSE_CODE_Content)));

    f_MBT_execute(c_LwM2M_stepName_sendNotificationForObservedResources, valueof(t_addr(0, 0)), {}, false);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_COAP(RESPONSE_CODE_Content)));

    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_RST_Empty), USE_LAST_RECEIVED_MID, USE_GIVEN_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_resourceNotObservedIndication, t_addr(0, ?), 3.0));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_regDereg_againstLeshan
  //
  // Purpose:
  //     Testcase for registering and then deregistering an LWM2M device using an external Leshan LwM2M server
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_regDereg_againstLeshan.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_regDereg_againstLeshan.jpg
  *     ref over Applib, Peer: tc_initialization(c_LeshanCoapAddr)
  *     FSM -> Applib: c_LwM2M_stepName_loadTemplate_byIntIdx(c_t_Register)
  *     FSM -> Applib: c_LwM2M_stepName_send()
  *     Leshan <- Applib: LWM2M Register
  *     Leshan -> Applib: 201 Created
  *     FSM <- Applib: c_LwM2M_eventName(201)
  *     FSM <- Applib: c_LwM2M_eventName_2xx
  *     FSM -> Applib: c_LwM2M_stepName_loadTemplate_byIntIdx(c_t_Deregister)
  *     FSM -> Applib: c_LwM2M_stepName_send()
  *     Leshan <- Applib: LWM2M Deregister
  *     Leshan -> Applib: 204 Deleted
  *     FSM <- Applib: c_LwM2M_eventName(202)
  *     FSM <- Applib: c_LwM2M_eventName_2xx    
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_regDereg_againstLeshan() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    f_initialization(c_LeshanCoapAddr);

    f_registration_againstLeshan();

    f_deregistration_againstLeshan();

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_regDereg_againstLeshan.jpg
  *     ref over Applib, Peer: tc_initialization(c_LeshanCoapsAddr)
  *     Leshan <- Applib: DTLS hello
  *     Leshan -> Applib: DTLS established
  *     FSM -> Applib: c_LwM2M_stepName_loadTemplate_byIntIdx(c_t_Register)
  *     FSM -> Applib: c_LwM2M_stepName_send()
  *     Leshan <- Applib: LWM2M Register
  *     Leshan -> Applib: 201 Created
  *     FSM <- Applib: c_LwM2M_eventName(201)
  *     FSM <- Applib: c_LwM2M_eventName_2xx
  *     FSM -> Applib: c_LwM2M_stepName_loadTemplate_byIntIdx(c_t_Deregister)
  *     FSM -> Applib: c_LwM2M_stepName_send()
  *     Leshan <- Applib: LWM2M Deregister
  *     Leshan -> Applib: 204 Deleted
  *     FSM <- Applib: c_LwM2M_eventName(202)
  *     FSM <- Applib: c_LwM2M_eventName_2xx    
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  /*
  testcase tc_regDereg_againstLeshan_dtls() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin(p_useDTLS := true);

    f_initialization(c_LeshanCoapsAddr);

    f_MBT_execute(c_COAP_stepName_startDTLS, valueof(t_addr(0, 0)), {}, false);    
    f_handleVerdict(f_MBT_waitFor(c_COAP_behaviorType, c_COAP_eventName_transportSucc, valueof(t_addr(0, 0)), 3.0));

    f_registration_againstLeshan();

    f_deregistration_againstLeshan();

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }
  */

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_regDereg_againstLeshan_psk
  //
  // Purpose:
  //     Testcase for registering and then deregistering an LWM2M device using an external Leshan LwM2M server (DTLS PSK transport)
  //
  // Configuration:
  //    - Leshan must be configured with identity and key according to <tsp_EPTF_COAP_LGen_psks>[0]
  //    - Default identity: "client01"
  //    - Default key: "01020304"
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_regDereg_againstLeshan_psk.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_regDereg_againstLeshan_psk.jpg
  *     ref over Applib, Peer: tc_initialization(c_LeshanCoapsAddr)
  *     FSM -> Applib: c_COAP_stepName_startDTLS_byIntIdx(c_psk_identityIdx)
  *     Leshan <- Applib: DTLS hello (PSK)
  *     Leshan -> Applib: DTLS established (PSDK)
  *     FSM -> Applib: c_LwM2M_stepName_loadTemplate_byIntIdx(c_t_Register_psk)
  *     FSM -> Applib: c_LwM2M_stepName_send()
  *     Leshan <- Applib: LWM2M Register
  *     Leshan -> Applib: 201 Created
  *     FSM <- Applib: c_LwM2M_eventName(201)
  *     FSM <- Applib: c_LwM2M_eventName_2xx
  *     FSM -> Applib: c_LwM2M_stepName_loadTemplate_byIntIdx(c_t_Deregister)
  *     FSM -> Applib: c_LwM2M_stepName_send()
  *     Leshan <- Applib: LWM2M Deregister
  *     Leshan -> Applib: 204 Deleted
  *     FSM <- Applib: c_LwM2M_eventName(202)
  *     FSM <- Applib: c_LwM2M_eventName_2xx    
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_regDereg_againstLeshan_psk() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin(p_useDTLS := true);

    f_initialization(c_LeshanCoapsAddr);
    
    f_MBT_execute(c_COAP_stepName_startDTLS_byIntIdx, valueof(t_addr(0, 0)), {c_psk_identityIdx}, false);
    
    f_handleVerdict(f_MBT_waitFor(c_COAP_behaviorType, c_COAP_eventName_transportSucc, valueof(t_addr(0, 0)), 3.0));
    
    f_registration_againstLeshan(c_t_Register_psk);
    
    f_deregistration_againstLeshan();

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }
  
/*
  SUT: Block1 server
    - recv: Write (block1) stateless, succ
    - recv: Write (block1) atomic, succ (content indication via fcb COAPapplib -> LWM2Mapplib)
    ? recv: Write (block1) atomic, unsucc
*/

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_write_resource_block1_stateless_succ
  //
  // Purpose:
  //     Testcase for writing a resource value using statless block1
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_write_resource_block1_stateless_succ.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_write_resource_block1_stateless_succ.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     FSM -> Applib: c_LwM2M_stepName_setBlock1Handling_stateless
  *     Peer -> Applib: CON-PUT /5/0/5 with Block1:({num=0, m=true, szx=5}), size1:8863
  *     FSM <- Applib: c_LwM2M_eventName_Write
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleWriteRequest
  *     FSM <- Applib: c_LwM2M_eventName_WriteFWPackage
  *     Peer <- Applib: ACK-204OK with with Block1:({num=0, m=false, szx=5})
  *     Peer -> Applib: CON-PUT /5/0/5 with Block1:({num=1, m=true, szx=5})
  *     FSM <- Applib: c_LwM2M_eventName_Write
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleWriteRequest
  *     FSM <- Applib: c_LwM2M_eventName_WriteFWPackage
  *     Peer <- Applib: ACK-204OK with with Block1:({num=1, m=false, szx=5})
  *     Peer -> Applib: CON-PUT /5/0/5 with Block1:({num=2, m=false, szx=5})
  *     FSM <- Applib: c_LwM2M_eventName_Write
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleWriteRequest
  *     FSM <- Applib: c_LwM2M_eventName_WriteFWPackage
  *     Peer <- Applib: ACK-204OK with with Block1:({num=2, m=false, szx=5})
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/
  testcase tc_write_resource_block1_stateless_succ() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_MBT_execute(c_LwM2M_stepName_setBlock1Handling_stateless, valueof(t_addr(0, 0)), {}, false);

    // Block1 num=0 (first)
    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_CON_PUT_Block1({ num := 0, m := true, szx := 5 })), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Write, t_addr(0, ?), 3.0));
    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleWriteRequest, valueof(t_addr(0, 0)), {}, false);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_WriteFWPackage, t_addr(0, ?), 3.0));

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_Changed_withBlock1(ACKNOWLEDGEMENT, {num:=0, m:=false, szx:=5})));

    // Block1 num=1
    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_CON_PUT_Block1({ num := 1, m := true, szx := 5 })), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Write, t_addr(0, ?), 3.0));
    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleWriteRequest, valueof(t_addr(0, 0)), {}, false);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_WriteFWPackage, t_addr(0, ?), 3.0));

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_Changed_withBlock1(ACKNOWLEDGEMENT, {num:=1, m:=false, szx:=5})));

    // Block1 num=2 (last)
    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_CON_PUT_Block1({ num := 2, m := false, szx := 5 })), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Write, t_addr(0, ?), 3.0));
    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleWriteRequest, valueof(t_addr(0, 0)), {}, false);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_WriteFWPackage, t_addr(0, ?), 3.0));

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_Changed_withBlock1(ACKNOWLEDGEMENT, {num:=2, m:=false, szx:=5})));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }

  ///////////////////////////////////////////////////////////
  //
  // Testcase: tc_write_resource_block1_atomic_succ
  //
  // Purpose:
  //     Testcase for writing a resource value using atomic block1
  //
  // Action:
  //     (see EPTF_LwM2M_Tests.tc_write_resource_block1_atomic_succ.jpg)
  ///////////////////////////////////////////////////////////
  /*****************************************************************
  *     @startuml EPTF_LwM2M_Tests.tc_write_resource_block1_atomic_succ.jpg
  *     ref over Applib, Peer: tc_initialization
  *     ref over Applib, Peer: tc_registration
  *     FSM -> Applib: c_LwM2M_stepName_setBlock1Handling_atomic
  *     Peer -> Applib: CON-PUT /5/0/0 with Block1:({num=0, m=true, szx=5}), size1:1889
  *     FSM <- Applib: c_LwM2M_eventName_Write
  *     FSM -> Applib: c_COAP_stepName_handleRequest
  *     FSM -> Applib: c_LwM2M_stepName_handleWriteRequest
  *     FSM <- Applib: c_LwM2M_eventName_WriteFWPackage
  *     Peer <- Applib: ACK-204OK with with Block1:({num=0, m=true, szx=5})
  *     Peer -> Applib: CON-PUT /5/0/0 with Block1:({num=1, m=true, szx=5})
  *     Peer <- Applib: ACK-204OK with with Block1:({num=1, m=true, szx=5})
  *     Peer -> Applib: CON-PUT /5/0/0 with Block1:({num=2, m=false, szx=5})
  *     FSM <- Applib: c_LwM2M_eventName_atomicBlock1Finished
  *     Peer <- Applib: ACK-204OK with with Block1:({num=2, m=false, szx=5})
  *     FSM -> Applib: c_COAP_stepName_cleanUp()
  *     @enduml
  ******************************************************************/ 
  testcase tc_write_resource_block1_atomic_succ() runs on LWM2M_FSM_CT
  {
    f_LWM2M_Tests_begin();

    var integer peer := f_IFW_addComponent(COAP_PEER, "tester");
    f_IFW_CoapPeer_setRemote(peer, "sut");
    f_IFW_initComponents();

    f_initialization();
    f_registration(peer);

    f_MBT_execute(c_LwM2M_stepName_setBlock1Handling_atomic, valueof(t_addr(0, 0)), {}, false);

    // Block1 num=0 (first)
    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_CON_PUT_Block1_FwUg_num0), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_Write, t_addr(0, ?), 3.0));
    f_MBT_execute(c_COAP_stepName_handleRequest, valueof(t_addr(0, 0)), {}, false);
    f_MBT_execute(c_LwM2M_stepName_handleWriteRequest, valueof(t_addr(0, 0)), {}, false);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_WriteFWPackage, t_addr(0, ?), 3.0));

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_Continue_withBlock1(ACKNOWLEDGEMENT, {num:=0, m:= true, szx:=5})));

    // Block1 num=1
    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_CON_PUT_Block1_FwUg_num1), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_Continue_withBlock1(ACKNOWLEDGEMENT, {num:=1, m:=true, szx:=5})));

    // Block1 num=2
    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_CON_PUT_Block1_FwUg_num2), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_Continue_withBlock1(ACKNOWLEDGEMENT, {num:=2, m:=true, szx:=5})));

    // Block1 num=3 (last)
    f_IFW_CoapPeer_setMessageToSend(peer, valueof(t_CON_PUT_Block1_FwUg_num3), GENERATE_NEW_MID, GENERATE_NEW_TOKEN);
    f_IFW_CoapPeer_send(peer);

    f_handleVerdict(f_MBT_waitFor(c_LwM2M_behaviorType, c_LwM2M_eventName_atomicBlock1Finished, t_addr(0, ?), 3.0));

    f_IFW_CoapPeer_receive(peer);
    f_handleVerdict(f_IFW_CoapPeer_check(peer, tr_Changed_withBlock1(ACKNOWLEDGEMENT, {num:=3, m:=false, szx:=5})));

    f_MBT_execute(c_COAP_stepName_cleanUp, valueof(t_addr(0, 0)), {}, false);

    f_LWM2M_Tests_end();
  }
  
  testcase tc_tlv_decoding_string() runs on LWM2M_FSM_CT
  {
    var octetstring v_oct :=
    'C801D568747470733A2F2F6D65617339756B37766F706966656C686E2E626C6F622E636F72652E77696E646F77732E6E65742F6677732F34313137383832392D333634312D343234372D623637352D3739393934643666316639313F73763D323031362D30352D33312673723D63267369673D43475833253246415A79786B66675A79474970716D474161595763526D436B5563476A4A42446A377138314F342533442673743D323031382D31302D30325430303A30303A30305A2673653D323031382D31302D30345430303A30303A30305A2673703D72'O;

    var LWM2M_TLV_Resources v_tlv_resources := {};
    v_tlv_resources := f_dec_LwM2M_TLV_Resources(v_oct);
    log("v_tlv_resources: ", v_tlv_resources);
    
    var LwM2M_Resource_List v_resources := {}
    v_resources := f_LwM2M_TLV_Resources_toResources(v_tlv_resources, {"5","0","1"});    
    
    log("decoded resources", v_resources);
    
    if (match(v_resources[0], t_lwm2m_str_resource(5,0,1)))
    { setverdict(pass) }
    else { setverdict(fail)}
  }
  
  template LwM2M_Resource t_lwm2m_str_resource(integer p_obj, integer p_inst, integer p_id) :=
  { id := p_id, objId := p_obj, objInstId := p_inst, observed := ?, dataSample := omit, spec :=?, contentFormat := *, val := { strValue := ? } }
  
  testcase tc_encdec_LwM2M_JSON_Resources_to_oct() runs on LWM2M_FSM_CT
  {
    log("data: ",t_lwm2m_json_resources);
    
    var octetstring v_encoded := f_enc_LwM2M_JSON_Resources(valueof(t_lwm2m_json_resources));
    
    log("encoded: ", oct2char(v_encoded), "\n", v_encoded);
      
    var LwM2M_JSON_Resources v_decoded := f_dec_LwM2M_JSON_Resources(v_encoded);
      
    if (match(v_decoded, t_lwm2m_json_resources)) { setverdict(pass)}
    else { setverdict(fail) }
  }
  
  template LwM2M_JSON_Resources t_lwm2m_json_resources :=
  {
    bn := "/",
    e := {
      { n := "1", v := omit, bv := omit, sv := "sg", ov := omit },
      { n := "7/1", v := omit, bv := true, sv := omit, ov := omit },
      { n := "11/0/1", v := { f := 4.0 }, bv := omit, sv := omit, ov := omit },
      { n := "14/0/1", v := { i := 5 }, bv := omit, sv := omit, ov := omit },
      { n := "14/0/1", v := omit, bv := omit, sv := omit, ov := "01020304" }
    }
  }
  
  testcase tc_encdec_SenML_JSON_Resources_to_oct() runs on LWM2M_FSM_CT
  {
    log("data: ", t_senml_json_resources);
    
    var octetstring v_encoded := f_enc_SenML_JSON_Resources(valueof(t_senml_json_resources));
    
    log("encoded: ", oct2char(v_encoded), "\n", v_encoded);
      
    var SenML_JSON_Resources v_decoded := f_dec_SenML_JSON_Resources(v_encoded);
      
    if (match(v_decoded, t_senml_json_resources)) { setverdict(pass)}
    else { setverdict(fail) }
  }
  
  template SenML_JSON_Resources t_senml_json_resources :=
  {
    { bn := "/4/0", n := "1", v := omit, vb := omit, vs := "sg", vd := omit },
    { bn := omit, n := "2", v := omit, vb := true, vs := omit, vd := omit },
    { bn := omit, n := "11", v := { f := 4.0 }, vb := omit, vs := omit, vd := omit },
    { bn := omit, n := "14", v := { i := 4 }, vb := omit, vs := omit, vd := omit },
    { bn := omit, n := "15", v := omit, vb := omit, vs := omit, vd := "01020304" }
  }
  
  testcase tc_encdec_LwM2M_Resources_to_oct_using_LwM2M_JSON() runs on LWM2M_FSM_CT
  {
    log("resources: ", t_lwm2m_resources);
    
    var octetstring v_encoded := f_enc_LwM2M_Resources_to_LwM2M_JSON(valueof(t_lwm2m_resources));
    
    log("encoded: ", oct2char(v_encoded), "\n", v_encoded);
      
    var LwM2M_Resource_List v_decoded := {};
        
    f_dec_LwM2M_Resources_from_LwM2M_JSON(v_encoded, v_decoded);
    
    log("decoded: ", v_decoded);
      
    if (match(v_decoded, t_lwm2m_resources)) { setverdict(pass)}
    else { setverdict(fail) }
  }
  
  testcase tc_encdec_LwM2M_Resources_to_oct_using_SenML_JSON() runs on LWM2M_FSM_CT
  {
    log("resources: ", t_lwm2m_resources);
    
    var octetstring v_encoded := f_enc_LwM2M_Resources_to_SenML_JSON(valueof(t_lwm2m_resources));
    
    log("encoded: ", oct2char(v_encoded), "\n", v_encoded);
      
    var LwM2M_Resource_List v_decoded := {};
        
    f_dec_LwM2M_Resources_from_SenML_JSON(v_encoded, v_decoded);
    
    log("decoded: ", v_decoded);
      
    if (match(v_decoded, t_lwm2m_resources)) { setverdict(pass)}
    else { setverdict(fail) }
  }
  
  template LwM2M_Resource_List t_lwm2m_resources :=
  {
    t_LwM2M_Resource_init(1,0,1,{ strValue := "sg" }),
    t_LwM2M_Resource_init(1,0,2,{ boolValue := true }),
    t_LwM2M_Resource_init(1,0,3,{ floatValue := 4.0 }),
    t_LwM2M_Resource_init(1,0,4,{ intValue := 5 }),
    t_LwM2M_Resource_init(1,0,5,{ opaqueValue := '01020304'O })
  }
  
  control
  {
    execute(tc_tlv_decoding_string());
    execute(tc_encdec_LwM2M_JSON_Resources_to_oct());
    execute(tc_encdec_SenML_JSON_Resources_to_oct());
    execute(tc_encdec_LwM2M_Resources_to_oct_using_LwM2M_JSON());
    execute(tc_encdec_LwM2M_Resources_to_oct_using_SenML_JSON());
    
    execute(tc_initialization());
    execute(tc_registration());
    execute(tc_deregistration());
    
    execute(tc_read_resource_float_using_text());
    execute(tc_read_resource_float_using_lwm2m_json());
    execute(tc_read_resource_float_using_senml_json());
    execute(tc_read_resource_int_using_text());
    execute(tc_read_resource_int_using_lwm2m_json());
    execute(tc_read_resource_int_using_senml_json());
    execute(tc_read_resource_string_using_text());
    execute(tc_read_resource_string_lwm2m_json());
    execute(tc_read_resource_string_senlm_json());
    execute(tc_read_object_instance_using_lwm2m_json());
    execute(tc_read_object_instance_using_senml_json());
    execute(tc_read_object_using_lwm2m_json());
    execute(tc_read_object_using_senml_json());
    
    execute(tc_write_resource_float_using_text());
    execute(tc_write_resource_float_using_lwm2m_json());
    execute(tc_write_resource_float_using_senml_json());
    execute(tc_write_resource_int_using_text());
    execute(tc_write_resource_int_using_lwm2m_json());
    execute(tc_write_resource_int_using_senml_json());
    execute(tc_write_resource_string_using_text());
    execute(tc_write_resource_string_using_lwm2m_json());
    execute(tc_write_resource_string_using_senml_json());
    execute(tc_write_resource_block1_stateless_succ());
    execute(tc_write_resource_block1_atomic_succ());
    
    execute(tc_execute_resource());
    
    execute(tc_observe_subscription());
    execute(tc_observe_notification());
    execute(tc_observe_unsubscribe());
  }
}
