/*! * \brief Unit tests for \ref ProviderModel * * \copyright Copyright (c) 2018-2019 Governikus GmbH & Co. KG, Germany */ #include "RemoteServiceModel.h" #include "context/RemoteServiceContext.h" #include "EstablishPaceChannelParser.h" #include "MockRemoteServer.h" #include #include using namespace governikus; class test_RemoteServiceModel : public QObject { Q_OBJECT RemoteServiceModel * mModel; QSharedPointer mContext; static QByteArray createDataToParse(const PacePasswordId& pinId) { const QByteArray chat = QByteArray::fromHex("7F4C12060904007F00070301020253050000000F0F"); const QByteArray certDescription = QByteArray::fromHex("30 8202A4" " 06 0A 04007F00070301030103" " A1 0E 0C0C442D547275737420476D6248" " A3 3A 0C38476573616D7476657262616E64206465722064657574736368656E20566572736963686572756E67737769727473636861667420652E562E" " A5 820248" " 04 820244 4E616D652C20416E7363687269667420756E6420452D4D61696C2D4164726573736520646573204469656E737465616E626965746572733A0D0A476573616D7476657262616E64206465722064657574736368656E20566572736963686572756E67737769727473636861667420652E562E0D0A57696C68656C6D73747261C39F652034332F3433670D0A3130313137204265726C696E0D0A6265726C696E406764762E64650D0A0D0A4765736368C3A46674737A7765636B3A0D0A2D52656769737472696572756E6720756E64204C6F67696E20616D204744562D4D616B6C6572706F7274616C2D0D0A0D0A48696E7765697320617566206469652066C3BC722064656E204469656E737465616E626965746572207A757374C3A46E646967656E205374656C6C656E2C20646965206469652045696E68616C74756E672064657220566F7273636872696674656E207A756D20446174656E73636875747A206B6F6E74726F6C6C696572656E3A0D0A4265726C696E6572204265617566747261677465722066C3BC7220446174656E73636875747A20756E6420496E666F726D6174696F6E7366726569686569740D0A416E20646572205572616E696120342D31300D0A3130373837204265726C696E0D0A3033302F3133382038392D300D0A6D61696C626F7840646174656E73636875747A2D6265726C696E2E64650D0A687474703A2F2F7777772E646174656E73636875747A2D6265726C696E2E64650D0A416E737072656368706172746E65723A2044722E20416C6578616E64657220446978"); EstablishPaceChannel builder; builder.setPasswordId(pinId); builder.setChat(chat); builder.setCertificateDescription(certDescription); const auto command = builder.createCommandDataCcid(); return command.getBuffer(); } private Q_SLOTS: void initTestCase() { Env::setCreator(std::function([&] { return new MockRemoteServer(); })); mModel = Env::getSingleton(); } void init() { mContext.reset(new RemoteServiceContext()); } void cleanup() { mModel->resetContext(); mContext.clear(); } void test_ReaderPlugInType() { const ReaderManagerPlugInType input1 = ReaderManagerPlugInType::NFC; const ReaderManagerPlugInType input2 = ReaderManagerPlugInType::UNKNOWN; mModel->setReaderPlugInType(input1); QCOMPARE(mModel->getReaderPlugInType(), ReaderManagerPlugInType::UNKNOWN); mModel->resetContext(mContext); mModel->setReaderPlugInType(input1); QCOMPARE(mModel->getReaderPlugInType(), input1); mModel->setReaderPlugInType(input2); QCOMPARE(mModel->getReaderPlugInType(), ReaderManagerPlugInType::UNKNOWN); } void test_CancelPasswordRequest() { QSignalSpy spy(mContext.data(), &RemoteServiceContext::fireCancelPasswordRequest); mModel->cancelPasswordRequest(); QCOMPARE(spy.count(), 0); mModel->resetContext(mContext); mModel->cancelPasswordRequest(); QCOMPARE(spy.count(), 1); } void test_Running() { QSignalSpy spyStartWorkflow(mModel, &RemoteServiceModel::fireStartWorkflow); QSignalSpy spyCancelWorkflow(mContext.data(), &RemoteServiceContext::fireCancelWorkflow); QSignalSpy spyIsRunningChanged(mModel, &RemoteServiceModel::fireIsRunningChanged); QVERIFY(!mModel->isRunning()); mModel->resetContext(mContext); QVERIFY(!mModel->isRunning()); mContext->getRemoteServer()->start(QString()); QVERIFY(mModel->isRunning()); mModel->setRunning(false); QCOMPARE(spyIsRunningChanged.count(), 1); QCOMPARE(spyCancelWorkflow.count(), 1); mContext->getRemoteServer()->stop(); mModel->setRunning(true); QCOMPARE(spyIsRunningChanged.count(), 2); QCOMPARE(spyStartWorkflow.count(), 1); } void test_ResetContext() { QSignalSpy spyConnectedChanged(mModel, &RemoteServiceModel::fireConnectedChanged); QSignalSpy spyCurrentStateChanged(mModel, &WorkflowModel::fireCurrentStateChanged); QSignalSpy spyIsRunningChanged(mModel, &RemoteServiceModel::fireIsRunningChanged); QSignalSpy spyPskChanged(mModel, &RemoteServiceModel::firePskChanged); QSignalSpy spyConnectedClientDeviceNameChanged(mModel, &RemoteServiceModel::fireConnectionInfoChanged); mModel->resetContext(mContext); QCOMPARE(spyCurrentStateChanged.count(), 1); QCOMPARE(spyConnectedChanged.count(), 1); Q_EMIT mContext->fireStateChanged(QString()); QCOMPARE(spyIsRunningChanged.count(), 1); Q_EMIT mContext->getRemoteServer()->firePskChanged(QByteArray()); QCOMPARE(spyPskChanged.count(), 1); Q_EMIT mContext->getRemoteServer()->fireConnectedChanged(true); QCOMPARE(spyConnectedChanged.count(), 2); QCOMPARE(spyConnectedClientDeviceNameChanged.count(), 1); } void test_SetPairing() { mModel->resetContext(mContext); const QSharedPointer server = qSharedPointerCast(mContext->getRemoteServer()); mModel->setPairing(true); QVERIFY(server->getPairing()); mModel->setPairing(false); QVERIFY(!server->getPairing()); } void test_GetPasswordTypeContextIsNull() { QCOMPARE(mModel->getPasswordType(), QString()); } void test_GetPassword_data() { QTest::addColumn("password"); QTest::addColumn("output"); QTest::newRow("pin") << PacePasswordId::PACE_PIN << QString("PIN"); QTest::newRow("can") << PacePasswordId::PACE_CAN << QString("CAN"); QTest::newRow("puk") << PacePasswordId::PACE_PUK << QString("PUK"); QTest::newRow("unknown") << PacePasswordId::UNKNOWN << QString(); } void test_GetPassword() { QFETCH(PacePasswordId, password); QFETCH(QString, output); auto data = createDataToParse(password); QSharedPointer message(new IfdEstablishPaceChannel(QString(), data)); mContext->setEstablishPaceChannelMessage(message); mModel->resetContext(mContext); QCOMPARE(mModel->getPasswordType(), output); } }; QTEST_GUILESS_MAIN(test_RemoteServiceModel) #include "test_RemoteServiceModel.moc"