/*! * \brief Unit tests for \ref DatagramHandlerImpl * * \copyright Copyright (c) 2016-2019 Governikus GmbH & Co. KG, Germany */ #include "DatagramHandlerImpl.h" #include "Env.h" #include "LogHandler.h" #include #include #include using namespace governikus; class test_DatagramHandlerImpl : public QObject { Q_OBJECT private Q_SLOTS: void initTestCase() { Env::getSingleton()->init(); } void init() { DatagramHandlerImpl::cPort = 0; } void cleanup() { Env::getSingleton()->resetBacklog(); } void startUpShutDown() { QSignalSpy spy(Env::getSingleton(), &LogHandler::fireLog); QSharedPointer socket(Env::create()); QVERIFY(socket->isBound()); QCOMPARE(spy.count(), 1); auto param = spy.takeFirst(); QVERIFY(param.at(0).toString().contains("Bound on port:")); socket.reset(); QCOMPARE(spy.count(), 1); param = spy.takeFirst(); QVERIFY(param.at(0).toString().contains("Shutdown socket")); } void cannotStart() { #ifdef Q_OS_WIN QSKIP("Windows does not block privileged ports"); #endif DatagramHandlerImpl::cPort = 80; QSignalSpy spy(Env::getSingleton(), &LogHandler::fireLog); QSharedPointer socket(Env::create()); QVERIFY(!socket->isBound()); QCOMPARE(spy.count(), 1); auto param = spy.takeFirst(); QVERIFY(param.at(0).toString().contains("Cannot bind socket: \"The address is protected\"")); } void getNonJsonDatagram() { QSharedPointer socket(Env::create()); QVERIFY(socket->isBound()); QSignalSpy spySocket(socket.data(), &DatagramHandler::fireNewMessage); QSignalSpy spy(Env::getSingleton(), &LogHandler::fireLog); QUdpSocket clientSocket; #ifndef QT_NO_NETWORKPROXY clientSocket.setProxy(QNetworkProxy::NoProxy); #endif auto written = clientSocket.writeDatagram("dummy", QHostAddress::LocalHost, socket.staticCast()->mSocket->localPort()); QTRY_COMPARE(spySocket.count(), 1); QCOMPARE(written, 5); QCOMPARE(spy.count(), 0); auto param = spySocket.takeFirst(); QCOMPARE(param.at(0).toByteArray(), QByteArray("dummy")); } void getJsonDatagram_data() { QTest::addColumn("broadcast"); QTest::newRow("WithBroadcast") << true; QTest::newRow("WithoutBroadcast") << false; } void getJsonDatagram() { QFETCH(bool, broadcast); #ifdef Q_OS_FREEBSD if (broadcast) { QSKIP("FreeBSD does not like that"); } #endif QSharedPointer socket(Env::create()); QVERIFY(socket->isBound()); QSignalSpy spySocket(socket.data(), &DatagramHandler::fireNewMessage); QUdpSocket clientSocket; #ifndef QT_NO_NETWORKPROXY clientSocket.setProxy(QNetworkProxy::NoProxy); #endif QByteArray data("{\"key\":\"value\"}"); auto written = clientSocket.writeDatagram(data, broadcast ? QHostAddress::Broadcast : QHostAddress::LocalHost, socket.staticCast()->mSocket->localPort()); QTRY_COMPARE(spySocket.count(), 1); QCOMPARE(written, data.size()); const auto& msg = spySocket.takeFirst(); QCOMPARE(msg.size(), 2); QCOMPARE(msg.at(0).toByteArray(), data); } void sendDatagram_data() { QTest::addColumn("broadcast"); QTest::newRow("WithBroadcast") << true; QTest::newRow("WithoutBroadcast") << false; } void sendDatagram() { QFETCH(bool, broadcast); QUdpSocket receiver; #ifndef QT_NO_NETWORKPROXY receiver.setProxy(QNetworkProxy::NoProxy); #endif QVERIFY(receiver.bind()); QSignalSpy spyReceiver(&receiver, &QUdpSocket::readyRead); QSharedPointer datagramHandlerImpl = QSharedPointer::create(false); QSignalSpy spy(Env::getSingleton(), &LogHandler::fireLog); QJsonObject obj; obj["test"] = "dummy"; QJsonDocument doc; doc.setObject(obj); if (broadcast) { #ifdef Q_OS_FREEBSD QSKIP("FreeBSD does not like that"); #endif QVERIFY(datagramHandlerImpl->send(doc.toJson(QJsonDocument::Compact), receiver.localPort())); } else { QVERIFY(datagramHandlerImpl->send(doc.toJson(QJsonDocument::Compact), QHostAddress::LocalHost, receiver.localPort())); } QTRY_COMPARE(spyReceiver.count(), 1); QCOMPARE(spy.count(), 0); QVERIFY(receiver.hasPendingDatagrams()); QByteArray msg; msg.resize(static_cast(receiver.pendingDatagramSize())); receiver.readDatagram(msg.data(), msg.size()); QCOMPARE(msg, QByteArray("{\"test\":\"dummy\"}")); } }; QTEST_GUILESS_MAIN(test_DatagramHandlerImpl) #include "test_DatagramHandlerImpl.moc"