1 /*! 2 * \brief Unit tests for \ref StateGetTcToken 3 * 4 * \copyright Copyright (c) 2018-2021 Governikus GmbH & Co. KG, Germany 5 */ 6 7 #include "states/StateGetTcToken.h" 8 9 #include "MockNetworkReply.h" 10 11 #include <QByteArrayList> 12 #include <QtTest> 13 14 15 using namespace governikus; 16 17 18 class test_StateGetTcToken 19 : public QObject 20 { 21 Q_OBJECT 22 23 private Q_SLOTS: test_Run()24 void test_Run() 25 { 26 const QSharedPointer<AuthContext> context(new AuthContext(nullptr)); 27 StateGetTcToken state(context); 28 const QUrl validUrl(QString("https://test.com")); 29 const QUrl invalidUrl(QString("test")); 30 QSignalSpy spyAbort(&state, &StateGetTcToken::fireAbort); 31 32 context->setTcTokenUrl(validUrl); 33 QTest::ignoreMessage(QtDebugMsg, "Got TC Token URL: QUrl(\"https://test.com\")"); 34 state.run(); 35 QCOMPARE(spyAbort.count(), 0); 36 37 context->setTcTokenUrl(invalidUrl); 38 QTest::ignoreMessage(QtDebugMsg, "Got TC Token URL: QUrl(\"test\")"); 39 state.run(); 40 QCOMPARE(spyAbort.count(), 1); 41 } 42 43 test_IsValidRedirectUrl()44 void test_IsValidRedirectUrl() 45 { 46 const QSharedPointer<AuthContext> context(new AuthContext(nullptr)); 47 StateGetTcToken state(context); 48 49 QTest::ignoreMessage(QtCriticalMsg, "Error while connecting to the provider. The server returns an invalid or empty redirect URL."); 50 const QUrl emptyUrl; 51 QVERIFY(!state.isValidRedirectUrl(emptyUrl)); 52 53 const QUrl invalidUrl(QString("test")); 54 QVERIFY(!state.isValidRedirectUrl(invalidUrl)); 55 56 const QUrl validUrl(QString("https://test.com")); 57 QVERIFY(state.isValidRedirectUrl(validUrl)); 58 } 59 60 test_SendRequest()61 void test_SendRequest() 62 { 63 const QSharedPointer<AuthContext> context(new AuthContext(nullptr)); 64 StateGetTcToken state(context); 65 QSignalSpy spyAbort(&state, &StateGetTcToken::fireAbort); 66 67 const QUrl url(QString("https://test.com")); 68 state.sendRequest(url); 69 QCOMPARE(state.mConnections.size(), 3); 70 71 QTRY_COMPARE(spyAbort.count(), 1); // clazy:exclude=qstring-allocations 72 } 73 74 test_ParseTcTokenNoData()75 void test_ParseTcTokenNoData() 76 { 77 const QSharedPointer<AuthContext> context(new AuthContext(nullptr)); 78 StateGetTcToken state(context); 79 state.mReply.reset(new MockNetworkReply(), &QObject::deleteLater); 80 QSignalSpy spyAbort(&state, &StateGetTcToken::fireAbort); 81 82 QTest::ignoreMessage(QtDebugMsg, "Received no data."); 83 state.parseTcToken(); 84 QCOMPARE(context->getStatus().getStatusCode(), GlobalStatus::Code::Workflow_TrustedChannel_No_Data_Received); 85 QCOMPARE(spyAbort.count(), 1); 86 } 87 88 test_ParseTcTokenWithDataUsePsk()89 void test_ParseTcTokenWithDataUsePsk() 90 { 91 const QByteArray data("<?xml version=\"1.0\"?>" 92 "<TCTokenType>" 93 " <ServerAddress>https://eid-server.example.de/entrypoint</ServerAddress>" 94 " <SessionIdentifier>1A2BB129</SessionIdentifier>" 95 " <RefreshAddress>https://service.example.de/loggedin?7eb39f62</RefreshAddress>" 96 " <Binding> urn:liberty:paos:2006-08 </Binding>" 97 " <PathSecurity-Protocol> urn:ietf:rfc:4279 </PathSecurity-Protocol>" 98 " <PathSecurity-Parameters>" 99 " <PSK> 4BC1A0B5 </PSK>" 100 " </PathSecurity-Parameters>" 101 "</TCTokenType>"); 102 103 const QSharedPointer<AuthContext> context(new AuthContext(nullptr)); 104 StateGetTcToken state(context); 105 state.mReply.reset(new MockNetworkReply(data), &QObject::deleteLater); 106 QSignalSpy spyContinue(&state, &StateGetTcToken::fireContinue); 107 108 QVERIFY(!context->getTcToken()); 109 state.parseTcToken(); 110 QVERIFY(context->getTcToken()); 111 QVERIFY(!context->isTcTokenNotFound()); 112 QCOMPARE(spyContinue.count(), 1); 113 } 114 115 test_ParseTcTokenWithDataNoPsk()116 void test_ParseTcTokenWithDataNoPsk() 117 { 118 const QByteArray data("invalid data"); 119 const QSharedPointer<AuthContext> context(new AuthContext(nullptr)); 120 StateGetTcToken state(context); 121 state.mReply.reset(new MockNetworkReply(data), &QObject::deleteLater); 122 QSignalSpy spyAbort(&state, &StateGetTcToken::fireAbort); 123 124 QTest::ignoreMessage(QtCriticalMsg, "TCToken invalid"); 125 state.parseTcToken(); 126 QCOMPARE(context->getStatus().getStatusCode(), GlobalStatus::Code::Workflow_TrustedChannel_Server_Format_Error); 127 QCOMPARE(spyAbort.count(), 1); 128 } 129 130 131 }; 132 133 QTEST_GUILESS_MAIN(test_StateGetTcToken) 134 #include "test_StateGetTcToken.moc" 135