File indexing completed on 2024-04-28 08:49:15

0001 /**
0002  * SPDX-FileCopyrightText: 2015 Aleix Pol Gonzalez <aleixpol@kde.org>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 #include <QCoreApplication>
0008 #include <QSignalSpy>
0009 #include <QSocketNotifier>
0010 #include <QStandardPaths>
0011 #include <QTemporaryFile>
0012 #include <QTest>
0013 #include <backends/lan/uploadjob.h>
0014 #include <core/filetransferjob.h>
0015 #include <kdeconnectconfig.h>
0016 
0017 #include "core/daemon.h"
0018 #include "core/device.h"
0019 #include "core/kdeconnectplugin.h"
0020 #include "kdeconnect-version.h"
0021 #include "testdaemon.h"
0022 #include <backends/lan/compositeuploadjob.h>
0023 #include <backends/pairinghandler.h>
0024 #include <plugins/share/shareplugin.h>
0025 
0026 class TestSendFile : public QObject
0027 {
0028     Q_OBJECT
0029 public:
0030     TestSendFile()
0031     {
0032         QStandardPaths::setTestModeEnabled(true);
0033         m_daemon = new TestDaemon;
0034     }
0035 
0036 private Q_SLOTS:
0037     void testSend()
0038     {
0039         if (!(m_daemon->getLinkProviders().size() > 0)) {
0040             QFAIL("No links available, but loopback should have been provided by the test");
0041         }
0042 
0043         Device *d = nullptr;
0044         const QList<Device *> devicesList = m_daemon->devicesList();
0045         for (Device *id : devicesList) {
0046             if (id->isReachable()) {
0047                 if (!id->isPaired())
0048                     id->requestPairing();
0049                 d = id;
0050             }
0051         }
0052         if (d == nullptr) {
0053             QFAIL("Unable to determine device");
0054         }
0055         QCOMPARE(d->isReachable(), true);
0056         QCOMPARE(d->isPaired(), true);
0057 
0058         QByteArray content("12312312312313213123213123");
0059 
0060         QTemporaryFile temp;
0061         temp.open();
0062         temp.write(content);
0063         temp.close();
0064 
0065         KdeConnectPlugin *plugin = d->plugin(QStringLiteral("kdeconnect_share"));
0066         QVERIFY(plugin);
0067         plugin->metaObject()->invokeMethod(plugin, "shareUrl", Q_ARG(QString, QUrl::fromLocalFile(temp.fileName()).toString()));
0068 
0069         QSignalSpy spy(plugin, SIGNAL(shareReceived(QString)));
0070         QVERIFY(spy.wait(2000));
0071 
0072         QVariantList args = spy.takeFirst();
0073         QUrl sentFile(args.first().toUrl());
0074 
0075         QFile file(sentFile.toLocalFile());
0076         QCOMPARE(file.size(), content.size());
0077         QVERIFY(file.open(QIODevice::ReadOnly));
0078         QCOMPARE(file.readAll(), content);
0079     }
0080 
0081     void testSslJobs()
0082     {
0083         const QString aFile = QFINDTESTDATA("sendfiletest.cpp");
0084         const QString destFile = QDir::tempPath() + QStringLiteral("/kdeconnect-test-sentfile");
0085         QFile(destFile).remove();
0086 
0087         DeviceInfo deviceInfo = KdeConnectConfig::instance().deviceInfo();
0088         KdeConnectConfig::instance().addTrustedDevice(deviceInfo);
0089 
0090         // We need the device to be loaded on the daemon, otherwise CompositeUploadJob will get a null device
0091         Device *device = new Device(this, deviceInfo.id);
0092         m_daemon->addDevice(device);
0093 
0094         QSharedPointer<QFile> f(new QFile(aFile));
0095         NetworkPacket np(PACKET_TYPE_SHARE_REQUEST);
0096         np.setPayload(f, f->size());
0097 
0098         CompositeUploadJob *job = new CompositeUploadJob(deviceInfo.id, false);
0099         UploadJob *uj = new UploadJob(np);
0100         job->addSubjob(uj);
0101 
0102         QSignalSpy spyUpload(job, &KJob::result);
0103         job->start();
0104 
0105         f->open(QIODevice::ReadWrite);
0106 
0107         FileTransferJob *ft = np.createPayloadTransferJob(QUrl::fromLocalFile(destFile));
0108 
0109         QSignalSpy spyTransfer(ft, &KJob::result);
0110 
0111         ft->start();
0112 
0113         QVERIFY(spyTransfer.count() || spyTransfer.wait());
0114 
0115         if (ft->error()) {
0116             qWarning() << "fterror" << ft->errorString();
0117         }
0118 
0119         QCOMPARE(ft->error(), 0);
0120 
0121         QCOMPARE(spyUpload.count(), 1);
0122 
0123         QFile resultFile(destFile), originFile(aFile);
0124         QVERIFY(resultFile.open(QIODevice::ReadOnly));
0125         QVERIFY(originFile.open(QIODevice::ReadOnly));
0126 
0127         const QByteArray resultContents = resultFile.readAll(), originContents = originFile.readAll();
0128         QCOMPARE(resultContents.size(), originContents.size());
0129         QCOMPARE(resultFile.readAll(), originFile.readAll());
0130     }
0131 
0132 private:
0133     TestDaemon *m_daemon;
0134 };
0135 
0136 QTEST_MAIN(TestSendFile);
0137 
0138 #include "sendfiletest.moc"