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