| /* Copyright (c) 2000-2019 Ericsson Telecom AB |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html |
| * |
| * Contributors: |
| * Michael Josenhans |
| ******************************************************************************/ |
| // |
| // File: SocketCAN_J1939_test.ttcn |
| // Description: SocketCAN J1939 testcases for J1939 messages |
| // |
| |
| |
| |
| module SocketCAN_J1939_test |
| { |
| import from J1939 all |
| import from J1939test all |
| |
| function create_octetstring_of_size(in integer size) return octetstring { |
| |
| var octetstring v_pdu_mod_1024 := ''O |
| var octetstring v_pdu_1024 := ''O |
| var octetstring v_pdu_mod_1048576 := ''O //1024*1024 |
| var octetstring v_pdu_1048576 := ''O |
| var octetstring v_pdu_1073741824 := ''O //1024*1024*1024 |
| var octetstring v_pdu := ''O |
| |
| var integer vcount :=0 |
| var integer maxcount |
| maxcount := size mod 1024 |
| for (vcount :=0;vcount < maxcount; vcount := vcount+1){ |
| v_pdu_mod_1024 := v_pdu_mod_1024 & int2oct((vcount mod 256),1) |
| } |
| |
| log("1") |
| for (vcount :=0;vcount < 1024; vcount := vcount+1){ |
| v_pdu_1024 := v_pdu_1024 & int2oct((vcount mod 256),1) |
| } |
| log("2") |
| maxcount := (size /1024) mod 1024 |
| for (vcount :=0;vcount < maxcount; vcount := vcount+1){ |
| v_pdu_mod_1048576 := v_pdu_mod_1048576 & v_pdu_1024 |
| } |
| v_pdu_mod_1048576 := v_pdu_mod_1048576 & v_pdu_mod_1024 |
| log("3") |
| for (vcount :=0;vcount < 1024; vcount := vcount+1){ |
| v_pdu_1048576 := v_pdu_1048576 & v_pdu_1024 |
| } |
| log("4") |
| maxcount := (size / (1024*1024)) |
| for (vcount :=0;vcount < maxcount; vcount := vcount+1){ |
| v_pdu_1073741824 := v_pdu_1073741824 & v_pdu_1048576 |
| } |
| v_pdu_1073741824 := v_pdu_1073741824 & v_pdu_mod_1048576 |
| log("5") |
| |
| v_pdu := v_pdu_1073741824 |
| |
| return v_pdu |
| } |
| |
| testcase tc_can_j1939_send_and_receive_message() runs on MTC { |
| var PTC v_ptc_j1939SendInitiator := PTC.create("PTC1_ptc_j1939SendInitiator") alive |
| var PTC v_ptc_j1939FrameReceiver := PTC.create("PTC2_ptc_j1939FrameReceiver") alive |
| |
| f_addSyncSlaveSet(v_ptc_j1939SendInitiator, v_PTCSet) |
| f_addSyncSlaveSet(v_ptc_j1939FrameReceiver, v_PTCSet) |
| |
| connect(mtc:pt_sync, v_ptc_j1939SendInitiator:pt_sync) |
| connect(mtc:pt_sync, v_ptc_j1939FrameReceiver:pt_sync) |
| |
| const integer c_send_prio := 2 |
| const octetstring c_addr_source1 := '80'O |
| const octetstring c_pgn_destination1 := '00E700'O // ECU to VT |
| const octetstring c_addr_destination1 := '90'O |
| |
| |
| |
| var octetstring v_pdu_send := ''O |
| |
| // According to ETP specification messages of 117440505 Bytes are possible, |
| // however the maximum possible message size for the current Linux kernels |
| // ETP implemantion messages depends upon the available RAM. |
| // Tests on my Laptop have shown that 4193975 bytes work |
| // When using very large messages, disable logging by commenting out |
| // the following lines in J1939.cfg and set the test cases guard timer |
| // c_guard appropriate (e.g. 100s): |
| // FileMask := LOG_ALL | DEBUG | MATCHING |
| // ConsoleMask := LOG_ALL | DEBUG | MATCHING |
| //v_pdu_send := create_octetstring_of_size(117440505) |
| |
| v_pdu_send := create_octetstring_of_size (4193975) //4193976 |
| |
| log("length of v_pdu_send: ", lengthof(v_pdu_send)) |
| |
| v_ptc_j1939SendInitiator.start(f_ptc_J1939SendInitiator( |
| e_testbody1, |
| c_send_prio, |
| c_addr_source1, |
| c_pgn_destination1, |
| c_addr_destination1, |
| v_pdu_send)) |
| |
| v_ptc_j1939FrameReceiver.start(f_ptc_J1939FrameReceiver( |
| e_testbody2, |
| c_addr_destination1, /* p_j1939_addr_source */ |
| c_pgn_destination1, /* p_peer_pgn */ |
| c_addr_source1, /* p_peer_addr */ |
| J1939_NO_NAME, /* p_peer_name */ |
| v_pdu_send /* p_j1939_pdu_expected */)) |
| |
| var e_Phase v_phase |
| |
| for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) { |
| f_startPhase(v_phase) |
| log("MTC: ", v_phase) |
| f_awaitEndPhase(v_phase) |
| } |
| |
| all component.done; |
| log("MTC done") |
| |
| disconnect(mtc:pt_sync, v_ptc_j1939SendInitiator:pt_sync) |
| disconnect(mtc:pt_sync, v_ptc_j1939FrameReceiver:pt_sync) |
| |
| all component.kill; |
| } |
| |
| testcase tc_can_j1939_send_and_receive_message_parallel() runs on MTC { |
| var PTC v_ptc_j1939SendInitiator1 := PTC.create("PTC1_ptc_j1939SendInitiator1") alive |
| var PTC v_ptc_j1939FrameReceiver1 := PTC.create("PTC2_ptc_j1939FrameReceiver1") alive |
| var PTC v_ptc_j1939SendInitiator2 := PTC.create("PTC1_ptc_j1939SendInitiator2") alive |
| var PTC v_ptc_j1939FrameReceiver2 := PTC.create("PTC2_ptc_j1939FrameReceiver2") alive |
| f_addSyncSlaveSet(v_ptc_j1939SendInitiator1, v_PTCSet) |
| f_addSyncSlaveSet(v_ptc_j1939FrameReceiver1, v_PTCSet) |
| f_addSyncSlaveSet(v_ptc_j1939SendInitiator2, v_PTCSet) |
| f_addSyncSlaveSet(v_ptc_j1939FrameReceiver2, v_PTCSet) |
| connect(mtc:pt_sync, v_ptc_j1939SendInitiator1:pt_sync) |
| connect(mtc:pt_sync, v_ptc_j1939FrameReceiver1:pt_sync) |
| connect(mtc:pt_sync, v_ptc_j1939SendInitiator2:pt_sync) |
| connect(mtc:pt_sync, v_ptc_j1939FrameReceiver2:pt_sync) |
| |
| const integer c_send_prio := 2 |
| const octetstring c_addr_source1 := '80'O |
| const octetstring c_pgn_destination1 := '00E700'O // ECU to VT |
| const octetstring c_addr_destination1 := '90'O |
| const octetstring c_addr_source2 := '80'O |
| const octetstring c_pgn_destination2 := '00E700'O // ECU to VT |
| const octetstring c_addr_destination2 := '91'O |
| |
| var octetstring v_pdu_send1 := ''O |
| var octetstring v_pdu_send2 := ''O |
| //v_pdu_send := create_octetstring_of_size(117440505) |
| v_pdu_send1 := create_octetstring_of_size(4193976) |
| //v_pdu_send1 := create_octetstring_of_size(2093976) |
| log("length of v_pdu_send1: ", lengthof(v_pdu_send1)) |
| v_pdu_send2 := create_octetstring_of_size(4193976) |
| //v_pdu_send2 := create_octetstring_of_size(2093976) |
| log("length of v_pdu_send2: ", lengthof(v_pdu_send2)) |
| |
| v_ptc_j1939SendInitiator1.start(f_ptc_J1939SendInitiator( |
| e_testbody1, |
| c_send_prio, |
| c_addr_source1, |
| c_pgn_destination1, |
| c_addr_destination1, |
| v_pdu_send1)) |
| |
| v_ptc_j1939FrameReceiver1.start(f_ptc_J1939FrameReceiver( |
| e_testbody2, |
| c_addr_destination1, /* p_j1939_addr_source */ |
| c_pgn_destination1, /* p_peer_pgn */ |
| c_addr_source1, /* p_peer_addr */ |
| J1939_NO_NAME, /* p_peer_name */ |
| v_pdu_send1 /* p_j1939_pdu_expected */)) |
| |
| v_ptc_j1939SendInitiator2.start(f_ptc_J1939SendInitiator( |
| e_testbody1, |
| c_send_prio, |
| c_addr_source2, |
| c_pgn_destination2, |
| c_addr_destination2, |
| v_pdu_send2)) |
| |
| v_ptc_j1939FrameReceiver2.start(f_ptc_J1939FrameReceiver( |
| e_testbody2, |
| c_addr_destination2, /* p_j1939_addr_source */ |
| c_pgn_destination2, /* p_peer_pgn */ |
| c_addr_source2, /* p_peer_addr */ |
| J1939_NO_NAME, /* p_peer_name */ |
| v_pdu_send2 /* p_j1939_pdu_expected */)) |
| |
| var e_Phase v_phase |
| |
| for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) { |
| f_startPhase(v_phase) |
| log("MTC: ", v_phase) |
| f_awaitEndPhase(v_phase) |
| } |
| all component.done; |
| log("MTC done") |
| |
| disconnect(mtc:pt_sync, v_ptc_j1939SendInitiator1:pt_sync) |
| disconnect(mtc:pt_sync, v_ptc_j1939FrameReceiver1:pt_sync) |
| disconnect(mtc:pt_sync, v_ptc_j1939SendInitiator2:pt_sync) |
| disconnect(mtc:pt_sync, v_ptc_j1939FrameReceiver2:pt_sync) |
| all component.kill; |
| } |
| |
| testcase tc_can_j1939_address_claim() runs on MTC { |
| var PTC v_ptc_j1939AddressClaimInitiator := PTC.create("PTC1_ptc_j1939AddressClaimInitiator") alive |
| |
| f_addSyncSlaveSet(v_ptc_j1939AddressClaimInitiator, v_PTCSet) |
| |
| connect(mtc:pt_sync, v_ptc_j1939AddressClaimInitiator:pt_sync) |
| |
| const J1939_NAME c_j1939_name_source := '1122334455667789'O |
| |
| v_ptc_j1939AddressClaimInitiator.start(f_j1939_address_claim( |
| e_testbody1, |
| c_j1939_name_source)) |
| |
| var e_Phase v_phase |
| |
| for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) { |
| f_startPhase(v_phase) |
| log("MTC: ", v_phase) |
| f_awaitEndPhase(v_phase) |
| } |
| |
| all component.done; |
| log("MTC done") |
| |
| disconnect(mtc:pt_sync, v_ptc_j1939AddressClaimInitiator:pt_sync) |
| |
| |
| all component.kill; |
| } |
| |
| testcase tc_can_j1939_send_to_name_and_receive_message() runs on MTC { |
| // before running this test cases start the j1939 address claim deamons via commandline |
| //j1939acd -r 100,80-120 -c /tmp/1122334455667789.jacd 1122334455667789 |
| //j1939acd -r 100,80-120 -c /tmp/1122334455667788.jacd 1122334455667788 |
| |
| var PTC v_ptc_j1939SendInitiatorECU := PTC.create("PTC1_ptc_j1939SendInitiatorECU") alive |
| var PTC v_ptc_j1939FrameReceiverVT := PTC.create("PTC2_ptc_j1939FrameReceiverVT") alive |
| |
| f_addSyncSlaveSet(v_ptc_j1939SendInitiatorECU, v_PTCSet) |
| f_addSyncSlaveSet(v_ptc_j1939FrameReceiverVT, v_PTCSet) |
| |
| connect(mtc:pt_sync, v_ptc_j1939SendInitiatorECU:pt_sync) |
| connect(mtc:pt_sync, v_ptc_j1939FrameReceiverVT:pt_sync) |
| |
| |
| const J1939_NAME c_name_VT := '1122334455667788'O |
| const J1939_NAME c_name_ECU := '1122334455667789'O |
| const integer c_send_prio := 2 |
| const octetstring c_pgn_ECU2VT := '00E700'O // ECU to VT |
| |
| |
| |
| var octetstring v_pdu_send := 'FEFEFFFFFFFF00FF'O |
| |
| v_ptc_j1939SendInitiatorECU.start(f_ptc_J1939SendToNameInitiator( |
| e_testbody3, |
| c_send_prio, |
| c_name_ECU, /* name source */ |
| c_pgn_ECU2VT, /* pgn destination */ |
| c_name_VT, /* name destination */ |
| v_pdu_send)) |
| |
| v_ptc_j1939FrameReceiverVT.start(f_ptc_J1939FrameReceiverByName( |
| e_testbody4, |
| c_name_VT, /* p_j1939_name_local */ |
| c_pgn_ECU2VT, /* p_pgn_local */ |
| J1939_NO_ADDR, /* p_peer_addr */ |
| c_name_ECU, /* p_peer_name */ |
| v_pdu_send /* p_j1939_pdu_expected */)) |
| |
| var e_Phase v_phase |
| |
| for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) { |
| f_startPhase(v_phase) |
| log("MTC: ", v_phase) |
| f_awaitEndPhase(v_phase) |
| } |
| |
| all component.done; |
| log("MTC done") |
| |
| disconnect(mtc:pt_sync, v_ptc_j1939SendInitiatorECU:pt_sync) |
| disconnect(mtc:pt_sync, v_ptc_j1939FrameReceiverVT:pt_sync) |
| all component.kill; |
| } |
| |
| testcase tc_can_j1939_send_to_global_address_and_receive_message() runs on MTC { |
| // before running this test cases start the j1939 address claim deamons via commandline |
| //j1939acd -r 100,80-120 -c /tmp/1122334455667789.jacd 1122334455667789 |
| //j1939acd -r 100,80-120 -c /tmp/1122334455667788.jacd 1122334455667788 |
| |
| var PTC v_ptc_j1939SendInitiatorVT := PTC.create("PTC1_ptc_j1939SendInitiatorVT") alive |
| var PTC v_ptc_j1939FrameReceiverECU := PTC.create("PTC2_ptc_j1939FrameReceiverECU") alive |
| |
| f_addSyncSlaveSet(v_ptc_j1939SendInitiatorVT, v_PTCSet) |
| f_addSyncSlaveSet(v_ptc_j1939FrameReceiverECU, v_PTCSet) |
| |
| connect(mtc:pt_sync, v_ptc_j1939SendInitiatorVT:pt_sync) |
| connect(mtc:pt_sync, v_ptc_j1939FrameReceiverECU:pt_sync) |
| |
| |
| const J1939_NAME c_name_VT := '1122334455667788'O |
| const J1939_NAME c_name_ECU := '1122334455667789'O |
| const integer c_send_prio := 2 |
| const octetstring c_pgn_VT2ECU := '00E600'O // VT to ECU |
| |
| |
| |
| var octetstring v_pdu_send := 'FF0104FFFFFFFFFF'O |
| |
| v_ptc_j1939SendInitiatorVT.start(f_ptc_J1939SendToGlobalAddressInitiator( |
| e_testbody3, |
| c_send_prio, |
| c_name_VT, /* name source */ |
| c_pgn_VT2ECU, /* pgn destination */ |
| v_pdu_send)) |
| |
| v_ptc_j1939FrameReceiverECU.start(f_ptc_J1939FrameBroadcastReceiver( |
| e_testbody4, |
| c_name_ECU, /* p_j1939_name_local */ |
| c_pgn_VT2ECU, /* p_pgn_local */ |
| v_pdu_send /* p_j1939_pdu_expected */)) |
| |
| var e_Phase v_phase |
| |
| for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) { |
| f_startPhase(v_phase) |
| log("MTC: ", v_phase) |
| f_awaitEndPhase(v_phase) |
| } |
| |
| all component.done; |
| log("MTC done") |
| |
| disconnect(mtc:pt_sync, v_ptc_j1939SendInitiatorVT:pt_sync) |
| disconnect(mtc:pt_sync, v_ptc_j1939FrameReceiverECU:pt_sync) |
| all component.kill; |
| } |
| |
| |
| testcase tc_can_j1939_request_for_address_claimed() runs on MTC { |
| var PTC v_ptc_j1939RequestForAddressClaimedInitiator := PTC.create("PTC1_ptc_j1939v_ptc_j1939RequestForAddressClaimedInitiator") alive |
| |
| f_addSyncSlaveSet(v_ptc_j1939RequestForAddressClaimedInitiator, v_PTCSet) |
| |
| connect(mtc:pt_sync, v_ptc_j1939RequestForAddressClaimedInitiator:pt_sync) |
| |
| //const J1939_NAME c_j1939_name_source := '1122334455667788'O |
| const J1939_NAME c_j1939_name_source := J1939_NO_NAME |
| const octetstring c_j1939_pdu_send := '00EE00'O |
| |
| v_ptc_j1939RequestForAddressClaimedInitiator.start(f_j1939_request_for_address_claimed( |
| e_testbody1, |
| c_j1939_name_source, |
| c_j1939_pdu_send)) |
| |
| var e_Phase v_phase |
| |
| for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) { |
| f_startPhase(v_phase) |
| log("MTC: ", v_phase) |
| f_awaitEndPhase(v_phase) |
| } |
| |
| all component.done; |
| log("MTC done") |
| |
| disconnect(mtc:pt_sync, v_ptc_j1939RequestForAddressClaimedInitiator:pt_sync) |
| |
| |
| all component.kill; |
| } |
| |
| testcase tc_can_j1939_receive_message() runs on MTC { |
| var PTC v_ptc_j1939FrameReceiver := PTC.create("PTC2_ptc_j1939FrameReceiver") alive |
| |
| f_addSyncSlaveSet(v_ptc_j1939FrameReceiver, v_PTCSet) |
| |
| connect(mtc:pt_sync, v_ptc_j1939FrameReceiver:pt_sync) |
| |
| |
| const octetstring c_addr_source1 := J1939_NO_ADDR |
| const octetstring c_pgn_destination1 := '00E600'O // ECU to VT |
| const octetstring c_addr_destination1 := 'F8'O // '90'O |
| |
| |
| |
| template octetstring v_pdu_receive := ?//''O |
| |
| v_ptc_j1939FrameReceiver.start(f_ptc_J1939FrameReceiver( |
| e_testbody2, |
| c_addr_destination1, /* p_j1939_addr_source */ |
| c_pgn_destination1, /* p_peer_pgn */ |
| c_addr_source1, /* p_peer_addr */ |
| J1939_NO_NAME, /* p_peer_name */ |
| v_pdu_receive /* p_j1939_pdu_expected */)) |
| |
| var e_Phase v_phase |
| |
| for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) { |
| f_startPhase(v_phase) |
| log("MTC: ", v_phase) |
| f_awaitEndPhase(v_phase) |
| } |
| |
| all component.done; |
| log("MTC done") |
| |
| disconnect(mtc:pt_sync, v_ptc_j1939FrameReceiver:pt_sync) |
| |
| all component.kill; |
| } |
| |
| testcase tc_can_j1939_receive_message_VT2ECU() runs on MTC { |
| var PTC v_ptc_j1939FrameReceiver := PTC.create("PTC2_ptc_j1939FrameReceiver") alive |
| |
| f_addSyncSlaveSet(v_ptc_j1939FrameReceiver, v_PTCSet) |
| |
| connect(mtc:pt_sync, v_ptc_j1939FrameReceiver:pt_sync) |
| |
| template J1939_NAME t_name_source := '80001d002e030231'O //J1939_NO_NAME |
| template octetstring t_pgn_source := '00E600'O // VT to ECU |
| template octetstring t_addr_source := ? //'F7'O //J1939_IDLE_ADDR |
| const octetstring c_pgn_local := '00E600'O //J1939_NO_PGN |
| const octetstring c_addr_local := 'F8'O // J1939_NO_ADDR |
| const J1939_NAME c_name_local := J1939_NO_NAME // '80003d002e030231'O //'80001d002e030231'O |
| |
| |
| var template octetstring v_pdu_receive := 'c7ff02cde001e001'O |
| |
| //log("length of v_pdu_receive: ", lengthof(v_pdu_receive)) |
| |
| v_ptc_j1939FrameReceiver.start(f_ptc_J1939FrameReceiverUntilExpectedMessage( |
| e_testbody2, |
| c_name_local, |
| c_pgn_local, |
| c_addr_local, /* p_j1939_addr_source */ |
| t_pgn_source, /* p_peer_pgn */ |
| t_addr_source, /* p_peer_addr */ |
| t_name_source, /* p_peer_name */ |
| v_pdu_receive /* p_j1939_pdu_expected */)) |
| |
| var e_Phase v_phase |
| |
| for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) { |
| f_startPhase(v_phase) |
| log("MTC: ", v_phase) |
| f_awaitEndPhase(v_phase) |
| } |
| all component.done; |
| log("MTC done") |
| |
| disconnect(mtc:pt_sync, v_ptc_j1939FrameReceiver:pt_sync) |
| |
| all component.kill; |
| } |
| testcase tc_can_j1939_receive_message_ECU2VT() runs on MTC { |
| var PTC v_ptc_j1939FrameReceiver := PTC.create("PTC2_ptc_j1939FrameReceiver") alive |
| |
| f_addSyncSlaveSet(v_ptc_j1939FrameReceiver, v_PTCSet) |
| |
| connect(mtc:pt_sync, v_ptc_j1939FrameReceiver:pt_sync) |
| |
| const J1939_NAME c_name_source := '80001d002e030231'O //J1939_NO_NAME |
| const octetstring c_pgn_source := '00E700'O // ECU to VT |
| const octetstring c_addr_source := 'F8'O //J1939_NO_ADDR |
| template octetstring c_pgn_destination := '00E700'O //J1939_NO_PGN |
| template octetstring c_addr_destination := ? //J1939_NO_ADDR |
| template J1939_NAME c_name_destination := ? //J1939_NO_NAME //'000000002e030231'O //'80001d002e030231'O |
| |
| |
| var template octetstring v_pdu_receive := ? // 'ff0104ffffffffff'O |
| |
| |
| //log("length of v_pdu_receive: ", lengthof(v_pdu_receive)) |
| |
| v_ptc_j1939FrameReceiver.start(f_ptc_J1939FrameReceiverUntilExpectedMessage( |
| e_testbody2, |
| c_name_source, |
| c_pgn_source, |
| c_addr_source, /* p_j1939_addr_source */ |
| c_pgn_destination, /* p_peer_pgn */ |
| c_addr_destination, /* p_peer_addr */ |
| c_name_destination, /* p_peer_name */ |
| v_pdu_receive /* p_j1939_pdu_expected */)) |
| |
| var e_Phase v_phase |
| |
| for(v_phase := c_firstPhase; v_phase < e_testcase_complete;v_phase := f_incMTCPhase(v_phase)) { |
| f_startPhase(v_phase) |
| log("MTC: ", v_phase) |
| f_awaitEndPhase(v_phase) |
| } |
| |
| all component.done; |
| log("MTC done") |
| |
| disconnect(mtc:pt_sync, v_ptc_j1939FrameReceiver:pt_sync) |
| |
| all component.kill; |
| } |
| |
| //========================================================================= |
| // Control |
| //========================================================================= |
| |
| // Insert control part here if applicable! |
| |
| } // end of module |