File indexing completed on 2024-05-12 05:26:22

0001 #include <QTest>
0002 
0003 #include <QString>
0004 
0005 #include "dummyresource/resourcefactory.h"
0006 #include "store.h"
0007 #include "notifier.h"
0008 #include "resourcecontrol.h"
0009 #include "commands.h"
0010 #include "entitybuffer.h"
0011 #include "log.h"
0012 #include "resourceconfig.h"
0013 #include "notification_generated.h"
0014 #include "test.h"
0015 #include "adaptorfactoryregistry.h"
0016 
0017 #include "hawd/dataset.h"
0018 #include "hawd/formatter.h"
0019 
0020 #include "event_generated.h"
0021 #include "entity_generated.h"
0022 #include "metadata_generated.h"
0023 #include "createentity_generated.h"
0024 
0025 /**
0026  * Benchmark full system with the dummy resource implementation.
0027  */
0028 class DummyResourceBenchmark : public QObject
0029 {
0030     Q_OBJECT
0031 private:
0032     int num;
0033 private slots:
0034     void initTestCase()
0035     {
0036         Sink::Log::setDebugOutputLevel(Sink::Log::Warning);
0037         auto factory = Sink::ResourceFactory::load("sink.dummy");
0038         QVERIFY(factory);
0039         ResourceConfig::addResource("sink.dummy.instance1", "sink.dummy");
0040         num = 5000;
0041     }
0042 
0043     void cleanup()
0044     {
0045     }
0046 
0047     // Ensure we can process a command in less than 0.1s
0048     void testCommandResponsiveness()
0049     {
0050         // Test responsiveness including starting the process.
0051         VERIFYEXEC(Sink::Store::removeDataFromDisk("sink.dummy.instance1"));
0052 
0053         QTime time;
0054         time.start();
0055 
0056         Sink::ApplicationDomain::Event event("sink.dummy.instance1");
0057         event.setProperty("uid", "testuid");
0058         QCOMPARE(event.getProperty("uid").toByteArray(), QByteArray("testuid"));
0059         event.setProperty("summary", "summaryValue");
0060 
0061         auto notifier = QSharedPointer<Sink::Notifier>::create("sink.dummy.instance1", "sink.dummy");
0062         bool gotNotification = false;
0063         int duration = 0;
0064         notifier->registerHandler([&gotNotification, &duration, &time](const Sink::Notification &notification) {
0065             if (notification.type == Sink::Notification::RevisionUpdate) {
0066                 gotNotification = true;
0067                 duration = time.elapsed();
0068             }
0069         });
0070 
0071         Sink::Store::create<Sink::ApplicationDomain::Event>(event).exec();
0072 
0073         // Wait for notification
0074         QUICK_TRY_VERIFY(gotNotification);
0075         HAWD::Dataset dataset("dummy_responsiveness", m_hawdState);
0076         HAWD::Dataset::Row row = dataset.row();
0077         row.setValue("responsetime", duration);
0078         dataset.insertRow(row);
0079         HAWD::Formatter::print(dataset);
0080 
0081         VERIFYEXEC(Sink::ResourceControl::shutdown("sink.dummy.instance1"));
0082     }
0083 
0084     void testWriteToFacade()
0085     {
0086         VERIFYEXEC(Sink::Store::removeDataFromDisk("sink.dummy.instance1"));
0087 
0088         QTime time;
0089         time.start();
0090         QList<KAsync::Future<void>> waitCondition;
0091         for (int i = 0; i < num; i++) {
0092             Sink::ApplicationDomain::Event event("sink.dummy.instance1");
0093             event.setProperty("uid", "testuid");
0094             QCOMPARE(event.getProperty("uid").toByteArray(), QByteArray("testuid"));
0095             event.setProperty("summary", "summaryValue");
0096             waitCondition << Sink::Store::create<Sink::ApplicationDomain::Event>(event).exec();
0097         }
0098         KAsync::waitForCompletion(waitCondition).exec().waitForFinished();
0099         auto appendTime = time.elapsed();
0100 
0101         // Ensure everything is processed
0102         {
0103             Sink::Query query;
0104             query.resourceFilter("sink.dummy.instance1");
0105             VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(QByteArrayList() << "sink.dummy.instance1"));
0106         }
0107         auto allProcessedTime = time.elapsed();
0108 
0109         HAWD::Dataset dataset("dummy_write_to_facade", m_hawdState);
0110         HAWD::Dataset::Row row = dataset.row();
0111 
0112         row.setValue("rows", num);
0113         row.setValue("append", (qreal)num / appendTime);
0114         row.setValue("total", (qreal)num / allProcessedTime);
0115         dataset.insertRow(row);
0116         HAWD::Formatter::print(dataset);
0117     }
0118 
0119     void testQueryByUid()
0120     {
0121         QTime time;
0122         time.start();
0123         // Measure query
0124         {
0125             time.start();
0126             Sink::Query query;
0127             query.resourceFilter("sink.dummy.instance1");
0128 
0129             query.filter("uid", Sink::Query::Comparator("testuid"));
0130             auto model = Sink::Store::loadModel<Sink::ApplicationDomain::Event>(query);
0131             QUICK_TRY_VERIFY(model->rowCount(QModelIndex()) == num);
0132         }
0133         auto queryTime = time.elapsed();
0134 
0135         HAWD::Dataset dataset("dummy_query_by_uid", m_hawdState);
0136         HAWD::Dataset::Row row = dataset.row();
0137         row.setValue("rows", num);
0138         row.setValue("read", (qreal)num / queryTime);
0139         dataset.insertRow(row);
0140         HAWD::Formatter::print(dataset);
0141     }
0142 
0143 
0144     // This allows to run individual parts without doing a cleanup, but still cleaning up normally
0145     void testCleanupForCompleteTest()
0146     {
0147         VERIFYEXEC(Sink::Store::removeDataFromDisk("sink.dummy.instance1"));
0148     }
0149 
0150 private:
0151     HAWD::State m_hawdState;
0152 };
0153 
0154 QTEST_MAIN(DummyResourceBenchmark)
0155 #include "dummyresourcebenchmark.moc"