blob: 6dd2bee39db25467d7ec671a9b07ac8755bb4b72 [file] [log] [blame]
/* 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