2017-12-20 14:54:05 +01:00
|
|
|
/*!
|
|
|
|
* \brief Unit tests for \ref RemoteReaderManagerPlugIn
|
|
|
|
*
|
2019-05-22 10:08:38 +02:00
|
|
|
* \copyright Copyright (c) 2017-2019 Governikus GmbH & Co. KG, Germany
|
2017-12-20 14:54:05 +01:00
|
|
|
*/
|
|
|
|
|
2019-01-03 15:06:22 +01:00
|
|
|
#include "plugin/RemoteReaderManagerPlugIn.h"
|
2017-12-20 14:54:05 +01:00
|
|
|
|
2019-09-30 17:22:19 +02:00
|
|
|
#include "AppSettings.h"
|
2019-01-03 15:06:22 +01:00
|
|
|
#include "Env.h"
|
2017-12-20 14:54:05 +01:00
|
|
|
#include "messages/IfdConnect.h"
|
2019-01-03 15:06:22 +01:00
|
|
|
#include "messages/IfdConnect.h"
|
|
|
|
#include "messages/IfdDisconnect.h"
|
2017-12-20 14:54:05 +01:00
|
|
|
#include "messages/IfdDisconnect.h"
|
|
|
|
#include "messages/IfdError.h"
|
|
|
|
#include "messages/IfdEstablishContext.h"
|
2019-01-03 15:06:22 +01:00
|
|
|
#include "messages/IfdEstablishPaceChannel.h"
|
|
|
|
#include "messages/IfdGetStatus.h"
|
2017-12-20 14:54:05 +01:00
|
|
|
#include "messages/IfdStatus.h"
|
|
|
|
#include "messages/IfdTransmit.h"
|
2019-01-03 15:06:22 +01:00
|
|
|
#include "messages/IfdTransmit.h"
|
2017-12-20 14:54:05 +01:00
|
|
|
#include "MockRemoteDispatcher.h"
|
|
|
|
#include "RemoteClient.h"
|
|
|
|
|
|
|
|
#include <QQueue>
|
|
|
|
#include <QSemaphore>
|
2019-09-30 17:22:19 +02:00
|
|
|
#include <QtCore>
|
|
|
|
#include <QtTest>
|
2017-12-20 14:54:05 +01:00
|
|
|
|
|
|
|
using namespace governikus;
|
|
|
|
|
|
|
|
|
|
|
|
Q_DECLARE_METATYPE(QSharedPointer<const RemoteMessage> )
|
|
|
|
|
|
|
|
|
|
|
|
class MockRemoteClient
|
|
|
|
: public RemoteClient
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
public:
|
|
|
|
MockRemoteClient() = default;
|
|
|
|
virtual ~MockRemoteClient() override = default;
|
|
|
|
|
|
|
|
virtual void startDetection() override;
|
|
|
|
virtual void stopDetection() override;
|
|
|
|
virtual bool isDetecting() override;
|
|
|
|
virtual void establishConnection(const QSharedPointer<RemoteDeviceListEntry>& pEntry, const QString& pPsk) override;
|
|
|
|
virtual QVector<RemoteServiceSettings::RemoteInfo> getConnectedDeviceInfos() override;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
void MockRemoteClient::startDetection()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void MockRemoteClient::stopDetection()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool MockRemoteClient::isDetecting()
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void MockRemoteClient::establishConnection(const QSharedPointer<RemoteDeviceListEntry>& pEntry, const QString& pPsk)
|
|
|
|
{
|
2019-09-30 17:22:19 +02:00
|
|
|
Q_UNUSED(pEntry)
|
|
|
|
Q_UNUSED(pPsk)
|
2017-12-20 14:54:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QVector<RemoteServiceSettings::RemoteInfo> MockRemoteClient::getConnectedDeviceInfos()
|
|
|
|
{
|
|
|
|
return QVector<RemoteServiceSettings::RemoteInfo>();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class test_RemoteReaderManagerPlugIn
|
|
|
|
: public QObject
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
|
|
private:
|
2019-01-03 15:06:22 +01:00
|
|
|
QThread mMainThread;
|
2017-12-20 14:54:05 +01:00
|
|
|
QThread mNetworkThread;
|
|
|
|
QSharedPointer<MockRemoteClient> mRemoteClient;
|
2019-01-03 15:06:22 +01:00
|
|
|
QSharedPointer<RemoteReaderManagerPlugIn> mPlugin;
|
2017-12-20 14:54:05 +01:00
|
|
|
QSharedPointer<MockRemoteDispatcher> mDispatcher1;
|
|
|
|
QSharedPointer<MockRemoteDispatcher> mDispatcher2;
|
|
|
|
QVector<QSharedPointer<const RemoteMessage> > mClientMessages;
|
|
|
|
|
|
|
|
private Q_SLOTS:
|
|
|
|
void initTestCase()
|
|
|
|
{
|
2019-01-03 15:06:22 +01:00
|
|
|
mMainThread.setObjectName(QStringLiteral("MainThread"));
|
2017-12-20 14:54:05 +01:00
|
|
|
mNetworkThread.setObjectName(QStringLiteral("NetworkThread"));
|
|
|
|
|
2019-01-03 15:06:22 +01:00
|
|
|
mRemoteClient.reset(new MockRemoteClient());
|
|
|
|
mRemoteClient->moveToThread(&mMainThread);
|
|
|
|
Env::set(RemoteClient::staticMetaObject, mRemoteClient.data());
|
2017-12-20 14:54:05 +01:00
|
|
|
|
|
|
|
mDispatcher1.reset(new MockRemoteDispatcher());
|
|
|
|
mDispatcher1->moveToThread(&mNetworkThread);
|
|
|
|
|
|
|
|
mDispatcher2.reset(new MockRemoteDispatcher());
|
|
|
|
mDispatcher2->moveToThread(&mNetworkThread);
|
|
|
|
|
|
|
|
mNetworkThread.start();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void cleanupTestCase()
|
|
|
|
{
|
|
|
|
mNetworkThread.quit();
|
|
|
|
mNetworkThread.wait();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void init()
|
|
|
|
{
|
|
|
|
// local
|
|
|
|
mPlugin.reset(new RemoteReaderManagerPlugIn());
|
2019-01-03 15:06:22 +01:00
|
|
|
mPlugin->init();
|
2017-12-20 14:54:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void cleanup()
|
|
|
|
{
|
|
|
|
// local
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void testStandardValues()
|
|
|
|
{
|
|
|
|
QSignalSpy spySend(mDispatcher1.data(), &MockRemoteDispatcher::fireSend);
|
|
|
|
|
|
|
|
QVERIFY(mPlugin->getReaders().isEmpty());
|
|
|
|
|
|
|
|
Q_EMIT mRemoteClient->fireNewRemoteDispatcher(mDispatcher1);
|
2019-01-03 15:06:22 +01:00
|
|
|
QTRY_COMPARE(spySend.count(), 1);
|
2017-12-20 14:54:05 +01:00
|
|
|
|
|
|
|
QVERIFY(mPlugin->getReaders().isEmpty());
|
|
|
|
QCOMPARE(spySend.size(), 1);
|
|
|
|
|
|
|
|
QSharedPointer<const RemoteMessage> result = qvariant_cast<QSharedPointer<const RemoteMessage> >(spySend.takeFirst().at(0));
|
|
|
|
QCOMPARE(result->getType(), RemoteCardMessageType::IFDEstablishContext);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void testSingleDispatcherSingleReaderAddRemoveWithoutCard()
|
|
|
|
{
|
|
|
|
QSignalSpy spySend(mDispatcher1.data(), &MockRemoteDispatcher::fireSend);
|
|
|
|
|
|
|
|
Q_EMIT mRemoteClient->fireNewRemoteDispatcher(mDispatcher1);
|
2019-01-03 15:06:22 +01:00
|
|
|
QTRY_COMPARE(spySend.count(), 1);
|
2017-12-20 14:54:05 +01:00
|
|
|
spySend.clear();
|
|
|
|
|
|
|
|
QSharedPointer<RemoteMessage> message;
|
|
|
|
QSignalSpy spyAdded(mPlugin.data(), &ReaderManagerPlugIn::fireReaderAdded);
|
|
|
|
QSignalSpy spyRemoved(mPlugin.data(), &ReaderManagerPlugIn::fireReaderRemoved);
|
|
|
|
|
2019-09-30 17:22:19 +02:00
|
|
|
ReaderInfo info(QStringLiteral("NFC Reader"));
|
|
|
|
info.setConnected(true);
|
|
|
|
info.setBasicReader(true);
|
|
|
|
info.setMaxApduLength(500);
|
|
|
|
Env::getSingleton<AppSettings>()->getRemoteServiceSettings().setPinPadMode(false);
|
|
|
|
message.reset(new IfdStatus(info));
|
2017-12-20 14:54:05 +01:00
|
|
|
mDispatcher1->onReceived(message);
|
|
|
|
QCOMPARE(mPlugin->getReaders().size(), 1);
|
|
|
|
QCOMPARE(spySend.size(), 0);
|
|
|
|
QCOMPARE(spyAdded.size(), 1);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(spyAdded.takeFirst().at(0).toString(), QStringLiteral("NFC Reader#TestContext"));
|
2017-12-20 14:54:05 +01:00
|
|
|
QCOMPARE(mPlugin->getReaders().size(), 1);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(mPlugin->getReaders().at(0)->getName(), QStringLiteral("NFC Reader#TestContext"));
|
|
|
|
QCOMPARE(mPlugin->getReaders().at(0)->getReaderInfo().isBasicReader(), true);
|
|
|
|
QCOMPARE(mPlugin->getReaders().at(0)->getReaderInfo().getMaxApduLength(), 500);
|
2017-12-20 14:54:05 +01:00
|
|
|
|
2019-09-30 17:22:19 +02:00
|
|
|
info.setConnected(false);
|
|
|
|
message.reset(new IfdStatus(info));
|
2017-12-20 14:54:05 +01:00
|
|
|
mDispatcher1->onReceived(message);
|
|
|
|
QCOMPARE(mPlugin->getReaders().size(), 0);
|
|
|
|
QCOMPARE(spySend.size(), 0);
|
|
|
|
QCOMPARE(spyAdded.size(), 0);
|
|
|
|
QCOMPARE(spyRemoved.size(), 1);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(spyRemoved.takeFirst().at(0).toString(), QStringLiteral("NFC Reader#TestContext"));
|
2017-12-20 14:54:05 +01:00
|
|
|
|
2019-09-30 17:22:19 +02:00
|
|
|
info.setConnected(true);
|
|
|
|
message.reset(new IfdStatus(info));
|
2017-12-20 14:54:05 +01:00
|
|
|
mDispatcher1->onReceived(message);
|
|
|
|
QCOMPARE(mPlugin->getReaders().size(), 1);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(mPlugin->getReaders().at(0)->getName(), QStringLiteral("NFC Reader#TestContext"));
|
2017-12-20 14:54:05 +01:00
|
|
|
spyAdded.clear();
|
|
|
|
|
|
|
|
mDispatcher1->onClosed();
|
|
|
|
QCOMPARE(spySend.size(), 0);
|
|
|
|
QCOMPARE(spyAdded.size(), 0);
|
|
|
|
QCOMPARE(spyRemoved.size(), 1);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(spyRemoved.takeFirst().at(0).toString(), QStringLiteral("NFC Reader#TestContext"));
|
2017-12-20 14:54:05 +01:00
|
|
|
QCOMPARE(mPlugin->getReaders().size(), 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void testSingleDispatcherSingleReaderPaceCapabilities()
|
|
|
|
{
|
|
|
|
QSignalSpy spySend(mDispatcher1.data(), &MockRemoteDispatcher::fireSend);
|
|
|
|
|
|
|
|
Q_EMIT mRemoteClient->fireNewRemoteDispatcher(mDispatcher1);
|
2019-01-03 15:06:22 +01:00
|
|
|
QTRY_COMPARE(spySend.count(), 1);
|
2017-12-20 14:54:05 +01:00
|
|
|
spySend.clear();
|
|
|
|
|
|
|
|
QSharedPointer<RemoteMessage> message;
|
|
|
|
QSignalSpy spyAdded(mPlugin.data(), &ReaderManagerPlugIn::fireReaderAdded);
|
|
|
|
QSignalSpy spyRemoved(mPlugin.data(), &ReaderManagerPlugIn::fireReaderRemoved);
|
|
|
|
|
2019-09-30 17:22:19 +02:00
|
|
|
ReaderInfo info(QStringLiteral("NFC Reader"));
|
|
|
|
info.setConnected(true);
|
|
|
|
info.setBasicReader(true);
|
|
|
|
info.setMaxApduLength(500);
|
|
|
|
Env::getSingleton<AppSettings>()->getRemoteServiceSettings().setPinPadMode(true);
|
|
|
|
message.reset(new IfdStatus(info));
|
2017-12-20 14:54:05 +01:00
|
|
|
mDispatcher1->onReceived(message);
|
|
|
|
QCOMPARE(spySend.size(), 0);
|
|
|
|
QCOMPARE(spyAdded.size(), 1);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(spyAdded.takeFirst().at(0).toString(), QStringLiteral("NFC Reader#TestContext"));
|
2017-12-20 14:54:05 +01:00
|
|
|
QCOMPARE(mPlugin->getReaders().size(), 1);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(mPlugin->getReaders().at(0)->getName(), QStringLiteral("NFC Reader#TestContext"));
|
|
|
|
QCOMPARE(mPlugin->getReaders().at(0)->getReaderInfo().isBasicReader(), false);
|
|
|
|
QCOMPARE(mPlugin->getReaders().at(0)->getReaderInfo().getMaxApduLength(), 500);
|
2017-12-20 14:54:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void testMultipleDispatcherSingleReaderAddRemoveWithoutCard()
|
|
|
|
{
|
|
|
|
QSignalSpy spySend1(mDispatcher1.data(), &MockRemoteDispatcher::fireSend);
|
|
|
|
QSignalSpy spySend2(mDispatcher2.data(), &MockRemoteDispatcher::fireSend);
|
|
|
|
|
|
|
|
Q_EMIT mRemoteClient->fireNewRemoteDispatcher(mDispatcher1);
|
|
|
|
Q_EMIT mRemoteClient->fireNewRemoteDispatcher(mDispatcher2);
|
2019-01-03 15:06:22 +01:00
|
|
|
QTRY_COMPARE(spySend1.count(), 1);
|
|
|
|
QTRY_COMPARE(spySend2.count(), 1);
|
2017-12-20 14:54:05 +01:00
|
|
|
spySend1.clear();
|
|
|
|
spySend2.clear();
|
|
|
|
|
|
|
|
QSharedPointer<RemoteMessage> message;
|
|
|
|
QSignalSpy spyAdded(mPlugin.data(), &ReaderManagerPlugIn::fireReaderAdded);
|
|
|
|
QSignalSpy spyRemoved(mPlugin.data(), &ReaderManagerPlugIn::fireReaderRemoved);
|
|
|
|
|
2019-09-30 17:22:19 +02:00
|
|
|
ReaderInfo info1(QStringLiteral("NFC Reader 1"));
|
|
|
|
info1.setMaxApduLength(500);
|
|
|
|
info1.setConnected(true);
|
|
|
|
info1.setBasicReader(true);
|
|
|
|
Env::getSingleton<AppSettings>()->getRemoteServiceSettings().setPinPadMode(false);
|
|
|
|
message.reset(new IfdStatus(info1));
|
2017-12-20 14:54:05 +01:00
|
|
|
mDispatcher1->onReceived(message);
|
2019-09-30 17:22:19 +02:00
|
|
|
|
|
|
|
ReaderInfo info2(QStringLiteral("NFC Reader 2"));
|
|
|
|
info2.setMaxApduLength(500);
|
|
|
|
info2.setConnected(true);
|
|
|
|
info2.setBasicReader(true);
|
|
|
|
message.reset(new IfdStatus(info2));
|
2017-12-20 14:54:05 +01:00
|
|
|
mDispatcher2->onReceived(message);
|
2019-09-30 17:22:19 +02:00
|
|
|
|
2017-12-20 14:54:05 +01:00
|
|
|
QCOMPARE(spySend1.size(), 0);
|
|
|
|
QCOMPARE(spySend2.size(), 0);
|
|
|
|
QCOMPARE(spyAdded.size(), 2);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(spyAdded.takeFirst().at(0).toString(), QStringLiteral("NFC Reader 1#TestContext"));
|
|
|
|
QCOMPARE(spyAdded.takeFirst().at(0).toString(), QStringLiteral("NFC Reader 2#TestContext"));
|
2017-12-20 14:54:05 +01:00
|
|
|
QCOMPARE(spyRemoved.size(), 0);
|
|
|
|
QCOMPARE(mPlugin->getReaders().size(), 2);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(mPlugin->getReaders().at(0)->getName(), QStringLiteral("NFC Reader 1#TestContext"));
|
|
|
|
QCOMPARE(mPlugin->getReaders().at(1)->getName(), QStringLiteral("NFC Reader 2#TestContext"));
|
2017-12-20 14:54:05 +01:00
|
|
|
|
2019-09-30 17:22:19 +02:00
|
|
|
info1.setConnected(false);
|
|
|
|
message.reset(new IfdStatus(info1));
|
2017-12-20 14:54:05 +01:00
|
|
|
mDispatcher1->onReceived(message);
|
2019-09-30 17:22:19 +02:00
|
|
|
|
2017-12-20 14:54:05 +01:00
|
|
|
QCOMPARE(spySend1.size(), 0);
|
|
|
|
QCOMPARE(spySend2.size(), 0);
|
|
|
|
QCOMPARE(spyAdded.size(), 0);
|
|
|
|
QCOMPARE(spyRemoved.size(), 1);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(spyRemoved.takeFirst().at(0).toString(), QStringLiteral("NFC Reader 1#TestContext"));
|
2017-12-20 14:54:05 +01:00
|
|
|
QCOMPARE(mPlugin->getReaders().size(), 1);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(mPlugin->getReaders().at(0)->getName(), QStringLiteral("NFC Reader 2#TestContext"));
|
2017-12-20 14:54:05 +01:00
|
|
|
|
2019-09-30 17:22:19 +02:00
|
|
|
info1.setConnected(true);
|
|
|
|
message.reset(new IfdStatus(info1));
|
2017-12-20 14:54:05 +01:00
|
|
|
mDispatcher1->onReceived(message);
|
2019-09-30 17:22:19 +02:00
|
|
|
|
2017-12-20 14:54:05 +01:00
|
|
|
QCOMPARE(spySend1.size(), 0);
|
|
|
|
QCOMPARE(spySend2.size(), 0);
|
|
|
|
QCOMPARE(spyAdded.size(), 1);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(spyAdded.takeFirst().at(0).toString(), QStringLiteral("NFC Reader 1#TestContext"));
|
2017-12-20 14:54:05 +01:00
|
|
|
QCOMPARE(spyRemoved.size(), 0);
|
|
|
|
QCOMPARE(mPlugin->getReaders().size(), 2);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(mPlugin->getReaders().at(0)->getName(), QStringLiteral("NFC Reader 1#TestContext"));
|
|
|
|
QCOMPARE(mPlugin->getReaders().at(1)->getName(), QStringLiteral("NFC Reader 2#TestContext"));
|
2017-12-20 14:54:05 +01:00
|
|
|
|
|
|
|
mDispatcher1->onClosed();
|
|
|
|
QCOMPARE(spySend1.size(), 0);
|
|
|
|
QCOMPARE(spySend2.size(), 0);
|
|
|
|
QCOMPARE(spyAdded.size(), 0);
|
|
|
|
QCOMPARE(spyRemoved.size(), 1);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(spyRemoved.takeFirst().at(0).toString(), QStringLiteral("NFC Reader 1#TestContext"));
|
2017-12-20 14:54:05 +01:00
|
|
|
QCOMPARE(mPlugin->getReaders().size(), 1);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(mPlugin->getReaders().at(0)->getName(), QStringLiteral("NFC Reader 2#TestContext"));
|
2017-12-20 14:54:05 +01:00
|
|
|
|
|
|
|
mDispatcher2->onClosed();
|
|
|
|
QCOMPARE(spySend1.size(), 0);
|
|
|
|
QCOMPARE(spySend2.size(), 0);
|
|
|
|
QCOMPARE(spyAdded.size(), 0);
|
|
|
|
QCOMPARE(spyRemoved.size(), 1);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(spyRemoved.takeFirst().at(0).toString(), QStringLiteral("NFC Reader 2#TestContext"));
|
2017-12-20 14:54:05 +01:00
|
|
|
QCOMPARE(mPlugin->getReaders().size(), 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void testSingleDispatcherSingleReaderChangeCard()
|
|
|
|
{
|
|
|
|
QSharedPointer<const RemoteMessage> result;
|
|
|
|
QSignalSpy spySend(mDispatcher1.data(), &MockRemoteDispatcher::fireSend);
|
|
|
|
|
|
|
|
mDispatcher1->setState(MockRemoteDispatcher::DispatcherState::ReaderWithCardError);
|
|
|
|
Q_EMIT mRemoteClient->fireNewRemoteDispatcher(mDispatcher1);
|
|
|
|
|
2019-01-03 15:06:22 +01:00
|
|
|
QTRY_COMPARE(spySend.count(), 2);
|
2017-12-20 14:54:05 +01:00
|
|
|
spySend.takeFirst();
|
|
|
|
result = qvariant_cast<QSharedPointer<const RemoteMessage> >(spySend.takeFirst().at(0));
|
|
|
|
QCOMPARE(result->getType(), RemoteCardMessageType::IFDConnect);
|
|
|
|
|
|
|
|
QSharedPointer<RemoteMessage> message;
|
2019-09-30 17:22:19 +02:00
|
|
|
|
|
|
|
ReaderInfo info1(QStringLiteral("NFC Reader"));
|
|
|
|
info1.setMaxApduLength(500);
|
|
|
|
info1.setConnected(true);
|
|
|
|
message.reset(new IfdStatus(info1));
|
|
|
|
info1.setBasicReader(true);
|
|
|
|
Env::getSingleton<AppSettings>()->getRemoteServiceSettings().setPinPadMode(false);
|
2017-12-20 14:54:05 +01:00
|
|
|
mDispatcher1->onReceived(message);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(mPlugin->getReaders().at(0)->getCard(), nullptr);
|
2017-12-20 14:54:05 +01:00
|
|
|
|
2019-01-03 15:06:22 +01:00
|
|
|
QSignalSpy spyInserted(mPlugin->getReaders().at(0), &Reader::fireCardInserted);
|
|
|
|
QSignalSpy spyRemoved(mPlugin->getReaders().at(0), &Reader::fireCardRemoved);
|
|
|
|
QSignalSpy spyChanged(mPlugin->getReaders().at(0), &Reader::fireCardRetryCounterChanged);
|
|
|
|
QSignalSpy spyUpdated(mPlugin->getReaders().at(0), &Reader::fireReaderPropertiesUpdated);
|
2017-12-20 14:54:05 +01:00
|
|
|
|
2019-09-30 17:22:19 +02:00
|
|
|
info1.setCardInfo(CardInfo(CardType::EID_CARD));
|
|
|
|
message.reset(new IfdStatus(info1));
|
2017-12-20 14:54:05 +01:00
|
|
|
mDispatcher1->onReceived(message);
|
|
|
|
|
2019-01-03 15:06:22 +01:00
|
|
|
QTRY_COMPARE(spySend.count(), 1);
|
2017-12-20 14:54:05 +01:00
|
|
|
result = qvariant_cast<QSharedPointer<const RemoteMessage> >(spySend.takeFirst().at(0));
|
|
|
|
QCOMPARE(result->getType(), RemoteCardMessageType::IFDConnect);
|
2019-01-03 15:06:22 +01:00
|
|
|
QVERIFY(mPlugin->getReaders().at(0)->getCard() != nullptr);
|
|
|
|
QCOMPARE(mPlugin->getReaders().at(0)->getReaderInfo().getMaxApduLength(), 500);
|
|
|
|
QVERIFY(mPlugin->getReaders().at(0)->getReaderInfo().hasCard());
|
2017-12-20 14:54:05 +01:00
|
|
|
QCOMPARE(spyInserted.size(), 1);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(spyInserted.takeFirst().at(0).toString(), QStringLiteral("NFC Reader#TestContext"));
|
2017-12-20 14:54:05 +01:00
|
|
|
QCOMPARE(spyRemoved.size(), 0);
|
|
|
|
QCOMPARE(spyChanged.size(), 0);
|
|
|
|
QCOMPARE(spyUpdated.size(), 0);
|
|
|
|
|
2019-09-30 17:22:19 +02:00
|
|
|
info1.setMaxApduLength(1);
|
|
|
|
message.reset(new IfdStatus(info1));
|
2017-12-20 14:54:05 +01:00
|
|
|
mDispatcher1->onReceived(message);
|
2019-01-03 15:06:22 +01:00
|
|
|
QVERIFY(mPlugin->getReaders().at(0)->getCard() != nullptr);
|
|
|
|
QCOMPARE(mPlugin->getReaders().at(0)->getReaderInfo().getMaxApduLength(), 1);
|
|
|
|
QVERIFY(mPlugin->getReaders().at(0)->getReaderInfo().hasCard());
|
2017-12-20 14:54:05 +01:00
|
|
|
QCOMPARE(spyInserted.size(), 0);
|
|
|
|
QCOMPARE(spyRemoved.size(), 0);
|
|
|
|
QCOMPARE(spyChanged.size(), 0);
|
|
|
|
QCOMPARE(spyUpdated.size(), 1);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(spyUpdated.takeFirst().at(0).toString(), QStringLiteral("NFC Reader#TestContext"));
|
2017-12-20 14:54:05 +01:00
|
|
|
|
2019-09-30 17:22:19 +02:00
|
|
|
message.reset(new IfdStatus(info1));
|
2017-12-20 14:54:05 +01:00
|
|
|
mDispatcher1->onReceived(message);
|
2019-01-03 15:06:22 +01:00
|
|
|
QVERIFY(mPlugin->getReaders().at(0)->getCard() != nullptr);
|
|
|
|
QCOMPARE(mPlugin->getReaders().at(0)->getReaderInfo().getMaxApduLength(), 1);
|
|
|
|
QVERIFY(mPlugin->getReaders().at(0)->getReaderInfo().hasCard());
|
2017-12-20 14:54:05 +01:00
|
|
|
QCOMPARE(spyInserted.size(), 0);
|
|
|
|
QCOMPARE(spyRemoved.size(), 0);
|
|
|
|
QCOMPARE(spyChanged.size(), 0);
|
|
|
|
QCOMPARE(spyUpdated.size(), 0);
|
|
|
|
|
2019-09-30 17:22:19 +02:00
|
|
|
ReaderInfo info2(QStringLiteral("NFC Reader"));
|
|
|
|
info2.setMaxApduLength(1);
|
|
|
|
info2.setConnected(true);
|
|
|
|
info2.setBasicReader(true);
|
|
|
|
message.reset(new IfdStatus(info2));
|
2017-12-20 14:54:05 +01:00
|
|
|
mDispatcher1->onReceived(message);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(mPlugin->getReaders().at(0)->getCard(), nullptr);
|
|
|
|
QVERIFY(!mPlugin->getReaders().at(0)->getReaderInfo().hasCard());
|
2017-12-20 14:54:05 +01:00
|
|
|
QCOMPARE(spyInserted.size(), 0);
|
|
|
|
QCOMPARE(spyRemoved.size(), 1);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(spyRemoved.takeFirst().at(0).toString(), QStringLiteral("NFC Reader#TestContext"));
|
2017-12-20 14:54:05 +01:00
|
|
|
QCOMPARE(spyChanged.size(), 0);
|
|
|
|
QCOMPARE(spyUpdated.size(), 0);
|
|
|
|
|
2019-09-30 17:22:19 +02:00
|
|
|
info1.setCardInfo(CardInfo(CardType::EID_CARD));
|
|
|
|
message.reset(new IfdStatus(info1));
|
2017-12-20 14:54:05 +01:00
|
|
|
mDispatcher1->onReceived(message);
|
2019-01-03 15:06:22 +01:00
|
|
|
QTRY_COMPARE(spySend.count(), 1);
|
2017-12-20 14:54:05 +01:00
|
|
|
result = qvariant_cast<QSharedPointer<const RemoteMessage> >(spySend.takeFirst().at(0));
|
|
|
|
QCOMPARE(result->getType(), RemoteCardMessageType::IFDConnect);
|
2019-01-03 15:06:22 +01:00
|
|
|
QVERIFY(mPlugin->getReaders().at(0)->getCard() != nullptr);
|
|
|
|
QCOMPARE(mPlugin->getReaders().at(0)->getReaderInfo().getMaxApduLength(), 1);
|
|
|
|
QVERIFY(mPlugin->getReaders().at(0)->getReaderInfo().hasCard());
|
2017-12-20 14:54:05 +01:00
|
|
|
QCOMPARE(spyInserted.size(), 1);
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(spyInserted.takeFirst().at(0).toString(), QStringLiteral("NFC Reader#TestContext"));
|
2017-12-20 14:54:05 +01:00
|
|
|
QCOMPARE(spyRemoved.size(), 0);
|
|
|
|
QCOMPARE(spyChanged.size(), 0);
|
|
|
|
QCOMPARE(spyUpdated.size(), 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void testSingleDispatcherSingleReaderCardCommunication()
|
|
|
|
{
|
|
|
|
QSharedPointer<const RemoteMessage> result;
|
|
|
|
QSignalSpy spySend(mDispatcher1.data(), &MockRemoteDispatcher::fireSend);
|
|
|
|
|
|
|
|
mDispatcher1->setState(MockRemoteDispatcher::DispatcherState::ReaderWithCard);
|
|
|
|
Q_EMIT mRemoteClient->fireNewRemoteDispatcher(mDispatcher1);
|
|
|
|
|
2019-01-03 15:06:22 +01:00
|
|
|
QTRY_COMPARE(spySend.count(), 4);
|
2017-12-20 14:54:05 +01:00
|
|
|
spySend.takeFirst();
|
|
|
|
result = qvariant_cast<QSharedPointer<const RemoteMessage> >(spySend.takeFirst().at(0));
|
|
|
|
QCOMPARE(result->getType(), RemoteCardMessageType::IFDConnect);
|
|
|
|
result = qvariant_cast<QSharedPointer<const RemoteMessage> >(spySend.takeFirst().at(0));
|
|
|
|
QCOMPARE(result->getType(), RemoteCardMessageType::IFDTransmit);
|
|
|
|
result = qvariant_cast<QSharedPointer<const RemoteMessage> >(spySend.takeFirst().at(0));
|
|
|
|
QCOMPARE(result->getType(), RemoteCardMessageType::IFDDisconnect);
|
|
|
|
|
|
|
|
QCOMPARE(mPlugin->getReaders().size(), 1);
|
2018-03-28 15:10:51 +02:00
|
|
|
Card* card = mPlugin->getReaders().at(0)->getCard();
|
2017-12-20 14:54:05 +01:00
|
|
|
QVERIFY(card != nullptr);
|
|
|
|
|
|
|
|
QCOMPARE(card->connect(), CardReturnCode::OK);
|
2019-01-03 15:06:22 +01:00
|
|
|
QTRY_COMPARE(spySend.count(), 1);
|
2017-12-20 14:54:05 +01:00
|
|
|
result = qvariant_cast<QSharedPointer<const RemoteMessage> >(spySend.takeFirst().at(0));
|
|
|
|
QCOMPARE(result->getType(), RemoteCardMessageType::IFDConnect);
|
|
|
|
QCOMPARE(static_cast<const IfdConnect*>(result.data())->getSlotName(), QStringLiteral("NFC Reader"));
|
|
|
|
|
|
|
|
QCOMPARE(card->disconnect(), CardReturnCode::OK);
|
2019-01-03 15:06:22 +01:00
|
|
|
QTRY_COMPARE(spySend.count(), 1);
|
2017-12-20 14:54:05 +01:00
|
|
|
result = qvariant_cast<QSharedPointer<const RemoteMessage> >(spySend.takeFirst().at(0));
|
|
|
|
QCOMPARE(result->getType(), RemoteCardMessageType::IFDDisconnect);
|
|
|
|
QCOMPARE(static_cast<const IfdDisconnect*>(result.data())->getSlotHandle(), QStringLiteral("NFC Reader"));
|
|
|
|
|
|
|
|
CommandApdu cmd(QByteArray("ping"));
|
|
|
|
ResponseApdu res;
|
|
|
|
QCOMPARE(card->transmit(cmd, res), CardReturnCode::OK);
|
2019-01-03 15:06:22 +01:00
|
|
|
QTRY_COMPARE(spySend.count(), 1);
|
2017-12-20 14:54:05 +01:00
|
|
|
result = qvariant_cast<QSharedPointer<const RemoteMessage> >(spySend.takeFirst().at(0));
|
|
|
|
QCOMPARE(result->getType(), RemoteCardMessageType::IFDTransmit);
|
|
|
|
QCOMPARE(static_cast<const IfdTransmit*>(result.data())->getSlotHandle(), QStringLiteral("NFC Reader"));
|
|
|
|
QCOMPARE(static_cast<const IfdTransmit*>(result.data())->getInputApdu(), QByteArray("ping"));
|
|
|
|
QCOMPARE(res.getBuffer(), QByteArray("pong"));
|
|
|
|
|
|
|
|
mDispatcher1->setState(MockRemoteDispatcher::DispatcherState::ReaderWithCardError);
|
|
|
|
|
|
|
|
QCOMPARE(card->connect(), CardReturnCode::COMMAND_FAILED);
|
2019-01-03 15:06:22 +01:00
|
|
|
QTRY_COMPARE(spySend.count(), 1);
|
2017-12-20 14:54:05 +01:00
|
|
|
result = qvariant_cast<QSharedPointer<const RemoteMessage> >(spySend.takeFirst().at(0));
|
|
|
|
QCOMPARE(result->getType(), RemoteCardMessageType::IFDConnect);
|
|
|
|
QCOMPARE(static_cast<const IfdConnect*>(result.data())->getSlotName(), QStringLiteral("NFC Reader"));
|
|
|
|
|
|
|
|
QCOMPARE(card->disconnect(), CardReturnCode::COMMAND_FAILED);
|
2019-01-03 15:06:22 +01:00
|
|
|
QTRY_COMPARE(spySend.count(), 1);
|
2017-12-20 14:54:05 +01:00
|
|
|
result = qvariant_cast<QSharedPointer<const RemoteMessage> >(spySend.takeFirst().at(0));
|
|
|
|
QCOMPARE(result->getType(), RemoteCardMessageType::IFDDisconnect);
|
|
|
|
QCOMPARE(static_cast<const IfdDisconnect*>(result.data())->getSlotHandle(), QStringLiteral("NFC Reader"));
|
|
|
|
|
|
|
|
res.setBuffer(QByteArray());
|
|
|
|
QCOMPARE(card->transmit(cmd, res), CardReturnCode::COMMAND_FAILED);
|
2019-01-03 15:06:22 +01:00
|
|
|
QTRY_COMPARE(spySend.count(), 1);
|
2017-12-20 14:54:05 +01:00
|
|
|
result = qvariant_cast<QSharedPointer<const RemoteMessage> >(spySend.takeFirst().at(0));
|
|
|
|
QCOMPARE(result->getType(), RemoteCardMessageType::IFDTransmit);
|
|
|
|
QCOMPARE(static_cast<const IfdTransmit*>(result.data())->getSlotHandle(), QStringLiteral("NFC Reader"));
|
|
|
|
QCOMPARE(static_cast<const IfdTransmit*>(result.data())->getInputApdu(), QByteArray("ping"));
|
|
|
|
QCOMPARE(res.getBuffer(), QByteArray());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void testUnexpectedMessagesCauseAnIfdErrorMessage()
|
|
|
|
{
|
|
|
|
QSignalSpy spySend(mDispatcher1.data(), &MockRemoteDispatcher::fireSend);
|
|
|
|
|
|
|
|
mDispatcher1->setState(MockRemoteDispatcher::DispatcherState::WithoutReader);
|
|
|
|
Q_EMIT mRemoteClient->fireNewRemoteDispatcher(mDispatcher1);
|
2019-01-03 15:06:22 +01:00
|
|
|
QTRY_COMPARE(spySend.count(), 1);
|
2017-12-20 14:54:05 +01:00
|
|
|
spySend.clear();
|
|
|
|
|
2019-01-03 15:06:22 +01:00
|
|
|
const QVector<QSharedPointer<const RemoteMessage> > clientMessages({
|
|
|
|
QSharedPointer<const RemoteMessage>(new IfdEstablishContext(IfdVersion::Version::v0, "MAC-MINI")),
|
|
|
|
QSharedPointer<const RemoteMessage>(new IfdGetStatus("Remote Reader")),
|
|
|
|
QSharedPointer<const RemoteMessage>(new IfdConnect("NFC Reader")),
|
|
|
|
QSharedPointer<const RemoteMessage>(new IfdDisconnect("NFC Reader")),
|
|
|
|
QSharedPointer<const RemoteMessage>(new IfdTransmit("NFC Reader", "00A402022F00")),
|
|
|
|
QSharedPointer<const RemoteMessage>(new IfdEstablishPaceChannel("NFC Reader", "abcd1234"))
|
|
|
|
}
|
|
|
|
);
|
|
|
|
for (const auto& clientMessage : clientMessages)
|
2017-12-20 14:54:05 +01:00
|
|
|
{
|
2019-01-03 15:06:22 +01:00
|
|
|
QMetaObject::invokeMethod(mDispatcher1.data(), [ = ] {
|
|
|
|
mDispatcher1->onReceived(clientMessage);
|
|
|
|
}, Qt::QueuedConnection);
|
|
|
|
QTRY_COMPARE(spySend.count(), 1);
|
2017-12-20 14:54:05 +01:00
|
|
|
const QList<QVariant>& arguments = spySend.last();
|
|
|
|
|
|
|
|
const QVariant remoteMessageVariant = arguments.at(0);
|
|
|
|
QVERIFY(remoteMessageVariant.canConvert<QSharedPointer<const RemoteMessage> >());
|
|
|
|
const QSharedPointer<const RemoteMessage> message = remoteMessageVariant.value<QSharedPointer<const RemoteMessage> >();
|
|
|
|
const QSharedPointer<const IfdError> errorMessage = message.dynamicCast<const IfdError>();
|
|
|
|
|
|
|
|
QVERIFY(!errorMessage.isNull());
|
|
|
|
QCOMPARE(errorMessage->getType(), RemoteCardMessageType::IFDError);
|
|
|
|
QCOMPARE(errorMessage->getContextHandle(), QString());
|
|
|
|
QCOMPARE(errorMessage->getSlotHandle(), QString());
|
|
|
|
QVERIFY(errorMessage->resultHasError());
|
2019-01-03 15:06:22 +01:00
|
|
|
QCOMPARE(errorMessage->getResultMinor(), ECardApiResult::Minor::AL_Unkown_API_Function);
|
2017-12-20 14:54:05 +01:00
|
|
|
|
|
|
|
spySend.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
QTEST_GUILESS_MAIN(test_RemoteReaderManagerPlugIn)
|
|
|
|
#include "test_RemoteReaderManagerPlugin.moc"
|