///////////////////////////////////////////////////////////////////////////////
//
// 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_Applib_HTTP_Test_Application1_Definitions.ttcn
//  Rev:      <RnXnn>
//  Prodnr:   CNL 113 618
//  Updated:  2009-01-08  
//  Contact:  http://ttcn.ericsson.se
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
//  Module: EPTF_Applib_HTTP_Test_Application1_Definitions
// 
//  Purpose:
//    This module contains the definitions to test HTTP application.
// 
//  Module Parameters:
//    -
// 
//  Module depends on:
//    <EPTF_CLL_Common_Definitions>
//
//    <EPTF_CLL_LGenBase_ConfigDefinitions>
//
//    <EPTF_HTTP_Transport_Definitions>
//
//    <EPTF_HTTP_Definitions>
//
//  Current Owner:    
//    EAKOPER 
// 
//  Last Review Date:
//    2009-01-09  
// 
//  Detailed Comments:
//
//    Application1 is based on HTTP transport. 
//    HTTP transport related components are extended here. Both
//    local and remote operation mode is supported. Current
//    operation mode is determined via configuration.
// 
///////////////////////////////////////////////////////////////////////////////

module EPTF_Applib_HTTP_Test_Application1_Definitions { 

//=========================================================================
// Import Part
//=========================================================================
import from EPTF_CLL_Common_Definitions all;
import from EPTF_CLL_LGenBase_ConfigDefinitions all;
import from EPTF_HTTP_Transport_Definitions all;
import from EPTF_HTTP_Definitions all;

//=========================================================================
// Types
//=========================================================================

type record EPTF_HTTP_Test_Valid
{
  integer step,
  integer groupId
}

type enumerated EPTF_HTTP_Test_Status
{
  READY
}

type port EPTF_HTTP_Test_Validation_PT message
{
  inout EPTF_HTTP_Test_Valid;
  inout EPTF_HTTP_Test_Status;
}with {extension "internal"}

// HTTP_CT to extend functionality of AppLib
// Extension functions and AppLib API can run on this CT
type component EPTF_HTTP_Test_Application1_CT 
  extends EPTF_HTTP_LGen_CT 
{
  // extensions component variables e.g. new stats
  var EPTF_CharstringList v_HTTP1_strList := {};

  var integer v_numEntities;
  var boolean v_portMode;
  var boolean v_globalMode;
  var integer v_numOfPorts;
  var boolean v_iConnOpen;
  var boolean v_iConnClose;

  var integer v_sizeofAnswers_idx := -1;

  var EPTF_BooleanArray2D v_portStates;

  var integer v_tcIdx;

  var boolean v_stateCheckEnabled := true;
}

// HTTP Local transport CT
// Extends HTTP_CT so that extension function and AppLib API
// work on it and transport specific API can be added
type component EPTF_HTTP_Test_Application1_LocalCT extends
  EPTF_HTTP_Test_Application1_CT, EPTF_HTTP_LocalTransport_CT
{  
}

type record of EPTF_HTTP_Test_Application1_LocalCT EPTF_HTTP_Test_Application1_LocalCTList;

type record of EPTF_BooleanList EPTF_BooleanArray2D;

// HTTP Remote transport CT
// Extends HTTP_CT so that extension function and AppLib API
// work on it and transport specific API can be added
type component EPTF_HTTP_Test_Application1_RemoteCT extends
  EPTF_HTTP_Test_Application1_CT, EPTF_HTTP_RemoteTransport_CT
{
}

type record of EPTF_HTTP_Test_Application1_RemoteCT EPTF_HTTP_Test_Application1_RemoteCTList;

type record of EPTF_HTTP_Transport_ConnectionState EPTF_HTTP_Transport_ConnectionStateList;

// HTTP Mapper CT
type component EPTF_HTTP_Test_Application1_MapperCT 
  extends EPTF_HTTP_Mapper_CT, EPTF_HTTP_Test_Application1_LocalCT
{
  port EPTF_HTTP_Test_Validation_PT v_validation_PCO;
}

template EPTF_LGenBase_TcMgmt_tcTypeDeclarator2 t_HTTP_defaultTC(
    in charstring pl_name,
    in charstring pl_fsmName,
    in charstring pl_eType
) :=
{
  name := pl_name,
  fsmName := pl_fsmName,
  entityType := pl_eType,
  customEntitySucc := "" 
}

template EPTF_LGenBase_TcMgmt_ScenarioDeclarator2 t_HTTP_defaultSC(
    in charstring pl_name,
    in EPTF_LGenBase_TcMgmt_TcOfScenario2List pl_tclist) :=
{
  name := pl_name,
  tcList := pl_tclist
}


template EPTF_LGenBase_TcMgmt_TcOfScenario2 t_HTTP_defaultTCofSC(
    in charstring pl_name,
    in float pl_delay,
    in float pl_cps) :=
{
  tcName := pl_name,
  startDelay := pl_delay,
  cpsToReach := pl_cps,
  enableEntities := true,
  enable := true,
  ranges := {},
  params  := {},
  //finishConditions
  groupFinishConditions  := c_EPTF_LGenBase_TcMgmt_emptyGroupFinishConditions2,
  entityFinishConditions  := c_EPTF_LGenBase_TcMgmt_emptyEntityFinishConditions,
  //actionLists
  entityFinishActions  := {},
  tcFinishActions  := {}
}

}
