TestCodec_GeoNetworking.ttcn 93.2 KB
Newer Older
garciay's avatar
garciay committed
                                                                                ) modifies mw_geoNwShbPacket := {
      commonHeader := mw_commonHeaderWithHopLimit(
garciay's avatar
garciay committed
                                                  p_nextHeader,
                                                  m_shbHeaderType,
                                                  p_hopLimit
                                                  ),
      payload := ?
      } // End of template mw_geoNwTsbPacketWithNextHeader_cam
      
garciay's avatar
garciay committed
      /**
       * @desc validate GeoNetworkingReq/Broadcast
       * @verdict Pass on success, Fail otherwise
       */
      testcase tc_GeoNet_Port_1() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
garciay's avatar
garciay committed
        var GeoNetworkingReq v_gnReq;
        var ExtendedHeader v_header;
        var boolean v_got_beacon := false;
garciay's avatar
garciay committed
        var GeoNetworkingInd v_msg;
garciay's avatar
garciay committed
        if (PX_GN_UPPER_LAYER != e_any) {
          setverdict(inconc, "PX_GN_UPPER_LAYER shall be set to e_any");
garciay's avatar
garciay committed
          stop;
        }
garciay's avatar
garciay committed
        map(self:geoNetworkingPort, system:geoNetworkingPort);
garciay's avatar
garciay committed

      v_gnReq := valueof(m_geoNwReq_linkLayerBroadcast( // Not compliant with PX_GN_UPPER_LAYER, just for test
                                                       m_geoNwPdu(
                                                                  m_geoNwBroadcastPacket(
                                                                                         m_dummyLongPosVectorNodeB, 
                                                                                         3456, 
                                                                                         m_dummyGeoBroadcastArea1
                                                                  Lifetime: {multiplier := c_defaultLifetime, ltBase := e_100s} // FIXME Looks like a TITAN bug!
        geoNetworkingPort.send(v_gnReq);
        tc_ac.start;
        alt {
          [] geoNetworkingPort.receive(
                                       mw_geoNwInd(
                                                   mw_geoNwPdu(
                                                               mw_geoNwBroadcastPacket
                                                               ))) {
            if (v_got_beacon == false) {
              v_got_beacon := true;
              setverdict(pass);
            }
          }
          [] geoNetworkingPort.receive(
                                       mw_geoNwInd(
                                                   mw_geoNwPdu(
                                                               mw_geoNwLsRequestPacket(
                                                                                       ?,
                                                                                       ?
                                                                                       )))) -> value v_msg {
            log("Receive LsRequest: ", v_msg.msgIn);
            // Send LsReply
            f_sendGeoNetMessage(
                                valueof(m_geoNwReq_linkLayerBroadcast(
                                                                      m_geoNwPdu(
                                                                                 m_geoNwLsReplyPacket(
                                                                                                      m_dummyLongPosVectorNodeA,
                                                                                                      f_longPosVector2ShortPosVector(
                                                                                                                                     valueof(v_msg.msgIn.gnPacket.packet.extendedHeader.lsRequestHeader.srcPosVector)
                                                                                                                                     ),
                                                                                                      vc_localSeqNumber
                                                                                                      )))));
            if (v_got_beacon == false) {
              v_got_beacon := true;
            }
            repeat;
          }
          [] geoNetworkingPort.receive(
                                       mw_geoNwInd(
                                                   ?
                                                   )) -> value v_msg {
            log("Receive beacon: ", v_msg.msgIn);
            setverdict(fail);
          }
          [] tc_ac.timeout {
            if (v_got_beacon == false) {
              setverdict(inconc, "Expected message not received");
            }
          }
        }
        unmap(self:geoNetworkingPort, system:geoNetworkingPort);
      } // End of testcase tc_GeoNet_Port_1
      /**
       * @desc validate GeoNetworkingReq/Broadcast
       * @verdict Pass on success, Fail otherwise
       */
      testcase tc_GeoNet_Port_2() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
        var AcGnResponse v_acGnResponse;
        var GeoNetworkingReq v_gnReq;
        var ExtendedHeader v_header;
        var boolean v_got_beacon := false; // Used with xxx_61_beacon pcap file
        var boolean v_got_shb := false; // Used with xxx_61_cam pcap file
        var LongPosVector v_longPosVectorIut;
        var GeoNetworkingInd v_msg;
        
        if (PX_GN_UPPER_LAYER != e_any) {
          setverdict(inconc, "PX_GN_UPPER_LAYER shall be set to e_any when using xxx_61_beacon and xxx_61_cam");
          stop;
        }
        
        map(self:geoNetworkingPort, system:geoNetworkingPort);
        map(self:acPort, system:acPort);
        
        // A small sleep to provide TA to read pcap file is it used
        tc_noac.start(5.0);
        alt {
          [] tc_noac.timeout {
          }
        } // end of 'alt' statement
        
        f_acTriggerEvent(m_getLongPosVector(f_getIutGnLocalAddress()));
        tc_ac.start;
        alt {
          [] acPort.receive(mw_getLongPosVectorAny(f_getIutGnLocalAddress())) -> value v_acGnResponse {
            tc_ac.stop;
            v_longPosVectorIut := v_acGnResponse.getLongPosVector;
            setverdict(pass);
          [] acPort.receive {
            tc_ac.stop;
            setverdict(fail, "GnAddress mismatch, check LibItsGeoNetworking_Pics.PICS_GN_LOCAL_GN_ADDR value in configuration file");
          }
          [] tc_ac.timeout {
            setverdict(inconc, "timeout");
          }
        } // End of 'alt' statement

        f_acTriggerEvent(m_startPassBeaconing(m_beaconHeader(v_longPosVectorIut).beaconHeader));
      v_gnReq := valueof(m_geoNwReq_linkLayerBroadcast(
                                                       m_geoNwPdu(
                                                                  m_geoNwBroadcastPacket(
                                                                                         m_dummyLongPosVectorNodeB, 
                                                                                         3456, 
                                                                                         m_dummyGeoBroadcastArea1
                                                                                         ),
                                                                  Lifetime: {multiplier := c_defaultLifetime, ltBase := e_100s} // FIXME Looks like a TITAN bug!
                                                                  )));
        geoNetworkingPort.send(v_gnReq);
        tc_ac.start;
        alt {
          [] geoNetworkingPort.receive(
                                       mw_geoNwInd(
                                                   mw_geoNwPdu(
                                                               mw_geoNwLsRequestPacket(
                                                                                       ?,
                                                                                       ?
                                                                                       )))) -> value v_msg {
            log("Receive LsRequest: ", v_msg.msgIn);
            // Send LsReply
            f_sendGeoNetMessage(
                                valueof(m_geoNwReq_linkLayerBroadcast(
                                                                      m_geoNwPdu(
                                                                                 m_geoNwLsReplyPacket(
                                                                                                      m_dummyLongPosVectorNodeA,
                                                                                                      f_longPosVector2ShortPosVector(
                                                                                                                                     valueof(v_msg.msgIn.gnPacket.packet.extendedHeader.lsRequestHeader.srcPosVector)
                                                                                                                                     ),
                                                                                                      vc_localSeqNumber
                                                                                                      )))));
            repeat;
          }
          [] geoNetworkingPort.receive(
                                       mw_geoNwInd(
                                                   mw_geoNwPdu(
                                                               mw_geoNwShbPacket_nextHeader(
                                                                                            -,
                                                                                            -,
                                                                                            e_btpA
                                                                                            )
                                                               )
                                                   )) -> value v_msg {
            log("Receive SHB packet: ", v_msg.msgIn);
            if (v_got_shb == false) {
              v_got_shb := true;
              setverdict(pass);
            }
          }
          [] geoNetworkingPort.receive(
                                       mw_geoNwInd(
                                                   mw_geoNwPdu(
                                                               mw_geoNwBeaconPacket
                                                               )
                                                   )) -> value v_msg {
            log("Receive beacon packet: ", v_msg.msgIn);
            if (v_got_beacon == false) {
              v_got_beacon := true;
              setverdict(pass);
            }
            repeat;
          }
          [] geoNetworkingPort.receive(
                                       mw_geoNwInd(
                                                   ?
                                                   )) -> value v_msg {
            log("Receive unexpected GeoNetworking message: ", v_msg.msgIn);
            setverdict(fail);
          }
          [] tc_ac.timeout {
            if ((v_got_beacon == false) and (v_got_shb == false)) {
              setverdict(inconc, "Expected messages not received");
            }
          }
        }

        f_acTriggerEvent(m_stopPassBeaconing);
        
        unmap(self:geoNetworkingPort, system:geoNetworkingPort);
        unmap(self:acPort, system:acPort);
        
      } // End of testcase tc_GeoNet_Port_2
            
      /**
       * @desc validate beaconing with secured mode set in config file
       * @verdict Pass on success, Fail otherwise
       */
      testcase tc_GeoNet_Port_3() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
        
        if (PX_GN_UPPER_LAYER != e_any) {
          setverdict(inconc, "PX_GN_UPPER_LAYER shall be set to e_any");
          stop;
        }
        
        map(self:geoNetworkingPort, system:geoNetworkingPort);

        tc_ac.start;
        alt {
          [] tc_ac.timeout {
            setverdict(pass);
          }
        }
        
        unmap(self:geoNetworkingPort, system:geoNetworkingPort);
        
      } // End of testcase tc_GeoNet_Port_3
      
      /**
       * @desc validate beaconing with secured mode set in config file
       * @verdict Pass on success, Fail otherwise
       */
      testcase tc_GeoNet_Port_4() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
        var AcGnResponse v_acGnResponse;
        var ExtendedHeader v_header;
        var LongPosVector v_longPosVectorIut;
        var GeoNetworkingInd v_msg;
        
        if (PX_GN_UPPER_LAYER != e_any) {
          setverdict(inconc, "PX_GN_UPPER_LAYER shall be set to e_any");
          stop;
        }
        
        map(self:acPort, system:acPort);
        map(self:geoNetworkingPort, system:geoNetworkingPort);

        // A small sleep to provide TA to read pcap file is it used
        tc_noac.start(1.0);
        alt {
          [] tc_noac.timeout {
          }
        } // end of 'alt' statement
        
        f_acTriggerEvent(m_getLongPosVector(f_getIutGnLocalAddress()));
        tc_ac.start;
        alt {
          [] acPort.receive(mw_getLongPosVectorAny(f_getIutGnLocalAddress())) -> value v_acGnResponse {
            tc_ac.stop;
            v_longPosVectorIut := v_acGnResponse.getLongPosVector;
            setverdict(pass);
          } 
          [] acPort.receive {
            tc_ac.stop;
            setverdict(fail, "GnAddress mismatch, check LibItsGeoNetworking_Pics.PICS_GN_LOCAL_GN_ADDR value in configuration file");
          }
          [] tc_ac.timeout {
            setverdict(inconc, "timeout");
          }
        } // End of 'alt' statement

        f_acTriggerEvent(m_startPassBeaconing(m_beaconHeader(v_longPosVectorIut).beaconHeader));
        
        tc_ac.start;
        alt {
          [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwSecPdu(mw_etsiTs103097Data_signed))) -> value v_msg {
            tc_ac.stop;
            log("v_msg = ", v_msg);
            setverdict(pass, "Security protocol version set to 3");
            f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_success);
          }
          [] tc_ac.timeout {
            setverdict(pass);
          }
        }
        
        unmap(self:geoNetworkingPort, system:geoNetworkingPort);
        unmap(self:acPort, system:acPort);
        
      } // End of testcase tc_GeoNet_Port_4
      
      /**
       * @desc validate GeoNetworkingReq/Broadcast
       * @verdict Pass on success, Fail otherwise
       */
      testcase tc_GeoNet_MultiPort() runs on ItsMtc system ItsGeoNetworkingSystem {
        var ItsGeoNetworking v_comp1;
        var ItsGeoNetworking v_comp2;

      v_comp1 := ItsGeoNetworking.create("Comp1") alive;
      v_comp2 := ItsGeoNetworking.create("Comp2") alive;
	
        connect(self:syncPort, mtc:syncPort);
        connect(v_comp1:syncPort, self:syncPort);
        connect(v_comp2:syncPort, self:syncPort);
        map(v_comp1:geoNetworkingPort, system:geoNetworkingPort);
        map(v_comp2:geoNetworkingPort, system:geoNetworkingPort);
	
        v_comp1.start(f_tc_GeoNet_MultiPort());
        v_comp2.start(f_tc_GeoNet_MultiPort());
        // Synchronization
        f_serverSyncNClientsAndStop(2, {c_prDone, c_tbDone});
	

        disconnect(self:syncPort, mtc:syncPort);
        disconnect(v_comp1:syncPort, self:syncPort);
        disconnect(v_comp2:syncPort, self:syncPort);
        unmap(v_comp1:geoNetworkingPort, system:geoNetworkingPort);
        unmap(v_comp2:geoNetworkingPort, system:geoNetworkingPort);
      }

      function f_tc_GeoNet_MultiPort() runs on ItsGeoNetworking {
        var GeoNetworkingReq v_gnReq;
        var ExtendedHeader v_header;
        var boolean v_got_it := false;
        var GeoNetworkingInd v_msg;
                
        if (PX_GN_UPPER_LAYER != e_any) {
          log("PX_GN_UPPER_LAYER shall be set to e_any");
          stop;
        }
                
        f_selfOrClientSyncAndVerdict(c_prDone, e_success);                
garciay's avatar
garciay committed
      v_gnReq := valueof(m_geoNwReq_linkLayerBroadcast(
garciay's avatar
garciay committed
                                                       m_geoNwPdu(
                                                                  m_geoNwBroadcastPacket(
                                                                                         m_dummyLongPosVectorNodeB, 
                                                                                         3456, 
                                                                                         m_dummyGeoBroadcastArea1
                                                                                         ))));
        //geoNetworkingPort.send(v_gnReq);
garciay's avatar
garciay committed
        tc_ac.start;
        alt {
          [] geoNetworkingPort.receive(
                                       mw_geoNwInd(
                                                   mw_geoNwPdu(
                                                               mw_geoNwTsbPacketWithNextHeader_cam(
                                                                                                   -,
                                                                                                   -,
                                                                                                   e_btpB
                                                                                                   )))) {
            if (v_got_it == false) {
              v_got_it := true;
              tc_ac.stop;
              log("*** " & testcasename() & ": PASS: Message received ***");
              f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
            } else {
              repeat;
garciay's avatar
garciay committed
            }
          }
          [] geoNetworkingPort.receive(
                                       mw_geoNwInd(
                                                   mw_geoNwPdu(
                                                               mw_geoNwLsRequestPacket(
                                                                                       ?,
                                                                                       ?
                                                                                       )))) -> value v_msg {
            log("Receive LsRequest: ", v_msg.msgIn);
            // Send LsReply
            f_sendGeoNetMessage(
                                valueof(m_geoNwReq_linkLayerBroadcast(
                                                                      m_geoNwPdu(
                                                                                 m_geoNwLsReplyPacket(
                                                                                                      m_dummyLongPosVectorNodeA,
                                                                                                      f_longPosVector2ShortPosVector(
                                                                                                                                     valueof(v_msg.msgIn.gnPacket.packet.extendedHeader.lsRequestHeader.srcPosVector)
                                                                                                                                     ),
                                                                                                      vc_localSeqNumber
                                                                                                      )))));
            repeat;
          }
          [] geoNetworkingPort.receive(
                                       mw_geoNwInd(
                                                   mw_geoNwPdu(
                                                               mw_geoNwBeaconPacket(?)
                                                               )
                                                   )) -> value v_msg {
            log("Receive beacon: ", v_msg.msgIn);
            repeat;
          }
          [] geoNetworkingPort.receive(
                                       mw_geoNwInd(
                                                   ?
                                                   )) -> value v_msg {
            tc_ac.stop;
            log("*** " & testcasename() & ": FAIL: Unexpected message received ***");
            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
garciay's avatar
garciay committed
          }
          [] tc_ac.timeout {
            if (v_got_it == false) {
              log("*** " & testcasename() & ": INCONC: Expected message not received ***");
              f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
	
      } // End of function f_tc_GeoNet_MultiPort
        
garciay's avatar
garciay committed
      /**
       * @desc validate GeoNetworkingReq/Broadcast with UtPort
       * @verdict Pass on success, Fail otherwise
       */
      testcase tc_GeoNet_Port_utPort() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
        var GeoNetworkingReq v_gnReq;
        var ExtendedHeader v_header;
        var boolean v_got_it := false;
        var GeoNetworkingInd v_msg;
garciay's avatar
garciay committed
        if (PX_GN_UPPER_LAYER != e_any) {
          log("PX_GN_UPPER_LAYER shall be set to e_any");
          stop;
        }
garciay's avatar
garciay committed
        map(self:geoNetworkingPort, system:geoNetworkingPort);
        map(self:utPort, system:utPort);

        f_utInitializeIut(m_gnInitialize);
garciay's avatar
garciay committed
      v_gnReq := valueof(m_geoNwReq_linkLayerBroadcast(
                                                       m_geoNwPdu(
                                                                  m_geoNwBroadcastPacket(
                                                                                         m_dummyLongPosVectorNodeB, 
                                                                                         3456, 
                                                                                         m_dummyGeoBroadcastArea1
                                                                                         ))));
garciay's avatar
garciay committed
        geoNetworkingPort.send(v_gnReq);
        tc_ac.start;
        alt {
          [] geoNetworkingPort.receive(
                                       mw_geoNwInd(
                                                   mw_geoNwPdu(
                                                               mw_geoNwTsbPacketWithNextHeader_cam(
                                                                                                   -,
                                                                                                   -,
                                                                                                   e_btpB
                                                                                                   )))) {
            if (v_got_it == false) {
              v_got_it := true;
garciay's avatar
garciay committed
              setverdict(pass);
            }
            repeat;
          }
          [] geoNetworkingPort.receive(
                                       mw_geoNwInd(
                                                   mw_geoNwPdu(
                                                               mw_geoNwLsRequestPacket(
                                                                                       ?,
                                                                                       ?
                                                                                       )))) -> value v_msg {
            log("Receive LsRequest: ", v_msg.msgIn);
            // Send LsReply
            f_sendGeoNetMessage(
                                valueof(m_geoNwReq_linkLayerBroadcast(
                                                                      m_geoNwPdu(
                                                                                 m_geoNwLsReplyPacket(
                                                                                                      m_dummyLongPosVectorNodeA,
                                                                                                      f_longPosVector2ShortPosVector(
                                                                                                                                     valueof(v_msg.msgIn.gnPacket.packet.extendedHeader.lsRequestHeader.srcPosVector)
                                                                                                                                     ),
                                                                                                      vc_localSeqNumber
                                                                                                      )))));
            repeat;
          }
          [] geoNetworkingPort.receive(
                                       mw_geoNwInd(
                                                   mw_geoNwPdu(
                                                               mw_geoNwBeaconPacket(?)
                                                               )
                                                   )) -> value v_msg {
            log("Receive beacon: ", v_msg.msgIn);
            repeat;
          }
          [] geoNetworkingPort.receive(
                                       mw_geoNwInd(
                                                   ?
                                                   )) -> value v_msg {
            setverdict(fail);
          }
          [] tc_ac.timeout {
            if (v_got_it == false) {
              setverdict(inconc, "Expected message not received");
garciay's avatar
garciay committed
        unmap(self:geoNetworkingPort, system:geoNetworkingPort);
        unmap(self:utPort, system:utPort);
garciay's avatar
garciay committed
      } // End of testcase tc_GeoNet_utPort
      
      /**
       * @desc validate AcPort/getLongposVector
       * @verdict Pass on success, Fail otherwise
       * @remark Change system.geoNetworkingPort.params parameter in configuration file to use different vendor's beacon (4 vendor, >63 beacons)
       */
      testcase tc_GeoNet_acPort_getLongPositionVector_1() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
        // Variables
        var AcGnResponse v_result;
        
        if (PX_GN_UPPER_LAYER != e_any) {
          log("PX_GN_UPPER_LAYER shall be set to e_any");
          stop;
        }
        
        map(self:geoNetworkingPort, system:geoNetworkingPort);
        map(self:acPort, system:acPort);

        // A small sleep to provide TA to read pcap file is it used
        tc_noac.start;
        alt {
          [] tc_noac.timeout {
          }
        } // end of 'alt' statement
        
        f_acTriggerEvent(m_getLongPosVector(f_getIutGnLocalAddress()));
        tc_ac.start;
        alt {
          [] acPort.receive(mw_getLongPosVectorAny(f_getIutGnLocalAddress())) -> value v_result {
            tc_ac.stop;
            log("v_result=", v_result);
            setverdict(pass);
          }
          [] acPort.receive {
            tc_ac.stop;
            setverdict(fail, "GnAddress mismatch, check LibItsGeoNetworking_Pics.PICS_GN_LOCAL_GN_ADDR value in configuration file");
          }
          [] tc_ac.timeout {
            setverdict(inconc, "timeout");
          }
        } // End of 'alt' statement
        
        unmap(self:geoNetworkingPort, system:geoNetworkingPort);
        unmap(self:acPort, system:acPort);
        
      } // End of testcase tc_GeoNet_acPort_getLongPositionVector_1
       
      /**
       * @desc validate AcPort/getLongposVector
       * @verdict Pass on success, Fail otherwise
       * @remark Change system.geoNetworkingPort.params parameter in configuration file to use different vendor's beacon (4 vendor, >63 beacons)
       */
      testcase tc_GeoNet_acPort_getLongPositionVector_2() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
        // Variables
        var AcGnResponse v_result;
        
        if (PX_GN_UPPER_LAYER != e_any) {
          log("PX_GN_UPPER_LAYER shall be set to e_any");
          stop;
        }
        
        map(self:geoNetworkingPort, system:geoNetworkingPort);
        map(self:acPort, system:acPort);

garciay's avatar
garciay committed
        tc_ac.start;
        f_acTriggerEvent(m_getLongPosVector(PX_TS_NODE_A_LOCAL_GN_ADDR)); // Do nit use IUT GN Address
        alt {
          [] acPort.receive(AcGnResponse: { failure := { failure := true } }) {
            tc_ac.stop;
            setverdict(pass, "Received negative ack");
          }
          [] acPort.receive(mw_getLongPosVectorAny(f_getIutGnLocalAddress())) -> value v_result {
            tc_ac.stop;
            log("v_result=", v_result);
            setverdict(fail);
          }
          [] acPort.receive {
            tc_ac.stop;
            setverdict(fail, "GnAddress mismatch, check LibItsGeoNetworking_Pics.PICS_GN_LOCAL_GN_ADDR value in configuration file");
          }
          [] tc_ac.timeout {
            setverdict(inconc, "timeout");
          }
        } // End of 'alt' statement
        
        unmap(self:geoNetworkingPort, system:geoNetworkingPort);
        unmap(self:acPort, system:acPort);
        
      } // End of testcase tc_GeoNet_acPort_getLongPositionVector_2
       
      /**
       * @desc validate GeoNetworkingReq/Broadcast with AcPort/beaconing
       * @verdict Pass on success, Fail otherwise
       */
      testcase tc_GeoNet_Port_acPort_beaconing_1() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
        // Variables
        var PositionTable v_positionTable := {};
        var GeoAreaTable v_areaTable := {};
        var GeoNetworkingInd v_msg;
        
        if (PX_GN_UPPER_LAYER != e_any) {
          log("PX_GN_UPPER_LAYER shall be set to e_any");
          stop;
        }
                
        map(self:geoNetworkingPort, system:geoNetworkingPort);
        map(self:acPort, system:acPort);

        f_preparePositionsAndAreas(v_positionTable, v_areaTable);
        f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeB);
        f_acTriggerEvent(m_startBeaconing(m_beaconHeader(f_getPosition(vc_componentName)).beaconHeader)); 
        tc_ac.start;
        alt {
          [] acPort.receive(AcGnResponse: { failure := { failure := true } }) {
            tc_ac.stop;
            setverdict(fail, "Received negative ack");
          }
          [] acPort.receive(AcGnResponse: { failure := { failure := false } }) {
            tc_ac.stop;
            setverdict(pass, "Received AC ACK");
          }
          [] tc_ac.timeout {
garciay's avatar
garciay committed
            setverdict(inconc, "Timeout while waiting for adapter control event result");
            stop;
          }
        } // End of 'alt' statement
                
        // A small sleep to send some beacons
        tc_noac.start;
        alt {
          [] geoNetworkingPort.receive(?) {
            repeat;
          }
          [] tc_noac.timeout {
            setverdict(pass, "Check that beaconing was started and stopped accordingly");
          }
        } // end of 'alt' statement
        
        unmap(self:geoNetworkingPort, system:geoNetworkingPort);
        unmap(self:acPort, system:acPort);
        
      } // End of testcase tc_GeoNet_acPort_beaconing_1
      
garciay's avatar
garciay committed
      /**
       * @desc validate GeoNetworkingReq/Broadcast with AcPort/beaconing
       * @verdict Pass on success, Fail otherwise
       */
      testcase tc_GeoNet_Port_acPort_beaconing_2() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
garciay's avatar
garciay committed
        // Variables
        var PositionTable v_positionTable := {};
        var GeoAreaTable v_areaTable := {};
        var GeoNetworkingReq v_gnReq;
        var boolean v_got_it := false;
        var GeoNetworkingInd v_msg;
        
        if (PX_GN_UPPER_LAYER != e_any) {
          log("PX_GN_UPPER_LAYER shall be set to e_any");
          stop;
        }
                
        map(self:geoNetworkingPort, system:geoNetworkingPort);
        map(self:acPort, system:acPort);

        f_preparePositionsAndAreas(v_positionTable, v_areaTable);    
        f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeB);
garciay's avatar
garciay committed
        f_acTriggerEvent(m_startBeaconing(m_beaconHeader(f_getPosition(vc_componentName)).beaconHeader)); 
        tc_ac.start;
        alt {
          [] acPort.receive(AcGnResponse: { failure := { failure := true } }) {
            tc_ac.stop;
            setverdict(fail, "Received negative ack");
garciay's avatar
garciay committed
          }
          [] acPort.receive(AcGnResponse: { failure := { failure := false } }) {
            tc_ac.stop;
            setverdict(pass, "Received AC ACK");
garciay's avatar
garciay committed
          }
          [] acPort.receive {
            tc_ac.stop;
            setverdict(fail, "Received unexpected AC message");
garciay's avatar
garciay committed
          }
          [] tc_ac.timeout {
garciay's avatar
garciay committed
            setverdict(inconc, "Timeout while waiting for adapter control event result");
garciay's avatar
garciay committed
          }
        } // End of 'alt' statement
                
        // A small sleep to send some beacons
        tc_noac.start;
        alt {
          [] geoNetworkingPort.receive(?) {
            repeat;
          }
          [] tc_noac.timeout {
            // Stop beaconing
            f_acTriggerEvent(m_stopBeaconing); 
          }
        } // end of 'alt' statement

        // Wait a little bit before terminate the test
        tc_noac.start;
        alt {
          [] tc_noac.timeout {
            setverdict(pass, "Check that beaconing was started and stopped accordingly");
          }
        } // end of 'alt' statement
        
        unmap(self:geoNetworkingPort, system:geoNetworkingPort);
        unmap(self:acPort, system:acPort);
        
      } // End of testcase tc_GeoNet_acPort_beaconing_2
      
      /**
       * @desc validate GeoNetworkingReq/Broadcast with AcPort/passing beacons
       * @verdict Pass on success, Fail otherwise
       */
      testcase tc_GeoNet_Port_acPort_pass_beaconing_1() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
        // Variables
        var PositionTable v_positionTable := {};
        var GeoAreaTable v_areaTable := {};
        var GeoNetworkingReq v_gnReq;
        var GeoNetworkingInd v_msg;
        
        if (PX_GN_UPPER_LAYER != e_any) {
          log("PX_GN_UPPER_LAYER shall be set to e_any");
          stop;
        }
        map(self:geoNetworkingPort, system:geoNetworkingPort);
        map(self:acPort, system:acPort);

        f_preparePositionsAndAreas(v_positionTable, v_areaTable);    
        f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeB);

        f_acTriggerEvent(m_startPassBeaconing(m_beaconHeader(f_getPosition(c_compIut)).beaconHeader));
garciay's avatar
garciay committed
        tc_ac.start;
        alt {
          [] acPort.receive(AcGnResponse: { failure := { failure := true } }) {
            tc_ac.stop;
            setverdict(fail, "Received negative ack");
garciay's avatar
garciay committed
          }
          [] acPort.receive(AcGnResponse: { failure := { failure := false } }) {
            tc_ac.stop;
            setverdict(pass, "Received AC ACK");
garciay's avatar
garciay committed
          }
          [] acPort.receive {
            tc_ac.stop;
            setverdict(fail, "Received unexpected AC message");
          }
          [] tc_ac.timeout {
garciay's avatar
garciay committed
            setverdict(inconc, "Timeout while waiting for adapter control event result");
garciay's avatar
garciay committed
          }
        } // End of 'alt' statement
                
        // A small sleep to send some beacons
        tc_ac.start;
        alt {
garciay's avatar
garciay committed
          [] geoNetworkingPort.receive(
                                       mw_geoNwInd(
                                                   mw_geoNwPdu(
                                                               mw_geoNwBeaconPacket(?)))) {
            tc_ac.stop;
            setverdict(pass);
garciay's avatar
garciay committed
          }
          [] geoNetworkingPort.receive {
            tc_ac.stop;
            setverdict(fail, "Unexpected message received");
          }
garciay's avatar
garciay committed
          [] tc_ac.timeout {
            setverdict(inconc, "Expected message not received");
garciay's avatar
garciay committed
          }
        } // end of 'alt' statement
        
garciay's avatar
garciay committed
        unmap(self:geoNetworkingPort, system:geoNetworkingPort);
        unmap(self:acPort, system:acPort);
        
      } // End of testcase tc_GeoNet_acPort_pass_beaconing_1
      
garciay's avatar
garciay committed
      /**
       * @desc validate GeoNetworkingReq/Broadcast with AcPort/passing beacons
garciay's avatar
garciay committed
       * @verdict Pass on success, Fail otherwise
       */
      testcase tc_GeoNet_Port_acPort_pass_beaconing_2() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
garciay's avatar
garciay committed
        // Variables
        var PositionTable v_positionTable := {};
        var GeoAreaTable v_areaTable := {};
        var GeoNetworkingReq v_gnReq;
        var GeoNetworkingInd v_msg;
        
        if (PX_GN_UPPER_LAYER != e_any) {
          log("PX_GN_UPPER_LAYER shall be set to e_any");
          stop;
        }
garciay's avatar
garciay committed
        map(self:geoNetworkingPort, system:geoNetworkingPort);
        map(self:acPort, system:acPort);

        f_preparePositionsAndAreas(v_positionTable, v_areaTable);    
        f_initialiseComponent(v_positionTable, v_areaTable, c_compNodeB);

        f_acTriggerEvent(m_startPassBeaconing(m_beaconHeader(f_getPosition(c_compIut)).beaconHeader));
garciay's avatar
garciay committed
        tc_ac.start;
        alt {
          [] acPort.receive(AcGnResponse: { failure := { failure := true } }) {
            tc_ac.stop;
            setverdict(fail, "Received negative ack");
garciay's avatar
garciay committed
          }
          [] acPort.receive(AcGnResponse: { failure := { failure := false } }) {
            tc_ac.stop;
            setverdict(pass, "Received AC ACK");
garciay's avatar
garciay committed
          }
          [] acPort.receive {
            tc_ac.stop;
            setverdict(fail, "Received unexpected AC message");
          }
          [] tc_ac.timeout {
garciay's avatar
garciay committed
            setverdict(inconc, "Timeout while waiting for adapter control event result");
          }
        } // End of 'alt' statement
        
        // A small sleep to send some beacons
        tc_ac.start;
        alt {
garciay's avatar
garciay committed
          [] geoNetworkingPort.receive(
                                       mw_geoNwInd(
                                                   mw_geoNwPdu(
                                                               mw_geoNwBeaconPacket(?)))) {
            tc_ac.stop;
            setverdict(pass);
          }
          [] tc_ac.timeout {
            setverdict(inconc, "Expected message not received");
          }
        } // end of 'alt' statement

        f_acTriggerEvent(m_stopPassBeaconing);
        tc_ac.start;
        alt {
          [] acPort.receive(AcGnResponse: { failure := { failure := true } }) {
            tc_ac.stop;
            setverdict(fail, "Received negative ack");
          }
          [] acPort.receive(AcGnResponse: { failure := { failure := false } }) {
            tc_ac.stop;
            setverdict(pass, "Received AC ACK");
          }
          [] acPort.receive {
            tc_ac.stop;
            setverdict(fail, "Received unexpected AC message");
garciay's avatar
garciay committed
          }
          [] tc_ac.timeout {
garciay's avatar
garciay committed
            setverdict(inconc, "Timeout while waiting for adapter control event result");
          }
        } // End of 'alt' statement
        
        // Check that no beacon are received now
        geoNetworkingPort.clear;
        tc_noac.start;
        alt {
garciay's avatar
garciay committed
          [] geoNetworkingPort.receive(
                                       mw_geoNwInd(
                                                   mw_geoNwPdu(
                                                               mw_geoNwBeaconPacket(?)))) {
            tc_noac.stop;
            setverdict(fail, "Should not receive beacon");
garciay's avatar
garciay committed
          }
          [] tc_noac.timeout {
            setverdict(pass);
garciay's avatar
garciay committed
          }
        } // end of 'alt' statement
        
garciay's avatar
garciay committed
        unmap(self:geoNetworkingPort, system:geoNetworkingPort);
        unmap(self:acPort, system:acPort);
        
      } // End of testcase tc_GeoNet_acPort_pass_beaconing_2
      
      /**
       * @desc validate GeoNetworkingReq/Broadcast with AcPort/beaconing
       * @verdict Pass on success, Fail otherwise
       */
      testcase tc_GeoNet_Port_acPort_secured_1() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
        // Variables
        var GeoNetworkingInd v_msg;
        
        map(self:acPort, system:acPort);
        map(self:geoNetworkingPort, system:geoNetworkingPort);

        f_loadCertificates(PX_IUT_SEC_CONFIG_NAME);
        
        acPort.send(m_acEnableSecurity(cc_taCert_A)); 
        tc_ac.start;
        alt {
          [] acPort.receive(m_acSecResponseSuccess) {
            tc_ac.stop;
            setverdict(pass);
          }
          [] acPort.receive {
            tc_ac.stop;
            log("*** " & __SCOPE__ & ": ERROR: Received unexpected message ***");
            f_selfOrClientSyncAndVerdict("error", e_error);
          }
          [] tc_ac.timeout {
            log("*** " & __SCOPE__ & ": ERROR: Timeout while waiting for adapter control event result ***");
            f_selfOrClientSyncAndVerdict("error", e_timeout);
          }
        } // End of 'alt' statement
        
        unmap(self:geoNetworkingPort, system:geoNetworkingPort);
        unmap(self:acPort, system:acPort);
        
      } // End of testcase tc_GeoNet_acPort_secured_1
      
    } // End of group testGeoNetPort
    
garciay's avatar
garciay committed
  } // End of group LibItsGeoNetworking_testCases
garciay's avatar
garciay committed
  group encdec_functions {
garciay's avatar
garciay committed
    function TestGeoNetworkingReq(
garciay's avatar
garciay committed
                                  in template (value) GeoNetworkingReq p_geoNetworkingReq,
                                  in boolean p_decode := true, 
                                  in template (omit) bitstring p_expEncMsg := omit 
                                  ) runs on TCType {
garciay's avatar
garciay committed
      var bitstring v_encMsg;
      var template (omit) TestRecord v_tr := { bs := p_expEncMsg };
      var GeoNetworkingReq v_decMsg;
      var integer v_res := 0;
garciay's avatar
garciay committed
      // Encode template
      log("Encode template ", valueof(p_geoNetworkingReq));
    v_encMsg := encvalue(p_geoNetworkingReq);
      log("Encoded message:  ", bit2oct(v_encMsg));
      // Check result
      if (not isbound(v_encMsg)) {
garciay's avatar
garciay committed
        setverdict(fail, "Encoding failed!");
        stop;
garciay's avatar
garciay committed
      }
      if (ispresent(v_tr.bs)) {
garciay's avatar
garciay committed
        if (not match(v_encMsg, p_expEncMsg)) {
          log("Expected message: ", bit2oct(valueof(p_expEncMsg)));
          setverdict(fail, "Encoding failed, not the expected result!");
          stop;
        }
garciay's avatar
garciay committed
      }
      setverdict(pass, "Encoding passed.");
garciay's avatar
garciay committed
      // Check decoding
      if (p_decode == true) {
      v_res := decvalue(v_encMsg, v_decMsg);
garciay's avatar
garciay committed
        log("Decoded message: ", v_decMsg);
        select (v_res) {
        case (0) {
          if(match(v_decMsg, p_geoNetworkingReq)) {
            setverdict(pass);
          } else {
            setverdict(fail);
          }
        }
        case (1) {
          setverdict(fail, "Decoding failed.");
        }
        case (2) {
          setverdict(fail, "Not enough bits.");
        }
        }
garciay's avatar
garciay committed
      }
garciay's avatar
garciay committed
    } // End of function TestGeoNetworkingReq
garciay's avatar
garciay committed
    function TestDecodeGeoNetworkingReq(
garciay's avatar
garciay committed
                                        in template GeoNetworkingReq p_geoNetworkingReq, 
                                        in template (present) octetstring p_expEncMsg
                                        ) runs on TCType {
garciay's avatar
garciay committed
      var GeoNetworkingReq v_decMsg;
      var bitstring v_encMsg := oct2bit(valueof(p_expEncMsg));
      var integer v_res := 0;
garciay's avatar
garciay committed
    v_res := decvalue(v_encMsg, v_decMsg);
      select (v_res) {
      case (0) {
garciay's avatar
garciay committed
        log("v_decMsg          : ", v_decMsg);
        if(match(valueof(v_decMsg), p_geoNetworkingReq)) {
          setverdict(pass);