///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2018 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:     XTDP_OldTestPortDemoAndTest_Common.ttcn
//  Rev:      <RnXnn>
//  Prodnr:   CNL 11
//  Updated:  2010-03-09
//  Contact:  http://ttcn.ericsson.se
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////
//  Module: XTDP_OldTestPortDemoAndTest_Common
// 
//  Purpose:
//    This module provides 
// 
//  Module depends on:
//    -
// 
//  Current Owner:
//    
// 
//  Last Review Date:
//    -
//
///////////////////////////////////////////////////////////////
module XTDP_OldTestPortDemoAndTest_Common
{
import from XTDP_EncDecFunctions all
//import from www_mozilla_org_keymaster_gatekeeper_there_is_only_xul all;
//import from ttcn_ericsson_se_xtdp_xtdp_1_0 all
//import from ttcn_ericsson_se_xtdp_xul_1_0 all
import from NoTargetNamespace all;
import from IPL4asp_PortType all;
import from IPL4asp_Types all;
//import from IPL4asp_Functions all;
import from XTDP_Templates all;
//import from TCCDateTime_Functions all;


modulepar boolean tsp_debug_GuiTest :=false; //from XTDP_TP:RunTimeGuiTest.ttcn
modulepar boolean tsp_debugVerbose_GuiTest :=false;//from XTDP_TP:RunTimeGuiTest.ttcn
modulepar integer tsp_callGrpsNo := 80;//from XTDP_TP:RunTimeGuiTest.ttcn
modulepar integer  tsp_sigLinksNo := 80//from XTDP_TP:RunTimeGuiTest.ttcn
modulepar float tsp_guard_timer := 30.0

type record of integer IntegerList;
type record of default DefaultList;
type component MTC {
  port IPL4asp_PT IPL4;
  var integer v_reqId := 1;
  var integer v_plainRequest:= 0;
  var IntegerList xtdp_connection_list := {};
  var DefaultList xtdp_connection_defaultlist := {}
  var XTDP_Message xtdp_message;
  var ASP_Event ipl4_event;
  var template integer newConnId := ?
  
}
function f_getNextReqId() runs on MTC return integer {
  var integer vl_retVal := v_reqId;
  v_reqId := v_reqId+1;
  return vl_retVal;
}
modulepar charstring tsp_xtdp_connectTo_addr := "172.31.21.49";
modulepar integer    tsp_xtdp_connectTo_port := 11420;
modulepar charstring tsp_xtdp_listenAt_addr := "159.107.148.181";
modulepar integer    tsp_xtdp_listenAt_port := 11420;

template ASP_RecvFrom t_recvfrom(template integer pl_connId) := {
  connId := pl_connId,
  remName := ?,
  remPort := ?,
  locName := ?,
  locPort := ?,
  proto := ?,
  userData := ?,
  msg := ?
}

template ASP_Event t_res(template integer pl_connId)  := {
  result := {
    errorCode := *,
    connId := pl_connId,
    os_error_code := *,
    os_error_text := *}
}

template ASP_Event t_open(template integer pl_connId)  := {
  connOpened := {
    connId := pl_connId,
    remName := ?,
    remPort := ?,
    locName := ?,
    locPort := ?,
    proto :=?,
    userData :=?
    
  }
}

template ASP_Event t_sctpEvent := {
  sctpEvent := ?
}

template ASP_Event t_close(template integer pl_connId) := {
  connClosed := {
    connId := pl_connId,
    remName := ?,
    remPort := ?,
    locName := ?,
    locPort := ?,
    proto :=?,
    userData :=?
    
  }
}

function f_connectToServerGui(in charstring pl_addr, in integer pl_port) 
runs on MTC return integer //connId
{
  var integer vl_connId;
  //map
  map(self:IPL4, system:IPL4);
  //connect to GUI
  var Result result:= IPL4asp_PortType.f_IPL4_connect(
    IPL4, 
    pl_addr, pl_port, 
    c_ipv4AnyAddr, c_anyPort, 
    vl_connId, {tcp := {}})
  if (ispresent(result.errorCode)) {
    log("Connection failed: ",result.errorCode);
    setverdict(fail);
    stop;
  }
  log("Connection open: ",result);
  setverdict(pass);
  vl_connId:= result.connId
  
  //register message dissector for receiving
  var f_IPL4_getMsgLen fcb_msglen := refers(f_XTDP_getMsgLen);
  f_IPL4_setGetMsgLen(IPL4, vl_connId, fcb_msglen, {})
  
  return vl_connId;
}

function f_listenForClientGui(in charstring pl_addr, in integer pl_port) 
runs on MTC return integer //server connId
{
  var integer vl_connId;
  //map
  map(self:IPL4, system:IPL4);
  //connect to GUI
  var Result result:= IPL4asp_PortType.f_IPL4_listen(
    portRef:= IPL4, 
    locName:= pl_addr, 
    locPort:= pl_port, 
    proto:= {tcp := {}}, 
    options:= {
      //   {reuseAddress := {enable:=true}}, 
      //   {tcpKeepAlive := {    
      //       /*boolean*/ enable := true /*optional*/,
      //       /*integer*/ count := omit /*optional*/,
      //       /*integer*/ idle :=omit /*optional*/,
      //       /*integer*/ interval := omit /*optional*/
      //     }}
    }
  ) //open listen port
  if (ispresent(result.errorCode)) {
    log("Listening failed: ",result);
    setverdict(fail);
    stop;
  }
  log("Listening started, result: ",result);
  setverdict(pass);
  vl_connId:= result.connId
  //register message dissector for receiving
  var f_IPL4_getMsgLen fcb_msglen := refers(f_XTDP_getMsgLen);
  f_IPL4_setGetMsgLen(IPL4, vl_connId, fcb_msglen, {})
  
  
  return vl_connId;
}

function f_sayBye(in integer pl_connId) 
runs on MTC  //connId
{
  //say Bye
  var octetstring vl_msgOct :=  enc_XTDP_Message(XTDP_Message:{
      noNamespaceSchemaLocation := "XTDP-Message.xsd",
      choice := {
        xTDP_Bye := "Normal end."
      }
    })
  var ASP_Send asp := {
    connId := pl_connId,
    proto := omit,      
    msg := int2oct(lengthof(vl_msgOct)+4,4) & vl_msgOct
  };
  IPL4.send(asp);
  
  timer t := 5.0; t.start; t.timeout;
  var ASP_Event vl_ipl4Event;
  var XTDP_Message xtdpMsg;
  var integer vl_result := -1;
  var template integer vl_conn := pl_connId
  t.start
  alt {
    []as_result(vl_conn, t, vl_ipl4Event) {
      if(vl_ipl4Event.result.os_error_code == 104) {
        log("The GUI reset the connection");
      }
      if (ispresent(vl_ipl4Event.result.errorCode)) {
        log(%definitionId, ": Port error, giving up: ", vl_ipl4Event.result);
        t.stop;
      } else {
        repeat;
      }
    }
    []as_connClose(t, vl_conn) {
      log("The GUI closed the connection. I also exit.");
      t.stop;
    }
    []as_recvFrom4Test(vl_conn, t, vl_result, xtdpMsg) {
      // as_recvFrom4Test will log the message
      t.stop; t.start; repeat;
    }
    [] t.timeout {
      log(%definitionId, ": Timeout waiting for answer");
    }
  }
}

function f_close(in integer pl_connId) 
runs on MTC  //connId
{
  var Result result:= IPL4asp_PortType.f_IPL4_close(IPL4, pl_connId, {tcp := {}})
  if (ispresent(result.errorCode)) {
    log("Closing failed: ",result.errorCode);
    setverdict(fail);
    stop;
  }
  log("Connection closed: ",result);
  setverdict(pass);
}

function f_sayByeAndCloseWithStop(in integer pl_connId) 
runs on MTC  //connId
{
  //say Bye
  f_sayBye(pl_connId);
  
  //close
  f_close(pl_connId)
  
  //unmap
  unmap(self:IPL4, system:IPL4);
  stop;
}


function f_send(
  in integer pl_connId,
  in template XTDP_Message pl_msg
) runs on MTC {
  if (ischosen(pl_msg.choice.xTDP_Requests)) {v_plainRequest := v_plainRequest+1}
  var octetstring vl_msgOct :=  enc_XTDP_Message(valueof(pl_msg))
  var ASP_Send asp := {
    connId := pl_connId,
    proto := omit,      
    msg := int2oct(lengthof(vl_msgOct)+4,4) & vl_msgOct
  };
  IPL4.send(asp);
}
altstep get_xtdp_message(template integer pl_connId) runs on MTC {
  //var ASP_XTDP xtdp_asp;
  //var integer vl_length := 0, vl_row, vl_column;
  var charstring vl_cell, vl_rowstr, vl_columnstr, widgetRoot;
  
  var ASP_RecvFrom vl_recv;
  var ASP_Event vl_event;
  var XTDP_Message vl_msg;
  [] IPL4.receive(t_recvfrom(pl_connId)) -> value vl_recv {
    log("Communication ASP received: ",vl_recv)
    setverdict(pass);
    var integer vl_result:= dec_XTDP_Message(f_XTDP_getRawMsg(vl_recv.msg), vl_msg);
    if (vl_result ==0 ) {
      log("Decoded msg:", vl_msg, " result:", vl_result)         
      setverdict(pass);
    } else {
      log("Unsuccesful decode:", vl_msg, " result:", vl_result)         
      setverdict(fail);
    }
    select( vl_msg )
    {
      case ( t_singleSuccessResp(?) )
      {
        if (tsp_debug_GuiTest) {
          log("GUI reported success for request #", vl_msg.choice.xTDP_Responses.xTDP_Response_list[0].requestId);
        }
        repeat;
      }
      case ( t_singleErrorResp(pl_rqId:=?, pl_argument:=*, pl_errorSource:=?, pl_errorCode:=?, pl_errorMessage:=?) )
      {
        if (tsp_debug_GuiTest) {
          log("GUI reported error for request #", vl_msg.choice.xTDP_Responses.xTDP_Response_list[0].requestId);
        }
        repeat;
      }
      case ( t_snapshotButtonPressed(pl_rqId:=?, pl_wtype:=string, pl_argument:=?, pl_timeout:=*) )
      {
        //f_sendSnapshot();      
        
        if (tsp_debug_GuiTest) {action("Snapshot button pressed...")};
        repeat;
      }
      case else
      {
        log("GUI reported:", vl_msg);
        if (tsp_debug_GuiTest) {action("GUI message is not handled here :-(");};
      }
    }
    repeat; 
  }  
}

altstep as_recvFrom(inout template integer pl_listenConnId, timer pl_Tguard, out integer pl_result) runs on MTC{
  var ASP_RecvFrom vl_recv;
  var XTDP_Message vl_msg;
  [] IPL4.receive(t_recvfrom(pl_listenConnId)) -> value vl_recv {
    pl_listenConnId := vl_recv.connId;
    pl_Tguard.stop;            
    log("Communication ASP received: ",vl_recv)
    pl_result:= dec_XTDP_Message(f_XTDP_getRawMsg(vl_recv.msg), vl_msg);
    if (pl_result ==0 ) {
      log("Decoded msg:", vl_msg, " result:", pl_result)         
      //var Window vl_window;
      //vl_result := dec_XTDL_Window(char2oct(unichar2char(vl_msg.choice.xTDP_LayoutResponse.elem)), vl_window)
    } else {
      log("Unsuccesful decode:", vl_msg, " result:", pl_result)
    }
    if(pl_result == 0 and ischosen(vl_msg.choice.xTDP_Responses)) {
      for(var integer i := 0; i < sizeof(vl_msg.choice.xTDP_Responses); i := i + 1) {
        if(vl_msg.choice.xTDP_Responses.xTDP_Response_list[i].responseCode != success) {
          log("Response #", i, " is not success!");
          setverdict(fail);
        } else {
          log("Response #", i, " is success!");
          setverdict(pass);
        }
      }
    }  
  }
}
altstep as_grokAck(inout template integer pl_listenConnId, timer pl_Tguard) runs on MTC{
  var ASP_RecvFrom vl_recv;
  var XTDP_Message vl_msg;
  var integer vl_result := -1;
  [] IPL4.receive(t_recvfrom(pl_listenConnId)) -> value vl_recv {
    pl_listenConnId := vl_recv.connId;
    pl_Tguard.stop;            
    log("Communication ASP received: ",vl_recv)
    vl_result:= dec_XTDP_Message(f_XTDP_getRawMsg(vl_recv.msg), vl_msg);
    if (vl_result ==0 ) {
      log("Decoded msg:", vl_msg, " result:", vl_result)         
      //var Window vl_window;
      //vl_result := dec_XTDL_Window(char2oct(unichar2char(vl_msg.choice.xTDP_LayoutResponse.elem)), vl_window)
    } else {
      log("Unsuccesful decode:", vl_msg, " result:", vl_result)
      setverdict(fail)
    }
    if(vl_result == 0) {
      if (ischosen(vl_msg.choice.xTDP_Responses)) {
        for(var integer i := 0; i < sizeof(vl_msg.choice.xTDP_Responses); i := i + 1) {
          if(vl_msg.choice.xTDP_Responses.xTDP_Response_list[i].responseCode != success) {
            log("Response #", i, " is not success!");
            setverdict(fail);
          } else {
            log("Response #", i, " is success!");
            setverdict(pass);
          }
        }
      } else {
        log(%definitionId, ": unhandled msg", vl_msg)
        setverdict(inconc);
      }
    }  
  }
}
altstep as_recvFrom4Test(inout template integer pl_listenConnId, timer pl_Tguard, out integer pl_result, out XTDP_Message pl_msg) runs on MTC{
  var ASP_RecvFrom vl_recv;
  [] IPL4.receive(t_recvfrom(pl_listenConnId)) -> value vl_recv {
    pl_listenConnId := vl_recv.connId;
    pl_Tguard.stop;            
    log("Communication ASP received: ",vl_recv)
    pl_result:= dec_XTDP_Message(f_XTDP_getRawMsg(vl_recv.msg), pl_msg);
    if (pl_result ==0 ) {
      log("Decoded msg:", pl_msg, " result:", pl_result)         
      //var Window vl_window;
      //vl_result := dec_XTDL_Window(char2oct(unichar2char(vl_msg.choice.xTDP_LayoutResponse.elem)), vl_window)
    } else {
      log("Unsuccesful decode:", pl_msg, " result:", pl_result)         
    }
    if(pl_result == 0 and ischosen(pl_msg.choice.xTDP_Responses)) {
      for(var integer i := 0; i < sizeof(pl_msg.choice.xTDP_Responses); i := i + 1) {
        if(pl_msg.choice.xTDP_Responses.xTDP_Response_list[i].responseCode != success) {
          log("Response #", i, " is not success!");
          setverdict(fail);
        } else {
          log("Response #", i, " is success!");
          setverdict(pass);
        }
      }
    }  
  }
}
altstep as_connOpen(timer pl_Tguard, inout template integer pl_clientConnId) runs on MTC{
  var ASP_Event vl_event;
  [] IPL4.receive(t_open(pl_clientConnId)) -> value vl_event{
    log("Event: Result ASP received:", vl_event);
    pl_Tguard.stop;
    pl_clientConnId := vl_event.connOpened.connId;
    
  }
}
altstep as_connClose(timer pl_Tguard, inout template integer pl_connId) runs on MTC{
  var ASP_Event vl_event;
  [] IPL4.receive(t_close(pl_connId)) -> value vl_event{
    log("Event: Connection closed: ",vl_event);
    pl_connId := vl_event.connClosed.connId;
    pl_Tguard.stop
  }
}

altstep as_result(inout template integer pl_listenConnId, timer pl_Tguard, out ASP_Event pl_event) runs on MTC{
  var ASP_Event vl_event;
  [] IPL4.receive(t_res(pl_listenConnId)) -> value vl_event{
    pl_listenConnId := vl_event.result.connId
    pl_event := vl_event;
    log("Event: ", vl_event)
    pl_Tguard.stop;
  }
}

altstep as_defaultSctpAndTimer(template integer pl_listenConnId, timer pl_Tguard) runs on MTC{
  var ASP_Event vl_event;
  [] IPL4.receive(t_sctpEvent) -> value vl_event {
    log("Event: SCTP event arrived: ",vl_event)
    repeat;
  }	  
  [] pl_Tguard.timeout {
    log("timeout:", pl_Tguard);
    setverdict(fail,"timeout:", pl_Tguard);
    stop
  }
}
altstep as_any(inout template integer pl_listenConnId) runs on MTC{
  var ASP_Event vl_event
  var template integer vl_conn := pl_listenConnId;
  var integer vl_result;
  timer dummy;
  [] as_result(vl_conn, dummy, vl_event) {}
  [] as_recvFrom(vl_conn, dummy, vl_result) {}
  [] IPL4.receive {
    log("Unhandled IPL4 ASP has arrived, discarded!")
  }	  
  
}
function f_wait4RecvFrom(in integer pl_connId) runs on MTC {
  timer T
  T.start(30.0);
  var integer vl_result := -1;
  var template integer vl_clientConnId := pl_connId
  alt {
    [] as_recvFrom(vl_clientConnId, T, vl_result) {
      if (vl_result==0){
        setverdict(pass)
      } else {
        setverdict(fail, "Unsuccesful XTDP decode");
      }
    }
  }
}
altstep f_wait4ConnOpened(
  inout template integer pl_serverConnId, 
  inout template integer pl_clientConnId,
  timer T
) runs on MTC {
  var ASP_Event vl_event;
  var integer vl_result;
  
  
  [] as_recvFrom(pl_serverConnId, T, vl_result){
    setverdict(fail);
  }
  
  [] as_result(pl_serverConnId, T, vl_event) {
    log("Event: Result ASP received:", vl_event);
    setverdict(fail);
    stop
  }
  []as_connOpen(T, pl_clientConnId) {
    setverdict(pass);
    T.stop;
  }
  [] as_connClose(T, pl_clientConnId) {
    setverdict(fail,"Event: Connection closed");
    stop
  }
  []as_defaultSctpAndTimer(pl_serverConnId, T){
  }  
}



}  // end of module
