diff options
Diffstat (limited to 'tests/auto/installer/clientserver/tst_clientserver.cpp')
-rw-r--r-- | tests/auto/installer/clientserver/tst_clientserver.cpp | 214 |
1 files changed, 176 insertions, 38 deletions
diff --git a/tests/auto/installer/clientserver/tst_clientserver.cpp b/tests/auto/installer/clientserver/tst_clientserver.cpp index 316bc3051..e5be5a8a0 100644 --- a/tests/auto/installer/clientserver/tst_clientserver.cpp +++ b/tests/auto/installer/clientserver/tst_clientserver.cpp @@ -39,12 +39,14 @@ #include <remotefileengine.h> #include <remoteserver.h> +#include <QBuffer> #include <QSettings> #include <QLocalSocket> #include <QTest> #include <QSignalSpy> #include <QTemporaryFile> #include <QUuid> +#include <QLocalServer> using namespace QInstaller; @@ -52,12 +54,154 @@ class tst_ClientServer : public QObject { Q_OBJECT +private: + template<typename T> + void sendCommand(QIODevice *device, const QByteArray &cmd, T t) + { + QByteArray data; + QDataStream stream(&data, QIODevice::WriteOnly); + stream << t; + sendPacket(device, cmd, data); + } + + template<typename T> + void receiveCommand(QIODevice *device, QByteArray *cmd, T *t) + { + QByteArray data; + while (!receivePacket(device, cmd, &data)) + device->waitForReadyRead(-1); + QDataStream stream(&data, QIODevice::ReadOnly); + stream >> *t; + QCOMPARE(stream.status(), QDataStream::Ok); + QVERIFY(stream.atEnd()); + } + private slots: void initTestCase() { RemoteClient::instance().setActive(true); } + void sendReceivePacket() + { + QByteArray validPackage; + typedef qint32 PackageSize; + + // first try sendPacket ... + { + QBuffer device(&validPackage); + device.open(QBuffer::WriteOnly); + + const QByteArray cmd = "say"; + const QByteArray data = "hello" ; + QInstaller::sendPacket(&device, cmd, data); + + // 1 is delimiter (\0) + QCOMPARE(device.buffer().size(), (int)sizeof(PackageSize) + cmd.size() + 1 + data.size()); + QCOMPARE(device.buffer().right(data.size()), data); + QCOMPARE(device.buffer().mid(sizeof(PackageSize), cmd.size()), cmd); + } + + // now try successful receivePacket ... + { + QBuffer device(&validPackage); + device.open(QBuffer::ReadOnly); + + QByteArray cmd; + QByteArray data; + QCOMPARE(QInstaller::receivePacket(&device, &cmd, &data), true); + + QCOMPARE(device.pos(), device.size()); + QCOMPARE(cmd, QByteArray("say")); + QCOMPARE(data, QByteArray("hello")); + } + + + // now try read of incomplete packet ... + { + QByteArray incompletePackage = validPackage; + char toStrip = validPackage.at(validPackage.size() - 1); + incompletePackage.resize(incompletePackage.size() - 1); + QBuffer device(&incompletePackage); + device.open(QBuffer::ReadOnly); + + QByteArray cmd; + QByteArray data; + QCOMPARE(QInstaller::receivePacket(&device, &cmd, &data), false); + + QCOMPARE(device.pos(), 0); + QCOMPARE(cmd, QByteArray()); + QCOMPARE(data, QByteArray()); + + // make packet complete again, retry + device.buffer().append(toStrip); + QCOMPARE(device.buffer(), validPackage); + + QCOMPARE(QInstaller::receivePacket(&device, &cmd, &data), true); + + QCOMPARE(device.pos(), device.size()); + QCOMPARE(cmd, QByteArray("say")); + QCOMPARE(data, QByteArray("hello")); + } + } + + void localSocket() + { + // + // test roundtrip of a (big) packet via QLocalSocket + // + const QString socketName(__FUNCTION__); + QLocalServer::removeServer(socketName); + + QEventLoop loop; + + const QByteArray command = "HELLO"; + const QByteArray message(10905, '0'); + + QLocalServer server; + { // server + QLocalSocket *rcv = 0; + auto srvDataArrived = [&]() { + QByteArray command, message; + if (!receivePacket(rcv, &command, &message)) + return; + sendPacket(rcv, command, message); + }; + + connect(&server, &QLocalServer::newConnection, [&,srvDataArrived]() { + rcv = server.nextPendingConnection(); + connect(rcv, &QLocalSocket::readyRead, srvDataArrived); + }); + + server.listen(socketName); + } + + + QLocalSocket snd; + { // client + auto clientDataArrived = [&]() { + QByteArray cmd, msg; + if (!receivePacket(&snd, &cmd, &msg)) + return; + QCOMPARE(cmd, command); + QCOMPARE(msg, message); + loop.exit(); + }; + + connect(&snd, &QLocalSocket::readyRead, clientDataArrived); + + QTimer::singleShot(0, [&]() { + snd.connect(&snd, &QLocalSocket::connected, [&](){ + sendPacket(&snd, command, message); + }); + snd.connectToServer(socketName); + }); + } + + loop.exec(); + } + + void testServerConnectDebug() { RemoteServer server; @@ -72,28 +216,25 @@ private slots: QVERIFY2(socket.waitForConnected(), "Could not connect to server."); QCOMPARE(socket.state() == QLocalSocket::ConnectedState, true); - QDataStream stream; - stream.setDevice(&socket); - stream << QString::fromLatin1(Protocol::Authorize) << QString(Protocol::DefaultAuthorizationKey); - - socket.waitForBytesWritten(-1); - if (!socket.bytesAvailable()) - socket.waitForReadyRead(-1); + sendCommand(&socket, Protocol::Authorize, QString(Protocol::DefaultAuthorizationKey)); - quint32 size; stream >> size; - bool authorized; - stream >> authorized; - QCOMPARE(authorized, true); + { + QByteArray command; + bool authorized; + receiveCommand(&socket, &command, &authorized); + QCOMPARE(command, QByteArray(Protocol::Reply)); + QCOMPARE(authorized, true); + } - socket.flush(); - stream << QString::fromLatin1(Protocol::Authorize) << QString("SomeKey"); - socket.waitForBytesWritten(-1); - if (!socket.bytesAvailable()) - socket.waitForReadyRead(-1); + sendCommand(&socket, Protocol::Authorize, QString::fromLatin1("Some Key")); - stream >> size; - stream >> authorized; - QCOMPARE(authorized, false); + { + QByteArray command; + bool authorized; + receiveCommand(&socket, &command, &authorized); + QCOMPARE(command, QByteArray(Protocol::Reply)); + QCOMPARE(authorized, false); + } } void testServerConnectRelease() @@ -108,28 +249,25 @@ private slots: QVERIFY2(socket.waitForConnected(), "Could not connect to server."); QCOMPARE(socket.state() == QLocalSocket::ConnectedState, true); - QDataStream stream; - stream.setDevice(&socket); - stream << QString::fromLatin1(Protocol::Authorize) << QString("SomeKey"); + sendCommand(&socket, Protocol::Authorize, QString::fromLatin1("SomeKey")); - socket.waitForBytesWritten(-1); - if (!socket.bytesAvailable()) - socket.waitForReadyRead(-1); - - quint32 size; stream >> size; - bool authorized; - stream >> authorized; - QCOMPARE(authorized, true); + { + QByteArray command; + bool authorized; + receiveCommand(&socket, &command, &authorized); + QCOMPARE(command, QByteArray(Protocol::Reply)); + QCOMPARE(authorized, true); + } - socket.flush(); - stream << QString::fromLatin1(Protocol::Authorize) << QString(Protocol::DefaultAuthorizationKey); - socket.waitForBytesWritten(-1); - if (!socket.bytesAvailable()) - socket.waitForReadyRead(-1); + sendCommand(&socket, Protocol::Authorize, QString::fromLatin1(Protocol::DefaultAuthorizationKey)); - stream >> size; - stream >> authorized; - QCOMPARE(authorized, false); + { + QByteArray command; + bool authorized; + receiveCommand(&socket, &command, &authorized); + QCOMPARE(command, QByteArray(Protocol::Reply)); + QCOMPARE(authorized, false); + } } void testQSettingsWrapper() |