///////////////////////////////////////////////////////////////////////////////
//
// 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:               IOT_App_Definitions.ttcn
//  Description:
//  Rev:                <RnXnn>
//  Prodnr:             CNL 113 909
//  Updated:            2020-02-06
//  Contact:            http://ttcn.ericsson.se
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////
//  Module: IOT_App_Definitions
// 
//  Purpose:
//    This module contains the definitions for RIoT's main component
//
//  Detailed comments:
//    RIoT is a load generator built on top of the TitanSim load generator framework. It is
//    capable of simulating devices using some IoT protocols (CoAP, LwM2M, MQTT, HTTP). RIoT
//    (and the TitanSim framework) was created to support non-functional tests, where load generation
//    is required like performance, stability, scalability.
//
//  Module depends on:
//    - <EPTF_CLL_Base_Definitions>
//    - <EPTF_CLL_DsRestAPI_Definitions>
// 
//  Module Parameters:
//    tsp_EPTF_DsRestAPI_HTTPServer_RemoteAddress - <tsp_EPTF_DsRestAPI_HTTPServer_RemoteAddress> - *charstring* - the IP address of the REST API server
//    tsp_EPTF_DsRestAPI_HTTPServer_RemotePort - <tsp_EPTF_DsRestAPI_HTTPServer_RemotePort> - *charstring* - the port number of the REST API server
//    tsp_EPTF_DsRestAPI_HTTPServer_directory - <tsp_EPTF_DsRestAPI_HTTPServer_directory> - *charstring* - the path of REST API HTTP server directory
//    tsp_EPTF_DsRestAPI_customizableApp_directory - <tsp_EPTF_DsRestAPI_customizableApp_directory> - *charstring* - the path of the REST API customizableApp directory
//    tsp_EPTF_DsRestAPI_API_directory - <tsp_EPTF_DsRestAPI_API_directory> - *charstring* - the path of DsRestAPI API directory
//
//  Configuration:
//    - <tsp_EPTF_ExecCtrl_LGenPool_Declarators>
//    - <tsp_EPTF_ExecCtrl_EntityGroup2LGenPool_List>
//    - <tsp_LGenBase_EntityGrpDeclarators>
//    - <tsp_EPTF_ExecCtrl_Scenario2EntityGroupList>
//    - <tsp_LGenBase_TcMgmt_ScenarioDeclarators3>
//    - <tsp_LGenBase_TcMgmt_tcTypeDeclarators2>
//    - <tsp_IOT_LGen_FSMs>
//
//  Component Diagram:
//   (see IOT_App_Definitions.components.jpg)
//
//  Related Types:
//    - <IOT_App_CT>
//    - <IOT_LGen_CT>
//    - <EPTF_ExecCtrl_CT>
///////////////////////////////////////////////////////////////
module IOT_App_Definitions
{
  import from EPTF_CLL_Base_Definitions all;
  import from EPTF_CLL_DsRestAPI_Definitions all;
  
 /*****************************************************************
  @startuml IOT_App_Definitions.components.jpg
  package "RIoT" {
    class IOT_App_CT {
      TC()
    }
    class EPTF_ExecCtrl_CT {
      f_IOT_App_startExecCtrl()
      f_IOT_LGen_create()
    }
    class IOT_LGen_CT {
      f_IOT_LGen_behavior()
    }
    IOT_App_CT "1" <-> "*" IOT_LGen_CT
    IOT_App_CT "1" <-> "1" EPTF_ExecCtrl_CT
    EPTF_ExecCtrl_CT "1" <-> "*" IOT_LGen_CT
  }
  package "GUI" {
  }
  RIoT <-> GUI
  @enduml
  ******************************************************************/
  
  ///////////////////////////////////////////////////////////
  //  Module parameter: tsp_EPTF_DsRestAPI_HTTPServer_RemoteAddress
  // 
  //  Purpose:
  //    IP address of the REST API server
  //
  //  Type:
  //     *charstring*
  //
  //  Default value:
  //     *"127.0.0.1"*
  ///////////////////////////////////////////////////////////
  modulepar charstring 	tsp_EPTF_DsRestAPI_HTTPServer_RemoteAddress := "127.0.0.1";

  ///////////////////////////////////////////////////////////
  //  Module parameter: tsp_EPTF_DsRestAPI_HTTPServer_RemotePort
  // 
  //  Purpose:
  //    Port number of the REST API server
  //
  //  Type:
  //     *integer*
  //
  //  Default value:
  //     *4040*
  ///////////////////////////////////////////////////////////
  modulepar integer 	tsp_EPTF_DsRestAPI_HTTPServer_RemotePort := 4040;

  ///////////////////////////////////////////////////////////
  //  Module parameter: tsp_EPTF_DsRestAPI_HTTPServer_directory
  // 
  //  Purpose:
  //    Path of REST API HTTP server directory
  //
  //  Type:
  //     *charstring*
  //
  //  Default value:
  //     *"./WebGUI/WebGUI_link/"*
  ///////////////////////////////////////////////////////////
  modulepar charstring	tsp_EPTF_DsRestAPI_HTTPServer_directory := "./WebGUI/WebGUI_link/";

  ///////////////////////////////////////////////////////////
  //  Module parameter: tsp_EPTF_DsRestAPI_customizableApp_directory
  // 
  //  Purpose:
  //    Path of the REST API customizableApp directory
  //
  //  Type:
  //     *charstring*
  //
  //  Default value:
  //     *"./WebGUI/GUICustomization_link"*
  ///////////////////////////////////////////////////////////
  modulepar charstring 	tsp_EPTF_DsRestAPI_customizableApp_directory := "./WebGUI/GUICustomization_link";

  ///////////////////////////////////////////////////////////
  //  Module parameter: tsp_EPTF_DsRestAPI_API_directory
  // 
  //  Purpose:
  //    Path of DsRestAPI API directory
  //
  //  Type:
  //     *charstring*
  //
  //  Default value:
  //     *"./WebGUI/Js_link"*
  ///////////////////////////////////////////////////////////
  modulepar charstring 	tsp_EPTF_DsRestAPI_API_directory := "./WebGUI/Js_link";  

  ///////////////////////////////////////////////////////////
  // Type: IOT_App_CT
  //
  // Purpose:
  //   RIoT application's main component providing a REST API to the environment
  //
  // Extensions:
  //  - <EPTF_Base_CT>
  //  - <EPTF_DsRestAPI_CT>
  //
  // Related Functions:
  //   - <TC> () - The main test case function, entry point of the application
  ///////////////////////////////////////////////////////////
  type component IOT_App_CT extends EPTF_Base_CT, EPTF_DsRestAPI_CT
  {
    var boolean v_ready := false; 
  }
}
