File indexing completed on 2025-03-16 12:55:37
0001 /* 0002 SPDX-FileCopyrightText: 2013 Sebastian Kügler <sebas@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "plugintest.h" 0008 0009 #include <QDebug> 0010 #include <kplugininfo.h> 0011 #include <kplugintrader.h> 0012 #include <kservice.h> 0013 #include <kservicetypetrader.h> 0014 0015 #include <QElapsedTimer> 0016 #include <QStandardPaths> 0017 #include <QStringList> 0018 0019 static QTextStream cout(stdout); // clazy:exclude=non-pod-global-static 0020 0021 class PluginTestPrivate 0022 { 0023 public: 0024 QString pluginName; 0025 }; 0026 0027 PluginTest::PluginTest() 0028 : QObject(nullptr) 0029 { 0030 d = new PluginTestPrivate; 0031 } 0032 0033 PluginTest::~PluginTest() 0034 { 0035 delete d; 0036 } 0037 0038 int PluginTest::runMain() 0039 { 0040 // measure performance 0041 QElapsedTimer timer; 0042 int runs = 1; 0043 QList<qint64> timings; 0044 0045 cout << "-- KPluginTrader Test --" << Qt::endl; 0046 bool ok = true; 0047 0048 // KSycoca querying 0049 timer.start(); 0050 0051 for (int _i = 0; _i < runs; _i++) { 0052 timer.restart(); 0053 if (!loadFromKService(QStringLiteral("time"))) { 0054 ok = false; 0055 } 0056 timings << timer.nsecsElapsed(); 0057 } 0058 report(timings, QStringLiteral("KServiceTypeTrader")); 0059 timings.clear(); 0060 0061 // -- Metadata querying 0062 for (int _i = 0; _i < runs; _i++) { 0063 timer.restart(); 0064 if (!loadFromMetaData()) { 0065 ok = false; 0066 } 0067 // if (!loadFromMetaData2("Plasma/ContainmentActions")) ok = false; 0068 timings << timer.nsecsElapsed(); 0069 } 0070 report(timings, QStringLiteral("Metadata")); 0071 timings.clear(); 0072 0073 findPlugins(); 0074 0075 if (ok) { 0076 qDebug() << "All tests finished successfully"; 0077 return 0; 0078 } 0079 return 0; // We return successfully in any case, since plugins aren't installed for most people 0080 } 0081 0082 void PluginTest::report(const QList<qint64> timings, const QString &msg) 0083 { 0084 qulonglong totalTime = 0; 0085 0086 int unitDiv = 1000; 0087 QString unit = QStringLiteral("microsec"); 0088 int i = 0; 0089 for (qint64 t : timings) { 0090 int msec = t / 1000000; 0091 qDebug() << " Run " << i << ": " << msec << " msec"; 0092 totalTime += t; 0093 i++; 0094 } 0095 QString av = QString::number((totalTime / timings.count() / unitDiv), 'f', 1); 0096 qDebug() << " Average: " << av << " " << unit << " (" << msg << ")"; 0097 } 0098 0099 bool PluginTest::loadFromKService(const QString &name) 0100 { 0101 bool ok = false; 0102 QString constraint = QStringLiteral("[X-KDE-PluginInfo-Name] == '%1'").arg(name); 0103 KService::List offers = KServiceTypeTrader::self()->query(QStringLiteral("Plasma/DataEngine"), constraint); 0104 if (offers.isEmpty()) { 0105 qDebug() << "offers are empty for " << name << " with constraint " << constraint; 0106 } else { 0107 QVariantList allArgs; 0108 allArgs << offers.first()->storageId(); 0109 const QString _n = offers.first()->property(QStringLiteral("Name")).toString(); 0110 if (!_n.isEmpty()) { 0111 qDebug() << "Found Dataengine: " << _n; 0112 ok = true; 0113 } else { 0114 qDebug() << "Nothing found. "; 0115 } 0116 } 0117 0118 return ok; 0119 } 0120 0121 bool PluginTest::loadFromMetaData(const QString &serviceType) 0122 { 0123 bool ok = false; 0124 QString pluginName(QStringLiteral("time")); 0125 QString constraint = QStringLiteral("[X-KDE-PluginInfo-Name] == '%1'").arg(pluginName); 0126 const KPluginInfo::List res = KPluginTrader::self()->query(QStringLiteral("kf5"), serviceType, QString()); 0127 qDebug() << "----------- Found " << res.count() << " Plugins" << constraint; 0128 ok = res.count() > 0; 0129 for (const KPluginInfo &info : res) { 0130 qDebug() << " file: " << info.libraryPath(); 0131 } 0132 0133 return ok; 0134 } 0135 0136 bool PluginTest::findPlugins() 0137 { 0138 QElapsedTimer timer; 0139 QList<qint64> timings; 0140 const QString pluginDir(QStringLiteral("/media/storage/testdata/")); 0141 const QStringList sizes = QStringList() << QStringLiteral("50") << QStringLiteral("100") << QStringLiteral("150") << QStringLiteral("200") 0142 << QStringLiteral("250") << QStringLiteral("300") << QStringLiteral("400") << QStringLiteral("500") 0143 << QStringLiteral("600") << QStringLiteral("700") << QStringLiteral("800") << QStringLiteral("1000") 0144 << QStringLiteral("1500") << QStringLiteral("2000") << QStringLiteral("5000"); 0145 QStringList datadirs; 0146 0147 for (const QString &_s : sizes) { 0148 datadirs << pluginDir + _s; 0149 } 0150 for (const QString &subdir : std::as_const(datadirs)) { 0151 const QString constraint; 0152 const QString serviceType; 0153 0154 timer.restart(); 0155 KPluginInfo::List res = KPluginTrader::self()->query(subdir, serviceType, constraint); 0156 timings << timer.nsecsElapsed(); 0157 qDebug() << "Found " << res.count() << " Plugins in " << subdir; 0158 } 0159 report(timings, QStringLiteral("reading monsterdirs")); 0160 return true; 0161 } 0162 0163 #include "moc_plugintest.cpp"