File indexing completed on 2024-04-21 04:00:31

0001 /*
0002     SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez <aleixpol@blue-systems.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include <QJsonArray>
0008 #include <QJsonObject>
0009 #include <QLoggingCategory>
0010 #include <QSignalSpy>
0011 #include <QStandardPaths>
0012 #include <qtest.h>
0013 
0014 #include <KConfigGroup>
0015 #include <KSharedConfig>
0016 
0017 #include "alternativesmodeltest.h"
0018 #include <purpose/alternativesmodel.h>
0019 #include <purpose/configuration.h>
0020 #include <purpose/job.h>
0021 
0022 QTEST_GUILESS_MAIN(AlternativesModelTest)
0023 
0024 static int saveAsRow(Purpose::AlternativesModel *model)
0025 {
0026     for (int i = 0, c = model->rowCount(); i < c; ++i) {
0027         QString pluginId = model->index(i).data(Purpose::AlternativesModel::PluginIdRole).toString();
0028         if (pluginId == QLatin1String("saveasplugin")) {
0029             return i;
0030         }
0031     }
0032 
0033     Q_ASSERT(!"Couldn't find the saveas plugin");
0034     return -1;
0035 }
0036 
0037 void AlternativesModelTest::initTestCase()
0038 {
0039     // To let ctest exit, we shouldn't start kio_http_cache_cleaner
0040     qputenv("KIO_DISABLE_CACHE_CLEANER", "yes");
0041 
0042     if (qEnvironmentVariableIsSet("QT_LOGGING_RULES")) { // as is the case in CI
0043         // CopyJob debug output is too noisy because of the huge data URL we're using in bigBufferTest.
0044         qputenv("QT_LOGGING_RULES", QByteArray(qgetenv("QT_LOGGING_RULES") + QByteArrayLiteral(";kf.kio.core.copyjob.debug=false")));
0045     }
0046 }
0047 
0048 void AlternativesModelTest::runJobTest()
0049 {
0050     Purpose::AlternativesModel model;
0051 
0052     const QString tempfile = m_tempDir.path() + QStringLiteral("/purposetest");
0053     QFile::remove(tempfile);
0054     QJsonObject input =
0055         QJsonObject{{QStringLiteral("urls"), QJsonArray{QStringLiteral("http://kde.org")}}, {QStringLiteral("mimeType"), QStringLiteral("dummy/thing")}};
0056     model.setInputData(input);
0057 
0058     model.setPluginType(QStringLiteral("Export"));
0059     model.setDisabledPlugins({});
0060 
0061     Purpose::Configuration *conf = model.configureJob(saveAsRow(&model));
0062     QVERIFY(!conf->isReady());
0063     QVERIFY(!conf->createJob());
0064     input.insert(QStringLiteral("destinationPath"), QUrl::fromLocalFile(tempfile).url()), conf->setData(input);
0065     QVERIFY(conf->isReady());
0066     Purpose::Job *job = conf->createJob();
0067     QVERIFY(job);
0068     QSignalSpy sOutput(job, &Purpose::Job::outputChanged);
0069     QVERIFY2(job->exec(), qPrintable(job->errorString()));
0070     QCOMPARE(sOutput.count(), 1);
0071     QVERIFY(QFile::remove(tempfile));
0072 }
0073 
0074 void AlternativesModelTest::bigBufferTest()
0075 {
0076     Purpose::AlternativesModel model;
0077 
0078     const QByteArray payload(1920 * 1080 * 4, 'x');
0079     const QString uri = QStringLiteral("data:text/plain;base64,") + QString::fromLatin1(payload.toBase64());
0080 
0081     const QString tempfile = m_tempDir.path() + QStringLiteral("/purposetest");
0082     QFile::remove(tempfile);
0083     const QJsonObject input = {{QStringLiteral("urls"), QJsonArray{uri}},
0084                                {QStringLiteral("mimeType"), QStringLiteral("dummy/thing")},
0085                                {QStringLiteral("destinationPath"), QUrl::fromLocalFile(tempfile).url()}};
0086     model.setInputData(input);
0087     model.setPluginType(QStringLiteral("Export"));
0088     model.setDisabledPlugins({});
0089 
0090     Purpose::Configuration *conf = model.configureJob(saveAsRow(&model));
0091     QVERIFY(conf->isReady());
0092     conf->setUseSeparateProcess(false);
0093     Purpose::Job *job = conf->createJob();
0094     QVERIFY(job);
0095     QSignalSpy sOutput(job, &Purpose::Job::outputChanged);
0096     QVERIFY2(job->exec(), qPrintable(job->errorString()));
0097     QCOMPARE(sOutput.count(), 1);
0098 
0099     QFileInfo fi(tempfile);
0100     QCOMPARE(fi.size(), payload.size());
0101     QVERIFY(QFile::remove(tempfile));
0102 }
0103 
0104 void AlternativesModelTest::disablePluginTest()
0105 {
0106     const auto listPlugins = [] {
0107         QStringList plugins;
0108         Purpose::AlternativesModel model;
0109         QJsonObject input =
0110             QJsonObject{{QStringLiteral("urls"), QJsonArray{QStringLiteral("http://kde.org")}}, {QStringLiteral("mimeType"), QStringLiteral("dummy/thing")}};
0111         model.setInputData(input);
0112         model.setPluginType(QStringLiteral("Export"));
0113         model.setDisabledPlugins({});
0114 
0115         for (int i = 0; i < model.rowCount(); ++i) {
0116             plugins << model.index(i).data(Purpose::AlternativesModel::PluginIdRole).toString();
0117         }
0118         return plugins;
0119     };
0120 
0121     auto plugins = listPlugins();
0122     QVERIFY(plugins.contains(QStringLiteral("saveasplugin")));
0123     QVERIFY(plugins.contains(QStringLiteral("emailplugin")));
0124 
0125     QStandardPaths::setTestModeEnabled(true);
0126     auto config = KSharedConfig::openConfig(QStringLiteral("purposerc"));
0127     auto group = config->group(QStringLiteral("plugins"));
0128     group.writeEntry("disabled", QStringList{QStringLiteral("saveasplugin"), QStringLiteral("emailplugin")});
0129 
0130     plugins = listPlugins();
0131     QVERIFY(!plugins.contains(QStringLiteral("saveasplugin")));
0132     QVERIFY(!plugins.contains(QStringLiteral("emailplugin")));
0133 
0134     // "cleanup"
0135     group.writeEntry("disabled", QStringList());
0136 }
0137 
0138 void AlternativesModelTest::blacklistTest()
0139 {
0140     const auto listPlugins = [](const QStringList &blacklist) {
0141         QStringList plugins;
0142         Purpose::AlternativesModel model;
0143         QJsonObject input =
0144             QJsonObject{{QStringLiteral("urls"), QJsonArray{QStringLiteral("http://kde.org")}}, {QStringLiteral("mimeType"), QStringLiteral("dummy/thing")}};
0145         model.setInputData(input);
0146         model.setPluginType(QStringLiteral("Export"));
0147         if (!blacklist.isEmpty()) {
0148             model.setDisabledPlugins(blacklist);
0149         }
0150 
0151         for (int i = 0; i < model.rowCount(); ++i) {
0152             plugins << model.index(i).data(Purpose::AlternativesModel::PluginIdRole).toString();
0153         }
0154         return plugins;
0155     };
0156 
0157     auto plugins = listPlugins(QStringList());
0158     QVERIFY(plugins.contains(QStringLiteral("emailplugin")));
0159 
0160     plugins = listPlugins({QStringLiteral("emailplugin")});
0161     QVERIFY(!plugins.contains(QStringLiteral("emailplugin")));
0162 
0163     plugins = listPlugins({QStringLiteral("saveasplugin")});
0164     QVERIFY(plugins.contains(QStringLiteral("emailplugin")));
0165 
0166     // Admin settings have precedence
0167     QStandardPaths::setTestModeEnabled(true);
0168     auto config = KSharedConfig::openConfig(QStringLiteral("purposerc"));
0169     auto group = config->group(QStringLiteral("plugins"));
0170     group.writeEntry("disabled", QStringList{QStringLiteral("emailplugin")});
0171 
0172     plugins = listPlugins({QStringLiteral("saveasplugin")});
0173     QVERIFY(!plugins.contains(QStringLiteral("emailplugin")));
0174 }
0175 
0176 #include "moc_alternativesmodeltest.cpp"