Browse Source

Unit test for mission transfer error string checking

QGC4.4
DoinLakeFlyer 5 years ago
parent
commit
ffb55f9233
  1. 49
      src/MissionManager/MissionManagerTest.cc
  2. 5
      src/MissionManager/MissionManagerTest.h
  3. 4
      src/comm/MockLink.cc
  4. 3
      src/comm/MockLink.h
  5. 9
      src/comm/MockLinkMissionItemHandler.cc
  6. 4
      src/comm/MockLinkMissionItemHandler.h

49
src/MissionManager/MissionManagerTest.cc

@ -27,9 +27,9 @@ MissionManagerTest::MissionManagerTest(void)
} }
void MissionManagerTest::_writeItems(MockLinkMissionItemHandler::FailureMode_t failureMode, bool shouldFail) void MissionManagerTest::_writeItems(MockLinkMissionItemHandler::FailureMode_t failureMode, MAV_MISSION_RESULT failureAckResult, bool shouldFail)
{ {
_mockLink->setMissionItemFailureMode(failureMode); _mockLink->setMissionItemFailureMode(failureMode, failureAckResult);
// Setup our test case data // Setup our test case data
QList<MissionItem*> missionItems; QList<MissionItem*> missionItems;
@ -115,11 +115,11 @@ void MissionManagerTest::_writeItems(MockLinkMissionItemHandler::FailureMode_t f
_multiSpyMissionManager->clearAllSignals(); _multiSpyMissionManager->clearAllSignals();
} }
void MissionManagerTest::_roundTripItems(MockLinkMissionItemHandler::FailureMode_t failureMode, bool shouldFail) void MissionManagerTest::_roundTripItems(MockLinkMissionItemHandler::FailureMode_t failureMode, MAV_MISSION_RESULT failureAckResult, bool shouldFail)
{ {
_writeItems(MockLinkMissionItemHandler::FailNone, false); _writeItems(MockLinkMissionItemHandler::FailNone, failureAckResult, false);
_mockLink->setMissionItemFailureMode(failureMode); _mockLink->setMissionItemFailureMode(failureMode, failureAckResult);
// Read the items back from the vehicle // Read the items back from the vehicle
_missionManager->loadFromVehicle(); _missionManager->loadFromVehicle();
@ -253,8 +253,8 @@ void MissionManagerTest::_testWriteFailureHandlingWorker(void)
for (size_t i=0; i<sizeof(rgTestCases)/sizeof(rgTestCases[0]); i++) { for (size_t i=0; i<sizeof(rgTestCases)/sizeof(rgTestCases[0]); i++) {
const WriteTestCase_t* pCase = &rgTestCases[i]; const WriteTestCase_t* pCase = &rgTestCases[i];
qDebug() << "TEST CASE " << pCase->failureText; qDebug() << "TEST CASE _testWriteFailureHandlingWorker" << pCase->failureText;
_writeItems(pCase->failureMode, pCase->shouldFail); _writeItems(pCase->failureMode, MAV_MISSION_ERROR, pCase->shouldFail);
_mockLink->resetMissionItemHandler(); _mockLink->resetMissionItemHandler();
} }
} }
@ -298,8 +298,8 @@ void MissionManagerTest::_testReadFailureHandlingWorker(void)
for (size_t i=0; i<sizeof(rgTestCases)/sizeof(rgTestCases[0]); i++) { for (size_t i=0; i<sizeof(rgTestCases)/sizeof(rgTestCases[0]); i++) {
const ReadTestCase_t* pCase = &rgTestCases[i]; const ReadTestCase_t* pCase = &rgTestCases[i];
qDebug() << "TEST CASE " << pCase->failureText; qDebug() << "TEST CASE _testReadFailureHandlingWorker" << pCase->failureText;
_roundTripItems(pCase->failureMode, pCase->shouldFail); _roundTripItems(pCase->failureMode, MAV_MISSION_ERROR, pCase->shouldFail);
_mockLink->resetMissionItemHandler(); _mockLink->resetMissionItemHandler();
_multiSpyMissionManager->clearAllSignals(); _multiSpyMissionManager->clearAllSignals();
} }
@ -329,3 +329,34 @@ void MissionManagerTest::_testReadFailureHandlingPX4(void)
_initForFirmwareType(MAV_AUTOPILOT_PX4); _initForFirmwareType(MAV_AUTOPILOT_PX4);
_testReadFailureHandlingWorker(); _testReadFailureHandlingWorker();
} }
void MissionManagerTest::_testErrorAckFailureStrings(void)
{
_initForFirmwareType(MAV_AUTOPILOT_PX4);
typedef struct {
const char* ackResultStr;
MAV_MISSION_RESULT ackResult;
} ErrorStringTestCase_t;
static const ErrorStringTestCase_t rgTestCases[] = {
{ "MAV_MISSION_UNSUPPORTED_FRAME", MAV_MISSION_UNSUPPORTED_FRAME },
{ "MAV_MISSION_UNSUPPORTED", MAV_MISSION_UNSUPPORTED },
{ "MAV_MISSION_INVALID_PARAM1", MAV_MISSION_INVALID_PARAM1 },
{ "MAV_MISSION_INVALID_PARAM2", MAV_MISSION_INVALID_PARAM2 },
{ "MAV_MISSION_INVALID_PARAM3", MAV_MISSION_INVALID_PARAM3 },
{ "MAV_MISSION_INVALID_PARAM4", MAV_MISSION_INVALID_PARAM4 },
{ "MAV_MISSION_INVALID_PARAM5_X", MAV_MISSION_INVALID_PARAM5_X },
{ "MAV_MISSION_INVALID_PARAM6_Y", MAV_MISSION_INVALID_PARAM6_Y },
{ "MAV_MISSION_INVALID_PARAM7", MAV_MISSION_INVALID_PARAM7 },
{ "MAV_MISSION_INVALID_SEQUENCE", MAV_MISSION_INVALID_SEQUENCE },
};
for (size_t i=0; i<sizeof(rgTestCases)/sizeof(rgTestCases[0]); i++) {
const ErrorStringTestCase_t* pCase = &rgTestCases[i];
qDebug() << "TEST CASE _testErrorAckFailureStrings" << pCase->ackResultStr;
_writeItems(MockLinkMissionItemHandler::FailWriteRequest1ErrorAck, pCase->ackResult, true /* shouldFail */);
_mockLink->resetMissionItemHandler();
}
}

5
src/MissionManager/MissionManagerTest.h

@ -31,10 +31,11 @@ private slots:
void _testWriteFailureHandlingAPM(void); void _testWriteFailureHandlingAPM(void);
void _testReadFailureHandlingPX4(void); void _testReadFailureHandlingPX4(void);
void _testReadFailureHandlingAPM(void); void _testReadFailureHandlingAPM(void);
void _testErrorAckFailureStrings(void);
private: private:
void _roundTripItems(MockLinkMissionItemHandler::FailureMode_t failureMode, bool shouldFail); void _roundTripItems(MockLinkMissionItemHandler::FailureMode_t failureMode, MAV_MISSION_RESULT failureAckResult, bool shouldFail);
void _writeItems(MockLinkMissionItemHandler::FailureMode_t failureMode, bool shouldFail); void _writeItems(MockLinkMissionItemHandler::FailureMode_t failureMode, MAV_MISSION_RESULT failureAckResult, bool shouldFail);
void _testWriteFailureHandlingWorker(void); void _testWriteFailureHandlingWorker(void);
void _testReadFailureHandlingWorker(void); void _testReadFailureHandlingWorker(void);

4
src/comm/MockLink.cc

@ -1013,9 +1013,9 @@ void MockLink::_respondWithAutopilotVersion(void)
respondWithMavlinkMessage(msg); respondWithMavlinkMessage(msg);
} }
void MockLink::setMissionItemFailureMode(MockLinkMissionItemHandler::FailureMode_t failureMode) void MockLink::setMissionItemFailureMode(MockLinkMissionItemHandler::FailureMode_t failureMode, MAV_MISSION_RESULT failureAckResult)
{ {
_missionItemHandler.setMissionItemFailureMode(failureMode); _missionItemHandler.setFailureMode(failureMode, failureAckResult);
} }
void MockLink::_sendHomePosition(void) void MockLink::_sendHomePosition(void)

3
src/comm/MockLink.h

@ -134,7 +134,8 @@ public:
/// Sets a failure mode for unit testing /// Sets a failure mode for unit testing
/// @param failureMode Type of failure to simulate /// @param failureMode Type of failure to simulate
void setMissionItemFailureMode(MockLinkMissionItemHandler::FailureMode_t failureMode); /// @param failureAckResult Error to send if one the ack error modes
void setMissionItemFailureMode(MockLinkMissionItemHandler::FailureMode_t failureMode, MAV_MISSION_RESULT failureAckResult);
/// Called to send a MISSION_ACK message while the MissionManager is in idle state /// Called to send a MISSION_ACK message while the MissionManager is in idle state
void sendUnexpectedMissionAck(MAV_MISSION_RESULT ackType) { _missionItemHandler.sendUnexpectedMissionAck(ackType); } void sendUnexpectedMissionAck(MAV_MISSION_RESULT ackType) { _missionItemHandler.sendUnexpectedMissionAck(ackType); }

9
src/comm/MockLinkMissionItemHandler.cc

@ -200,7 +200,7 @@ void MockLinkMissionItemHandler::_handleMissionRequest(const mavlink_message_t&
if ((_failureMode == FailReadRequest0ErrorAck && request.seq == 0) || if ((_failureMode == FailReadRequest0ErrorAck && request.seq == 0) ||
(_failureMode == FailReadRequest1ErrorAck && request.seq == 1)) { (_failureMode == FailReadRequest1ErrorAck && request.seq == 1)) {
_sendAck(MAV_MISSION_ERROR); _sendAck(_failureAckResult);
} else { } else {
MissionItemBoth_t missionItemBoth; MissionItemBoth_t missionItemBoth;
@ -327,7 +327,7 @@ void MockLinkMissionItemHandler::_requestNextMissionItem(int sequenceNumber)
if ((_failureMode == FailWriteRequest0ErrorAck && sequenceNumber == 0) || if ((_failureMode == FailWriteRequest0ErrorAck && sequenceNumber == 0) ||
(_failureMode == FailWriteRequest1ErrorAck && sequenceNumber == 1)) { (_failureMode == FailWriteRequest1ErrorAck && sequenceNumber == 1)) {
qCDebug(MockLinkMissionItemHandlerLog) << "_requestNextMissionItem sending ack error due to failure mode"; qCDebug(MockLinkMissionItemHandlerLog) << "_requestNextMissionItem sending ack error due to failure mode";
_sendAck(MAV_MISSION_ERROR); _sendAck(_failureAckResult);
} else { } else {
mavlink_message_t message; mavlink_message_t message;
@ -408,7 +408,7 @@ void MockLinkMissionItemHandler::_handleMissionItem(const mavlink_message_t& msg
_writeSequenceIndex++; _writeSequenceIndex++;
if (_writeSequenceIndex < _writeSequenceCount) { if (_writeSequenceIndex < _writeSequenceCount) {
if (_failureMode == FailWriteFinalAckMissingRequests && _writeSequenceIndex == 3) { if (_failureMode == FailWriteFinalAckMissingRequests && _writeSequenceIndex == 3) {
// Send MAV_MISSION_ACCPETED ack too early // Send MAV_MISSION_ACCEPTED ack too early
_sendAck(MAV_MISSION_ACCEPTED); _sendAck(MAV_MISSION_ACCEPTED);
} else { } else {
_requestNextMissionItem(_writeSequenceIndex); _requestNextMissionItem(_writeSequenceIndex);
@ -448,9 +448,10 @@ void MockLinkMissionItemHandler::sendUnexpectedMissionRequest(void)
Q_ASSERT(false); Q_ASSERT(false);
} }
void MockLinkMissionItemHandler::setMissionItemFailureMode(FailureMode_t failureMode) void MockLinkMissionItemHandler::setFailureMode(FailureMode_t failureMode, MAV_MISSION_RESULT failureAckResult)
{ {
_failureMode = failureMode; _failureMode = failureMode;
_failureAckResult = failureAckResult;
} }
void MockLinkMissionItemHandler::shutdown(void) void MockLinkMissionItemHandler::shutdown(void)

4
src/comm/MockLinkMissionItemHandler.h

@ -63,7 +63,8 @@ public:
/// Sets a failure mode for unit testing /// Sets a failure mode for unit testing
/// @param failureMode Type of failure to simulate /// @param failureMode Type of failure to simulate
void setMissionItemFailureMode(FailureMode_t failureMode); /// @param failureAckResult Error to send if one the ack error modes
void setFailureMode(FailureMode_t failureMode, MAV_MISSION_RESULT failureAckResult);
/// Called to send a MISSION_ACK message while the MissionManager is in idle state /// Called to send a MISSION_ACK message while the MissionManager is in idle state
void sendUnexpectedMissionAck(MAV_MISSION_RESULT ackType); void sendUnexpectedMissionAck(MAV_MISSION_RESULT ackType);
@ -115,6 +116,7 @@ private:
QTimer* _missionItemResponseTimer; QTimer* _missionItemResponseTimer;
FailureMode_t _failureMode; FailureMode_t _failureMode;
MAV_MISSION_RESULT _failureAckResult;
bool _sendHomePositionOnEmptyList; bool _sendHomePositionOnEmptyList;
MAVLinkProtocol* _mavlinkProtocol; MAVLinkProtocol* _mavlinkProtocol;
bool _failReadRequestListFirstResponse; bool _failReadRequestListFirstResponse;

Loading…
Cancel
Save