/*! * * 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" //using namespace Can; // Project #include "guiglobals.h" #include "caninterface.h" #include "frameinterface.h" #include "messagedispatcher.h" #include "applicationcontroller.h" #include "guicontroller.h" #include "maintimer.h" #include "format.h" 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("Error: Connection"); Can::_CanInterface->_canInterface = "can1"; Can::_CanInterface ->init(); Can::_CanInterface ->enableConsoleOut(false); QCOMPARE(Can::_CanInterface->status().left(mTr.length()), mTr); } void tst_canbus::tst_CanInterface_Connect_NoError() { Can::_CanInterface->_canInterface = "can0"; Can::_CanInterface ->init(); Can::_CanInterface ->enableConsoleOut(true); QString mTr = tr("Connected"); QCOMPARE(Can::_CanInterface->status().left(mTr.length()), mTr); Can::_CanInterface->onFrameReceive (); } void tst_canbus::tst_FrameInterface_Init() { Can::_FrameInterface->init(); Can::_MessageDispatcher->init(); Can::_MessageDispatcher->enableConsoleOut(true); connect(Can::_MessageDispatcher, &Can::MessageDispatcher::didFrameTransmit, [=](Can_Id vCanId , const QByteArray &vPayload) { _emited = true; QCOMPARE(Format::toHexString(vPayload), _expected); }); connect(Can::_MessageDispatcher, &Can::MessageDispatcher::didActionReceive, [=](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_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); QCOMPARE(_emited, false); //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, {}); QCOMPARE(_emited, false); // 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::Can_Id::eChlid_HD); mPayload = "A5.01.00.01.00.6F.00.00"; mFrame.setPayload(QByteArray::fromHex(mPayload.remove(QLatin1Char('.')).toLatin1())); emit Can::_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::Can_Id::eChlid_HD); mPayload = "A5.01.00.01.01.5E.00.00"; mFrame.setPayload(QByteArray::fromHex(mPayload.remove(QLatin1Char('.')).toLatin1())); emit Can::_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::Can_Id::eChlid_HD_DG); mPayload = "A5.01.00.01.01.5E.00.00"; mFrame.setPayload(QByteArray::fromHex(mPayload.remove(QLatin1Char('.')).toLatin1())); emit Can::_CanInterface->didFrameReceive(mFrame); QCOMPARE(_emited, false); // 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 Can::_CanInterface->didFrameReceive(mFrame); QCOMPARE(_emited, false); // 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::Can_Id::eChlid_HD); mPayload = "A5.01.00.01.00.66.00.00"; mFrame.setPayload(QByteArray::fromHex(mPayload.remove(QLatin1Char('.')).toLatin1())); emit Can::_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::Can_Id::eChlid_HD); mPayload = "A5.01.00.01.00.6F"; mFrame.setPayload(QByteArray::fromHex(mPayload.remove(QLatin1Char('.')).toLatin1())); emit Can::_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::Can_Id::eChlid_HD); mPayload = "A5.01.00.01.00.6F.FF.FF.FF"; mFrame.setPayload(QByteArray::fromHex(mPayload.remove(QLatin1Char('.')).toLatin1())); emit Can::_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::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 Can::_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::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 Can::_CanInterface->didFrameReceive(mFrame); } QCOMPARE(_emited, false); // Should not emit due to - ERROR : "Incorrect data for Message ID (HD) '0x0500'" } void tst_canbus::cleanup() { //disconnect(Can::_FrameInterface ); //disconnect(Can::_MessageDispatcher ); //Can::_CanInterface ->initConnections(); //Can::_FrameInterface ->initConnections(); //Can::_MessageDispatcher ->initConnections(); } void tst_canbus::cleanupTestCase() { Can::_CanInterface->quit(); QString mTr = tr("Disconnected"); QCOMPARE(Can::_CanInterface->status().left(mTr.length()), mTr); }