/*! * \brief Unit tests for \ref NetworkManager * * \copyright Copyright (c) 2014-2019 Governikus GmbH & Co. KG, Germany */ #include "NetworkManager.h" #include "context/SelfAuthContext.h" #include "controller/SelfAuthController.h" #include "Env.h" #include "LogHandler.h" #include "SecureStorage.h" #include "MockNetworkManager.h" #include "MockNetworkReply.h" #include #include #include using namespace governikus; Q_DECLARE_METATYPE(QSharedPointer ) class test_NetworkManager : public QObject { Q_OBJECT private Q_SLOTS: void initTestCase() { Env::getSingleton()->init(); } void cleanup() { Env::getSingleton()->resetBacklog(); } void paosRequestAttached() { QNetworkRequest request(QUrl("https://dummy")); auto reply = Env::getSingleton()->paos(request, "paosNamespace", "content", false, QByteArray(), 1); QVERIFY(request.hasRawHeader("PAOS")); QCOMPARE(request.rawHeader("PAOS"), QByteArray("ver=\"paosNamespace\"")); QCOMPARE(reply->request(), request); QCOMPARE(request.sslConfiguration().ellipticCurves().size(), 6); QVERIFY(request.sslConfiguration().ellipticCurves().contains(QSslEllipticCurve::fromLongName("prime256v1"))); const int cipherCount = SecureStorage::getInstance().getTlsConfig().getCiphers().size(); QCOMPARE(request.sslConfiguration().ciphers().size(), cipherCount); QVERIFY(request.sslConfiguration().ciphers().contains(QSslCipher("ECDHE-RSA-AES256-GCM-SHA384"))); } void paosRequestPsk() { QNetworkRequest request(QUrl("https://dummy")); auto reply = Env::getSingleton()->paos(request, "paosNamespace", "content", true, QByteArray(), 1); QVERIFY(request.hasRawHeader("PAOS")); QCOMPARE(request.rawHeader("PAOS"), QByteArray("ver=\"paosNamespace\"")); QCOMPARE(reply->request(), request); QCOMPARE(request.sslConfiguration().ellipticCurves().size(), 0); const int cipherCount = SecureStorage::getInstance().getTlsConfig(SecureStorage::TlsSuite::PSK).getCiphers().size(); QCOMPARE(request.sslConfiguration().ciphers().size(), cipherCount); QVERIFY(request.sslConfiguration().ciphers().contains(QSslCipher("RSA-PSK-AES128-CBC-SHA256"))); QVERIFY(request.sslConfiguration().ciphers().contains(QSslCipher("RSA-PSK-AES128-GCM-SHA256"))); QVERIFY(request.sslConfiguration().ciphers().contains(QSslCipher("RSA-PSK-AES256-CBC-SHA384"))); QVERIFY(request.sslConfiguration().ciphers().contains(QSslCipher("RSA-PSK-AES256-GCM-SHA384"))); } void serviceUnavailableEnums() { MockNetworkReply reply; reply.setNetworkError(QNetworkReply::ServiceUnavailableError, "dummy error msg"); QCOMPARE(NetworkManager::toNetworkError(&reply), NetworkManager::NetworkError::ServiceUnavailable); QCOMPARE(NetworkManager::toTrustedChannelStatus(&reply), GlobalStatus(GlobalStatus::Code::Workflow_TrustedChannel_ServiceUnavailable)); QCOMPARE(NetworkManager::toStatus(&reply), GlobalStatus(GlobalStatus::Code::Network_ServiceUnavailable)); } void serviceUnavailable_data() { QTest::addColumn >("status"); QTest::addColumn("param"); QTest::addColumn("msg"); const auto& msg = QStringLiteral("The service is temporarily not available. Please try again later."); auto status = QSharedPointer::create(GlobalStatus::Code::Workflow_TrustedChannel_ServiceUnavailable); QTest::newRow("trustedChannel") << status << true << msg; QTest::newRow("trustedChannel") << status << false << msg; status = QSharedPointer::create(GlobalStatus::Code::Network_ServiceUnavailable); QTest::newRow("network") << status << true << msg; QTest::newRow("network") << status << false << msg; } void serviceUnavailable() { QFETCH(QSharedPointer, status); QFETCH(bool, param); QFETCH(QString, msg); QCOMPARE(status->toErrorDescription(param), msg); } void serviceUnavailableWorkflow() { MockNetworkManager networkManager; Env::set(NetworkManager::staticMetaObject, &networkManager); connect(&networkManager, &MockNetworkManager::fireReply, this, [&] { networkManager.fireFinished(); }, Qt::QueuedConnection); auto reply = new MockNetworkReply; reply->setNetworkError(QNetworkReply::ServiceUnavailableError, "dummy"); networkManager.setNextReply(reply); auto context = QSharedPointer::create(); connect(context.data(), &AuthContext::fireStateChanged, this, [&] { context->setStateApproved(); }); SelfAuthController controller(context); QSignalSpy spy(&controller, &WorkflowController::fireComplete); controller.run(); QTRY_COMPARE(spy.count(), 1); QCOMPARE(context->getStatus(), GlobalStatus(GlobalStatus::Code::Workflow_TrustedChannel_ServiceUnavailable)); } }; QTEST_GUILESS_MAIN(test_NetworkManager) #include "test_NetworkManager.moc"