diff --git a/core/backends/lan/downloadjob.cpp b/core/backends/lan/downloadjob.cpp index bba2e988b..abbedf102 100644 --- a/core/backends/lan/downloadjob.cpp +++ b/core/backends/lan/downloadjob.cpp @@ -20,30 +20,50 @@ #include "downloadjob.h" +#include + +#include +#include +#include +#include + +#include "lanlinkprovider.h" + DownloadJob::DownloadJob(QHostAddress address, QVariantMap transferInfo): KJob() { mAddress = address; mPort = transferInfo["port"].toInt(); - mSocket = QSharedPointer(new QTcpSocket); + mSocket = QSharedPointer(new QTcpSocket()); +} + +DownloadJob::~DownloadJob() +{ } void DownloadJob::start() { - //kDebug(kdeconnect_kded()) << "DownloadJob Start"; + //TODO: Timeout? + connect(mSocket.data(), &QAbstractSocket::disconnected, this, &DownloadJob::done); + connect(mSocket.data(), SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(done())); + //connect(mSocket.data(), &QAbstractSocket::connected, [=](){ qDebug() << "Connected"; }); + mSocket->connectToHost(mAddress, mPort, QIODevice::ReadOnly); - connect(mSocket.data(), SIGNAL(disconnected()), - this, SLOT(disconnected())); + + //mSocket->open(QIODevice::ReadOnly); + //TODO: Implement payload encryption somehow (create an intermediate iodevice to encrypt the payload here?) } -void DownloadJob::disconnected() +void DownloadJob::done() { - //kDebug(kdeconnect_kded()) << "DownloadJob End"; + if (mSocket->error()) { + qWarning(KDECONNECT_CORE) << mSocket->errorString(); + } emitResult(); + deleteLater(); } QSharedPointer DownloadJob::getPayload() { - //kDebug(kdeconnect_kded()) << "getPayload"; return mSocket.staticCast(); } diff --git a/core/backends/lan/downloadjob.h b/core/backends/lan/downloadjob.h index 544e33cd4..e3d3a7dc6 100644 --- a/core/backends/lan/downloadjob.h +++ b/core/backends/lan/downloadjob.h @@ -35,7 +35,8 @@ class DownloadJob Q_OBJECT public: DownloadJob(QHostAddress address, QVariantMap transferInfo); - virtual void start() override; + ~DownloadJob(); + void start() Q_DECL_OVERRIDE; QSharedPointer getPayload(); private: @@ -43,9 +44,8 @@ private: qint16 mPort; QSharedPointer mSocket; - private Q_SLOTS: - void disconnected(); + void done(); }; diff --git a/core/core_debug.h b/core/core_debug.h index 93a0f1d1f..d74745cb9 100644 --- a/core/core_debug.h +++ b/core/core_debug.h @@ -23,6 +23,8 @@ #include -Q_DECLARE_LOGGING_CATEGORY(KDECONNECT_CORE) +#include "kdeconnectcore_export.h" + +KDECONNECTCORE_EXPORT Q_DECLARE_LOGGING_CATEGORY(KDECONNECT_CORE) #endif //CORE_DEBUG_H diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 727f3951d..4be7945cb 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -16,3 +16,4 @@ set(kdeconnect_libraries ecm_add_test(networkpackagetests.cpp LINK_LIBRARIES ${kdeconnect_libraries}) ecm_add_test(testsocketlinereader.cpp ../core/backends/lan/socketlinereader.cpp TEST_NAME testsocketlinereader LINK_LIBRARIES ${kdeconnect_libraries}) +ecm_add_test(downloadjobtest.cpp ../core/backends/lan/downloadjob.cpp TEST_NAME downloadjobtest LINK_LIBRARIES ${kdeconnect_libraries}) diff --git a/tests/downloadjobtest.cpp b/tests/downloadjobtest.cpp new file mode 100644 index 000000000..efaea3dc2 --- /dev/null +++ b/tests/downloadjobtest.cpp @@ -0,0 +1,107 @@ +/************************************************************************************* + * Copyright (C) 2014 by Albert Vaca Cintora * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * + *************************************************************************************/ + +#include "../core/backends/lan/downloadjob.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class DownloadJobTest : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + void failToConnectShouldDestroyTheJob(); + void closingTheConnectionShouldDestroyTheJob(); +private: + + void initServer(); + void initDownloadJob(); + void awaitToBeDestroyedOrTimeOut(); + void stopServer(); + + QTimer mTimer; + QEventLoop mLoop; + DownloadJob* test; + QTcpServer *mServer; +}; + +void DownloadJobTest::initServer() +{ + mServer = new QTcpServer(this); + QVERIFY2(mServer->listen(QHostAddress::LocalHost, 8694), "Failed to create local tcp server"); +} + +void DownloadJobTest::stopServer() +{ + mServer->close(); +} + +void DownloadJobTest::initDownloadJob() +{ + QVariantMap transferInfo; + transferInfo["port"]= 8694; + test = new DownloadJob(QHostAddress::LocalHost, transferInfo); + test->start(); +} + +void DownloadJobTest::awaitToBeDestroyedOrTimeOut() +{ + //Either the job is destroyed + connect(test, &QObject::destroyed, &mLoop, &QEventLoop::quit); + + //Or we time out + mTimer.setInterval(2000); + mTimer.setSingleShot(true); + connect(&mTimer, &QTimer::timeout, [this]() { + mLoop.quit(); + QFAIL("Test timed out"); + }); + mTimer.start(); + + //We wait + mLoop.exec(); + + mTimer.stop(); +} + +void DownloadJobTest::failToConnectShouldDestroyTheJob() +{ + initDownloadJob(); + awaitToBeDestroyedOrTimeOut(); +} + +void DownloadJobTest::closingTheConnectionShouldDestroyTheJob() +{ + initServer(); + initDownloadJob(); + stopServer(); + awaitToBeDestroyedOrTimeOut(); +} + +QTEST_GUILESS_MAIN(DownloadJobTest) + +#include "downloadjobtest.moc"