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 }