File indexing completed on 2024-05-12 05:46:31

0001 /************************************************************************************
0002  * SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>                *
0003  *                                                                                  *
0004  * This program is free software; you can redistribute it and/or                    *
0005  * modify it under the terms of the GNU General Public License                      *
0006  * as published by the Free Software Foundation; either version 2                   *
0007  * of the License, or (at your option) any later version.                           *
0008  *                                                                                  *
0009  * This program is distributed in the hope that it will be useful,                  *
0010  * but WITHOUT ANY WARRANTY; without even the implied warranty of                   *
0011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                    *
0012  * GNU General Public License for more details.                                     *
0013  *                                                                                  *
0014  * You should have received a copy of the GNU General Public License                *
0015  * along with this program; if not, write to the Free Software                      *
0016  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA   *
0017  ************************************************************************************/
0018 
0019 #include <qtest.h>
0020 #include <QJsonObject>
0021 #include <QJsonArray>
0022 #include <QStandardPaths>
0023 #include <QSignalSpy>
0024 #include <QLoggingCategory>
0025 
0026 #include <KSharedConfig>
0027 #include <KConfigGroup>
0028 
0029 #include "alternativesmodeltest.h"
0030 #include <purpose/job.h>
0031 #include <purpose/alternativesmodel.h>
0032 #include <purpose/configuration.h>
0033 
0034 QTEST_GUILESS_MAIN(AlternativesModelTest)
0035 
0036 static int saveAsRow(Purpose::AlternativesModel* model)
0037 {
0038     for(int i=0, c=model->rowCount(); i<c; ++i) {
0039         QString pluginId = model->index(i).data(Purpose::AlternativesModel::PluginIdRole).toString();
0040         if (pluginId == QLatin1String("saveasplugin")) {
0041             return i;
0042         }
0043     }
0044 
0045     Q_ASSERT(!"Couldn't find the saveas plugin");
0046     return -1;
0047 }
0048 
0049 void AlternativesModelTest::initTestCase()
0050 {
0051     // To avoid a runtime dependency on klauncher
0052     qputenv("KDE_FORK_SLAVES", "yes");
0053 
0054     if (qEnvironmentVariableIsSet("QT_LOGGING_RULES")) { // as is the case in CI
0055         // CopyJob debug output is too noisy because of the huge data URL we're using in bigBufferTest.
0056         qputenv("QT_LOGGING_RULES", qgetenv("QT_LOGGING_RULES") + QByteArrayLiteral(";kf.kio.core.copyjob.debug=false"));
0057     }
0058 
0059 }
0060 
0061 void AlternativesModelTest::runJobTest()
0062 {
0063     Purpose::AlternativesModel model;
0064 
0065     const QString tempfile = m_tempDir.path() + QStringLiteral("/purposetest");
0066     QFile::remove(tempfile);
0067     QJsonObject input = QJsonObject {
0068         {QStringLiteral("urls"), QJsonArray {QStringLiteral("http://kde.org")} },
0069         {QStringLiteral("mimeType"), QStringLiteral("dummy/thing") }
0070     };
0071     model.setInputData(input);
0072 
0073     model.setPluginType(QStringLiteral("Export"));
0074     model.setDisabledPlugins({});
0075 
0076     Purpose::Configuration* conf = model.configureJob(saveAsRow(&model));
0077     QVERIFY(!conf->isReady());
0078     QVERIFY(!conf->createJob());
0079     input.insert(QStringLiteral("destinationPath"), QUrl::fromLocalFile(tempfile).url()),
0080     conf->setData(input);
0081     QVERIFY(conf->isReady());
0082     Purpose::Job* job = conf->createJob();
0083     QVERIFY(job);
0084     QSignalSpy sOutput(job, &Purpose::Job::outputChanged);
0085     QVERIFY2(job->exec(), qPrintable(job->errorString()));
0086     QCOMPARE(sOutput.count(), 1);
0087     QVERIFY(QFile::remove(tempfile));
0088 }
0089 
0090 void AlternativesModelTest::bigBufferTest()
0091 {
0092     Purpose::AlternativesModel model;
0093 
0094     const QByteArray payload(1920*1080*4, 'x');
0095     const QString uri = QStringLiteral("data:text/plain;base64,") + QString::fromLatin1(payload.toBase64());
0096 
0097     const QString tempfile = m_tempDir.path() + QStringLiteral("/purposetest");
0098     QFile::remove(tempfile);
0099     const QJsonObject input = {
0100         {QStringLiteral("urls"), QJsonArray {uri} },
0101         {QStringLiteral("mimeType"), QStringLiteral("dummy/thing") },
0102         {QStringLiteral("destinationPath"), QUrl::fromLocalFile(tempfile).url()}
0103     };
0104     model.setInputData(input);
0105     model.setPluginType(QStringLiteral("Export"));
0106     model.setDisabledPlugins({});
0107 
0108     Purpose::Configuration* conf = model.configureJob(saveAsRow(&model));
0109     QVERIFY(conf->isReady());
0110     conf->setUseSeparateProcess(false);
0111     Purpose::Job* job = conf->createJob();
0112     QVERIFY(job);
0113     QSignalSpy sOutput(job, &Purpose::Job::outputChanged);
0114     QVERIFY2(job->exec(), qPrintable(job->errorString()));
0115     QCOMPARE(sOutput.count(), 1);
0116 
0117     QFileInfo fi(tempfile);
0118     QCOMPARE(fi.size(), payload.size());
0119     QVERIFY(QFile::remove(tempfile));
0120 }
0121 
0122 void AlternativesModelTest::disablePluginTest()
0123 {
0124     const auto listPlugins = [] {
0125         QStringList plugins;
0126         Purpose::AlternativesModel model;
0127         QJsonObject input = QJsonObject {
0128             {QStringLiteral("urls"), QJsonArray {QStringLiteral("http://kde.org")} },
0129             {QStringLiteral("mimeType"), QStringLiteral("dummy/thing") }
0130         };
0131         model.setInputData(input);
0132         model.setPluginType(QStringLiteral("Export"));
0133         model.setDisabledPlugins({});
0134 
0135         for (int i = 0; i < model.rowCount(); ++i) {
0136             plugins << model.index(i).data(Purpose::AlternativesModel::PluginIdRole).toString();
0137         }
0138         return plugins;
0139     };
0140 
0141     auto plugins = listPlugins();
0142     QVERIFY(plugins.contains(QStringLiteral("saveasplugin")));
0143     QVERIFY(plugins.contains(QStringLiteral("emailplugin")));
0144 
0145     QStandardPaths::setTestModeEnabled(true);
0146     auto config = KSharedConfig::openConfig(QStringLiteral("purposerc"));
0147     auto group = config->group("plugins");
0148     group.writeEntry("disabled", QStringList{ QStringLiteral("saveasplugin"), QStringLiteral("emailplugin") });
0149 
0150     plugins = listPlugins();
0151     QVERIFY(!plugins.contains(QStringLiteral("saveasplugin")));
0152     QVERIFY(!plugins.contains(QStringLiteral("emailplugin")));
0153 
0154     // "cleanup"
0155     group.writeEntry("disabled", QStringList());
0156 }
0157 
0158 void AlternativesModelTest::blacklistTest()
0159 {
0160     const auto listPlugins = [](const QStringList &blacklist) {
0161         QStringList plugins;
0162         Purpose::AlternativesModel model;
0163         QJsonObject input = QJsonObject {
0164             {QStringLiteral("urls"), QJsonArray {QStringLiteral("http://kde.org")} },
0165             {QStringLiteral("mimeType"), QStringLiteral("dummy/thing") }
0166         };
0167         model.setInputData(input);
0168         model.setPluginType(QStringLiteral("Export"));
0169         if (!blacklist.isEmpty()) {
0170             model.setDisabledPlugins(blacklist);
0171         }
0172 
0173         for (int i = 0; i < model.rowCount(); ++i) {
0174             plugins << model.index(i).data(Purpose::AlternativesModel::PluginIdRole).toString();
0175         }
0176         return plugins;
0177     };
0178 
0179     auto plugins = listPlugins(QStringList());
0180     QVERIFY(plugins.contains(QStringLiteral("emailplugin")));
0181 
0182     plugins = listPlugins({QStringLiteral("emailplugin")});
0183     QVERIFY(!plugins.contains(QStringLiteral("emailplugin")));
0184 
0185     plugins = listPlugins({QStringLiteral("saveasplugin")});
0186     QVERIFY(plugins.contains(QStringLiteral("emailplugin")));
0187 
0188     // Admin settings have precedence
0189     QStandardPaths::setTestModeEnabled(true);
0190     auto config = KSharedConfig::openConfig(QStringLiteral("purposerc"));
0191     auto group = config->group("plugins");
0192     group.writeEntry("disabled", QStringList{ QStringLiteral("emailplugin") });
0193 
0194     plugins = listPlugins({QStringLiteral("saveasplugin")});
0195     QVERIFY(!plugins.contains(QStringLiteral("emailplugin")));
0196 }