1 /*
2     SPDX-FileCopyrightText: 2013 Sebastian Kügler <sebas@kde.org>
3 
4     SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "plugintest.h"
8 
9 #include <QDebug>
10 #include <kplugininfo.h>
11 #include <kplugintrader.h>
12 #include <kservice.h>
13 #include <kservicetypetrader.h>
14 
15 #include <QElapsedTimer>
16 #include <QStandardPaths>
17 #include <QStringList>
18 
19 static QTextStream cout(stdout); // clazy:exclude=non-pod-global-static
20 
21 class PluginTestPrivate
22 {
23 public:
24     QString pluginName;
25 };
26 
PluginTest()27 PluginTest::PluginTest()
28     : QObject(nullptr)
29 {
30     d = new PluginTestPrivate;
31 }
32 
~PluginTest()33 PluginTest::~PluginTest()
34 {
35     delete d;
36 }
37 
runMain()38 int PluginTest::runMain()
39 {
40     // measure performance
41     QElapsedTimer timer;
42     int runs = 1;
43     QList<qint64> timings;
44 
45     cout << "-- KPluginTrader Test --" << Qt::endl;
46     bool ok = true;
47 
48     // KSycoca querying
49     timer.start();
50 
51     for (int _i = 0; _i < runs; _i++) {
52         timer.restart();
53         if (!loadFromKService(QStringLiteral("time"))) {
54             ok = false;
55         }
56         timings << timer.nsecsElapsed();
57     }
58     report(timings, QStringLiteral("KServiceTypeTrader"));
59     timings.clear();
60 
61     // -- Metadata querying
62     for (int _i = 0; _i < runs; _i++) {
63         timer.restart();
64         if (!loadFromMetaData()) {
65             ok = false;
66         }
67         // if (!loadFromMetaData2("Plasma/ContainmentActions")) ok = false;
68         timings << timer.nsecsElapsed();
69     }
70     report(timings, QStringLiteral("Metadata"));
71     timings.clear();
72 
73     findPlugins();
74 
75     if (ok) {
76         qDebug() << "All tests finished successfully";
77         return 0;
78     }
79     return 0; // We return successfully in any case, since plugins aren't installed for most people
80 }
81 
report(const QList<qint64> timings,const QString & msg)82 void PluginTest::report(const QList<qint64> timings, const QString &msg)
83 {
84     qulonglong totalTime = 0;
85 
86     int unitDiv = 1000;
87     QString unit = QStringLiteral("microsec");
88     int i = 0;
89     for (qint64 t : timings) {
90         int msec = t / 1000000;
91         qDebug() << "  Run " << i << ": " << msec << " msec";
92         totalTime += t;
93         i++;
94     }
95     QString av = QString::number((totalTime / timings.count() / unitDiv), 'f', 1);
96     qDebug() << " Average: " << av << " " << unit << " (" << msg << ")";
97 }
98 
loadFromKService(const QString & name)99 bool PluginTest::loadFromKService(const QString &name)
100 {
101     bool ok = false;
102     QString constraint = QStringLiteral("[X-KDE-PluginInfo-Name] == '%1'").arg(name);
103     KService::List offers = KServiceTypeTrader::self()->query(QStringLiteral("Plasma/DataEngine"), constraint);
104     if (offers.isEmpty()) {
105         qDebug() << "offers are empty for " << name << " with constraint " << constraint;
106     } else {
107         QVariantList allArgs;
108         allArgs << offers.first()->storageId();
109         const QString _n = offers.first()->property(QStringLiteral("Name")).toString();
110         if (!_n.isEmpty()) {
111             qDebug() << "Found Dataengine: " << _n;
112             ok = true;
113         } else {
114             qDebug() << "Nothing found. ";
115         }
116     }
117 
118     return ok;
119 }
120 
loadFromMetaData(const QString & serviceType)121 bool PluginTest::loadFromMetaData(const QString &serviceType)
122 {
123     bool ok = false;
124     QString pluginName(QStringLiteral("time"));
125     QString constraint = QStringLiteral("[X-KDE-PluginInfo-Name] == '%1'").arg(pluginName);
126     const KPluginInfo::List res = KPluginTrader::self()->query(QStringLiteral("kf5"), serviceType, QString());
127     qDebug() << "----------- Found " << res.count() << " Plugins" << constraint;
128     ok = res.count() > 0;
129     for (const KPluginInfo &info : res) {
130         qDebug() << "   file: " << info.libraryPath();
131     }
132 
133     return ok;
134 }
135 
findPlugins()136 bool PluginTest::findPlugins()
137 {
138     QElapsedTimer timer;
139     QList<qint64> timings;
140     const QString pluginDir(QStringLiteral("/media/storage/testdata/"));
141     const QStringList sizes = QStringList() << QStringLiteral("50") << QStringLiteral("100") << QStringLiteral("150") << QStringLiteral("200")
142                                             << QStringLiteral("250") << QStringLiteral("300") << QStringLiteral("400") << QStringLiteral("500")
143                                             << QStringLiteral("600") << QStringLiteral("700") << QStringLiteral("800") << QStringLiteral("1000")
144                                             << QStringLiteral("1500") << QStringLiteral("2000") << QStringLiteral("5000");
145     QStringList datadirs;
146 
147     for (const QString &_s : sizes) {
148         datadirs << pluginDir + _s;
149     }
150     for (const QString &subdir : std::as_const(datadirs)) {
151         const QString constraint;
152         const QString serviceType;
153 
154         timer.restart();
155         KPluginInfo::List res = KPluginTrader::self()->query(subdir, serviceType, constraint);
156         timings << timer.nsecsElapsed();
157         qDebug() << "Found " << res.count() << " Plugins in " << subdir;
158     }
159     report(timings, QStringLiteral("reading monsterdirs"));
160     return true;
161 }
162 
163 #include "moc_plugintest.cpp"
164