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