@ -232,10 +232,16 @@ void MissionManagerTest::_writeItems(MockLinkMissionItemHandler::FailureMode_t f
@@ -232,10 +232,16 @@ void MissionManagerTest::_writeItems(MockLinkMissionItemHandler::FailureMode_t f
_multiSpy - > clearAllSignals ( ) ;
}
void MissionManagerTest : : _roundTripItems ( void )
void MissionManagerTest : : _roundTripItems ( MockLinkMissionItemHandler : : FailureMode_t failureMode , MissionManager : : ErrorCode_t errorCode , bool failFirstTimeOnly )
{
_writeItems ( MockLinkMissionItemHandler : : FailNone , MissionManager : : InternalError , false ) ;
_mockLink - > setMissionItemFailureMode ( failureMode , failFirstTimeOnly ) ;
if ( failFirstTimeOnly ) {
// Should fail first time, then retry should succed
failureMode = MockLinkMissionItemHandler : : FailNone ;
}
// Read the items back from the vehicle
_missionManager - > requestMissionItems ( ) ;
@ -246,21 +252,69 @@ void MissionManagerTest::_roundTripItems(void)
@@ -246,21 +252,69 @@ void MissionManagerTest::_roundTripItems(void)
_multiSpy - > clearAllSignals ( ) ;
// Now wait for read sequence to complete. We should get both a newMissionItemsAvailable and a
// inProgressChanged signal to signal completion.
_multiSpy - > waitForSignalByIndex ( newMissionItemsAvailableSignalIndex , 1000 ) ;
_multiSpy - > waitForSignalByIndex ( inProgressChangedSignalIndex , 1000 ) ;
if ( failureMode = = MockLinkMissionItemHandler : : FailNone ) {
// This should be clean run
// Now wait for read sequence to complete. We should get:
// inProgressChanged(false) signal to signal completion
// newMissionItemsAvailable signal
_multiSpy - > waitForSignalByIndex ( inProgressChangedSignalIndex , 10000 ) ;
QCOMPARE ( _multiSpy - > checkSignalByMask ( newMissionItemsAvailableSignalMask | inProgressChangedSignalMask ) , true ) ;
QCOMPARE ( _multiSpy - > checkNoSignalByMask ( canEditChangedSignalMask ) , true ) ;
_checkInProgressValues ( false ) ;
} else {
// This should be a failed run
const size_t cTestCases = sizeof ( _rgTestCases ) / sizeof ( _rgTestCases [ 0 ] ) ;
QCOMPARE ( _missionManager - > missionItems ( ) - > count ( ) , ( int ) cTestCases ) ;
QCOMPARE ( _missionManager - > canEdit ( ) , true ) ;
// Wait for read sequence to complete. We should get:
// inProgressChanged(false) signal to signal completion
// error(errorCode, QString) signal
// newMissionItemsAvailable signal
_multiSpy - > waitForSignalByIndex ( inProgressChangedSignalIndex , 10000 ) ;
QCOMPARE ( _multiSpy - > checkSignalByMask ( newMissionItemsAvailableSignalMask | inProgressChangedSignalMask | errorSignalMask ) , true ) ;
// Validate the returned items against our test data
// Validate inProgressChanged signal value
_checkInProgressValues ( false ) ;
for ( size_t i = 0 ; i < cTestCases ; i + + ) {
// Validate error signal values
QSignalSpy * spy = _multiSpy - > getSpyByIndex ( errorSignalIndex ) ;
QList < QVariant > signalArgs = spy - > takeFirst ( ) ;
QCOMPARE ( signalArgs . count ( ) , 2 ) ;
qDebug ( ) < < signalArgs [ 1 ] . toString ( ) ;
QCOMPARE ( signalArgs [ 0 ] . toInt ( ) , ( int ) errorCode ) ;
}
_multiSpy - > clearAllSignals ( ) ;
// Validate returned items
size_t cMissionItemsExpected ;
if ( failureMode = = MockLinkMissionItemHandler : : FailNone | | failFirstTimeOnly = = true ) {
cMissionItemsExpected = sizeof ( _rgTestCases ) / sizeof ( _rgTestCases [ 0 ] ) ;
} else {
switch ( failureMode ) {
case MockLinkMissionItemHandler : : FailReadRequestListNoResponse :
case MockLinkMissionItemHandler : : FailReadRequest0NoResponse :
case MockLinkMissionItemHandler : : FailReadRequest0IncorrectSequence :
case MockLinkMissionItemHandler : : FailReadRequest0ErrorAck :
cMissionItemsExpected = 0 ;
break ;
case MockLinkMissionItemHandler : : FailReadRequest1NoResponse :
case MockLinkMissionItemHandler : : FailReadRequest1IncorrectSequence :
case MockLinkMissionItemHandler : : FailReadRequest1ErrorAck :
cMissionItemsExpected = 1 ;
break ;
default :
// Internal error
Q_ASSERT ( false ) ;
break ;
}
}
QCOMPARE ( _missionManager - > missionItems ( ) - > count ( ) , ( int ) cMissionItemsExpected ) ;
QCOMPARE ( _missionManager - > canEdit ( ) , true ) ;
for ( size_t i = 0 ; i < cMissionItemsExpected ; i + + ) {
const TestCase_t * testCase = & _rgTestCases [ i ] ;
MissionItem * actual = qobject_cast < MissionItem * > ( _missionManager - > missionItems ( ) - > get ( i ) ) ;
@ -276,11 +330,54 @@ void MissionManagerTest::_roundTripItems(void)
@@ -276,11 +330,54 @@ void MissionManagerTest::_roundTripItems(void)
QCOMPARE ( actual - > autoContinue ( ) , testCase - > expectedItem . autocontinue ) ;
QCOMPARE ( actual - > frame ( ) , testCase - > expectedItem . frame ) ;
}
}
void MissionManagerTest : : _testWriteFailureHandling ( void )
{
/*
/// Called to send a MISSION_ACK message while the MissionManager is in idle state
void sendUnexpectedMissionAck ( MAV_MISSION_RESULT ackType ) { _missionItemHandler . sendUnexpectedMissionAck ( ackType ) ; }
/// Called to send a MISSION_ITEM message while the MissionManager is in idle state
void sendUnexpectedMissionItem ( void ) { _missionItemHandler . sendUnexpectedMissionItem ( ) ; }
/// Called to send a MISSION_REQUEST message while the MissionManager is in idle state
void sendUnexpectedMissionRequest ( void ) { _missionItemHandler . sendUnexpectedMissionRequest ( ) ; }
*/
typedef struct {
const char * failureText ;
MockLinkMissionItemHandler : : FailureMode_t failureMode ;
MissionManager : : ErrorCode_t errorCode ;
} TestCase_t ;
static const TestCase_t rgTestCases [ ] = {
{ " No Failure " , MockLinkMissionItemHandler : : FailNone , MissionManager : : AckTimeoutError } ,
{ " FailWriteRequest0NoResponse " , MockLinkMissionItemHandler : : FailWriteRequest0NoResponse , MissionManager : : AckTimeoutError } ,
{ " FailWriteRequest1NoResponse " , MockLinkMissionItemHandler : : FailWriteRequest1NoResponse , MissionManager : : AckTimeoutError } ,
{ " FailWriteRequest0IncorrectSequence " , MockLinkMissionItemHandler : : FailWriteRequest0IncorrectSequence , MissionManager : : ItemMismatchError } ,
{ " FailWriteRequest1IncorrectSequence " , MockLinkMissionItemHandler : : FailWriteRequest1IncorrectSequence , MissionManager : : ItemMismatchError } ,
{ " FailWriteRequest0ErrorAck " , MockLinkMissionItemHandler : : FailWriteRequest0ErrorAck , MissionManager : : VehicleError } ,
{ " FailWriteRequest1ErrorAck " , MockLinkMissionItemHandler : : FailWriteRequest1ErrorAck , MissionManager : : VehicleError } ,
{ " FailWriteFinalAckNoResponse " , MockLinkMissionItemHandler : : FailWriteFinalAckNoResponse , MissionManager : : AckTimeoutError } ,
{ " FailWriteFinalAckErrorAck " , MockLinkMissionItemHandler : : FailWriteFinalAckErrorAck , MissionManager : : VehicleError } ,
{ " FailWriteFinalAckMissingRequests " , MockLinkMissionItemHandler : : FailWriteFinalAckMissingRequests , MissionManager : : MissingRequestsError } ,
} ;
for ( size_t i = 0 ; i < sizeof ( rgTestCases ) / sizeof ( rgTestCases [ 0 ] ) ; i + + ) {
qDebug ( ) < < " TEST CASE " < < rgTestCases [ i ] . failureText < < " errorCode: " < < rgTestCases [ i ] . errorCode < < " failFirstTimeOnly:false " ;
_writeItems ( rgTestCases [ i ] . failureMode , rgTestCases [ i ] . errorCode , false ) ;
_mockLink - > resetMissionItemHandler ( ) ;
qDebug ( ) < < " TEST CASE " < < rgTestCases [ i ] . failureText < < " errorCode: " < < rgTestCases [ i ] . errorCode < < " failFirstTimeOnly:true " ;
_writeItems ( rgTestCases [ i ] . failureMode , rgTestCases [ i ] . errorCode , true ) ;
_mockLink - > resetMissionItemHandler ( ) ;
}
}
void MissionManagerTest : : _testReadFailureHandling ( void )
{
/*
FailReadRequestListNoResponse , // Don't send MISSION_COUNT in response to MISSION_REQUEST_LIST
FailReadRequest0NoResponse , // Don't send MISSION_ITEM in response to MISSION_REQUEST item 0
FailReadRequest1NoResponse , // Don't send MISSION_ITEM in response to MISSION_REQUEST item 1
@ -318,23 +415,21 @@ void MissionManagerTest::_testWriteFailureHandling(void)
@@ -318,23 +415,21 @@ void MissionManagerTest::_testWriteFailureHandling(void)
static const TestCase_t rgTestCases [ ] = {
{ " No Failure " , MockLinkMissionItemHandler : : FailNone , MissionManager : : AckTimeoutError } ,
{ " FailWriteRequest0NoResponse " , MockLinkMissionItemHandler : : FailWriteRequest0NoResponse , MissionManager : : AckTimeoutError } ,
{ " FailWriteRequest1NoResponse " , MockLinkMissionItemHandler : : FailWriteRequest1NoResponse , MissionManager : : AckTimeoutError } ,
{ " FailWriteRequest0IncorrectSequence " , MockLinkMissionItemHandler : : FailWriteRequest0IncorrectSequence , MissionManager : : ItemMismatchError } ,
{ " FailWriteRequest1IncorrectSequence " , MockLinkMissionItemHandler : : FailWriteRequest1IncorrectSequence , MissionManager : : ItemMismatchError } ,
{ " FailWriteRequest0ErrorAck " , MockLinkMissionItemHandler : : FailWriteRequest0ErrorAck , MissionManager : : VehicleError } ,
{ " FailWriteRequest1ErrorAck " , MockLinkMissionItemHandler : : FailWriteRequest1ErrorAck , MissionManager : : VehicleError } ,
{ " FailWriteFinalAckNoResponse " , MockLinkMissionItemHandler : : FailWriteFinalAckNoResponse , MissionManager : : AckTimeoutError } ,
{ " FailWriteFinalAckErrorAck " , MockLinkMissionItemHandler : : FailWriteFinalAckErrorAck , MissionManager : : VehicleError } ,
{ " FailWriteFinalAckMissingRequests " , MockLinkMissionItemHandler : : FailWriteFinalAckMissingRequests , MissionManager : : MissingRequestsError } ,
{ " FailReadRequestListNoResponse " , MockLinkMissionItemHandler : : FailReadRequestListNoResponse , MissionManager : : AckTimeoutError } ,
{ " FailReadRequest0NoResponse " , MockLinkMissionItemHandler : : FailReadRequest0NoResponse , MissionManager : : AckTimeoutError } ,
{ " FailReadRequest1NoResponse " , MockLinkMissionItemHandler : : FailReadRequest1NoResponse , MissionManager : : AckTimeoutError } ,
{ " FailReadRequest0IncorrectSequence " , MockLinkMissionItemHandler : : FailReadRequest0IncorrectSequence , MissionManager : : ItemMismatchError } ,
{ " FailReadRequest1IncorrectSequence " , MockLinkMissionItemHandler : : FailReadRequest1IncorrectSequence , MissionManager : : ItemMismatchError } ,
{ " FailReadRequest0ErrorAck " , MockLinkMissionItemHandler : : FailReadRequest0ErrorAck , MissionManager : : VehicleError } ,
{ " FailReadRequest1ErrorAck " , MockLinkMissionItemHandler : : FailReadRequest1ErrorAck , MissionManager : : VehicleError } ,
} ;
for ( size_t i = 0 ; i < sizeof ( rgTestCases ) / sizeof ( rgTestCases [ 0 ] ) ; i + + ) {
qDebug ( ) < < " TEST CASE " < < rgTestCases [ i ] . failureText < < " errorCode: " < < rgTestCases [ i ] . errorCode < < " failFirstTimeOnly:false " ;
_write Items ( rgTestCases [ i ] . failureMode , rgTestCases [ i ] . errorCode , false ) ;
_roundTrip Items ( rgTestCases [ i ] . failureMode , rgTestCases [ i ] . errorCode , false ) ;
_mockLink - > resetMissionItemHandler ( ) ;
qDebug ( ) < < " TEST CASE " < < rgTestCases [ i ] . failureText < < " errorCode: " < < rgTestCases [ i ] . errorCode < < " failFirstTimeOnly:true " ;
_write Items ( rgTestCases [ i ] . failureMode , rgTestCases [ i ] . errorCode , true ) ;
_roundTrip Items ( rgTestCases [ i ] . failureMode , rgTestCases [ i ] . errorCode , true ) ;
_mockLink - > resetMissionItemHandler ( ) ;
}
}