From 130ac82eefd6d8ed6690cb6c9092999c4377d246 Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Fri, 23 Oct 2015 14:35:10 -0700 Subject: [PATCH] Base class for MissionManager/ControllerTest --- .../MissionControllerManagerTest.cc | 101 ++++++++++++++++++ .../MissionControllerManagerTest.h | 92 ++++++++++++++++ 2 files changed, 193 insertions(+) create mode 100644 src/MissionManager/MissionControllerManagerTest.cc create mode 100644 src/MissionManager/MissionControllerManagerTest.h diff --git a/src/MissionManager/MissionControllerManagerTest.cc b/src/MissionManager/MissionControllerManagerTest.cc new file mode 100644 index 000000000..7e04e4432 --- /dev/null +++ b/src/MissionManager/MissionControllerManagerTest.cc @@ -0,0 +1,101 @@ +/*===================================================================== + + QGroundControl Open Source Ground Control Station + + (c) 2009 - 2014 QGROUNDCONTROL PROJECT + + This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + QGROUNDCONTROL is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QGROUNDCONTROL. If not, see . + + ======================================================================*/ + +#include "MissionControllerManagerTest.h" +#include "LinkManager.h" +#include "MultiVehicleManager.h" + +UT_REGISTER_TEST(MissionControllerManagerTest) + +MissionControllerManagerTest::MissionControllerManagerTest(void) + : _mockLink(NULL) +{ + +} + +void MissionControllerManagerTest::cleanup(void) +{ + delete _multiSpyMissionManager; + _multiSpyMissionManager = NULL; + + LinkManager::instance()->disconnectLink(_mockLink); + _mockLink = NULL; + QTest::qWait(1000); // Need to allow signals to move between threads + + UnitTest::cleanup(); +} + +void MissionControllerManagerTest::_initForFirmwareType(MAV_AUTOPILOT firmwareType) +{ + UnitTest::init(); + + LinkManager* linkMgr = LinkManager::instance(); + Q_CHECK_PTR(linkMgr); + + _mockLink = new MockLink(); + Q_CHECK_PTR(_mockLink); + _mockLink->setFirmwareType(firmwareType); + LinkManager::instance()->_addLink(_mockLink); + + linkMgr->connectLink(_mockLink); + + // Wait for the Vehicle to work it's way through the various threads + + QSignalSpy spyVehicle(MultiVehicleManager::instance(), SIGNAL(activeVehicleChanged(Vehicle*))); + QCOMPARE(spyVehicle.wait(5000), true); + + // Wait for the Mission Manager to finish it's initial load + + _missionManager = MultiVehicleManager::instance()->activeVehicle()->missionManager(); + QVERIFY(_missionManager); + + _rgMissionManagerSignals[canEditChangedSignalIndex] = SIGNAL(canEditChanged(bool)); + _rgMissionManagerSignals[newMissionItemsAvailableSignalIndex] = SIGNAL(newMissionItemsAvailable(void)); + _rgMissionManagerSignals[inProgressChangedSignalIndex] = SIGNAL(inProgressChanged(bool)); + _rgMissionManagerSignals[errorSignalIndex] = SIGNAL(error(int, const QString&)); + + _multiSpyMissionManager = new MultiSignalSpy(); + Q_CHECK_PTR(_multiSpyMissionManager); + QCOMPARE(_multiSpyMissionManager->init(_missionManager, _rgMissionManagerSignals, _cMissionManagerSignals), true); + + if (_missionManager->inProgress()) { + _multiSpyMissionManager->waitForSignalByIndex(newMissionItemsAvailableSignalIndex, _missionManagerSignalWaitTime); + _multiSpyMissionManager->waitForSignalByIndex(inProgressChangedSignalIndex, _missionManagerSignalWaitTime); + QCOMPARE(_multiSpyMissionManager->checkSignalByMask(newMissionItemsAvailableSignalMask | inProgressChangedSignalMask), true); + QCOMPARE(_multiSpyMissionManager->checkNoSignalByMask(canEditChangedSignalIndex), true); + } + + QVERIFY(!_missionManager->inProgress()); + QCOMPARE(_missionManager->missionItems()->count(), 0); + _multiSpyMissionManager->clearAllSignals(); +} + +/// Checks the state of the inProgress value and signal to match the specified value +void MissionControllerManagerTest::_checkInProgressValues(bool inProgress) +{ + QCOMPARE(_missionManager->inProgress(), inProgress); + QSignalSpy* spy = _multiSpyMissionManager->getSpyByIndex(inProgressChangedSignalIndex); + QList signalArgs = spy->takeFirst(); + QCOMPARE(signalArgs.count(), 1); + QCOMPARE(signalArgs[0].toBool(), inProgress); +} diff --git a/src/MissionManager/MissionControllerManagerTest.h b/src/MissionManager/MissionControllerManagerTest.h new file mode 100644 index 000000000..4c62bd741 --- /dev/null +++ b/src/MissionManager/MissionControllerManagerTest.h @@ -0,0 +1,92 @@ +/*===================================================================== + + QGroundControl Open Source Ground Control Station + + (c) 2009 - 2015 QGROUNDCONTROL PROJECT + + This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + QGROUNDCONTROL is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QGROUNDCONTROL. If not, see . + + ======================================================================*/ + +#ifndef MissionControllerManagerTest_H +#define MissionControllerManagerTest_H + +#include "UnitTest.h" +#include "MockLink.h" +#include "MissionManager.h" +#include "MultiSignalSpy.h" + +#include + +/// This is the base class for the MissionManager and MissionController unit tests. +class MissionControllerManagerTest : public UnitTest +{ + Q_OBJECT + +public: + MissionControllerManagerTest(void); + +protected slots: + void cleanup(void); + +protected: + void _initForFirmwareType(MAV_AUTOPILOT firmwareType); + void _checkInProgressValues(bool inProgress); + + MockLink* _mockLink; + MissionManager* _missionManager; + + typedef struct { + int sequenceNumber; + QGeoCoordinate coordinate; + int command; + double param1; + double param2; + double param3; + double param4; + bool autocontinue; + bool isCurrentItem; + int frame; + } ItemInfo_t; + + typedef struct { + const char* itemStream; + const ItemInfo_t expectedItem; + } TestCase_t; + + typedef enum { + canEditChangedSignalIndex = 0, + newMissionItemsAvailableSignalIndex, + inProgressChangedSignalIndex, + errorSignalIndex, + maxSignalIndex + } MissionManagerSignalIndex_t; + + typedef enum { + canEditChangedSignalMask = 1 << canEditChangedSignalIndex, + newMissionItemsAvailableSignalMask = 1 << newMissionItemsAvailableSignalIndex, + inProgressChangedSignalMask = 1 << inProgressChangedSignalIndex, + errorSignalMask = 1 << errorSignalIndex, + } MissionManagerSignalMask_t; + + MultiSignalSpy* _multiSpyMissionManager; + static const size_t _cMissionManagerSignals = maxSignalIndex; + const char* _rgMissionManagerSignals[_cMissionManagerSignals]; + + static const int _missionManagerSignalWaitTime = MissionManager::_ackTimeoutMilliseconds * MissionManager::_maxRetryCount * 2; +}; + +#endif -- 2.22.0