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"