1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
/*
SPDX-FileCopyrightText: 2002 David Faure <faure@kde.org>
SPDX-License-Identifier: LGPL-2.0-only
*/
#include <KConfig>
#include <KConfigGroup>
#include <KPluginMetaData>
#include <QDebug>
#include <QFile>
#include <QJsonObject>
#include <QStandardPaths>
#include <QTest>
#include <QUrl>
#include <algorithm>
#include <kprotocolmanager.h>
// Tests both KProtocolInfo and KProtocolManager
class KProtocolInfoTest : public QObject
{
Q_OBJECT
private Q_SLOTS:
void initTestCase();
void testBasic();
void testExtraFields();
void testShowFilePreview();
void testWorkerProtocol();
void testProxySettings_data();
void testProxySettings();
void testCapabilities();
void testProtocolForArchiveMimetype();
void testHelperProtocols();
};
void KProtocolInfoTest::initTestCase()
{
QString configFile = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + "/kioslaverc";
QFile::remove(configFile);
}
void KProtocolInfoTest::testBasic()
{
QVERIFY(KProtocolInfo::isKnownProtocol(QUrl(QStringLiteral("http:/"))));
QVERIFY(KProtocolInfo::isKnownProtocol(QUrl(QStringLiteral("file:/"))));
QVERIFY(KProtocolInfo::exec(QStringLiteral("file")).contains(QStringLiteral("kf" QT_STRINGIFY(QT_VERSION_MAJOR) "/kio/kio_file")));
QCOMPARE(KProtocolInfo::protocolClass(QStringLiteral("file")), QStringLiteral(":local"));
QCOMPARE(KProtocolInfo::protocolClass(QStringLiteral("http")), QStringLiteral(":internet"));
QCOMPARE(KProtocolInfo::defaultMimetype(QStringLiteral("help")), QString("text/html"));
QCOMPARE(KProtocolInfo::defaultMimetype(QStringLiteral("http")), QString("application/octet-stream"));
QVERIFY(KProtocolManager::supportsListing(QUrl(QStringLiteral("ftp://10.1.1.10"))));
const QUrl url = QUrl::fromLocalFile(QStringLiteral("/tmp"));
QCOMPARE(KProtocolManager::inputType(url), KProtocolInfo::T_NONE);
QCOMPARE(KProtocolManager::outputType(url), KProtocolInfo::T_FILESYSTEM);
QVERIFY(KProtocolManager::supportsReading(url));
}
void KProtocolInfoTest::testExtraFields()
{
KProtocolInfo::ExtraFieldList extraFields = KProtocolInfo::extraFields(QUrl(QStringLiteral("trash:/")));
KProtocolInfo::ExtraFieldList::Iterator extraFieldsIt = extraFields.begin();
for (; extraFieldsIt != extraFields.end(); ++extraFieldsIt) {
qDebug() << (*extraFieldsIt).name << " " << (*extraFieldsIt).type;
}
// TODO
}
void KProtocolInfoTest::testShowFilePreview()
{
QVERIFY(KProtocolInfo::showFilePreview(QStringLiteral("file")));
QVERIFY(!KProtocolInfo::showFilePreview(QStringLiteral("audiocd")));
}
void KProtocolInfoTest::testWorkerProtocol()
{
QString proxy;
QString protocol = KProtocolManager::workerProtocol(QUrl(QStringLiteral("http://bugs.kde.org")), proxy);
QCOMPARE(protocol, QStringLiteral("http"));
QVERIFY(!KProtocolManager::useProxy());
// Just to test it doesn't deadlock
KProtocolManager::reparseConfiguration();
protocol = KProtocolManager::workerProtocol(QUrl(QStringLiteral("http://bugs.kde.org")), proxy);
QCOMPARE(protocol, QStringLiteral("http"));
}
void KProtocolInfoTest::testProxySettings_data()
{
QTest::addColumn<int>("proxyType");
// Just to test it doesn't deadlock (bug 346214)
QTest::newRow("manual") << static_cast<int>(KProtocolManager::ManualProxy);
QTest::newRow("wpad") << static_cast<int>(KProtocolManager::WPADProxy);
// Same for bug 350890
QTest::newRow("envvar") << static_cast<int>(KProtocolManager::EnvVarProxy);
}
void KProtocolInfoTest::testProxySettings()
{
QFETCH(int, proxyType);
KConfig config(QStringLiteral("kioslaverc"), KConfig::NoGlobals);
KConfigGroup cfg(&config, "Proxy Settings");
cfg.writeEntry("ProxyType", proxyType);
cfg.sync();
KProtocolManager::reparseConfiguration();
QString proxy;
QString protocol = KProtocolManager::workerProtocol(QUrl(QStringLiteral("http://bugs.kde.org")), proxy);
QCOMPARE(protocol, QStringLiteral("http"));
QVERIFY(KProtocolManager::useProxy());
// restore
cfg.writeEntry("ProxyType", static_cast<int>(KProtocolManager::NoProxy));
cfg.sync();
KProtocolManager::reparseConfiguration();
}
void KProtocolInfoTest::testCapabilities()
{
QStringList capabilities = KProtocolInfo::capabilities(QStringLiteral("imap"));
qDebug() << "kio_imap capabilities: " << capabilities;
// QVERIFY(capabilities.contains("ACL"));
}
void KProtocolInfoTest::testProtocolForArchiveMimetype()
{
// The zip protocol is available at least with the kio_archive worker from kio-extras repo (11 2022)
auto supportsZipProtocol = [](const KPluginMetaData &metaData) {
const QJsonObject protocols = metaData.rawData().value(QStringLiteral("KDE-KIO-Protocols")).toObject();
return (protocols.find(QLatin1String("zip")) != protocols.end());
};
const QVector<KPluginMetaData> workers = KPluginMetaData::findPlugins(QStringLiteral("kf" QT_STRINGIFY(QT_VERSION_MAJOR) "/kio"));
if (std::none_of(workers.cbegin(), workers.cend(), supportsZipProtocol)) {
QSKIP("kio-extras not installed");
} else {
const QString zip = KProtocolManager::protocolForArchiveMimetype(QStringLiteral("application/zip"));
// Krusader's kio_krarc.so also provides the zip protocol and might be found before/instead
QVERIFY(zip == QLatin1String("zip") || zip == QLatin1String("krarc"));
}
}
void KProtocolInfoTest::testHelperProtocols()
{
QVERIFY(!KProtocolInfo::isHelperProtocol(QStringLiteral("http")));
QVERIFY(!KProtocolInfo::isHelperProtocol(QStringLiteral("ftp")));
QVERIFY(!KProtocolInfo::isHelperProtocol(QStringLiteral("file")));
QVERIFY(!KProtocolInfo::isHelperProtocol(QStringLiteral("unknown")));
// Comes from ktelnetservice.desktop:MimeType=x-scheme-handler/telnet;x-scheme-handler/rlogin;x-scheme-handler/ssh;
// TODO: this logic has moved to KRun. Should it be public API, so we can unittest it?
// QVERIFY(KProtocolInfo::isHelperProtocol("telnet"));
// To test that compat still works
if (KProtocolInfo::isKnownProtocol(QStringLiteral("tel"))) {
QVERIFY(KProtocolInfo::isHelperProtocol(QStringLiteral("tel")));
}
}
QTEST_MAIN(KProtocolInfoTest)
#include "kprotocolinfotest.moc"
|