diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index c74553ee7afcbecc4768b811c89bf54cb758e33d..1e35f1e6df8a0135b3053771e15c32f5cdebc0c4 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -571,6 +571,7 @@ HEADERS += \ src/qgcunittest/MavlinkLogTest.h \ src/qgcunittest/MessageBoxTest.h \ src/qgcunittest/MultiSignalSpy.h \ + src/qgcunittest/ParameterLoaderTest.h \ src/qgcunittest/RadioConfigTest.h \ src/qgcunittest/TCPLinkTest.h \ src/qgcunittest/TCPLoopBackServer.h \ @@ -596,6 +597,7 @@ SOURCES += \ src/qgcunittest/MavlinkLogTest.cc \ src/qgcunittest/MessageBoxTest.cc \ src/qgcunittest/MultiSignalSpy.cc \ + src/qgcunittest/ParameterLoaderTest.cc \ src/qgcunittest/RadioConfigTest.cc \ src/qgcunittest/TCPLinkTest.cc \ src/qgcunittest/TCPLoopBackServer.cc \ diff --git a/src/qgcunittest/ParameterLoaderTest.cc b/src/qgcunittest/ParameterLoaderTest.cc new file mode 100644 index 0000000000000000000000000000000000000000..0089f410c31c5e66530db0bcc0c1f8f95a0f179f --- /dev/null +++ b/src/qgcunittest/ParameterLoaderTest.cc @@ -0,0 +1,137 @@ +/**************************************************************************** + * + * (c) 2009-2016 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + + +#include "ParameterLoaderTest.h" +#include "MultiVehicleManager.h" +#include "QGCApplication.h" +#include "ParameterLoader.h" + +/// Test failure modes which should still lead to param load success +void ParameterLoaderTest::_noFailureWorker(MockConfiguration::FailureMode_t failureMode) +{ + Q_ASSERT(!_mockLink); + _mockLink = MockLink::startPX4MockLink(false, failureMode); + + MultiVehicleManager* vehicleMgr = qgcApp()->toolbox()->multiVehicleManager(); + QVERIFY(vehicleMgr); + + // Wait for the Vehicle to get created + QSignalSpy spyVehicle(vehicleMgr, SIGNAL(activeVehicleAvailableChanged(bool))); + QCOMPARE(spyVehicle.wait(5000), true); + QCOMPARE(spyVehicle.count(), 1); + QList arguments = spyVehicle.takeFirst(); + QCOMPARE(arguments.count(), 1); + QCOMPARE(arguments.at(0).toBool(), true); + + Vehicle* vehicle = vehicleMgr->activeVehicle(); + QVERIFY(vehicle); + + // We should get progress bar updates during load + QSignalSpy spyProgress(vehicle->getParameterLoader(), SIGNAL(parameterListProgress(float))); + QCOMPARE(spyProgress.wait(2000), true); + arguments = spyProgress.takeFirst(); + QCOMPARE(arguments.count(), 1); + QVERIFY(arguments.at(0).toFloat() > 0.0f); + + // When param load is complete we get the param ready signal + QSignalSpy spyParamsReady(vehicleMgr, SIGNAL(parameterReadyVehicleAvailableChanged(bool))); + QCOMPARE(spyParamsReady.wait(60000), true); + arguments = spyParamsReady.takeFirst(); + QCOMPARE(arguments.count(), 1); + QCOMPARE(arguments.at(0).toBool(), true); + + // Progress should have been set back to 0 + arguments = spyProgress.takeLast(); + QCOMPARE(arguments.count(), 1); + QCOMPARE(arguments.at(0).toFloat(), 0.0f); +} + + +void ParameterLoaderTest::_noFailure(void) +{ + _noFailureWorker(MockConfiguration::FailNone); +} + +void ParameterLoaderTest::_requestListMissingParamSuccess(void) +{ + _noFailureWorker(MockConfiguration::FailMissingParamOnInitialReqest); +} + +// Test no response to param_request_list +void ParameterLoaderTest::_requestListNoResponse(void) +{ + Q_ASSERT(!_mockLink); + _mockLink = MockLink::startPX4MockLink(false, MockConfiguration::FailParamNoReponseToRequestList); + + MultiVehicleManager* vehicleMgr = qgcApp()->toolbox()->multiVehicleManager(); + QVERIFY(vehicleMgr); + + // Wait for the Vehicle to get created + QSignalSpy spyVehicle(vehicleMgr, SIGNAL(activeVehicleAvailableChanged(bool))); + QCOMPARE(spyVehicle.wait(5000), true); + QCOMPARE(spyVehicle.count(), 1); + QList arguments = spyVehicle.takeFirst(); + QCOMPARE(arguments.count(), 1); + QCOMPARE(arguments.at(0).toBool(), true); + + Vehicle* vehicle = vehicleMgr->activeVehicle(); + QVERIFY(vehicle); + + QSignalSpy spyParamsReady(vehicleMgr, SIGNAL(parameterReadyVehicleAvailableChanged(bool))); + QSignalSpy spyProgress(vehicle->getParameterLoader(), SIGNAL(parameterListProgress(float))); + + // We should not get any progress bar updates, nor a parameter ready signal + QCOMPARE(spyProgress.wait(500), false); + QCOMPARE(spyParamsReady.wait(40000), false); + + // User should have been notified + checkMultipleExpectedMessageBox(5); +} + +// MockLink will fail to send a param on initial request, it will also fail to send it on subsequent +// param_read requests. +void ParameterLoaderTest::_requestListMissingParamFail(void) +{ + // Will pop error about missing params + setExpectedMessageBox(QMessageBox::Ok); + + Q_ASSERT(!_mockLink); + _mockLink = MockLink::startPX4MockLink(false, MockConfiguration::FailMissingParamOnAllRequests); + + MultiVehicleManager* vehicleMgr = qgcApp()->toolbox()->multiVehicleManager(); + QVERIFY(vehicleMgr); + + // Wait for the Vehicle to get created + QSignalSpy spyVehicle(vehicleMgr, SIGNAL(activeVehicleAvailableChanged(bool))); + QCOMPARE(spyVehicle.wait(5000), true); + QCOMPARE(spyVehicle.count(), 1); + QList arguments = spyVehicle.takeFirst(); + QCOMPARE(arguments.count(), 1); + QCOMPARE(arguments.at(0).toBool(), true); + + Vehicle* vehicle = vehicleMgr->activeVehicle(); + QVERIFY(vehicle); + + QSignalSpy spyParamsReady(vehicleMgr, SIGNAL(parameterReadyVehicleAvailableChanged(bool))); + QSignalSpy spyProgress(vehicle->getParameterLoader(), SIGNAL(parameterListProgress(float))); + + // We will get progress bar updates, since it will fail after getting partially through the request + QCOMPARE(spyProgress.wait(2000), true); + arguments = spyProgress.takeFirst(); + QCOMPARE(arguments.count(), 1); + QVERIFY(arguments.at(0).toFloat() > 0.0f); + + // We should get a parameters ready signal, but Vehicle should indicate missing params + QCOMPARE(spyParamsReady.wait(40000), true); + QCOMPARE(vehicle->missingParameters(), true); + + // User should have been notified + checkExpectedMessageBox(); +} diff --git a/src/qgcunittest/ParameterLoaderTest.h b/src/qgcunittest/ParameterLoaderTest.h new file mode 100644 index 0000000000000000000000000000000000000000..2b251bd430047c5e7107c7d19f5abb614f03a848 --- /dev/null +++ b/src/qgcunittest/ParameterLoaderTest.h @@ -0,0 +1,33 @@ +/**************************************************************************** + * + * (c) 2009-2016 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + + +#ifndef ParameterLoaderTest_H +#define ParameterLoaderTest_H + +#include "UnitTest.h" +#include "MockLink.h" +#include "MultiSignalSpy.h" +#include "MockLink.h" + +class ParameterLoaderTest : public UnitTest +{ + Q_OBJECT + +private slots: + void _noFailure(void); + void _requestListNoResponse(void); + void _requestListMissingParamSuccess(void); + void _requestListMissingParamFail(void); + +private: + void _noFailureWorker(MockConfiguration::FailureMode_t failureMode); +}; + +#endif diff --git a/src/qgcunittest/UnitTestList.cc b/src/qgcunittest/UnitTestList.cc index 7b1a1b461d0d4af33dc92891d126d1a04068b4dc..c8355a40e0a4c5ca64c35d392f62d7f78383db57 100644 --- a/src/qgcunittest/UnitTestList.cc +++ b/src/qgcunittest/UnitTestList.cc @@ -29,6 +29,7 @@ #include "MainWindowTest.h" #include "FileManagerTest.h" #include "TCPLinkTest.h" +#include "ParameterLoaderTest.h" UT_REGISTER_TEST(FactSystemTestGeneric) UT_REGISTER_TEST(FactSystemTestPX4) @@ -46,6 +47,7 @@ UT_REGISTER_TEST(MissionManagerTest) UT_REGISTER_TEST(RadioConfigTest) UT_REGISTER_TEST(TCPLinkTest) UT_REGISTER_TEST(FileManagerTest) +UT_REGISTER_TEST(ParameterLoaderTest) // List of unit test which are currently disabled. // If disabling a new test, include reason in comment.