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 ¬ification) { 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"