File indexing completed on 2024-04-28 15:29:56

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"