ItsGeoNetworking_TpFunctions.ttcn 718 KB
Newer Older
                }
                else {
                    log("*** " & testcasename() & ": PASS: GN was NOT transmitted to upper layer ***");
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                }
                
                // Postamble
                f_poNeighbour();
                f_cf01Down();
                
            } // end f_GEONW_PON_GAC_BV_10
            
            group GEONW_PON_GAC_BO_11 {
                
                /**
                 * @desc    TP Function for TC_GEONW_PON_GAC_BO_11
                 */
                function f_GEONW_PON_GAC_BO_11() runs on ItsMtc {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    var UInt16 v_distanceTooBig;
                    
                    // Test control
                    if (not PICS_GN_GAC_FWD) {
                        log("*** " & testcasename() & ": PICS_GN_GAC_FWD required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
                    // Test component configuration
                    f_cf04Up();
                    v_distanceTooBig := float2int(1.1 * f_radiusFromCircularArea(f_getGnMaxAreaSize()*c_squareKm));
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GAC_BO_11_nodeB(v_distanceTooBig));
                    v_nodeC.start(f_GEONW_PON_GAC_BO_11_nodeC(v_distanceTooBig));
                    v_nodeD.start(f_GEONW_PON_GAC_BO_11_nodeD(v_distanceTooBig));
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end f_GEONW_PON_GAC_BO_11
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GAC_BO_11)
                 */
                function f_GEONW_PON_GAC_BO_11_nodeB(in UInt16 p_distanceTooBig) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var GeoArea v_areaTooBig;
                    
                    // Preamble
                    f_prNeighbour();
                    v_areaTooBig := f_computeCircularArea(
                        f_computePosition(f_getPosition(c_compNodeB), 1000, 0), 
                        p_distanceTooBig
                    );
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwAnycastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_geoArea2GeoAnycastArea(v_areaTooBig)
                            )))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GAC message forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GAC message not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BO_11_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_GAC_BO_11)
                 */
                function f_GEONW_PON_GAC_BO_11_nodeC(in UInt16 p_distanceTooBig) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var GeoArea v_areaTooBig;
                    
                    // Preamble
                    f_prNeighbour();
                    v_areaTooBig := f_computeCircularArea(
                        f_computePosition(f_getPosition(c_compNodeB), 1000, 0), 
                        p_distanceTooBig
                    );
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwAnycastPacket(
                                    v_longPosVectorNodeC,
                                    vc_localSeqNumber,
                                    f_geoArea2GeoAnycastArea(v_areaTooBig)
                                )
                            )
                        )
                    );
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BO_11_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GAC_BO_11)
                 */
                function f_GEONW_PON_GAC_BO_11_nodeD(in UInt16 p_distanceTooBig) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var GeoArea v_areaTooBig;
                    
                    // Preamble
                    f_prNeighbour();
                    v_areaTooBig := f_computeCircularArea(
                        f_computePosition(f_getPosition(c_compNodeB), 1000, 0), 
                        p_distanceTooBig
                    );
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwAnycastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_geoArea2GeoAnycastArea(v_areaTooBig)
                            )))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GAC message forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GAC message not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BO_11_nodeD
                
            } // end GEONW_PON_GAC_BO_11

            group GEONW_PON_GAC_BV_13 {
                
                /**
                 * @desc    TP Function for TC_GEONW_PON_GAC_BV_13
                 */
                function f_GEONW_PON_GAC_BV_13() runs on ItsMtc {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if (not PICS_GN_GAC_SRC) {
                        log("*** " & testcasename() & ": PICS_GN_GAC_SRC required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    if(f_getGeoBroadcastForwardingAlgorithm() != e_cbf) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == ( e_cbf ) required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                                        
                    // Test component configuration
                    f_cf02Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_GAC_BV_13_nodeB());
                    v_nodeD.start(f_GEONW_PON_GAC_BV_13_nodeD());
                    
                    // Synchronization
                    f_serverSync2ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf02Down();
                    
                } // end f_GEONW_PON_GAC_BV_13
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_GAC_BV_13)
                 */
                function f_GEONW_PON_GAC_BV_13_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    if(not f_utTriggerEvent(m_generateGeoAnycastMessage(f_getArea(c_area2)))) {
                        log("*** " & testcasename() & ": INCONC: Trigger failed ***");
                        f_selfOrClientSyncAndVerdict(c_tbDone, e_timeout);
                    }
                    
                    tc_ac.start;
                    alt {
                        [] a_receiveGeoAnycastWithArea(
garciay's avatar
garciay committed
                                mw_longPosVectorPosition(v_longPosVectorIut),
                                ?,
                                f_getGeoAnycastArea(c_area2)) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GAC message received correctly ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GAC message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_13_nodeB
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_GAC_BV_13)
                 */
                function f_GEONW_PON_GAC_BV_13_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    tc_ac.start;
                    alt {
                        [] a_receiveGeoAnycastWithArea(
garciay's avatar
garciay committed
                                mw_longPosVectorPosition(v_longPosVectorIut),
                                ?,
                                f_getGeoAnycastArea(c_area2)) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: received GAC message ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GAC message not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_GAC_BV_13_nodeD
                
            } // end GEONW_PON_GAC_BV_13
            
        } // end geoGeoAnycast
        
        // 6.2.2.13
        group geoGeoBroadcastCbfAlgorithm {
            
            group GEONW_PON_BCA_BV_01 {
                 * @desc    TP Function for TC_GEONW_PON_BCA_BV_01
                function f_GEONW_PON_BCA_BV_01() runs on ItsMtc {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    var UInt16 v_sequenceNumberC := f_getInitialSequenceNumber();
                    
                    // Test control
                    if (not PICS_GN_GBC_FWD) {
                        log("*** " & testcasename() & ": PICS_GN_GBC_FWD required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_cbf) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_cbf required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
garciay's avatar
garciay committed
//                    if (f_getGeoBroadcastCbfMinTime() < 300) {
//                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
//                        setverdict(inconc);
//                        stop;
//                    }
                                        
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_BCA_BV_01_nodeB());
                    v_nodeC.start(f_GEONW_PON_BCA_BV_01_nodeC(v_sequenceNumberC));
                    v_nodeD.start(f_GEONW_PON_BCA_BV_01_nodeD(v_sequenceNumberC));
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end f_GEONW_PON_BCA_BV_01
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BCA_BV_01)
                function f_GEONW_PON_BCA_BV_01_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GBC message re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GBC message not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_01_nodeB
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_BCA_BV_01)
                function f_GEONW_PON_BCA_BV_01_nodeC(in UInt16 p_sequenceNumberC) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeC,
                                    p_sequenceNumberC,
                                    f_getGeoBroadcastArea(c_area1)
                                )
                            )
                        )
                    );
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GBC message re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GBC message not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_01_nodeC
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_BCA_BV_01)
                function f_GEONW_PON_BCA_BV_01_nodeD(in UInt16 p_sequenceNumberC) runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeC,
                                    p_sequenceNumberC,
                                    f_getGeoBroadcastArea(c_area1)
                                )
                            )
                        )
                    );
                    
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GBC message re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GBC message not re-broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_01_nodeD
            } // end GEONW_PON_BCA_BV_01
            
            group GEONW_PON_BCA_BV_02 {
                
                /**
                 * @desc    TP Function for TC_GEONW_PON_BCA_BV_02
                 */
                function f_GEONW_PON_BCA_BV_02() runs on ItsMtc {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if (not PICS_GN_GBC_FWD) {
                        log("*** " & testcasename() & ": PICS_GN_GBC_FWD required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_cbf) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_cbf required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
garciay's avatar
garciay committed
//                    if (f_getGeoBroadcastCbfMinTime() < 300) {
//                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
//                        setverdict(inconc);
//                        stop;
//                    }
                    
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_BCA_BV_02_nodeB());
                    v_nodeC.start(f_GEONW_PON_BCA_BV_02_nodeC());
                    v_nodeD.start(f_GEONW_PON_BCA_BV_02_nodeD());
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end f_GEONW_PON_BCA_BV_02
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BCA_BV_02)
                 */
                function f_GEONW_PON_BCA_BV_02_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GBC message broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GBC message not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_02_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_BCA_BV_02)
                 */
                function f_GEONW_PON_BCA_BV_02_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    var LongPosVector v_longPosVectorIut := f_getPosition(c_compIut);
                    timer t_toCbf := (int2float(f_getGeoBroadcastCbfMaxTime())
                        + (
                            int2float(f_getGeoBroadcastCbfMinTime() - f_getGeoBroadcastCbfMaxTime())
                            / int2float(f_getCbfMaxCommunicationRange())
                        ) * f_distance(v_longPosVectorNodeC, v_longPosVectorIut)) * 0.95 / 1000.0;
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeC,
                                    vc_localSeqNumber,
                                    f_getGeoBroadcastArea(c_area1)
                                )
                            )
                        )
                    );
                    
                    t_toCbf.start;                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;                           
                            
                            if(t_toCbf.running) {                               
                                t_toCbf.stop;
                                log("*** " & testcasename() & ": FAIL: GBC retransmitted before CBF timer expiration ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                            }
                            else {
                                log("*** " & testcasename() & ": PASS: GBC message received ***");
                                f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                            }
                        }
                        [] t_toCbf.timeout {
                            log("*** " & testcasename() & ": INFO: CBF timer elapsed ***");
                            repeat;
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GBC message not received ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_02_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_BCA_BV_02)
                 */
                function f_GEONW_PON_BCA_BV_02_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area1)
                            )))) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GBC message broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GBC message not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_02_nodeD
                
            } // end GEONW_PON_BCA_BV_02
            
            group GEONW_PON_BCA_BV_03 {
                
                /**
                 * @desc    TP Function for TC_GEONW_PON_BCA_BV_03
                 */
                function f_GEONW_PON_BCA_BV_03() runs on ItsMtc {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if (not PICS_GN_GBC_FWD) {
                        log("*** " & testcasename() & ": PICS_GN_GBC_FWD required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_cbf) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_cbf required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
garciay's avatar
garciay committed
//                    if (f_getGeoBroadcastCbfMinTime() < 300) {
//                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
//                        setverdict(inconc);
//                        stop;
//                    }
                                        
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_BCA_BV_03_nodeB());
                    v_nodeC.start(f_GEONW_PON_BCA_BV_03_nodeC());
                    v_nodeD.start(f_GEONW_PON_BCA_BV_03_nodeD());
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end f_GEONW_PON_BCA_BV_03
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BCA_BV_03)
                 */
                function f_GEONW_PON_BCA_BV_03_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    
                    tc_ac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd_withLinkLayerDestination(mw_geoNwPdu(mw_geoNwBroadcastPacketWithArea(
                                mw_longPosVectorPosition(v_longPosVectorNodeC),
                                ?,
                                f_getGeoBroadcastArea(c_area2)
                            )),
                            f_getTsGnLocalAddress(c_compNodeB).mid
                            )) {
                            tc_ac.stop;
                            log("*** " & testcasename() & ": PASS: GBC correctly forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                        [] tc_ac.timeout {
                            log("*** " & testcasename() & ": FAIL: GBC message not forwarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_03_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_BCA_BV_03)
                 */
                function f_GEONW_PON_BCA_BV_03_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeC := f_getPosition(c_compNodeC);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeC,
                                    vc_localSeqNumber,
                                    f_getGeoBroadcastArea(c_area2)
                                )
                            )
                        )
                    );
                    
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(?))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: Message was broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: Message not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_03_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_BCA_BV_03)
                 */
                function f_GEONW_PON_BCA_BV_03_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(?))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: Message was broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: Message not broadcasted ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BV_03_nodeD
                
            } // end GEONW_PON_BCA_BV_03
            
            group GEONW_PON_BCA_BO_04 {
                
                /**
                 * @desc    TP Function for TC_GEONW_PON_BCA_BO_04
                 */
                function f_GEONW_PON_BCA_BO_04() runs on ItsMtc {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if (not PICS_GN_GBC_FWD) {
                        log("*** " & testcasename() & ": PICS_GN_GBC_FWD required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    if (f_getGeoBroadcastForwardingAlgorithm() != e_cbf) {
                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_FORWARDING_ALGORITHM == e_cbf required for executing the TC ***");
                        setverdict(inconc);
                        stop;
                    }
                    
garciay's avatar
garciay committed
//                    if (f_getGeoBroadcastCbfMinTime() < 300) {
//                        log("*** " & testcasename() & ": PICS_GN_GEOBROADCAST_CBF_MIN_TIME >= 300 required for executing the TC ***");
//                        setverdict(inconc);
//                        stop;
//                    }
                                                          
                    // Test component configuration
                    f_cf04Up();
                    
                    // Preamble
                    
                    // Start components
                    v_nodeB := f_getComponent(c_compNodeB);
                    v_nodeC := f_getComponent(c_compNodeC);
                    v_nodeD := f_getComponent(c_compNodeD);
                    v_nodeB.start(f_GEONW_PON_BCA_BO_04_nodeB());
                    v_nodeC.start(f_GEONW_PON_BCA_BO_04_nodeC());
                    v_nodeD.start(f_GEONW_PON_BCA_BO_04_nodeD());
                    
                    // Synchronization
                    f_serverSync3ClientsAndStop({c_prDone, c_tbDone});
                    
                    // Cleanup
                    f_cf04Down();
                    
                } // end f_GEONW_PON_BCA_BO_04
                
                /**
                 * @desc    Behavior function for NodeB (TC_GEONW_PON_BCA_BO_04)
                 */
                function f_GEONW_PON_BCA_BO_04_nodeB() runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body                    
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(?))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GBC received and not discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GBC message discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BO_04_nodeB
                
                /**
                 * @desc    Behavior function for NodeC (TC_GEONW_PON_BCA_BO_04)
                 */
                function f_GEONW_PON_BCA_BO_04_nodeC() runs on ItsGeoNetworking {
                    
                    // Local variables
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(?))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GBC received and not discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GBC message discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BO_04_nodeC
                
                /**
                 * @desc    Behavior function for NodeD (TC_GEONW_PON_BCA_BO_04)
                 */
                function f_GEONW_PON_BCA_BO_04_nodeD() runs on ItsGeoNetworking {
                    
                    // Local variables
                    var LongPosVector v_longPosVectorNodeD := f_getPosition(c_compNodeD);
                    
                    // Preamble
                    f_prNeighbour();
                    f_selfOrClientSyncAndVerdict(c_prDone, e_success);
                    
                    // Test Body
                    f_sendGeoNetMessage(
                        m_geoNwReq_linkLayerBroadcast(
                            m_geoNwPdu(
                                m_geoNwBroadcastPacket(
                                    v_longPosVectorNodeD,
                                    vc_localSeqNumber,
                                    f_getGeoBroadcastArea(c_area2)
                                )
                            )
                        )
                    );
                    
                    tc_noac.start;
                    alt {
                        [] geoNetworkingPort.receive(mw_geoNwInd(mw_geoNwPdu(?))) {
                            tc_noac.stop;
                            log("*** " & testcasename() & ": FAIL: GBC received and not discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_error);
                        }
                        [] tc_noac.timeout {
                            log("*** " & testcasename() & ": PASS: GBC message discarded ***");
                            f_selfOrClientSyncAndVerdict(c_tbDone, e_success);
                        }
                    }
                    
                    // Postamble
                    f_poNeighbour();
                    
                } // end f_GEONW_PON_BCA_BO_04_nodeD
                
            } // end GEONW_PON_BCA_BO_04
            
            group GEONW_PON_BCA_BV_05 {
                
                /**
                 * @desc    TP Function for TC_GEONW_PON_BCA_BV_05
                 */
                function f_GEONW_PON_BCA_BV_05() runs on ItsMtc {
                    
                    // Local variables
                    var ItsGeoNetworking v_nodeB;
                    var ItsGeoNetworking v_nodeC;
                    var ItsGeoNetworking v_nodeD;
                    
                    // Test control
                    if (not PICS_GN_GBC_FWD) {
                        log("*** " & testcasename() & ": PICS_GN_GBC_FWD required for executing the TC ***");