1 /*!
2  * \brief Unit tests for \ref RemoteServerImpl
3  *
4  * \copyright Copyright (c) 2017-2021 Governikus GmbH & Co. KG, Germany
5  */
6 #include "RemoteServerImpl.h"
7 
8 #include "Env.h"
9 #include "RemoteReaderAdvertiser.h"
10 #include "RemoteServer.h"
11 #include "RemoteWebSocketServer.h"
12 
13 #include <QPointer>
14 #include <QSharedPointer>
15 #include <QtTest>
16 
17 
18 using namespace governikus;
19 
20 class RemoteWebSocketServerMock
21 	: public RemoteWebSocketServer
22 {
23 	Q_OBJECT
24 
25 	public:
26 		QString mServerName;
27 		bool mPairing;
28 		bool mListening = false, mConnected = false;
29 		QSharedPointer<ServerMessageHandler> mEmptyHandler;
30 
isListening() const31 		[[nodiscard]] bool isListening() const override
32 		{
33 			return mListening;
34 		}
35 
36 
isConnected() const37 		[[nodiscard]] bool isConnected() const override
38 		{
39 			return mConnected;
40 		}
41 
42 
isPairingConnection() const43 		[[nodiscard]] bool isPairingConnection() const override
44 		{
45 			return false;
46 		}
47 
48 
setConnected(bool pConnected)49 		void setConnected(bool pConnected)
50 		{
51 			if (mConnected != pConnected)
52 			{
53 				mConnected = pConnected;
54 				Q_EMIT fireConnectedChanged(mConnected);
55 			}
56 		}
57 
58 
listen(const QString & pServerName)59 		bool listen(const QString& pServerName) override
60 		{
61 			if (mListening)
62 			{
63 				return false;
64 			}
65 			mServerName = pServerName;
66 			mListening = true;
67 			return true;
68 		}
69 
70 
close()71 		void close() override
72 		{
73 			mListening = false;
74 			mServerName = QString();
75 			mPairing = false;
76 		}
77 
78 
getServerName() const79 		[[nodiscard]] QString getServerName() const override
80 		{
81 			return mServerName;
82 		}
83 
84 
getServerPort() const85 		[[nodiscard]] quint16 getServerPort() const override
86 		{
87 			return 1;
88 		}
89 
90 
setPairing(bool pEnabled=true)91 		void setPairing(bool pEnabled = true) override
92 		{
93 			mPairing = pEnabled;
94 		}
95 
96 
getCurrentCertificate() const97 		[[nodiscard]] QSslCertificate getCurrentCertificate() const override
98 		{
99 			return QSslCertificate();
100 		}
101 
102 
getMessageHandler() const103 		[[nodiscard]] const QSharedPointer<ServerMessageHandler>& getMessageHandler() const override
104 		{
105 			return mEmptyHandler;
106 		}
107 
108 
109 };
110 
111 
112 class RemoteReaderAdvertiserMock
113 	: public RemoteReaderAdvertiser
114 {
115 	Q_OBJECT
116 
117 	public:
118 		const QString mIfdName;
119 		const QString mIfdId;
120 		const quint16 mPort;
121 
RemoteReaderAdvertiserMock(const QString & pIfdName,const QString & pIfdId,quint16 pPort)122 		RemoteReaderAdvertiserMock(const QString& pIfdName, const QString& pIfdId, quint16 pPort)
123 			: RemoteReaderAdvertiser()
124 			, mIfdName(pIfdName)
125 			, mIfdId(pIfdId)
126 			, mPort(pPort)
127 		{
128 		}
129 
130 
131 		~RemoteReaderAdvertiserMock() override;
132 };
133 
134 
~RemoteReaderAdvertiserMock()135 RemoteReaderAdvertiserMock::~RemoteReaderAdvertiserMock()
136 {
137 }
138 
139 
140 class test_RemoteServerImpl
141 	: public QObject
142 {
143 	Q_OBJECT
144 
145 	QPointer<RemoteReaderAdvertiserMock> mAdvertiserMock;
146 	QPointer<RemoteWebSocketServerMock> mWebSocketMock;
147 	QScopedPointer<RemoteServer> mServer;
148 
149 	private Q_SLOTS:
init()150 		void init()
151 		{
152 			std::function<RemoteReaderAdvertiser* (const QString&, const QString&, quint16&)> creator = [this](const QString& pIfdName, const QString& pIfdId, quint16& pPort){
153 						mAdvertiserMock = new RemoteReaderAdvertiserMock(pIfdName, pIfdId, pPort);
154 						return mAdvertiserMock;
155 					};
156 			Env::setCreator<RemoteReaderAdvertiser*, const QString&, const QString&, quint16&>(creator);
157 			std::function<RemoteWebSocketServer* ()> creator2 = [this](){
158 						mWebSocketMock = new RemoteWebSocketServerMock();
159 						return mWebSocketMock;
160 					};
161 			Env::setCreator<RemoteWebSocketServer*>(creator2);
162 			mServer.reset(new RemoteServerImpl());
163 		}
164 
165 
startStop()166 		void startStop()
167 		{
168 			QVERIFY(!mAdvertiserMock);
169 			QVERIFY(!mWebSocketMock->isListening());
170 
171 			QVERIFY(mServer->start(QStringLiteral("ServerName")));
172 			QVERIFY(mAdvertiserMock);
173 			QVERIFY(mWebSocketMock->isListening());
174 
175 			mServer->stop();
176 			QVERIFY(!mAdvertiserMock);
177 			QVERIFY(!mWebSocketMock->isListening());
178 		}
179 
180 
serverName()181 		void serverName()
182 		{
183 			mServer->start(QStringLiteral("ServerName"));
184 			QCOMPARE(mAdvertiserMock->mIfdName, QStringLiteral("ServerName"));
185 			QCOMPARE(mWebSocketMock->mServerName, QStringLiteral("ServerName"));
186 		}
187 
188 
port()189 		void port()
190 		{
191 			mServer->start(QStringLiteral("ServerName"));
192 			QCOMPARE(mAdvertiserMock->mPort, mWebSocketMock->getServerPort());
193 		}
194 
195 
stopAdvertisingOnConnection()196 		void stopAdvertisingOnConnection()
197 		{
198 			mServer->start(QStringLiteral("ServerName"));
199 			mWebSocketMock->setConnected(true);
200 
201 			QVERIFY(!mAdvertiserMock);
202 		}
203 
204 
startAdvertisingOnConnectionClosed()205 		void startAdvertisingOnConnectionClosed()
206 		{
207 			mServer->start(QStringLiteral("ServerName"));
208 			mWebSocketMock->setConnected(true);
209 			mWebSocketMock->setConnected(false);
210 
211 			QVERIFY(mAdvertiserMock);
212 		}
213 
214 
215 };
216 
217 
218 QTEST_GUILESS_MAIN(test_RemoteServerImpl)
219 #include "test_RemoteServerImpl.moc"
220