/*! * * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * copyright * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, * IN PART OR IN WHOLE, * WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * file tst_canbus.cpp * date 11/21/2019 * author Behrouz NematiPour * */ #include "tst_canbus.h" // Project #include "caninterface.h" #include "frameinterface.h" #include "messagedispatcher.h" using namespace Can; tst_canbus::tst_canbus(QObject *parent) : QObject(parent) { } void tst_canbus::initTestCase() { } void tst_canbus::initTestCase_data() { } void tst_canbus::init() { _emited = false; } void tst_canbus::tst_CanInterface_Connect_Error_Interface() { QString mTr = tr("Connection"); _CanInterface._canInterface = "can1"; _CanInterface._init = false; _CanInterface.init(); _CanInterface.enableConsoleOut(false); QCOMPARE(_CanInterface.status().left(mTr.length()), mTr); } void tst_canbus::tst_CanInterface_Connect_NoError() { _CanInterface._canInterface = "can0"; _CanInterface._init = false; _CanInterface.init(); _CanInterface.enableConsoleOut(true); QString mTr = tr("Connected"); QCOMPARE(_CanInterface.status().left(mTr.length()), mTr); _CanInterface.onFrameReceive (); } void tst_canbus::tst_FrameInterface_Init() { _FrameInterface .init(); _MessageDispatcher .init(); _MessageDispatcher .enableConsoleOut(true); connect(&_MessageDispatcher, &MessageDispatcher::didFrameTransmit, [=](Can::Can_Id vCanId , const QByteArray &vPayload) { _emited = true; QCOMPARE(Format::toHexString(vPayload), _expected); }); connect(&_MessageDispatcher, &MessageDispatcher::didActionReceive, [=](Gui::GuiActionType vAction , const QVariantList &vData ) { _emited = true; QVERIFY(vAction == _action); for (int i = 0; i < vData.length(); i++) { if (! strcmp(vData[i].typeName(), "float")) { float f1 = vData[i].toFloat(); float f2 = _data[i].toFloat(); QVERIFY(Types::floatCompare(f1, f2)); } else { QVERIFY(vData[i] == _data[i]); } } }); } void tst_canbus::tst_FrameInterface_ReInit() { QVERIFY( ! _FrameInterface .init() ); // Coverage QVERIFY( ! _MessageDispatcher .init() ); // Coverage } void tst_canbus::tst_FrameInterface_ActionTransmit_KeepAlive() { _expected = "A5.07.00.00.E3.00.00.00"; _MessageDispatcher.onActionTransmit(Gui::GuiActionType::KeepAlive, {}); QVERIFY(_emited); } void tst_canbus::tst_FrameInterface_TransmitFrame_LongerData() { _expected = QByteArray("123456789"); _FrameInterface.transmitFrame(Can_Id::eChlid_HD, _expected); QVERIFY( ! _emited ); //there is no signal call - Code Coverage only : Error : "Payload can't be larger than 8 bytes" } void tst_canbus::tst_FrameInterface_ActionTransmit_PowerOff_Accepted() { _expected = "A5.01.00.01.01.5E.00.00"; QVariantList mData {static_cast(Gui::GuiActionData::Accepted)}; _MessageDispatcher.onActionTransmit(Gui::GuiActionType::PowerOff, mData); QVERIFY(_emited); } void tst_canbus::tst_FrameInterface_ActionTransmit_PowerOff_Rejected() { _expected = "A5.01.00.01.02.0D.00.00"; QVariantList mData {static_cast(Gui::GuiActionData::Rejected)}; _MessageDispatcher.onActionTransmit(Gui::GuiActionType::PowerOff, mData); QVERIFY(_emited); } void tst_canbus::tst_FrameInterface_ActionTransmit_PowerOff() { _expected = "A5.01.00.01.00.6F.00.00"; QVariantList mData {static_cast(Gui::GuiActionData::NoData)}; _MessageDispatcher.onActionTransmit(Gui::GuiActionType::PowerOff, mData); QVERIFY(_emited); } void tst_canbus::tst_FrameInterface_ActionTransmit_LongFF() { // An example of longest data transmission by Gui::GuiActionType::String // which can be as long as 255 byte. _expected = "A5.FF.FF.03.41.42.43.EF"; QVariantList mData {"ABC"}; _MessageDispatcher.onActionTransmit(Gui::GuiActionType::String, mData); QVERIFY(_emited); } void tst_canbus::tst_FrameInterface_ActionTransmit_Unknown() { _expected = ""; _MessageDispatcher.onActionTransmit(Gui::GuiActionType::Unknown, {}); QVERIFY( ! _emited ); // should not emit the signal due to unknown action } void tst_canbus::tst_FrameInterface_FrameReceived_PowerOff() { _action = Gui::GuiActionType::PowerOff; _data = {0}; QCanBusFrame mFrame; QString mPayload; mFrame.setFrameId(Can_Id::eChlid_HD); mPayload = "A5.01.00.01.00.6F.00.00"; mFrame.setPayload(QByteArray::fromHex(mPayload.remove(QLatin1Char('.')).toLatin1())); emit _CanInterface.didFrameReceive(mFrame); QVERIFY(_emited); } void tst_canbus::tst_FrameInterface_FrameReceived_PowerOff_Timeout() { _action = Gui::GuiActionType::PowerOff; _data = {1}; QCanBusFrame mFrame; QString mPayload; mFrame.setFrameId(Can_Id::eChlid_HD); mPayload = "A5.01.00.01.01.5E.00.00"; mFrame.setPayload(QByteArray::fromHex(mPayload.remove(QLatin1Char('.')).toLatin1())); emit _CanInterface.didFrameReceive(mFrame); QVERIFY(_emited); } void tst_canbus::tst_FrameInterface_FrameReceived_Channel_NotListen() { _action = Gui::GuiActionType::PowerOff; _data = {1}; QCanBusFrame mFrame; QString mPayload; mFrame.setFrameId(Can_Id::eChlid_HD_DG); mPayload = "A5.01.00.01.01.5E.00.00"; mFrame.setPayload(QByteArray::fromHex(mPayload.remove(QLatin1Char('.')).toLatin1())); emit _CanInterface.didFrameReceive(mFrame); QVERIFY( ! _emited ); // should not be emitted due to not listening channel } void tst_canbus::tst_FrameInterface_FrameReceived_Channel_Incorrect() { _action = Gui::GuiActionType::PowerOff; _data = {1}; QCanBusFrame mFrame; QString mPayload; mFrame.setFrameId(0x999); mPayload = "A5.01.00.01.01.5E.00.00"; mFrame.setPayload(QByteArray::fromHex(mPayload.remove(QLatin1Char('.')).toLatin1())); emit _CanInterface.didFrameReceive(mFrame); QVERIFY( ! _emited ); // should not be emitted due to not listening channel } void tst_canbus::tst_FrameInterface_FrameReceived_CRC_Error() { _action = Gui::GuiActionType::PowerOff; _data = {0}; QCanBusFrame mFrame; QString mPayload; mFrame.setFrameId(Can_Id::eChlid_HD); mPayload = "A5.01.00.01.00.66.00.00"; mFrame.setPayload(QByteArray::fromHex(mPayload.remove(QLatin1Char('.')).toLatin1())); emit _CanInterface.didFrameReceive(mFrame); QCOMPARE(_emited, false); // Should not emit due to crc error } void tst_canbus::tst_FrameInterface_FrameReceived_ShortFrame_Error() { _action = Gui::GuiActionType::PowerOff; _data = {0}; QCanBusFrame mFrame; QString mPayload; mFrame.setFrameId(Can_Id::eChlid_HD); mPayload = "A5.01.00.01.00.6F"; mFrame.setPayload(QByteArray::fromHex(mPayload.remove(QLatin1Char('.')).toLatin1())); emit _CanInterface.didFrameReceive(mFrame); QVERIFY(_emited); // Should not emit due to crc error } void tst_canbus::tst_FrameInterface_FrameReceived_LongFrame_Error() { _action = Gui::GuiActionType::PowerOff; _data = {0}; QCanBusFrame mFrame; QString mPayload; mFrame.setFrameId(Can_Id::eChlid_HD); mPayload = "A5.01.00.01.00.6F.FF.FF.FF"; mFrame.setPayload(QByteArray::fromHex(mPayload.remove(QLatin1Char('.')).toLatin1())); emit _CanInterface.didFrameReceive(mFrame); QVERIFY(_emited); // Should not emit due to crc error } void tst_canbus::tst_FrameInterface_FrameReceived_LongFrame_BloodFlow() { _action = Gui::GuiActionType::BloodFlow; _data = { -400, -397.50f, -26.20f, -2000.00f, -2002.50f, 648.75f, 62.50f }; QCanBusFrame mFrame; mFrame.setFrameId(Can_Id::eChlid_HD_Sync); QStringList mPayloadList { "a5.05.00.1c.70.fe.ff.ff" , "00.c0.c6.c3.9a.99.d1.c1" , "00.00.fa.c4.00.50.fa.c4" , "00.30.22.44.00.00.7a.42" , "c4.00.00.00.00.00.00.00" , }; for ( QString payload : mPayloadList ) { mFrame.setPayload(QByteArray::fromHex(payload.remove(QLatin1Char('.')).toLatin1())); emit _CanInterface.didFrameReceive(mFrame); } QVERIFY(_emited); // Should not emit due to crc error } void tst_canbus::tst_FrameInterface_FrameReceived_LongFrame_BloodFlow_LessData() { _action = Gui::GuiActionType::BloodFlow; _data = { -400, -397.50f, -26.20f, -2000.00f, -2002.50f, 648.75f, 62.50f }; QCanBusFrame mFrame; mFrame.setFrameId(Can_Id::eChlid_HD_Sync); QStringList mPayloadList { "a5.05.00.1c.70.fe.ff.ff" , "00.c0.c6.c3.9a.99.d1.c1" , "00.00.fa.c4.00.50.fa.c4" , "00.30.22.44.00.00.7a.42" , }; for ( QString payload : mPayloadList ) { mFrame.setPayload(QByteArray::fromHex(payload.remove(QLatin1Char('.')).toLatin1())); emit _CanInterface.didFrameReceive(mFrame); } QVERIFY( ! _emited ); // Should not emit due to - ERROR : "Incorrect data for Message ID (HD) '0x0500'" } void tst_canbus::tst_FrameInterface_FrameReceived_LongFrame_AlarmStatus() { _action = Gui::GuiActionType::AlarmStatus; _data = { 2, 10, 60, 30, false,true ,false,false, // 0100 true ,false,false,false, // 1000 true ,true ,false,false, // 1100 false,false,false,false, // 0000 }; QCanBusFrame mFrame; mFrame.setFrameId(Can_Id::eChlid_HD_Alarm); QStringList mPayloadList { "a5.02.00.12.02.00.00.00" , "0a.00.00.00.3c.00.00.00" , "1e.00.00.00.12.03.bb.00" , }; for ( QString payload : mPayloadList ) { mFrame.setPayload(QByteArray::fromHex(payload.remove(QLatin1Char('.')).toLatin1())); emit _CanInterface.didFrameReceive(mFrame); } QVERIFY(_emited); } void tst_canbus::tst_FrameInterface_FrameReceived_LongFrame_AlarmStatus_LessData() { _action = Gui::GuiActionType::AlarmStatus; _data = { 2, 10, 60, 30, false,true ,false,false, // 0100 true ,false,false,false, // 1000 true ,true ,false,false, // 1100 false,false,false,false, // 0000 }; QCanBusFrame mFrame; mFrame.setFrameId(Can_Id::eChlid_HD_Alarm); QStringList mPayloadList { "a5.02.00.12.02.00.00.00" , "0a.00.00.00.3c.00.00.00" , }; for ( QString payload : mPayloadList ) { mFrame.setPayload(QByteArray::fromHex(payload.remove(QLatin1Char('.')).toLatin1())); emit _CanInterface.didFrameReceive(mFrame); } QVERIFY( ! _emited ); // Should not emit due to - ERROR : "Incorrect data for Message ID (HD) '0x0200'" } void tst_canbus::cleanup() { } void tst_canbus::cleanupTestCase() { _CanInterface.quitDevice(); QString mTr = tr("Disconnected"); QCOMPARE(_CanInterface.status().left(mTr.length()), mTr); }