///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// 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                                 //
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////
//  Module: EPTF_LoggingDS_TestCases
// 
//  Purpose:
//    This module provides test for the Logging client/server
//    functionality
// 
//  Module Parameters:
//    -
// 
//  Module depends on:
//    <>
// 
//  Current Owner:
//    ELSZSKU
// 
//  Last Review Date:
//    2008-
// 
//  Detailed Comments:
// 
///////////////////////////////////////////////////////////
module EPTF_LoggingDS_TestCases
{
import from EPTF_CLL_Common_Definitions all;
import from EPTF_CLL_Logging_Definitions all;
import from EPTF_CLL_Variable_Definitions all;
import from EPTF_CLL_Variable_Functions all;
import from EPTF_CLL_LoggingClient_Functions all;
import from EPTF_CLL_DataSource_Functions all;
import from EPTF_CLL_DataSource_Definitions all;
import from EPTF_CLL_DataSourceClient_Functions all;
import from EPTF_CLL_Base_Functions all;
import from EPTF_CLL_LoggingServer_Definitions all;
import from EPTF_CLL_LoggingServer_Functions all;
import from EPTF_CLL_Logging_Functions all;

friend module EPTF_LoggingDSGUI_TestCases;
//type EPTF_LoggingServer_CT LoggingDS_TestServer_CT 

type record LoggingDS_EnabledVarIds {
  integer globalVarId,
  integer client1VarId,
  integer client2VarId,
  LoggingDS_EnabledVarIdsTypes CLLBoth,
  LoggingDS_EnabledVarIdsTypes CLLSecond, //short
  LoggingDS_EnabledVarIdsTypes UserBoth, //short
  LoggingDS_EnabledVarIdsTypes UserSecond
}
//c_ctypeCLLSecond
//type record of EPTF_IntegerArray2D EPTF_IntegerArray3D;

type record LoggingDS_EnabledVarIdsTypes{
  LoggingDS_EnabledVarIdsClasses global,
  LoggingDS_EnabledVarIdsClasses client1,
  LoggingDS_EnabledVarIdsClasses client2
}

type record LoggingDS_EnabledVarIdsClasses{
  integer globalVarId,
  integer debugVarId,
  integer verboseVarId,
  integer infoVarId
}

type record LoggingDS_EnabledStates {
  boolean userBothDebug,
  boolean userBothInfo,
  boolean cllBothDebug,
  boolean cllBothInfo
}

type component LoggingDS_Test_CT extends EPTF_LoggingClient_CT, EPTF_DataSource_CT{
  const charstring c_clientName1 := "LoggingClient1"
  const charstring c_clientName2 := "LoggingClient2"
  //iterators
  var integer v_LoggingDS_varId_clients;
  var integer v_LoggingDS_varId_selectionTypes;
  var integer v_LoggingDS_varId_typesCLL;
  var integer v_LoggingDS_varId_typesUser;
  var integer v_LoggingDS_varId_clientCTypeCLLBoth;
  var integer v_LoggingDS_varId_clientCTypeUserBoth;
  var integer v_LoggingDS_varId_clientCTypeCLLSecond;
  var integer v_LoggingDS_varId_clientCTypeUserSecond;
  var integer v_LoggingDS_varId_classesUserSecond;
  var integer v_LoggingDS_varId_classesUserBoth;
  var integer v_LoggingDS_varId_classesCLLBoth;

  var integer v_LoggingDS_logTypeIdUserBoth;
  var integer v_LoggingDS_logTypeIdCLLBoth;

  var LoggingDS_EnabledVarIds v_LoggingDS_enabledData;

  var EPTF_LoggingServer_CT v_LoggingDS_server;
  var EPTF_LoggingClient_CT v_LoggingDS_client2;
}
const float c_LoggingDS_varSyncInterval := 0.1;
function f_LoggingDS_Test_serverBehavior(in EPTF_DataSource_CT pl_dsServer)
runs on EPTF_LoggingServer_CT{
  f_EPTF_LoggingServer_init_CT(%definitionId, pl_dsServer);
  f_EPTF_Var_setSyncInterval(c_LoggingDS_varSyncInterval);
  f_EPTF_Base_wait4Shutdown();
}

const charstring c_ctypeCLLBoth := "TestCLLLogTypeOnBoth"
const charstring c_ctypeCLLSecond := "TestCLLLogTypeOnSecond"
const charstring c_ctypeUserBoth := "TestUserLogTypeOnBoth"
const charstring c_ctypeUserSecond := "TestUserLogTypeOnSecond"
const charstring c_logmaskDebug := "Debug";
const charstring c_logmaskDebugVerbose := "DebugVerbose"
const charstring c_logmaskInfo := "Info";
const integer c_logClassDebug := 0;
const integer c_logClassInfo := 1;
const integer c_logClassDebugVerbose := 2;
const EPTF_Logging_EventClassPrefixList c_loggingEventClasses := { c_logmaskDebug, c_logmaskInfo, c_logmaskDebugVerbose };
const EPTF_Logging_EventClassPrefixList c_loggingEventClassesShort := { c_logmaskDebug, c_logmaskInfo };

function f_LoggingDS_Test_clientBehavior(
  in EPTF_LoggingServer_CT pl_server,
  in charstring pl_selfName,
  in EPTF_DataSource_CT pl_sourceCompRef,
  in boolean pl_addSelections)
runs on EPTF_LoggingClient_CT{
  f_EPTF_LoggingClient_init_CT(pl_selfName, pl_server, pl_sourceCompRef);
  f_EPTF_Var_setSyncInterval(c_LoggingDS_varSyncInterval);

  //Registers as a client
  var integer vl_logTypeId := f_EPTF_Logging_registerComponentMasks(c_ctypeCLLBoth, c_loggingEventClasses, EPTF_Logging_CLL);
  f_EPTF_Logging_enableLocalMask(vl_logTypeId, c_logClassDebugVerbose);
  f_EPTF_Logging_enableLocalMask(vl_logTypeId, c_logClassDebug);
  f_EPTF_Logging_disableLocalMask(vl_logTypeId, c_logClassInfo);

  vl_logTypeId := f_EPTF_Logging_registerComponentMasks(c_ctypeCLLSecond, c_loggingEventClassesShort, EPTF_Logging_CLL);
  f_EPTF_Logging_enableLocalMask(vl_logTypeId, c_logClassDebug);
  f_EPTF_Logging_disableLocalMask(vl_logTypeId, c_logClassInfo);

  vl_logTypeId := f_EPTF_Logging_registerComponentMasks(c_ctypeUserBoth, c_loggingEventClassesShort, EPTF_Logging_user);
  f_EPTF_Logging_disableLocalMask(vl_logTypeId, c_logClassDebug);
  f_EPTF_Logging_enableLocalMask(vl_logTypeId, c_logClassInfo);

  vl_logTypeId := f_EPTF_Logging_registerComponentMasks(c_ctypeUserSecond, c_loggingEventClasses, EPTF_Logging_user);
  f_EPTF_Logging_enableLocalMask(vl_logTypeId, c_logClassDebugVerbose);
  f_EPTF_Logging_enableLocalMask(vl_logTypeId, c_logClassDebug);
  f_EPTF_Logging_disableLocalMask(vl_logTypeId, c_logClassInfo);
  if(pl_addSelections){
    var integer vl_selection := f_EPTF_Logging_registerSelection("Debug");
    //Register CLLBoth class
    vl_logTypeId := f_EPTF_Logging_registerComponentMasks("AppLib_B", {"Traffic errors: "}, vl_selection);
    f_EPTF_Logging_enableLocalMask(vl_logTypeId, 0);
    vl_selection := f_EPTF_Logging_registerSelection("Traffic");
    //Register CLLBoth class
    vl_logTypeId := f_EPTF_Logging_registerComponentMasks("AppLib_A", {"Traffic errors: "}, vl_selection);
    f_EPTF_Logging_enableLocalMask(vl_logTypeId, 0);
  }
  //f_EPTF_Logging_logAll();
  f_EPTF_Base_wait4Shutdown();
}

friend function f_LoggingDS_initConfig(in boolean pl_addSelections)
runs on LoggingDS_Test_CT{
  f_LoggingDS_init();
  f_LoggingDS_initClient();
  f_LoggingDS_registerCLLBoth();
  f_LoggingDS_registerUserBoth();
  f_LoggingDS_createClient2(pl_addSelections);
  timer t1;
  t1.start(3.0*c_LoggingDS_varSyncInterval);
  t1.timeout;
}

private function f_LoggingDSNeg_initConfig()
runs on LoggingDS_Test_Neg_CT{
  f_EPTF_DataSource_init_CT(c_clientName1);
  f_EPTF_Var_setSyncInterval(c_LoggingDS_varSyncInterval);
  f_EPTF_LoggingServer_init_CT(c_clientName1, self);
  v_LoggingDS_server := self;
  f_LoggingDS_initClient();
  f_LoggingDS_registerCLLBoth();
  f_LoggingDS_registerUserBoth();
  f_LoggingDS_createClient2(false);
  timer t1;
  t1.start(3.0*c_LoggingDS_varSyncInterval);
  t1.timeout;
}
private function f_LoggingDS_init()
runs on LoggingDS_Test_CT{
  f_EPTF_DataSource_init_CT(c_clientName1);
  f_EPTF_Var_setSyncInterval(c_LoggingDS_varSyncInterval);
  //Creates and starts a server
  v_LoggingDS_server := EPTF_LoggingServer_CT.create;
  v_LoggingDS_server.start( f_LoggingDS_Test_serverBehavior(self) );
  f_EPTF_Logging_init_CT(c_clientName1);
}

private function f_LoggingDS_initClient()
runs on LoggingDS_Test_CT{
  //Register logging client
  f_EPTF_LoggingClient_init_CT(c_clientName1, v_LoggingDS_server, self);
}

private function f_LoggingDS_registerCLLBoth()
runs on LoggingDS_Test_CT{
  //Register CLLBoth class
  v_LoggingDS_logTypeIdCLLBoth := f_EPTF_Logging_registerComponentMasks(c_ctypeCLLBoth, c_loggingEventClasses, EPTF_Logging_CLL);
  f_EPTF_Logging_enableLocalMask(v_LoggingDS_logTypeIdCLLBoth, c_logClassDebugVerbose);
  f_EPTF_Logging_enableLocalMask(v_LoggingDS_logTypeIdCLLBoth, c_logClassDebug);
  f_EPTF_Logging_disableLocalMask(v_LoggingDS_logTypeIdCLLBoth, c_logClassInfo);
}

private function f_LoggingDS_registerUserBoth()
runs on LoggingDS_Test_CT{
  v_LoggingDS_logTypeIdUserBoth := f_EPTF_Logging_registerComponentMasks(c_ctypeUserBoth, c_loggingEventClassesShort, EPTF_Logging_user);
  f_EPTF_Logging_enableLocalMask(v_LoggingDS_logTypeIdUserBoth, c_logClassDebug);
  f_EPTF_Logging_disableLocalMask(v_LoggingDS_logTypeIdUserBoth, c_logClassInfo);
}
//Creates a new client, and registers classes
private function f_LoggingDS_createClient2(in boolean pl_addSelections)
runs on LoggingDS_Test_CT{
  v_LoggingDS_client2 := EPTF_LoggingClient_CT.create;
  v_LoggingDS_client2.start( f_LoggingDS_Test_clientBehavior(v_LoggingDS_server, c_clientName2, self, pl_addSelections) );
}

///////////////////////////////////////////////////////////
//  Testcase: tc_LoggingDS_elements
// 
//  Purpose:
//    Tests the behavior client-server features of the Logging
//    and their DataSource client
//    
//  Detailed Comments:
//    - There are 2 clients in the test: "LoggingClient1" and "LoggingClient2".
//    - The MTC extends the EPTF_DataSource_CT and the EPTF_LoggingClient_CT.
//    - After the initialization of the DataSource, it starts
//      a new PTC, which is the Logging server.
//    - First the test verifies the iterators of the Logging Server when
//      there are no clients connected.
//    - Then initializes the LoggingClient CT, but does not register logmasks yet.
//    - After it verifies the "Clients" iterator, which must now contain the new client.
//    - Registers a new component type, "CLLBoth" under the "CLL" selection. 
//    - Verifies the change of the "ComponentTypes" iterator.
//    - Registers a new type, "UserBoth" under the "User" selection.
//    - Verifies the change of the "ComponentTypes" iterators for both selections.
//    - Starts a new client, "LoggingClient2", which registers 
//      "CLLBoth", "UserBoth", "CLLSecond" and "UserSecond" type under the
//      selections indicated in their names.
//    - Verifies the "Clients" iterator, which must now contain the new client.
//    - Verifies the change of the "ComponentTypes" iterators for both selections.
//    - Verifies the "Clients" iterator for "CLLBoth", "UserBoth", "CLLSecond" and "UserSecond" types.
//    - Verifies the change of the "ComponentTypes" iterator for both selections.
//    - Verifies the "Classes" iterator for "CLLBoth", "UserBoth", "CLLSecond" and "UserSecond" types.
//    - After verifying the iterators, it verifies the enabled states.
//    - First tries to get the DataSource variables for
//      - global logging
//      - global logging for "CLLBoth", "UserBoth", "CLLSecond" and "UserSecond" types and for their log classes
//      - client logging on clients
//      - logging for "CLLBoth", "UserBoth", "CLLSecond" and "UserSecond" types
//        and for their log classes on both clients
//    - After getting the DataSource variables tests the way from Logging <f_EPTF_Logging_enableLocalMask>
//      to the data sources. Compares the values of the DataSource elements of the class log enable states to the
//      expected state according to the previous <f_EPTF_Logging_enableLocalMask> calls.
//    - Enables/disables some class logs and type logs, and verifies if the appropriate
//      external data values changed properly.
//    - Finally verifies the way from DataSource elements to the logging enabled states.
//    - First on clients:
//      Sets class log, type log and client log enabled state, then checks with <f_EPTF_Logging_isEnabled>
//      function if the appropriate class logs are enabled/disabled properly.
//    - The it repeats the verification setting the global enabled states on the server.    
//    
///////////////////////////////////////////////////////////
testcase tc_LoggingDS_elements() runs on LoggingDS_Test_CT
{
  const EPTF_CharstringList c_Logging_selectionList := {"EPTF_CLL", "EPTF_User"};
  //Init Logging, start DS server
  f_LoggingDS_init();
  timer t_guard;
  t_guard.start( 0.55 );
  t_guard.timeout;
  f_LoggingDS_getVar(v_LoggingDS_varId_clients,c_LoggingServer_sourceId, c_LoggingServer_iteratorClients);
  //Here the clients list must be empty, since no one registered
  f_LoggingDS_checkIteratorContent(v_LoggingDS_varId_clients, {}, c_LoggingServer_iteratorClients);
  //Selections
  f_LoggingDS_getVar(v_LoggingDS_varId_selectionTypes,c_LoggingServer_sourceId, c_LoggingServer_iteratorSelectionTypes);
  f_LoggingDS_checkIteratorContent(v_LoggingDS_varId_selectionTypes,c_Logging_selectionList,c_LoggingServer_iteratorSelectionTypes);
  //Register logging client
  f_LoggingDS_initClient();
  //The synchronization happens here
  t_guard.start( 0.25 );
  t_guard.timeout;
  f_LoggingDS_getVar(v_LoggingDS_varId_typesCLL,c_LoggingServer_sourceId, c_LoggingServer_iteratorComponentTypes,{{c_LoggingServer_paramNameSelection,c_Logging_selectionList[EPTF_Logging_CLL]}});
  var EPTF_CharstringList vl_cllTypes := f_EPTF_Var_getCharstringlistValue(v_LoggingDS_varId_typesCLL);
  //Check client list
  //It must contain only this client
  f_LoggingDS_checkIteratorContent(v_LoggingDS_varId_clients,{c_clientName1},c_LoggingServer_iteratorClients);
  //Register CLLBoth class
  f_LoggingDS_registerCLLBoth();
  t_guard.start( 0.15 );
  t_guard.timeout;
  //Check initial environment
  if(not f_EPTF_Logging_isEnabled(v_LoggingDS_logTypeIdCLLBoth, c_logClassDebugVerbose)){
    setverdict ( inconc,"Initial DebugVerbose logging is disabled!" );
    f_EPTF_Base_stopAll(fail);
  }
  if(not f_EPTF_Logging_isEnabled(v_LoggingDS_logTypeIdCLLBoth, c_logClassDebug)){
    setverdict ( inconc,"Initial DebugNormal logging is disabled!" );
    f_EPTF_Base_stopAll(fail);
  }
  if(f_EPTF_Logging_isEnabled(v_LoggingDS_logTypeIdCLLBoth, c_logClassInfo)){
    setverdict ( inconc,"Initial Info logging is enabled!" );
    f_EPTF_Base_stopAll(fail);
  }
  //c_LoggingServer_iteratorComponentTypes, first client only
  //Now the last registered type is the last in the list. If it changed, the test shall be changed.
  vl_cllTypes[sizeof(vl_cllTypes)]:=c_ctypeCLLBoth;
  f_LoggingDS_checkIteratorContent(v_LoggingDS_varId_typesCLL,vl_cllTypes,c_LoggingServer_iteratorComponentTypes&", {"&c_ctypeCLLBoth&"}");
  f_LoggingDS_registerUserBoth();
  t_guard.start( 0.25 );
  t_guard.timeout;
  f_LoggingDS_getVar(v_LoggingDS_varId_typesUser,c_LoggingServer_sourceId, c_LoggingServer_iteratorComponentTypes,{{c_LoggingServer_paramNameSelection,c_Logging_selectionList[EPTF_Logging_user]}});
  //Now the last registered type is the last in the list. If it changed, the test shall be changed. 
  f_LoggingDS_checkIteratorContent(v_LoggingDS_varId_typesUser,{c_ctypeUserBoth},c_LoggingServer_iteratorComponentTypes);
  //Creates a new client, and registers classes
  f_LoggingDS_createClient2(false)
  t_guard.start( 0.4 );
  t_guard.timeout;
  //The client list must contain two clients
  f_LoggingDS_checkIteratorContent(v_LoggingDS_varId_clients,{c_clientName1, c_clientName2},c_LoggingServer_iteratorClients);
  //Clients list for c_ctypeCLLBoth must contain both clients
  f_LoggingDS_getVar(
    v_LoggingDS_varId_clientCTypeCLLBoth,
    c_LoggingServer_sourceId,
    c_LoggingServer_iteratorClients,
    {{c_LoggingServer_paramNameComponentType,c_ctypeCLLBoth}}
  );
  f_LoggingDS_checkIteratorContent(v_LoggingDS_varId_clientCTypeCLLBoth,{c_clientName1, c_clientName2},
    c_LoggingServer_iteratorClients&", {"&c_LoggingServer_paramNameComponentType&":="&c_ctypeCLLBoth&"}");

  //Clients list for c_ctypeUserBoth must contain both clients
  f_LoggingDS_getVar(v_LoggingDS_varId_clientCTypeUserBoth,
    c_LoggingServer_sourceId,
    c_LoggingServer_iteratorClients,
    {{c_LoggingServer_paramNameComponentType,c_ctypeUserBoth}}
  );
  f_LoggingDS_checkIteratorContent(v_LoggingDS_varId_clientCTypeUserBoth,{c_clientName1, c_clientName2},
    c_LoggingServer_iteratorClients&", {"&c_LoggingServer_paramNameComponentType&":="&c_ctypeUserBoth&"}");
  //Clients list for c_ctypeCLLSecond must contain only the second client
  f_LoggingDS_getVar(v_LoggingDS_varId_clientCTypeCLLSecond,
    c_LoggingServer_sourceId,
    c_LoggingServer_iteratorClients,
    {{c_LoggingServer_paramNameComponentType,c_ctypeCLLSecond}}
  );
  f_LoggingDS_checkIteratorContent(v_LoggingDS_varId_clientCTypeCLLSecond,{c_clientName2},
    c_LoggingServer_iteratorClients&", {"&c_LoggingServer_paramNameComponentType&":="&c_ctypeUserSecond&"}");

  //Clients list for c_ctypeUserSecond must contain only the second client
  f_LoggingDS_getVar(v_LoggingDS_varId_clientCTypeUserSecond,
    c_LoggingServer_sourceId,
    c_LoggingServer_iteratorClients,
    {{c_LoggingServer_paramNameComponentType,c_ctypeUserSecond}}
  );
  f_LoggingDS_checkIteratorContent(v_LoggingDS_varId_clientCTypeUserSecond,{c_clientName2},
    c_LoggingServer_iteratorClients&", {"&c_LoggingServer_paramNameComponentType&":="&c_ctypeUserSecond&"}");

  //c_LoggingServer_iteratorComponentTypes, both clients
  vl_cllTypes[sizeof(vl_cllTypes)]:=c_ctypeCLLSecond;
  f_LoggingDS_checkIteratorContent(v_LoggingDS_varId_typesCLL,vl_cllTypes,c_LoggingServer_iteratorComponentTypes&", {"&c_ctypeCLLSecond&"}");
  //c_LoggingServer_iteratorComponentTypes, both clients
  f_LoggingDS_checkIteratorContent(v_LoggingDS_varId_typesUser,{c_ctypeUserBoth,c_ctypeUserSecond},c_LoggingServer_iteratorComponentTypes&", {"&c_ctypeUserSecond&"}");
  //c_LoggingServer_iteratorClasses
  f_LoggingDS_getVar(v_LoggingDS_varId_classesUserSecond,
    c_LoggingServer_sourceId,
    c_LoggingServer_iteratorClasses,
    {{c_LoggingServer_paramNameComponentType,c_ctypeUserSecond}}
  );
  f_LoggingDS_checkIteratorContent(v_LoggingDS_varId_classesUserSecond,
    c_loggingEventClasses,c_LoggingServer_iteratorClasses,{{c_LoggingServer_paramNameComponentType,c_ctypeUserSecond}});

  f_LoggingDS_getVar(v_LoggingDS_varId_classesUserBoth,
    c_LoggingServer_sourceId,
    c_LoggingServer_iteratorClasses,
    {{c_LoggingServer_paramNameComponentType,c_ctypeUserBoth}}
  );
  f_LoggingDS_checkIteratorContent(v_LoggingDS_varId_classesUserBoth,
    c_loggingEventClassesShort,c_LoggingServer_iteratorClasses,{{c_LoggingServer_paramNameComponentType,c_ctypeUserBoth}});

  f_LoggingDS_getVar(v_LoggingDS_varId_classesCLLBoth,
    c_LoggingServer_sourceId,
    c_LoggingServer_iteratorClasses,
    {{c_LoggingServer_paramNameComponentType,c_ctypeCLLBoth}}
  );
  f_LoggingDS_checkIteratorContent(v_LoggingDS_varId_classesCLLBoth,c_loggingEventClasses,c_LoggingServer_iteratorClasses,{{c_LoggingServer_paramNameComponentType,c_ctypeCLLBoth}});


  //Enabled states - build up the tree
  //Global
  f_LoggingDS_getVar(v_LoggingDS_enabledData.globalVarId,
    c_LoggingServer_sourceId,
    c_LoggingServer_dataElementLogEnabled);


  //Component type
  //Global enabled states
  //Classes for CLLBoth
  f_LoggingDS_getVarIds(v_LoggingDS_enabledData.CLLBoth.global, "", c_ctypeCLLBoth, false);
  //Classes for CLLSecond
  f_LoggingDS_getVarIds(v_LoggingDS_enabledData.CLLSecond.global, "", c_ctypeCLLSecond, true);
  //Classes for UserBoth
  f_LoggingDS_getVarIds(v_LoggingDS_enabledData.UserBoth.global, "", c_ctypeUserBoth, true);
  //Classes for UserSecond
  f_LoggingDS_getVarIds(v_LoggingDS_enabledData.UserSecond.global, "", c_ctypeUserSecond, false);

  //Clients
  //"LoggingClient1"
  f_LoggingDS_getVar(v_LoggingDS_enabledData.client1VarId,
    c_LoggingClient_sourceId,
    c_LoggingServer_dataElementLogEnabled,
    {},
    c_clientName1);

  //Classes on client1
  f_LoggingDS_getVarIds(v_LoggingDS_enabledData.CLLBoth.client1, c_clientName1, c_ctypeCLLBoth, false);
  f_LoggingDS_getVarIds(v_LoggingDS_enabledData.UserBoth.client1, c_clientName1, c_ctypeUserBoth, true);
  //"LoggingClient2"
  f_LoggingDS_getVar(v_LoggingDS_enabledData.client2VarId,
    c_LoggingClient_sourceId,
    c_LoggingServer_dataElementLogEnabled,
    {},
    c_clientName2);
  //Classes on client2
  f_LoggingDS_getVarIds(v_LoggingDS_enabledData.CLLBoth.client2, c_clientName2, c_ctypeCLLBoth, false);
  f_LoggingDS_getVarIds(v_LoggingDS_enabledData.CLLSecond.client2, c_clientName2, c_ctypeCLLSecond, true);
  f_LoggingDS_getVarIds(v_LoggingDS_enabledData.UserBoth.client2, c_clientName2, c_ctypeUserBoth, true);
  f_LoggingDS_getVarIds(v_LoggingDS_enabledData.UserSecond.client2, c_clientName2, c_ctypeUserSecond, false);

  //---------------------------------------------------------
  //Tests the way from Logging f_EPTF_Logging_enableLocalMask to the data sources
  //Check enabled value 4 c_ctypeUserSecond, c_logClassInfo on client2. Must be false, since the client behavior disables it.
  if(f_EPTF_Var_getBoolValue(v_LoggingDS_enabledData.UserSecond.client2.infoVarId)){
    setverdict(fail,"enabled value 4 c_ctypeUserSecond, c_logClassInfo on client2 must be false.");
    f_EPTF_Base_stopAll(fail);
  }
  //Check enabled value 4 c_ctypeUserSecond, c_logClassInfo on client2. Must be false, since the client behavior enables it.
  if(not f_EPTF_Var_getBoolValue(v_LoggingDS_enabledData.UserSecond.client2.debugVarId)){
    setverdict(fail,"enabled value 4 c_ctypeUserSecond, debug on client2 must be true.");
    f_EPTF_Base_stopAll(fail);
  }
  //Check enabled value 4 UserBoth, c_logClassInfo on client2. Must be true.
  if(not f_EPTF_Var_getBoolValue(v_LoggingDS_enabledData.UserBoth.client2.infoVarId)){
    setverdict(fail,"enabled value 4 UserBoth, c_logClassInfo on client2 must be true.");
    f_EPTF_Base_stopAll(fail);
  }
  //Check enabled value 4 c_ctypeUserSecond, c_logClassInfo on client2. Must be false.
  if(f_EPTF_Var_getBoolValue(v_LoggingDS_enabledData.UserBoth.client2.debugVarId)){
    setverdict(fail,"enabled value 4 c_ctypeUserSecond, debug on client2 must be false.");
    f_EPTF_Base_stopAll(fail);
  }
  //Check enabled value 4 UserBoth, c_logClassInfo on client1. Must be false.
  if(f_EPTF_Var_getBoolValue(v_LoggingDS_enabledData.UserBoth.client1.infoVarId)){
    setverdict(fail,"enabled value 4 UserBoth, info on client1 must be false.");
    f_EPTF_Base_stopAll(fail);
  }
  //Check enabled value 4 c_ctypeUserSecond, c_logClassInfo on client1. Must be false.
  if(not f_EPTF_Var_getBoolValue(v_LoggingDS_enabledData.UserBoth.client1.debugVarId)){
    setverdict(fail,"enabled value 4 UserBoth, debug on client1 must be true.");
    f_EPTF_Base_stopAll(fail);
  }
  //Check enabled value 4 UserBoth on client1 class independent. Must be true.
  if(not f_EPTF_Var_getBoolValue(v_LoggingDS_enabledData.UserBoth.client1.globalVarId)){
    setverdict(fail,"enabled value 4 UserBoth, class independent on client1 must be true.");
    f_EPTF_Base_stopAll(fail);
  }

  //Change the enabled state on client1 4 UserBoth, c_logClassInfo
  f_EPTF_Logging_enableLocalMask(v_LoggingDS_logTypeIdUserBoth, c_logClassInfo);
  f_EPTF_Logging_disableLocalMask(v_LoggingDS_logTypeIdUserBoth, c_logClassDebug);
  f_EPTF_Logging_disableLocal(v_LoggingDS_logTypeIdCLLBoth);
  t_guard.start( 0.15 );
  t_guard.timeout;
  //Check enabled value 4 UserBoth, c_logClassInfo on client1. Must be true now.
  if(not f_EPTF_Var_getBoolValue(v_LoggingDS_enabledData.UserBoth.client1.infoVarId)){
    setverdict(fail,"enabled value 4 UserBoth, c_logClassInfo on client1 must be changed to true.");
    f_EPTF_Base_stopAll(fail);
  }
  //Check enabled value 4 c_ctypeUserSecond, c_logClassInfo on client1. Must be changed to false.
  if(f_EPTF_Var_getBoolValue(v_LoggingDS_enabledData.UserBoth.client1.debugVarId)){
    setverdict(fail,"enabled value 4 UserBoth, debug on client1 must be changed to false.");
    f_EPTF_Base_stopAll(fail);
  }
  //Check enabled value 4 UserBoth on client1 class independent. Must be changed to false.
  if(not f_EPTF_Var_getBoolValue(v_LoggingDS_enabledData.UserBoth.client1.globalVarId)){
    setverdict(fail,"enabled value 4 UserBoth on client1 class independent. Must be changed to false.");
    f_EPTF_Base_stopAll(fail);
  }

  f_EPTF_Logging_enableLocalMask(v_LoggingDS_logTypeIdUserBoth, c_logClassInfo);
  f_EPTF_Logging_enableLocalMask(v_LoggingDS_logTypeIdCLLBoth, c_logClassInfo);
  f_EPTF_Logging_enableLocal(v_LoggingDS_logTypeIdCLLBoth);
  //------------------------------------------------  
  //Tests the way from data sources to the Logging f_EPTF_Logging_isEnabled.

  //Client data sources
  //Class of CT on client (lowest) level. ----
  f_EPTF_Var_adjustContent(v_LoggingDS_enabledData.UserBoth.client1.debugVarId,{boolVal := false});
  t_guard.start( 0.15 );
  t_guard.timeout;
  f_LoggingDS_checkEnabledStates(pl_userBothDebug := false)
  //Set back
  f_EPTF_Var_adjustContent(v_LoggingDS_enabledData.UserBoth.client1.debugVarId,{boolVal := true});
  t_guard.start( 0.15 );
  t_guard.timeout;
  f_LoggingDS_checkEnabledStates();
  //CT on client level ----
  //Disable component type log 4 UserBoth on client1
  f_EPTF_Var_adjustContent(v_LoggingDS_enabledData.UserBoth.client1.globalVarId,{boolVal := false});
  t_guard.start( 0.15 );
  t_guard.timeout;
  f_LoggingDS_checkEnabledStates(pl_userBothDebug := false, pl_userBothInfo := false);
  //Set back
  f_EPTF_Var_adjustContent(v_LoggingDS_enabledData.UserBoth.client1.globalVarId,{boolVal := true});
  t_guard.start( 0.15 );
  t_guard.timeout;
  f_LoggingDS_checkEnabledStates();
  //Client level ----
  f_EPTF_Var_adjustContent(v_LoggingDS_enabledData.client1VarId,{boolVal := false});
  t_guard.start( 0.15 );
  t_guard.timeout;
  f_LoggingDS_checkEnabledStates(false,false,false,false);
  //Set back
  f_EPTF_Var_adjustContent(v_LoggingDS_enabledData.client1VarId,{boolVal := true});
  t_guard.start( 0.15 );
  t_guard.timeout;
  f_LoggingDS_checkEnabledStates();

  //Server side data sources
  //Class of CT level. ----
  f_EPTF_Var_adjustContent(v_LoggingDS_enabledData.UserBoth.global.debugVarId,{boolVal := false});
  t_guard.start( 0.15 );
  t_guard.timeout;
  f_LoggingDS_checkEnabledStates(pl_userBothDebug := false);
  f_EPTF_Var_adjustContent(v_LoggingDS_enabledData.UserBoth.global.debugVarId,{boolVal := true});
  t_guard.start( 0.15 );
  t_guard.timeout;
  f_LoggingDS_checkEnabledStates();
  //Class level. ----
  f_EPTF_Var_adjustContent(v_LoggingDS_enabledData.UserBoth.global.globalVarId,{boolVal := false});
  t_guard.start( 0.15 );
  t_guard.timeout;
  f_LoggingDS_checkEnabledStates(pl_userBothDebug := false, pl_userBothInfo := false);
  f_EPTF_Var_adjustContent(v_LoggingDS_enabledData.UserBoth.global.globalVarId,{boolVal := true});
  t_guard.start( 0.15 );
  t_guard.timeout;
  f_LoggingDS_checkEnabledStates();
  //Global
  f_EPTF_Var_adjustContent(v_LoggingDS_enabledData.globalVarId,{boolVal := false});
  t_guard.start( 0.15 );
  t_guard.timeout;
  f_LoggingDS_checkEnabledStates(false,false,false,false);
  f_EPTF_Var_adjustContent(v_LoggingDS_enabledData.globalVarId,{boolVal := true});
  t_guard.start( 0.15 );
  t_guard.timeout;
  f_LoggingDS_checkEnabledStates();

  f_EPTF_Base_stop(pass);
}

private function f_LoggingDS_checkEnabledStates(
  boolean pl_userBothDebug := true,
  boolean pl_userBothInfo := true,
  boolean pl_cllBothDebug := true,
  boolean pl_cllBothInfo := true
)
runs on LoggingDS_Test_CT{
  var LoggingDS_EnabledStates vl_states;
  f_LoggingDS_getEnabled(vl_states);
  var template LoggingDS_EnabledStates tl_expectedStates := {pl_userBothDebug,pl_userBothInfo,pl_cllBothDebug,pl_cllBothInfo};
  if(not match ( vl_states, tl_expectedStates )){
    setverdict ( fail, log2str(match ( vl_states, tl_expectedStates )) );
    log("Expected: ",tl_expectedStates);
    log("Received: ",vl_states);
    f_EPTF_Base_stopAll(fail);
  }
}


private function f_LoggingDS_getEnabled(out LoggingDS_EnabledStates pl_states)
runs on LoggingDS_Test_CT{
  pl_states.cllBothDebug := f_EPTF_Logging_isEnabled(v_LoggingDS_logTypeIdCLLBoth, c_logClassDebug)
  pl_states.cllBothInfo := f_EPTF_Logging_isEnabled(v_LoggingDS_logTypeIdCLLBoth, c_logClassInfo)
  pl_states.userBothDebug := f_EPTF_Logging_isEnabled(v_LoggingDS_logTypeIdUserBoth, c_logClassDebug)
  pl_states.userBothInfo := f_EPTF_Logging_isEnabled(v_LoggingDS_logTypeIdUserBoth, c_logClassInfo)
}

private function f_LoggingDS_getDataVar(
  in charstring pl_source,
  in charstring pl_ptcName := "",
  in charstring pl_element,
  in EPTF_DataSource_Params pl_params := {},
  in EPTF_Var_SubscriptionMode pl_subscriptionMode := tsp_EPTF_DataSource_subscriptionMode,
  in integer pl_refreshRate := tsp_EPTF_DataSource_refreshRate
) runs on LoggingDS_Test_CT return integer {
  var integer vl_ret := -1;
  var charstring vl_dataVarName;
  if(0 == f_EPTF_DataSource_getData(vl_dataVarName, pl_source, pl_ptcName, pl_element, pl_params, pl_subscriptionMode, pl_refreshRate)){
    vl_ret := f_EPTF_Var_getId(vl_dataVarName);
  }
  return vl_ret;
}

private function f_LoggingDS_getVar(
  out integer pl_varId,
  in charstring pl_source,
  in charstring pl_element,
  in EPTF_DataSource_Params pl_params := {},
  in charstring pl_ptcName := "")
runs on LoggingDS_Test_CT{
  
  pl_varId := f_LoggingDS_getDataVar(pl_source, pl_ptcName, pl_element, pl_params, realtime);
  if(0 > pl_varId){
    setverdict ( fail, "DS variable for "&pl_element&" not found! Params: ",pl_params );
    f_EPTF_Base_stopAll(fail);
  }
}

private function f_LoggingDS_checkIteratorContent(
  in integer pl_varId,
  in EPTF_CharstringList pl_expected,
  in charstring pl_iteratorName,
  in EPTF_DataSource_Params pl_params := {})
runs on LoggingDS_Test_CT{
  var EPTF_CharstringList vl_temp :=
  f_EPTF_Var_getCharstringlistValue(pl_varId);
  if(not match ( vl_temp, pl_expected )){
    setverdict ( fail, "Content of iterator "&pl_iteratorName&" does not match:",match( vl_temp, pl_expected ),"\n Parameters: ",pl_params );
    f_EPTF_Base_stopAll(fail);
  }
}

private function f_LoggingDS_getVarIds(
  inout LoggingDS_EnabledVarIdsClasses pl_tree,
  in charstring pl_client,
  in charstring pl_type,
  in boolean pl_short)
runs on LoggingDS_Test_CT{
  //action("Client: ",pl_client,", Type: ",pl_type);
  var charstring vl_source := c_LoggingServer_sourceId
  if("" != pl_client){
    vl_source := c_LoggingClient_sourceId;
  }
  var EPTF_DataSource_Params vl_params := {{c_LoggingServer_paramNameComponentType,pl_type}}
  f_LoggingDS_getVar(pl_tree.globalVarId,
    vl_source,
    c_LoggingServer_dataElementLogEnabled,
    vl_params,
    pl_client
  );
  //Classes
  vl_params[1] := {c_LoggingServer_paramNameClass,c_logmaskDebug};
  f_LoggingDS_getVar(pl_tree.debugVarId,
    vl_source,
    c_LoggingServer_dataElementLogEnabled,
    vl_params,
    pl_client
  );
  if(not pl_short){
    vl_params[1] := {c_LoggingServer_paramNameClass,c_logmaskDebugVerbose};
    f_LoggingDS_getVar(pl_tree.verboseVarId,
      vl_source,
      c_LoggingServer_dataElementLogEnabled,
      vl_params,
      pl_client
    );
  }
  vl_params[1] := {c_LoggingServer_paramNameClass,c_logmaskInfo};
  f_LoggingDS_getVar(pl_tree.infoVarId,
    vl_source,
    c_LoggingServer_dataElementLogEnabled,
    vl_params,
    pl_client
  );
}

group negative{
  type component LoggingDS_Test_Neg_CT extends LoggingDS_Test_CT, EPTF_LoggingServer_CT{
    var charstring v_LoggingDS_expectedWarningMsg;
    var boolean v_LoggingDS_expectedWarningReceived := false;
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_LoggingDS_Test_Neg
  // 
  //  Purpose:
  //    Initializes a configuration similar to the described in
  //    <tc_LoggingDS_elements>, except that the logging sever is on the
  //    MTC, just as the first client and the DataSource server.
  //    If someone tries to get an iterator or external data element with
  //    invalid parameters, the DataSource clients must write a warning
  //    which contains the name of the invalid parameter, and the name of
  //    the element to be get.
  //    The test 
  //    - registers a preamble function for the logging: <f_LoggingDS_Test_Neg_preambleFn>
  //    - registers a cleanup function, which checks the flag set by the <f_LoggingDS_Test_Neg_preambleFn>
  //    - tries to retrieve an iterator or external data element
  //      specified by the parameters
  //    - the cleanup sets the verdict according the flag
  //    
  ///////////////////////////////////////////////////////////
  private function f_LoggingDS_Test_Neg(
    in charstring pl_expectedMsg,
    in charstring pl_source,
    in charstring pl_element,
    in EPTF_DataSource_Params pl_params := {},
    in charstring pl_ptcName := ""
  )
  runs on LoggingDS_Test_Neg_CT{
    f_LoggingDSNeg_initConfig();
    f_EPTF_Base_registerCleanup(refers(f_LoggingDS_Test_Neg_cleanup));
    f_EPTF_Logging_registerPreambleFn(refers( f_LoggingDS_Test_Neg_preambleFn ));
    v_LoggingDS_expectedWarningMsg := pl_expectedMsg&pl_element&"*";
    var integer vl_varId := f_LoggingDS_getDataVar(pl_source, pl_ptcName, pl_element, pl_params);
    if(-1 != vl_varId){
      setverdict(fail,"DataSource '"&pl_source&" should return -1 for variable of pl_element. It returned "&int2str(vl_varId)&", the id of "&f_EPTF_Var_getName(vl_varId));
    }
    f_EPTF_Base_stopAll(pass);
  }

  private function f_LoggingDS_Test_Neg_cleanup() runs on LoggingDS_Test_Neg_CT{
    if(not v_LoggingDS_expectedWarningReceived){
      setverdict(fail,"Expected '"&v_LoggingDS_expectedWarningMsg&"' message not received.")
    }
  }

  ///////////////////////////////////////////////////////////
  //  Function: f_LoggingDS_Test_Neg_preambleFn
  // 
  //  Purpose:
  //    Matches the received log statement with an expected one.
  //    If matched, sets a flag to true.
  // 
  ///////////////////////////////////////////////////////////
  private function f_LoggingDS_Test_Neg_preambleFn(in charstring pl_message)
  runs on LoggingDS_Test_Neg_CT {
    if (not match(pl_message,pattern "*Warning*")) {
      return;
    }
    if (match(pl_message,pattern v_LoggingDS_expectedWarningMsg)) {
      v_LoggingDS_expectedWarningReceived := true;
    }
  }

  //-------------------
  //Server side iterators
  //-------------------
  ///////////////////////////////////////////////////////////
  //  Testcase: tc_LoggingDS_iterators_badElem
  // 
  //  Purpose:
  //    Tries to get an invalid element.
  //    See also: <f_LoggingDS_Test_Neg>
  //    
  ///////////////////////////////////////////////////////////
  testcase tc_LoggingDS_iterators_badElem() runs on LoggingDS_Test_Neg_CT{
    f_LoggingDS_Test_Neg(
      "*",
      c_LoggingServer_sourceId,
      "bubu",
      {{"malacka","mikkamakka"}});
  }

  ///////////////////////////////////////////////////////////
  //  Testcase: tc_LoggingDS_iteratorSelectionTypes
  // 
  //  Purpose:
  //    SelectionTypes iterator has no parameters. Tests with
  //    an invalid parameter.
  //    See also: <f_LoggingDS_Test_Neg>
  //    
  ///////////////////////////////////////////////////////////
  testcase tc_LoggingDS_iteratorSelectionTypes_badParam() runs on LoggingDS_Test_Neg_CT{
    f_LoggingDS_Test_Neg(
      "*bubu*",
      c_LoggingServer_sourceId,
      c_LoggingServer_iteratorSelectionTypes,
      {{"bubu","mikkamakka"}});
  }

  ///////////////////////////////////////////////////////////
  //  Testcase: tc_LoggingDS_Clients_badParamName
  // 
  //  Purpose:
  //    Clients iterator has an optional parameter, <c_LoggingServer_paramNameComponentType>.
  //    This test checks with invalid parameter name.
  //    See also: <f_LoggingDS_Test_Neg>
  //    
  ///////////////////////////////////////////////////////////
  testcase tc_LoggingDS_Clients_badParamName() runs on LoggingDS_Test_Neg_CT{
    f_LoggingDS_Test_Neg(
      "*bubu*",
      c_LoggingServer_sourceId,
      c_LoggingServer_iteratorSelectionTypes,
      {{"bubu",c_ctypeCLLBoth}});
  }

  ///////////////////////////////////////////////////////////
  //  Testcase: tc_LoggingDS_Clients_badParamContent
  // 
  //  Purpose:
  //    Clients iterator has an optional parameter, <c_LoggingServer_paramNameComponentType>.
  //    This test checks with invalid component type name parameter.
  //    See also: <f_LoggingDS_Test_Neg>
  //    
  ///////////////////////////////////////////////////////////
  testcase tc_LoggingDS_Clients_badParamContent() runs on LoggingDS_Test_Neg_CT{
    f_LoggingDS_Test_Neg(
      "*bubu*",
      c_LoggingServer_sourceId,
      c_LoggingServer_iteratorClients,
      {{c_LoggingServer_paramNameComponentType,"bubu"}})
  }

  ///////////////////////////////////////////////////////////
  //  Testcase: tc_LoggingDS_ComponentTypes_badParamName
  // 
  //  Purpose:
  //    ComponentTypes iterator has a mandatory parameter, <paramNameSelection>.
  //    This test checks with invalid parameter name.
  //    See also: <f_LoggingDS_Test_Neg>
  //    
  ///////////////////////////////////////////////////////////
  testcase tc_LoggingDS_ComponentTypes_badParamName() runs on LoggingDS_Test_Neg_CT{
    f_LoggingDS_Test_Neg(
      "*bubu*",
      c_LoggingServer_sourceId,
      c_LoggingServer_iteratorComponentTypes,
      {{"bubu","mikkamakka"}})
  }

  ///////////////////////////////////////////////////////////
  //  Testcase: tc_LoggingDS_ComponentTypes_badParamContent
  // 
  //  Purpose:
  //    ComponentTypes iterator has a mandatory parameter, <paramNameSelection>.
  //    This test checks with invalid parameter content.
  //    See also: <f_LoggingDS_Test_Neg>
  //    
  ///////////////////////////////////////////////////////////
  testcase tc_LoggingDS_ComponentTypes_badParamContent() runs on LoggingDS_Test_Neg_CT{
    f_LoggingDS_Test_Neg(
      "*bubu*",
      c_LoggingServer_sourceId,
      c_LoggingServer_iteratorComponentTypes,
      {{c_LoggingServer_paramNameSelection,"bubu"}})
  }

  ///////////////////////////////////////////////////////////
  //  Testcase: tc_LoggingDS_ComponentTypes_noParam
  // 
  //  Purpose:
  //    ComponentTypes iterator has a mandatory parameter, <paramNameSelection>.
  //    This test checks without parameter.
  //    See also: <f_LoggingDS_Test_Neg>
  //    
  ///////////////////////////////////////////////////////////
  testcase tc_LoggingDS_ComponentTypes_noParam() runs on LoggingDS_Test_Neg_CT{
    f_LoggingDS_Test_Neg(
      "*mpty*",
      c_LoggingServer_sourceId,
      c_LoggingServer_iteratorComponentTypes,
      {})
  }

  ///////////////////////////////////////////////////////////
  //  Testcase: tc_LoggingDS_Classes_noParam
  // 
  //  Purpose:
  //    ComponentTypes iterator has a mandatory parameter, <c_LoggingServer_paramNameComponentType>.
  //    This test checks without parameter.
  //    See also: <f_LoggingDS_Test_Neg>
  //    
  ///////////////////////////////////////////////////////////
  testcase tc_LoggingDS_Classes_noParam() runs on LoggingDS_Test_Neg_CT{
    f_LoggingDS_Test_Neg(
      "*mpty*",
      c_LoggingServer_sourceId,
      c_LoggingServer_iteratorClasses,
      {})
  }

  ///////////////////////////////////////////////////////////
  //  Testcase: tc_LoggingDS_Classes_badParamContent
  // 
  //  Purpose:
  //    ComponentTypes iterator has a mandatory parameter, <c_LoggingServer_paramNameComponentType>.
  //    This test checks with invalid parameter content.
  //    See also: <f_LoggingDS_Test_Neg>
  //    
  ///////////////////////////////////////////////////////////
  testcase tc_LoggingDS_Classes_badParamContent() runs on LoggingDS_Test_Neg_CT{
    f_LoggingDS_Test_Neg(
      "*bubu*",
      c_LoggingServer_sourceId,
      c_LoggingServer_iteratorClasses,
      {{c_LoggingServer_paramNameComponentType,"bubu"}})
  }

  //Server side c_LoggingServer_dataElementLogEnabled

  ///////////////////////////////////////////////////////////
  //  Testcase: tc_LoggingDS_Enabled_badCTypeName
  // 
  //  Purpose:
  //    Tests retrieving the LogEnabled data element if the <c_LoggingServer_paramNameComponentType>
  //    has an invalid content.
  //    See also: <f_LoggingDS_Test_Neg>, <c_LoggingServer_dataElementLogEnabled>
  //    
  ///////////////////////////////////////////////////////////
  testcase tc_LoggingDS_Enabled_badCTypeName() runs on LoggingDS_Test_Neg_CT{
    f_LoggingDS_Test_Neg(
      "*bubu*",
      c_LoggingServer_sourceId,
      c_LoggingServer_dataElementLogEnabled,
      {
        {c_LoggingServer_paramNameComponentType,"bubu"},
        {c_LoggingServer_paramNameClass,c_logmaskDebug}
      })
  }

  ///////////////////////////////////////////////////////////
  //  Testcase: tc_LoggingDS_Enabled_badClassName
  // 
  //  Purpose:
  //    Tests retrieving the LogEnabled data element if the <c_LoggingServer_paramNameClass>
  //    has an invalid content.
  //    See also: <f_LoggingDS_Test_Neg>, <c_LoggingServer_dataElementLogEnabled>
  //    
  ///////////////////////////////////////////////////////////
  testcase tc_LoggingDS_Enabled_badClassName() runs on LoggingDS_Test_Neg_CT{
    f_LoggingDS_Test_Neg(
      "*"&c_logmaskDebugVerbose&"*",
      c_LoggingServer_sourceId,
      c_LoggingServer_dataElementLogEnabled,
      {
        {c_LoggingServer_paramNameComponentType,c_ctypeCLLSecond},
        {c_LoggingServer_paramNameClass,c_logmaskDebugVerbose}
      })
  }

  ///////////////////////////////////////////////////////////
  //  Testcase: tc_LoggingDS_Enabled_noCType
  // 
  //  Purpose:
  //    Tests retrieving the LogEnabled data element if the <c_LoggingServer_paramNameClass>
  //    is set, but c_LoggingServer_paramNameComponentType is not.
  //    See also: <f_LoggingDS_Test_Neg>, <c_LoggingServer_dataElementLogEnabled>
  //    
  ///////////////////////////////////////////////////////////
  testcase tc_LoggingDS_Enabled_noCType() runs on LoggingDS_Test_Neg_CT{
    f_LoggingDS_Test_Neg(
      "*"&c_LoggingServer_paramNameComponentType&"*",
      c_LoggingServer_sourceId,
      c_LoggingServer_dataElementLogEnabled,
      {
        {c_LoggingServer_paramNameClass,c_ctypeCLLBoth}
      })
  }
  //Client side c_LoggingClient_dataElementLogEnabled
  ///////////////////////////////////////////////////////////
  //  Testcase: tc_LoggingDS_ClientEnabled_badCTypeName
  // 
  //  Purpose:
  //    Tests retrieving the LogEnabled data element if the <c_LoggingServer_paramNameComponentType>
  //    has an invalid content.
  //    See also: <f_LoggingDS_Test_Neg>, <c_LoggingServer_dataElementLogEnabled>
  //    
  ///////////////////////////////////////////////////////////
  testcase tc_LoggingDS_ClientEnabled_badCTypeName() runs on LoggingDS_Test_Neg_CT{
    f_LoggingDS_Test_Neg(
      "*bubu*",
      c_LoggingClient_sourceId,
      c_LoggingClient_dataElementLogEnabled,
      {
        {c_LoggingClient_paramNameComponentType,"bubu"},
        {c_LoggingClient_paramNameClass,c_logmaskDebug}
      },
      c_clientName1)
  }

  ///////////////////////////////////////////////////////////
  //  Testcase: tc_LoggingDS_ClientEnabled_badClassName
  // 
  //  Purpose:
  //    Tests retrieving the LogEnabled data element if the <c_LoggingClient_paramNameClass>
  //    has an invalid content.
  //    See also: <f_LoggingDS_Test_Neg>, <c_LoggingClient_dataElementLogEnabled>
  //    
  ///////////////////////////////////////////////////////////
  testcase tc_LoggingDS_ClientEnabled_badClassName() runs on LoggingDS_Test_Neg_CT{
    f_LoggingDS_Test_Neg(
      "*"&c_logmaskDebugVerbose&"*",
      c_LoggingClient_sourceId,
      c_LoggingClient_dataElementLogEnabled,
      {
        {c_LoggingClient_paramNameComponentType,c_ctypeUserBoth},
        {c_LoggingClient_paramNameClass,c_logmaskDebugVerbose}
      },
      c_clientName1)
  }

  ///////////////////////////////////////////////////////////
  //  Testcase: tc_LoggingDS_ClientEnabled_noCType
  // 
  //  Purpose:
  //    Tests retrieving the LogEnabled data element if the <c_LoggingClient_paramNameClass>
  //    is set, but c_LoggingClient_paramNameComponentType is not.
  //    See also: <f_LoggingDS_Test_Neg>, <c_LoggingClient_dataElementLogEnabled>
  //    
  ///////////////////////////////////////////////////////////
  testcase tc_LoggingDS_ClientEnabled_noCType() runs on LoggingDS_Test_Neg_CT{
    f_LoggingDS_Test_Neg(
      "*"&c_LoggingClient_paramNameComponentType&"*",
      c_LoggingClient_sourceId,
      c_LoggingClient_dataElementLogEnabled,
      {
        {c_LoggingClient_paramNameClass,c_ctypeCLLBoth}
      },
      c_clientName1)
  }
}

group Help {
    
  type component Logging_HelpTest_CT extends LoggingDS_Test_CT {
    var boolean v_Logging_ready := false;
    var boolean v_LoggingClient_ready := false;
  }
  
  function f_EPTF_Logging_Test_checkLoggingReady(
    in charstring pl_source,
    in charstring pl_ptcName
  ) runs on  Logging_HelpTest_CT {
    if (pl_source == c_LoggingServer_sourceId) {
      v_Logging_ready := true;
    }
    if (pl_source == c_LoggingClient_sourceId) {
      v_LoggingClient_ready := true;
    }
  }
  
  function f_EPTF_Logging_Test_helpCheck(in charstring pl_source := "", in charstring pl_element := "", in charstring pl_expectedPattern := "") runs on Logging_HelpTest_CT {
    var charstring vl_helpTEXT;
    var octetstring vl_helpJSON;
    vl_helpTEXT := f_EPTF_DataSource_getHelpTEXT(pl_source, pl_element);
    action("Help for "&pl_source&": ", vl_helpTEXT);
    if (pl_expectedPattern!="") {
      // check if the TEXT help contains the pattern:
      if(not match(vl_helpTEXT,pattern pl_expectedPattern)) {
        setverdict(fail,"The TEXT help does not match the expected pattern: ", match(vl_helpTEXT,pattern pl_expectedPattern));
        f_EPTF_Base_stop(none);
      }
    }

    vl_helpJSON := f_EPTF_DataSource_getHelpJSON(pl_source,pl_element);
    action("HelpJSON for "&pl_source&": ", vl_helpJSON);
  }
  
  testcase tc_EPTF_Logging_Test_help() runs on Logging_HelpTest_CT {
    f_EPTF_DataSource_init_CT("MTC");
    v_Logging_ready := false;
    v_LoggingClient_ready := false;
    f_EPTF_DataSource_registerReadyCallback(refers(f_EPTF_Logging_Test_checkLoggingReady));

    f_LoggingDS_init();
    f_LoggingDS_createClient2(false);
    timer t1;
    t1.start(2.0);
    t1.timeout;

/*    timer T_guard, T_alt;
    T_guard.start( 100.0 );
    T_alt.start( 0.0 );
    alt{
      [] T_guard.timeout{
        setverdict(fail,"Timeout during config");
        f_EPTF_Base_stopAll();
      }
      [v_Logging_ready and v_LoggingClient_ready] T_alt.timeout{}
    };*/
    
    // Logging
    f_EPTF_Logging_Test_helpCheck(pl_source := c_LoggingServer_sourceId,pl_expectedPattern := "*Source: \""&c_LoggingServer_sourceId&"\"\n\n*DataElement: \"help\"*")


    // LoggingClient:
    f_EPTF_Logging_Test_helpCheck(pl_source := c_LoggingClient_sourceId,pl_expectedPattern := "*Source: \""&c_LoggingClient_sourceId&"\"\n\n*DataElement: \"help\"*")

    setverdict(pass);
    f_EPTF_Base_stop(none);
    
  }
  
} //group Help


control{
  execute(tc_LoggingDS_elements());
  execute(tc_LoggingDS_iterators_badElem());
  execute(tc_LoggingDS_iteratorSelectionTypes_badParam());
  execute(tc_LoggingDS_Clients_badParamName());
  execute(tc_LoggingDS_Clients_badParamContent());
  execute(tc_LoggingDS_ComponentTypes_badParamName());
  execute(tc_LoggingDS_ComponentTypes_badParamContent());
  execute(tc_LoggingDS_ComponentTypes_noParam());
  execute(tc_LoggingDS_Classes_noParam());
  execute(tc_LoggingDS_Classes_badParamContent());
  execute(tc_LoggingDS_Enabled_badCTypeName());
  execute(tc_LoggingDS_Enabled_badClassName());
  execute(tc_LoggingDS_Enabled_noCType());
  execute(tc_LoggingDS_ClientEnabled_badCTypeName());
  execute(tc_LoggingDS_ClientEnabled_badClassName());
  execute(tc_LoggingDS_ClientEnabled_noCType());
  execute(tc_EPTF_Logging_Test_help());
}
}  // end of module
