summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/CMakeLists.txt3
-rw-r--r--tests/dbwriter.cpp45
-rw-r--r--tests/domainadaptortest.cpp63
-rw-r--r--tests/hawd/state.cpp2
-rw-r--r--tests/interresourcemovetest.cpp2
-rw-r--r--tests/mailquerybenchmark.cpp8
-rw-r--r--tests/mailsynctest.cpp51
-rw-r--r--tests/mailtest.cpp20
-rw-r--r--tests/mailthreadtest.cpp6
-rw-r--r--tests/messagequeuetest.cpp2
-rw-r--r--tests/notificationtest.cpp21
-rw-r--r--tests/querytest.cpp138
-rw-r--r--tests/storagetest.cpp55
-rw-r--r--tests/testimplementations.h4
14 files changed, 306 insertions, 114 deletions
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index c77a736..2b3e7b1 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -16,6 +16,9 @@ add_library(sink_test SHARED testimplementations.cpp getrssusage.cpp mailtest.cp
16qt5_use_modules(sink_test Core Test Concurrent) 16qt5_use_modules(sink_test Core Test Concurrent)
17target_link_libraries(sink_test sink libhawd KF5::Mime) 17target_link_libraries(sink_test sink libhawd KF5::Mime)
18 18
19add_executable(dbwriter dbwriter.cpp)
20target_link_libraries(dbwriter sink)
21
19include(SinkTest) 22include(SinkTest)
20 23
21manual_tests ( 24manual_tests (
diff --git a/tests/dbwriter.cpp b/tests/dbwriter.cpp
new file mode 100644
index 0000000..902a607
--- /dev/null
+++ b/tests/dbwriter.cpp
@@ -0,0 +1,45 @@
1#include <QByteArrayList>
2#include <QDebug>
3#include <storage.h>
4
5int main(int argc, char *argv[])
6{
7
8 QByteArrayList arguments;
9 for (int i = 0; i < argc; i++) {
10 arguments << argv[i];
11 }
12 auto testDataPath = arguments.value(1);
13 auto dbName = arguments.value(2);
14 auto count = arguments.value(3).toInt();
15
16 if (Sink::Storage::DataStore(testDataPath, dbName, Sink::Storage::DataStore::ReadOnly).exists()) {
17 Sink::Storage::DataStore(testDataPath, dbName, Sink::Storage::DataStore::ReadWrite).removeFromDisk();
18 }
19
20 qWarning() << "Creating db: " << testDataPath << dbName << count;
21 Sink::Storage::DataStore store(testDataPath, dbName, Sink::Storage::DataStore::ReadWrite);
22 auto transaction = store.createTransaction(Sink::Storage::DataStore::ReadWrite);
23 for (int i = 0; i < count; i++) {
24 if (!transaction) {
25 qWarning() << "No valid transaction";
26 return -1;
27 }
28 transaction.openDatabase("a", nullptr, false).write(QByteArray::number(i), "a");
29 transaction.openDatabase("b", nullptr, false).write(QByteArray::number(i), "b");
30 transaction.openDatabase("c", nullptr, false).write(QByteArray::number(i), "c");
31 transaction.openDatabase("p", nullptr, false).write(QByteArray::number(i), "c");
32 transaction.openDatabase("q", nullptr, false).write(QByteArray::number(i), "c");
33 if (i > (count/2)) {
34 for (int d = 0; d < 40; d++) {
35 transaction.openDatabase("db" + QByteArray::number(d), nullptr, false).write(QByteArray::number(i), "a");
36 }
37 }
38 if ((i % 1000) == 0) {
39 transaction.commit();
40 transaction = store.createTransaction(Sink::Storage::DataStore::ReadWrite);
41 }
42 }
43 qWarning() << "Creating db done.";
44 return 0;
45}
diff --git a/tests/domainadaptortest.cpp b/tests/domainadaptortest.cpp
index a17152e..2aed0a9 100644
--- a/tests/domainadaptortest.cpp
+++ b/tests/domainadaptortest.cpp
@@ -14,24 +14,22 @@
14#include "metadata_generated.h" 14#include "metadata_generated.h"
15#include "entity_generated.h" 15#include "entity_generated.h"
16 16
17class TestFactory : public DomainTypeAdaptorFactory<Sink::ApplicationDomain::Event, Sink::ApplicationDomain::Buffer::Event, Sink::ApplicationDomain::Buffer::EventBuilder> 17class TestFactory : public DomainTypeAdaptorFactory<Sink::ApplicationDomain::Event>
18{ 18{
19public: 19public:
20 TestFactory() 20 TestFactory() = default;
21 {
22 mResourceWriteMapper = QSharedPointer<WritePropertyMapper<Sink::ApplicationDomain::Buffer::EventBuilder>>::create();
23 Sink::ApplicationDomain::TypeImplementation<Sink::ApplicationDomain::Event>::configure(*mResourceWriteMapper);
24 }
25}; 21};
26 22
27class TestMailFactory : public DomainTypeAdaptorFactory<Sink::ApplicationDomain::Mail, Sink::ApplicationDomain::Buffer::Mail, Sink::ApplicationDomain::Buffer::MailBuilder> 23class TestMailFactory : public DomainTypeAdaptorFactory<Sink::ApplicationDomain::Mail>
28{ 24{
29public: 25public:
30 TestMailFactory() 26 TestMailFactory() = default;
31 { 27};
32 mResourceWriteMapper = QSharedPointer<WritePropertyMapper<Sink::ApplicationDomain::Buffer::MailBuilder>>::create(); 28
33 Sink::ApplicationDomain::TypeImplementation<Sink::ApplicationDomain::Mail>::configure(*mResourceWriteMapper); 29class TestContactFactory : public DomainTypeAdaptorFactory<Sink::ApplicationDomain::Contact>
34 } 30{
31public:
32 TestContactFactory() = default;
35}; 33};
36 34
37/** 35/**
@@ -51,7 +49,7 @@ private slots:
51 49
52 void testCreateBufferPart() 50 void testCreateBufferPart()
53 { 51 {
54 auto writeMapper = QSharedPointer<WritePropertyMapper<Sink::ApplicationDomain::Buffer::EventBuilder>>::create(); 52 auto writeMapper = QSharedPointer<PropertyMapper>::create();
55 Sink::ApplicationDomain::TypeImplementation<Sink::ApplicationDomain::Event>::configure(*writeMapper); 53 Sink::ApplicationDomain::TypeImplementation<Sink::ApplicationDomain::Event>::configure(*writeMapper);
56 54
57 Sink::ApplicationDomain::Event event; 55 Sink::ApplicationDomain::Event event;
@@ -104,7 +102,7 @@ private slots:
104 102
105 void testMail() 103 void testMail()
106 { 104 {
107 auto writeMapper = QSharedPointer<WritePropertyMapper<Sink::ApplicationDomain::Buffer::MailBuilder>>::create(); 105 auto writeMapper = QSharedPointer<PropertyMapper>::create();
108 Sink::ApplicationDomain::TypeImplementation<Sink::ApplicationDomain::Mail>::configure(*writeMapper); 106 Sink::ApplicationDomain::TypeImplementation<Sink::ApplicationDomain::Mail>::configure(*writeMapper);
109 107
110 Sink::ApplicationDomain::Mail mail; 108 Sink::ApplicationDomain::Mail mail;
@@ -139,6 +137,43 @@ private slots:
139 } 137 }
140 138
141 } 139 }
140
141 void testContact()
142 {
143 auto writeMapper = QSharedPointer<PropertyMapper>::create();
144 Sink::ApplicationDomain::TypeImplementation<Sink::ApplicationDomain::Contact>::configure(*writeMapper);
145
146 auto binaryData = QByteArray::fromRawData("\xEF\xBF\xBD\x00\xEF\xBF", 5);
147
148 Sink::ApplicationDomain::Contact contact;
149 contact.setPhoto(binaryData);
150 QVERIFY(!contact.getPhoto().isEmpty());
151
152 flatbuffers::FlatBufferBuilder metadataFbb;
153 auto metadataBuilder = Sink::MetadataBuilder(metadataFbb);
154 metadataBuilder.add_revision(1);
155 auto metadataBuffer = metadataBuilder.Finish();
156 Sink::FinishMetadataBuffer(metadataFbb, metadataBuffer);
157
158 flatbuffers::FlatBufferBuilder mailFbb;
159 auto pos = createBufferPart<Sink::ApplicationDomain::Buffer::ContactBuilder, Sink::ApplicationDomain::Buffer::Contact>(contact, mailFbb, *writeMapper);
160 Sink::ApplicationDomain::Buffer::FinishContactBuffer(mailFbb, pos);
161
162 flatbuffers::FlatBufferBuilder fbb;
163 Sink::EntityBuffer::assembleEntityBuffer(
164 fbb, metadataFbb.GetBufferPointer(), metadataFbb.GetSize(), mailFbb.GetBufferPointer(), mailFbb.GetSize(), mailFbb.GetBufferPointer(), mailFbb.GetSize());
165
166 {
167 std::string data(reinterpret_cast<const char *>(fbb.GetBufferPointer()), fbb.GetSize());
168 Sink::EntityBuffer buffer((void *)(data.data()), data.size());
169
170 TestContactFactory factory;
171 auto adaptor = factory.createAdaptor(buffer.entity());
172 Sink::ApplicationDomain::Contact readContact{QByteArray{}, QByteArray{}, 0, adaptor};
173 QCOMPARE(readContact.getPhoto(), contact.getPhoto());
174 }
175
176 }
142}; 177};
143 178
144QTEST_MAIN(DomainAdaptorTest) 179QTEST_MAIN(DomainAdaptorTest)
diff --git a/tests/hawd/state.cpp b/tests/hawd/state.cpp
index dfeef41..a994718 100644
--- a/tests/hawd/state.cpp
+++ b/tests/hawd/state.cpp
@@ -117,7 +117,7 @@ void State::findGitHash()
117{ 117{
118#ifdef HAVE_LIBGIT2 118#ifdef HAVE_LIBGIT2
119 git_libgit2_init(); 119 git_libgit2_init();
120 git_buf root = {0}; 120 git_buf root = GIT_BUF_INIT_CONST(0, 0);
121 int error = git_repository_discover(&root, projectPath().toStdString().data(), 0, NULL); 121 int error = git_repository_discover(&root, projectPath().toStdString().data(), 0, NULL);
122 if (!error) { 122 if (!error) {
123 git_repository *repo = NULL; 123 git_repository *repo = NULL;
diff --git a/tests/interresourcemovetest.cpp b/tests/interresourcemovetest.cpp
index 3ac6ad4..5438bc7 100644
--- a/tests/interresourcemovetest.cpp
+++ b/tests/interresourcemovetest.cpp
@@ -48,7 +48,7 @@ class InterResourceMoveTest : public QObject
48 m.subject(true)->fromUnicodeString(subject, "utf8"); 48 m.subject(true)->fromUnicodeString(subject, "utf8");
49 m.messageID(true)->setIdentifier(uid); 49 m.messageID(true)->setIdentifier(uid);
50 m.assemble(); 50 m.assemble();
51 return m.encodedContent(); 51 return m.encodedContent(true);
52 } 52 }
53 53
54private slots: 54private slots:
diff --git a/tests/mailquerybenchmark.cpp b/tests/mailquerybenchmark.cpp
index b15c8d6..00c156d 100644
--- a/tests/mailquerybenchmark.cpp
+++ b/tests/mailquerybenchmark.cpp
@@ -78,7 +78,7 @@ class MailQueryBenchmark : public QObject
78 entityStore.commitTransaction(); 78 entityStore.commitTransaction();
79 } 79 }
80 80
81 void testLoad(const Sink::Query &query, int count, int expectedSize) 81 void testLoad(const QByteArray &name, const Sink::Query &query, int count, int expectedSize)
82 { 82 {
83 const auto startingRss = getCurrentRSS(); 83 const auto startingRss = getCurrentRSS();
84 84
@@ -124,7 +124,7 @@ class MailQueryBenchmark : public QObject
124 std::cout << "Rss without db [kb]: " << rssWithoutDb / 1024 << std::endl; 124 std::cout << "Rss without db [kb]: " << rssWithoutDb / 1024 << std::endl;
125 std::cout << "Percentage error: " << percentageRssError << std::endl; 125 std::cout << "Percentage error: " << percentageRssError << std::endl;
126 126
127 HAWD::Dataset dataset("mail_query", mHawdState); 127 HAWD::Dataset dataset(QString{"mail_query"} + name, mHawdState);
128 HAWD::Dataset::Row row = dataset.row(); 128 HAWD::Dataset::Row row = dataset.row();
129 row.setValue("rows", list.size()); 129 row.setValue("rows", list.size());
130 row.setValue("queryResultPerMs", (qreal)list.size() / elapsed); 130 row.setValue("queryResultPerMs", (qreal)list.size() / elapsed);
@@ -159,7 +159,7 @@ private slots:
159 query.limit(1000); 159 query.limit(1000);
160 160
161 populateDatabase(50000); 161 populateDatabase(50000);
162 testLoad(query, 50000, query.limit()); 162 testLoad({}, query, 50000, query.limit());
163 } 163 }
164 164
165 void test50kThreadleader() 165 void test50kThreadleader()
@@ -176,7 +176,7 @@ private slots:
176 176
177 int count = 50000; 177 int count = 50000;
178 populateDatabase(count, mailsPerFolder); 178 populateDatabase(count, mailsPerFolder);
179 testLoad(query, count, query.limit()); 179 testLoad("_threadleader", query, count, query.limit());
180 } 180 }
181}; 181};
182 182
diff --git a/tests/mailsynctest.cpp b/tests/mailsynctest.cpp
index c8ba9f1..75454c0 100644
--- a/tests/mailsynctest.cpp
+++ b/tests/mailsynctest.cpp
@@ -33,8 +33,6 @@
33using namespace Sink; 33using namespace Sink;
34using namespace Sink::ApplicationDomain; 34using namespace Sink::ApplicationDomain;
35 35
36SINK_DEBUG_AREA("mailsynctest")
37
38void MailSyncTest::initTestCase() 36void MailSyncTest::initTestCase()
39{ 37{
40 Test::initTest(); 38 Test::initTest();
@@ -226,7 +224,8 @@ void MailSyncTest::testListNewSubFolder()
226 for (const auto &folder : folders) { 224 for (const auto &folder : folders) {
227 names << folder->getName(); 225 names << folder->getName();
228 } 226 }
229 QVERIFY(names.contains("sub1")); 227 ASYNCVERIFY(names.contains("sub1"));
228 return KAsync::null();
230 }); 229 });
231 VERIFYEXEC(job); 230 VERIFYEXEC(job);
232} 231}
@@ -254,7 +253,8 @@ void MailSyncTest::testListRemovedSubFolder()
254 for (const auto &folder : folders) { 253 for (const auto &folder : folders) {
255 names << folder->getName(); 254 names << folder->getName();
256 } 255 }
257 QVERIFY(!names.contains("sub1")); 256 ASYNCVERIFY(!names.contains("sub1"));
257 return KAsync::null();
258 }); 258 });
259 VERIFYEXEC(job); 259 VERIFYEXEC(job);
260} 260}
@@ -270,18 +270,19 @@ void MailSyncTest::testListMails()
270 VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier)); 270 VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier));
271 271
272 auto job = Store::fetchAll<Mail>(query).then([](const QList<Mail::Ptr> &mails) { 272 auto job = Store::fetchAll<Mail>(query).then([](const QList<Mail::Ptr> &mails) {
273 QCOMPARE(mails.size(), 1); 273 ASYNCCOMPARE(mails.size(), 1);
274 auto mail = mails.first(); 274 auto mail = mails.first();
275 QVERIFY(mail->getSubject().startsWith(QString("[Nepomuk] Jenkins build is still unstable"))); 275 ASYNCVERIFY(mail->getSubject().startsWith(QString("[Nepomuk] Jenkins build is still unstable")));
276 const auto data = mail->getMimeMessage(); 276 const auto data = mail->getMimeMessage();
277 QVERIFY(!data.isEmpty()); 277 ASYNCVERIFY(!data.isEmpty());
278 278
279 KMime::Message m; 279 KMime::Message m;
280 m.setContent(data); 280 m.setContent(KMime::CRLFtoLF(data));
281 m.parse(); 281 m.parse();
282 QCOMPARE(mail->getSubject(), m.subject(true)->asUnicodeString()); 282 ASYNCCOMPARE(mail->getSubject(), m.subject(true)->asUnicodeString());
283 QVERIFY(!mail->getFolder().isEmpty()); 283 ASYNCVERIFY(!mail->getFolder().isEmpty());
284 QVERIFY(mail->getDate().isValid()); 284 ASYNCVERIFY(mail->getDate().isValid());
285 return KAsync::null();
285 }); 286 });
286 VERIFYEXEC(job); 287 VERIFYEXEC(job);
287} 288}
@@ -302,10 +303,11 @@ void MailSyncTest::testResyncMails()
302 VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier)); 303 VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier));
303 304
304 auto job = Store::fetchAll<Mail>(query).then([](const QList<Mail::Ptr> &mails) { 305 auto job = Store::fetchAll<Mail>(query).then([](const QList<Mail::Ptr> &mails) {
305 QCOMPARE(mails.size(), 1); 306 ASYNCCOMPARE(mails.size(), 1);
306 auto mail = mails.first(); 307 auto mail = mails.first();
307 QVERIFY(!mail->getSubject().isEmpty()); 308 ASYNCVERIFY(!mail->getSubject().isEmpty());
308 QVERIFY(!mail->getMimeMessagePath().isEmpty()); 309 ASYNCVERIFY(!mail->getMimeMessagePath().isEmpty());
310 return KAsync::null();
309 }); 311 });
310 VERIFYEXEC(job); 312 VERIFYEXEC(job);
311} 313}
@@ -330,7 +332,8 @@ void MailSyncTest::testFetchNewRemovedMessages()
330 332
331 { 333 {
332 auto job = Store::fetchAll<Mail>(query).then([](const QList<Mail::Ptr> &mails) { 334 auto job = Store::fetchAll<Mail>(query).then([](const QList<Mail::Ptr> &mails) {
333 QCOMPARE(mails.size(), 2); 335 ASYNCCOMPARE(mails.size(), 2);
336 return KAsync::null();
334 }); 337 });
335 VERIFYEXEC(job); 338 VERIFYEXEC(job);
336 } 339 }
@@ -342,7 +345,8 @@ void MailSyncTest::testFetchNewRemovedMessages()
342 345
343 { 346 {
344 auto job = Store::fetchAll<Mail>(query).then([](const QList<Mail::Ptr> &mails) { 347 auto job = Store::fetchAll<Mail>(query).then([](const QList<Mail::Ptr> &mails) {
345 QCOMPARE(mails.size(), 1); 348 ASYNCCOMPARE(mails.size(), 1);
349 return KAsync::null();
346 }); 350 });
347 VERIFYEXEC(job); 351 VERIFYEXEC(job);
348 } 352 }
@@ -365,7 +369,8 @@ void MailSyncTest::testFlagChange()
365 369
366 { 370 {
367 auto job = Store::fetchAll<Mail>(query).then([](const QList<Mail::Ptr> &mails) { 371 auto job = Store::fetchAll<Mail>(query).then([](const QList<Mail::Ptr> &mails) {
368 QCOMPARE(mails.size(), 0); 372 ASYNCCOMPARE(mails.size(), 0);
373 return KAsync::null();
369 }); 374 });
370 VERIFYEXEC(job); 375 VERIFYEXEC(job);
371 } 376 }
@@ -378,8 +383,9 @@ void MailSyncTest::testFlagChange()
378 383
379 { 384 {
380 auto job = Store::fetchAll<Mail>(query).then([](const QList<Mail::Ptr> &mails) { 385 auto job = Store::fetchAll<Mail>(query).then([](const QList<Mail::Ptr> &mails) {
381 QCOMPARE(mails.size(), 1); 386 ASYNCCOMPARE(mails.size(), 1);
382 QVERIFY(mails.first()->getImportant()); 387 ASYNCVERIFY(mails.first()->getImportant());
388 return KAsync::null();
383 }); 389 });
384 VERIFYEXEC(job); 390 VERIFYEXEC(job);
385 } 391 }
@@ -394,8 +400,9 @@ void MailSyncTest::testSyncSingleFolder()
394 Folder::Ptr folder; 400 Folder::Ptr folder;
395 { 401 {
396 auto job = Store::fetchAll<Folder>(Sink::Query{}.resourceFilter(mResourceInstanceIdentifier).filter<Folder::Name>("test")).template then([&](const QList<Folder::Ptr> &folders) { 402 auto job = Store::fetchAll<Folder>(Sink::Query{}.resourceFilter(mResourceInstanceIdentifier).filter<Folder::Name>("test")).template then([&](const QList<Folder::Ptr> &folders) {
397 QCOMPARE(folders.size(), 1); 403 ASYNCCOMPARE(folders.size(), 1);
398 folder = folders.first(); 404 folder = folders.first();
405 return KAsync::null();
399 }); 406 });
400 VERIFYEXEC(job); 407 VERIFYEXEC(job);
401 } 408 }
@@ -419,11 +426,13 @@ void MailSyncTest::testSyncSingleMail()
419 Mail::Ptr mail; 426 Mail::Ptr mail;
420 { 427 {
421 auto job = Store::fetchAll<Mail>(Sink::Query{}.resourceFilter(mResourceInstanceIdentifier)).template then([&](const QList<Mail::Ptr> &mails) { 428 auto job = Store::fetchAll<Mail>(Sink::Query{}.resourceFilter(mResourceInstanceIdentifier)).template then([&](const QList<Mail::Ptr> &mails) {
422 QVERIFY(mails.size() >= 1); 429 ASYNCVERIFY(mails.size() >= 1);
423 mail = mails.first(); 430 mail = mails.first();
431 return KAsync::null();
424 }); 432 });
425 VERIFYEXEC(job); 433 VERIFYEXEC(job);
426 } 434 }
435 QVERIFY(mail);
427 436
428 auto syncScope = Sink::SyncScope{ApplicationDomain::getTypeName<Mail>()}; 437 auto syncScope = Sink::SyncScope{ApplicationDomain::getTypeName<Mail>()};
429 syncScope.resourceFilter(mResourceInstanceIdentifier); 438 syncScope.resourceFilter(mResourceInstanceIdentifier);
diff --git a/tests/mailtest.cpp b/tests/mailtest.cpp
index c51fc56..cbb56d5 100644
--- a/tests/mailtest.cpp
+++ b/tests/mailtest.cpp
@@ -31,8 +31,6 @@
31using namespace Sink; 31using namespace Sink;
32using namespace Sink::ApplicationDomain; 32using namespace Sink::ApplicationDomain;
33 33
34SINK_DEBUG_AREA("mailtest")
35
36void MailTest::initTestCase() 34void MailTest::initTestCase()
37{ 35{
38 Test::initTest(); 36 Test::initTest();
@@ -154,7 +152,7 @@ void MailTest::testCreateModifyDeleteMail()
154 message->assemble(); 152 message->assemble();
155 153
156 auto mail = Mail::create(mResourceInstanceIdentifier); 154 auto mail = Mail::create(mResourceInstanceIdentifier);
157 mail.setMimeMessage(message->encodedContent()); 155 mail.setMimeMessage(message->encodedContent(true));
158 mail.setFolder(folder); 156 mail.setFolder(folder);
159 157
160 VERIFYEXEC(Store::create(mail)); 158 VERIFYEXEC(Store::create(mail));
@@ -168,7 +166,7 @@ void MailTest::testCreateModifyDeleteMail()
168 QCOMPARE(mail.getFolder(), folder.identifier()); 166 QCOMPARE(mail.getFolder(), folder.identifier());
169 QVERIFY(QFile(mail.getMimeMessagePath()).exists()); 167 QVERIFY(QFile(mail.getMimeMessagePath()).exists());
170 KMime::Message m; 168 KMime::Message m;
171 m.setContent(mail.getMimeMessage()); 169 m.setContent(KMime::CRLFtoLF(mail.getMimeMessage()));
172 m.parse(); 170 m.parse();
173 QCOMPARE(m.subject(true)->asUnicodeString(), subject); 171 QCOMPARE(m.subject(true)->asUnicodeString(), subject);
174 }); 172 });
@@ -184,7 +182,7 @@ void MailTest::testCreateModifyDeleteMail()
184 auto message2 = KMime::Message::Ptr::create(); 182 auto message2 = KMime::Message::Ptr::create();
185 message2->subject(true)->fromUnicodeString(subject2, "utf8"); 183 message2->subject(true)->fromUnicodeString(subject2, "utf8");
186 message2->assemble(); 184 message2->assemble();
187 mail.setMimeMessage(message2->encodedContent()); 185 mail.setMimeMessage(message2->encodedContent(true));
188 186
189 VERIFYEXEC(Store::modify(mail)); 187 VERIFYEXEC(Store::modify(mail));
190 VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier)); 188 VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier));
@@ -197,7 +195,7 @@ void MailTest::testCreateModifyDeleteMail()
197 QCOMPARE(mail.getFolder(), folder.identifier()); 195 QCOMPARE(mail.getFolder(), folder.identifier());
198 QVERIFY(QFile(mail.getMimeMessagePath()).exists()); 196 QVERIFY(QFile(mail.getMimeMessagePath()).exists());
199 KMime::Message m; 197 KMime::Message m;
200 m.setContent(mail.getMimeMessage()); 198 m.setContent(KMime::CRLFtoLF(mail.getMimeMessage()));
201 m.parse(); 199 m.parse();
202 QCOMPARE(m.subject(true)->asUnicodeString(), subject2); 200 QCOMPARE(m.subject(true)->asUnicodeString(), subject2);
203 }); 201 });
@@ -239,7 +237,7 @@ void MailTest::testMoveMail()
239 message->assemble(); 237 message->assemble();
240 238
241 auto mail = Mail::create(mResourceInstanceIdentifier); 239 auto mail = Mail::create(mResourceInstanceIdentifier);
242 mail.setMimeMessage(message->encodedContent()); 240 mail.setMimeMessage(message->encodedContent(true));
243 mail.setFolder(folder); 241 mail.setFolder(folder);
244 242
245 VERIFYEXEC(Store::create(mail)); 243 VERIFYEXEC(Store::create(mail));
@@ -291,7 +289,7 @@ void MailTest::testMarkMailAsRead()
291 message->assemble(); 289 message->assemble();
292 290
293 auto mail = Mail::create(mResourceInstanceIdentifier); 291 auto mail = Mail::create(mResourceInstanceIdentifier);
294 mail.setMimeMessage(message->encodedContent()); 292 mail.setMimeMessage(message->encodedContent(true));
295 mail.setFolder(folder); 293 mail.setFolder(folder);
296 mail.setUnread(true); 294 mail.setUnread(true);
297 VERIFYEXEC(Store::create(mail)); 295 VERIFYEXEC(Store::create(mail));
@@ -343,7 +341,7 @@ void MailTest::testCreateDraft()
343 message->assemble(); 341 message->assemble();
344 342
345 auto mail = ApplicationDomain::Mail::create(mResourceInstanceIdentifier); 343 auto mail = ApplicationDomain::Mail::create(mResourceInstanceIdentifier);
346 mail.setMimeMessage(message->encodedContent()); 344 mail.setMimeMessage(message->encodedContent(true));
347 mail.setDraft(true); 345 mail.setDraft(true);
348 346
349 VERIFYEXEC(Store::create(mail)); 347 VERIFYEXEC(Store::create(mail));
@@ -393,7 +391,7 @@ void MailTest::testModifyMailToDraft()
393 message->assemble(); 391 message->assemble();
394 392
395 auto mail = ApplicationDomain::Mail::create(mResourceInstanceIdentifier); 393 auto mail = ApplicationDomain::Mail::create(mResourceInstanceIdentifier);
396 mail.setMimeMessage(message->encodedContent()); 394 mail.setMimeMessage(message->encodedContent(true));
397 mail.setDraft(false); 395 mail.setDraft(false);
398 mail.setFolder(folder); 396 mail.setFolder(folder);
399 397
@@ -440,7 +438,7 @@ void MailTest::testModifyMailToTrash()
440 message->assemble(); 438 message->assemble();
441 439
442 auto mail = ApplicationDomain::Mail::create(mResourceInstanceIdentifier); 440 auto mail = ApplicationDomain::Mail::create(mResourceInstanceIdentifier);
443 mail.setMimeMessage(message->encodedContent()); 441 mail.setMimeMessage(message->encodedContent(true));
444 mail.setTrash(false); 442 mail.setTrash(false);
445 mail.setFolder(folder); 443 mail.setFolder(folder);
446 444
diff --git a/tests/mailthreadtest.cpp b/tests/mailthreadtest.cpp
index 02b29f6..741eb78 100644
--- a/tests/mailthreadtest.cpp
+++ b/tests/mailthreadtest.cpp
@@ -117,7 +117,7 @@ void MailThreadTest::testIndexInMixedOrder()
117 117
118 { 118 {
119 auto mail = Mail::create(mResourceInstanceIdentifier); 119 auto mail = Mail::create(mResourceInstanceIdentifier);
120 mail.setMimeMessage(message3->encodedContent()); 120 mail.setMimeMessage(message3->encodedContent(true));
121 mail.setFolder(folder); 121 mail.setFolder(folder);
122 VERIFYEXEC(Store::create(mail)); 122 VERIFYEXEC(Store::create(mail));
123 } 123 }
@@ -140,7 +140,7 @@ void MailThreadTest::testIndexInMixedOrder()
140 140
141 { 141 {
142 auto mail = Mail::create(mResourceInstanceIdentifier); 142 auto mail = Mail::create(mResourceInstanceIdentifier);
143 mail.setMimeMessage(message2->encodedContent()); 143 mail.setMimeMessage(message2->encodedContent(true));
144 mail.setFolder(folder); 144 mail.setFolder(folder);
145 VERIFYEXEC(Store::create(mail)); 145 VERIFYEXEC(Store::create(mail));
146 } 146 }
@@ -156,7 +156,7 @@ void MailThreadTest::testIndexInMixedOrder()
156 156
157 { 157 {
158 auto mail = Mail::create(mResourceInstanceIdentifier); 158 auto mail = Mail::create(mResourceInstanceIdentifier);
159 mail.setMimeMessage(message1->encodedContent()); 159 mail.setMimeMessage(message1->encodedContent(true));
160 mail.setFolder(folder); 160 mail.setFolder(folder);
161 VERIFYEXEC(Store::create(mail)); 161 VERIFYEXEC(Store::create(mail));
162 } 162 }
diff --git a/tests/messagequeuetest.cpp b/tests/messagequeuetest.cpp
index 83fa23f..2e3bd75 100644
--- a/tests/messagequeuetest.cpp
+++ b/tests/messagequeuetest.cpp
@@ -9,8 +9,6 @@
9#include "log.h" 9#include "log.h"
10#include "test.h" 10#include "test.h"
11 11
12SINK_DEBUG_AREA("messagequeuetest")
13
14/** 12/**
15 * Test of the messagequeue implementation. 13 * Test of the messagequeue implementation.
16 */ 14 */
diff --git a/tests/notificationtest.cpp b/tests/notificationtest.cpp
index a34d325..f0d957e 100644
--- a/tests/notificationtest.cpp
+++ b/tests/notificationtest.cpp
@@ -67,12 +67,21 @@ private slots:
67 VERIFYEXEC(Sink::Store::synchronize(query)); 67 VERIFYEXEC(Sink::Store::synchronize(query));
68 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(QByteArrayList() << "sink.dummy.instance1")); 68 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(QByteArrayList() << "sink.dummy.instance1"));
69 69
70 QVERIFY(statusNotifications.size() <= 3); 70 using namespace Sink::ApplicationDomain;
71 QTRY_COMPARE(statusNotifications.size(), 3); 71 {
72 //Sync 72 QList<Status> expected = {
73 QCOMPARE(statusNotifications.at(0).code, static_cast<int>(ApplicationDomain::Status::ConnectedStatus)); 73 Status::ConnectedStatus,
74 QCOMPARE(statusNotifications.at(1).code, static_cast<int>(ApplicationDomain::Status::BusyStatus)); 74 Status::BusyStatus,
75 QCOMPARE(statusNotifications.at(2).code, static_cast<int>(ApplicationDomain::Status::ConnectedStatus)); 75 Status::ConnectedStatus,
76 };
77 qInfo() << "Received notifications " << statusNotifications;
78 QVERIFY2(statusNotifications.size() <= expected.size(), "More notifications than expected.");
79 QTRY_COMPARE(statusNotifications.size(), expected.size());
80 qInfo() << "All received notifications " << statusNotifications;
81 for (auto i = 0; i < statusNotifications.size(); i++) {
82 QCOMPARE(statusNotifications.at(i).code, static_cast<int>(expected.at(i)));
83 }
84 }
76 //Changereplay 85 //Changereplay
77 // It can happen that we get a changereplay notification pair first and then a second one at the end, 86 // It can happen that we get a changereplay notification pair first and then a second one at the end,
78 // we therefore currently filter all changereplay notifications (see above). 87 // we therefore currently filter all changereplay notifications (see above).
diff --git a/tests/querytest.cpp b/tests/querytest.cpp
index f639d94..714e549 100644
--- a/tests/querytest.cpp
+++ b/tests/querytest.cpp
@@ -98,10 +98,7 @@ private slots:
98 void testSingle() 98 void testSingle()
99 { 99 {
100 // Setup 100 // Setup
101 { 101 VERIFYEXEC(Sink::Store::create<Mail>(Mail("sink.dummy.instance1")));
102 Mail mail("sink.dummy.instance1");
103 VERIFYEXEC(Sink::Store::create<Mail>(mail));
104 }
105 102
106 // Test 103 // Test
107 Sink::Query query; 104 Sink::Query query;
@@ -116,10 +113,7 @@ private slots:
116 void testSingleWithDelay() 113 void testSingleWithDelay()
117 { 114 {
118 // Setup 115 // Setup
119 { 116 VERIFYEXEC(Sink::Store::create<Mail>(Mail("sink.dummy.instance1")));
120 Mail mail("sink.dummy.instance1");
121 Sink::Store::create<Mail>(mail).exec().waitForFinished();
122 }
123 117
124 // Test 118 // Test
125 Sink::Query query; 119 Sink::Query query;
@@ -142,13 +136,13 @@ private slots:
142 Mail mail("sink.dummy.instance1"); 136 Mail mail("sink.dummy.instance1");
143 mail.setExtractedMessageId("test1"); 137 mail.setExtractedMessageId("test1");
144 mail.setFolder("folder1"); 138 mail.setFolder("folder1");
145 Sink::Store::create<Mail>(mail).exec().waitForFinished(); 139 VERIFYEXEC(Sink::Store::create<Mail>(mail));
146 } 140 }
147 { 141 {
148 Mail mail("sink.dummy.instance1"); 142 Mail mail("sink.dummy.instance1");
149 mail.setExtractedMessageId("test2"); 143 mail.setExtractedMessageId("test2");
150 mail.setFolder("folder2"); 144 mail.setFolder("folder2");
151 Sink::Store::create<Mail>(mail).exec().waitForFinished(); 145 VERIFYEXEC(Sink::Store::create<Mail>(mail));
152 } 146 }
153 147
154 // Test 148 // Test
@@ -164,13 +158,13 @@ private slots:
164 auto mail = model->index(0, 0, QModelIndex()).data(Sink::Store::DomainObjectRole).value<Mail::Ptr>(); 158 auto mail = model->index(0, 0, QModelIndex()).data(Sink::Store::DomainObjectRole).value<Mail::Ptr>();
165 { 159 {
166 mail->setFolder("folder2"); 160 mail->setFolder("folder2");
167 Sink::Store::modify<Mail>(*mail).exec().waitForFinished(); 161 VERIFYEXEC(Sink::Store::modify<Mail>(*mail));
168 } 162 }
169 QTRY_COMPARE(model->rowCount(), 0); 163 QTRY_COMPARE(model->rowCount(), 0);
170 164
171 { 165 {
172 mail->setFolder("folder1"); 166 mail->setFolder("folder1");
173 Sink::Store::modify<Mail>(*mail).exec().waitForFinished(); 167 VERIFYEXEC(Sink::Store::modify<Mail>(*mail));
174 } 168 }
175 QTRY_COMPARE(model->rowCount(), 1); 169 QTRY_COMPARE(model->rowCount(), 1);
176 } 170 }
@@ -181,8 +175,8 @@ private slots:
181 // Setup 175 // Setup
182 { 176 {
183 Mail mail("sink.dummy.instance1"); 177 Mail mail("sink.dummy.instance1");
184 Sink::Store::create<Mail>(mail).exec().waitForFinished(); 178 VERIFYEXEC(Sink::Store::create<Mail>(mail));
185 Sink::Store::create<Mail>(mail).exec().waitForFinished(); 179 VERIFYEXEC(Sink::Store::create<Mail>(mail));
186 180
187 Sink::Query query; 181 Sink::Query query;
188 query.resourceFilter("sink.dummy.instance1"); 182 query.resourceFilter("sink.dummy.instance1");
@@ -211,7 +205,7 @@ private slots:
211 // Setup 205 // Setup
212 { 206 {
213 Folder folder("sink.dummy.instance1"); 207 Folder folder("sink.dummy.instance1");
214 Sink::Store::create<Folder>(folder).exec().waitForFinished(); 208 VERIFYEXEC(Sink::Store::create<Folder>(folder));
215 } 209 }
216 210
217 // Test 211 // Test
@@ -387,6 +381,7 @@ private slots:
387 { 381 {
388 // Setup 382 // Setup
389 Folder::Ptr folderEntity; 383 Folder::Ptr folderEntity;
384 const auto date = QDateTime(QDate(2015, 7, 7), QTime(12, 0));
390 { 385 {
391 Folder folder("sink.dummy.instance1"); 386 Folder folder("sink.dummy.instance1");
392 Sink::Store::create<Folder>(folder).exec().waitForFinished(); 387 Sink::Store::create<Folder>(folder).exec().waitForFinished();
@@ -404,7 +399,6 @@ private slots:
404 folderEntity = model->index(0, 0).data(Sink::Store::DomainObjectRole).value<Folder::Ptr>(); 399 folderEntity = model->index(0, 0).data(Sink::Store::DomainObjectRole).value<Folder::Ptr>();
405 QVERIFY(!folderEntity->identifier().isEmpty()); 400 QVERIFY(!folderEntity->identifier().isEmpty());
406 401
407 const auto date = QDateTime(QDate(2015, 7, 7), QTime(12, 0));
408 { 402 {
409 Mail mail("sink.dummy.instance1"); 403 Mail mail("sink.dummy.instance1");
410 mail.setExtractedMessageId("testSecond"); 404 mail.setExtractedMessageId("testSecond");
@@ -434,6 +428,11 @@ private slots:
434 query.filter<Mail::Folder>(*folderEntity); 428 query.filter<Mail::Folder>(*folderEntity);
435 query.sort<Mail::Date>(); 429 query.sort<Mail::Date>();
436 query.limit(1); 430 query.limit(1);
431 query.setFlags(Query::LiveQuery);
432 query.reduce<ApplicationDomain::Mail::ThreadId>(Query::Reduce::Selector::max<ApplicationDomain::Mail::Date>())
433 .count("count")
434 .collect<ApplicationDomain::Mail::Unread>("unreadCollected")
435 .collect<ApplicationDomain::Mail::Important>("importantCollected");
437 436
438 // Ensure all local data is processed 437 // Ensure all local data is processed
439 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(QByteArrayList() << "sink.dummy.instance1")); 438 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(QByteArrayList() << "sink.dummy.instance1"));
@@ -449,6 +448,26 @@ private slots:
449 QCOMPARE(model->rowCount(), 2); 448 QCOMPARE(model->rowCount(), 2);
450 // We can't make any assumptions about the order of the indexes 449 // We can't make any assumptions about the order of the indexes
451 // QCOMPARE(model->index(1, 0).data(Sink::Store::DomainObjectRole).value<Mail::Ptr>()->getProperty("messageId").toByteArray(), QByteArray("testSecond")); 450 // QCOMPARE(model->index(1, 0).data(Sink::Store::DomainObjectRole).value<Mail::Ptr>()->getProperty("messageId").toByteArray(), QByteArray("testSecond"));
451
452 //New revisions always go through
453 {
454 Mail mail("sink.dummy.instance1");
455 mail.setExtractedMessageId("testInjected");
456 mail.setFolder(folderEntity->identifier());
457 mail.setExtractedDate(date.addDays(-2));
458 Sink::Store::create<Mail>(mail).exec().waitForFinished();
459 }
460 QTRY_COMPARE(model->rowCount(), 3);
461
462 //Ensure we can continue fetching after the incremental update
463 model->fetchMore(QModelIndex());
464 QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool());
465 QCOMPARE(model->rowCount(), 4);
466
467 //Ensure we have fetched all
468 model->fetchMore(QModelIndex());
469 QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool());
470 QCOMPARE(model->rowCount(), 4);
452 } 471 }
453 472
454 void testReactToNewResource() 473 void testReactToNewResource()
@@ -503,12 +522,13 @@ private slots:
503 Folder folder2(resource2.identifier()); 522 Folder folder2(resource2.identifier());
504 VERIFYEXEC(Sink::Store::create<Folder>(folder2)); 523 VERIFYEXEC(Sink::Store::create<Folder>(folder2));
505 } 524 }
525 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(QByteArrayList() << resource1.identifier()));
526 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(QByteArrayList() << resource2.identifier()));
506 527
507 // Test 528 // Test
508 Sink::Query query; 529 Sink::Query query;
509 query.resourceFilter<SinkResource::Account>(account1); 530 query.resourceFilter<SinkResource::Account>(account1);
510 531
511 // We fetch before the data is available and rely on the live query mechanism to deliver the actual data
512 auto folders = Sink::Store::read<Folder>(query); 532 auto folders = Sink::Store::read<Folder>(query);
513 QCOMPARE(folders.size(), 1); 533 QCOMPARE(folders.size(), 1);
514 } 534 }
@@ -621,18 +641,50 @@ private slots:
621 resource2.setResourceType("sink.dummy"); 641 resource2.setResourceType("sink.dummy");
622 VERIFYEXEC(Store::create(resource2)); 642 VERIFYEXEC(Store::create(resource2));
623 643
624 Folder folder1(resource1.identifier()); 644 VERIFYEXEC(Sink::Store::create<Folder>(Folder{resource1.identifier()}));
625 VERIFYEXEC(Sink::Store::create<Folder>(folder1)); 645 VERIFYEXEC(Sink::Store::create<Folder>(Folder{resource2.identifier()}));
626 Folder folder2(resource2.identifier());
627 VERIFYEXEC(Sink::Store::create<Folder>(folder2));
628 646
629 // Test 647 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(resource1.identifier()));
630 Sink::Query query; 648 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(resource2.identifier()));
631 query.resourceContainsFilter<SinkResource::Capabilities>("cap1");
632 649
633 // We fetch before the data is available and rely on the live query mechanism to deliver the actual data 650 // We fetch before the data is available and rely on the live query mechanism to deliver the actual data
634 auto folders = Sink::Store::read<Folder>(query); 651 auto folders = Sink::Store::read<Folder>(Sink::Query{}.resourceContainsFilter<SinkResource::Capabilities>("cap1"));
635 QCOMPARE(folders.size(), 1); 652 QCOMPARE(folders.size(), 1);
653
654 //TODO this should be part of the regular cleanup between tests
655 VERIFYEXEC(Store::remove(resource1));
656 VERIFYEXEC(Store::remove(resource2));
657 }
658
659 void testFilteredLiveResourceSubQuery()
660 {
661 using namespace Sink;
662 using namespace Sink::ApplicationDomain;
663
664 //Setup
665 auto resource1 = ApplicationDomainType::createEntity<SinkResource>();
666 resource1.setResourceType("sink.dummy");
667 resource1.setCapabilities(QByteArrayList() << "cap1");
668 VERIFYEXEC(Store::create(resource1));
669 VERIFYEXEC(Store::create<Folder>(Folder{resource1.identifier()}));
670 VERIFYEXEC(ResourceControl::flushMessageQueue(resource1.identifier()));
671
672 auto model = Sink::Store::loadModel<Folder>(Query{Query::LiveQuery}.resourceContainsFilter<SinkResource::Capabilities>("cap1"));
673 QTRY_COMPARE(model->rowCount(), 1);
674
675 auto resource2 = ApplicationDomainType::createEntity<SinkResource>();
676 resource2.setCapabilities(QByteArrayList() << "cap2");
677 resource2.setResourceType("sink.dummy");
678 VERIFYEXEC(Store::create(resource2));
679 VERIFYEXEC(Store::create<Folder>(Folder{resource2.identifier()}));
680 VERIFYEXEC(ResourceControl::flushMessageQueue(resource2.identifier()));
681
682 //The new resource should be filtered and thus not make it in here
683 QCOMPARE(model->rowCount(), 1);
684
685 //TODO this should be part of the regular cleanup between tests
686 VERIFYEXEC(Store::remove(resource1));
687 VERIFYEXEC(Store::remove(resource2));
636 } 688 }
637 689
638 void testLivequeryUnmatchInThread() 690 void testLivequeryUnmatchInThread()
@@ -1059,30 +1111,18 @@ private slots:
1059 QDateTime now{QDate{2017, 2, 3}, QTime{10, 0, 0}}; 1111 QDateTime now{QDate{2017, 2, 3}, QTime{10, 0, 0}};
1060 QDateTime later{QDate{2017, 2, 3}, QTime{11, 0, 0}}; 1112 QDateTime later{QDate{2017, 2, 3}, QTime{11, 0, 0}};
1061 1113
1062 { 1114 auto createMail = [] (const QByteArray &messageid, const Folder &folder, const QDateTime &date, bool important) {
1063 auto mail1 = Mail::createEntity<Mail>("sink.dummy.instance1"); 1115 auto mail = Mail::createEntity<Mail>("sink.dummy.instance1");
1064 mail1.setExtractedMessageId("mail1"); 1116 mail.setExtractedMessageId(messageid);
1065 mail1.setFolder(folder1); 1117 mail.setFolder(folder);
1066 mail1.setExtractedDate(now); 1118 mail.setExtractedDate(date);
1067 mail1.setImportant(false); 1119 mail.setImportant(important);
1068 VERIFYEXEC(Sink::Store::create(mail1)); 1120 return mail;
1069 } 1121 };
1070 { 1122
1071 auto mail2 = Mail::createEntity<Mail>("sink.dummy.instance1"); 1123 VERIFYEXEC(Sink::Store::create(createMail("mail1", folder1, now, false)));
1072 mail2.setExtractedMessageId("mail2"); 1124 VERIFYEXEC(Sink::Store::create(createMail("mail2", folder1, earlier, false)));
1073 mail2.setFolder(folder1); 1125 VERIFYEXEC(Sink::Store::create(createMail("mail3", folder1, later, true)));
1074 mail2.setExtractedDate(earlier);
1075 mail2.setImportant(false);
1076 VERIFYEXEC(Sink::Store::create(mail2));
1077 }
1078 {
1079 auto mail3 = Mail::createEntity<Mail>("sink.dummy.instance1");
1080 mail3.setExtractedMessageId("mail3");
1081 mail3.setFolder(folder1);
1082 mail3.setExtractedDate(later);
1083 mail3.setImportant(true);
1084 VERIFYEXEC(Sink::Store::create(mail3));
1085 }
1086 1126
1087 // Ensure all local data is processed 1127 // Ensure all local data is processed
1088 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue("sink.dummy.instance1")); 1128 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue("sink.dummy.instance1"));
diff --git a/tests/storagetest.cpp b/tests/storagetest.cpp
index 7202628..9e9bad9 100644
--- a/tests/storagetest.cpp
+++ b/tests/storagetest.cpp
@@ -487,6 +487,61 @@ private slots:
487 } 487 }
488 } 488 }
489 489
490 void testCopyTransaction()
491 {
492 Sink::Storage::DataStore store(testDataPath, dbName, Sink::Storage::DataStore::ReadWrite);
493 {
494 auto transaction = store.createTransaction(Sink::Storage::DataStore::ReadWrite);
495 transaction.openDatabase("a", nullptr, false);
496 transaction.openDatabase("b", nullptr, false);
497 transaction.openDatabase("c", nullptr, false);
498 transaction.commit();
499 }
500 auto transaction = store.createTransaction(Sink::Storage::DataStore::ReadOnly);
501 for (int i = 0; i < 1000; i++) {
502 transaction.openDatabase("a", nullptr, false);
503 transaction.openDatabase("b", nullptr, false);
504 transaction.openDatabase("c", nullptr, false);
505 transaction = store.createTransaction(Sink::Storage::DataStore::ReadOnly);
506 }
507 }
508
509 /*
510 * This test is meant to find problems with the multi-process architecture and initial database creation.
511 * If we create named databases dynamically (not all up front), it is possilbe that we violate the rule
512 * that mdb_open_dbi may only be used by a single thread at a time.
513 * This test is meant to stress that condition.
514 *
515 * However, it yields absolutely nothing.
516 */
517 void testReadDuringExternalProcessWrite()
518 {
519 QSKIP("Not running multiprocess test");
520
521 QList<QFuture<void>> futures;
522 for (int i = 0; i < 5; i++) {
523 futures << QtConcurrent::run([&]() {
524 QTRY_VERIFY(Sink::Storage::DataStore(testDataPath, dbName, Sink::Storage::DataStore::ReadOnly).exists());
525 Sink::Storage::DataStore store(testDataPath, dbName, Sink::Storage::DataStore::ReadOnly);
526 auto transaction = store.createTransaction(Sink::Storage::DataStore::ReadOnly);
527 for (int i = 0; i < 100000; i++) {
528 transaction.openDatabase("a", nullptr, false);
529 transaction.openDatabase("b", nullptr, false);
530 transaction.openDatabase("c", nullptr, false);
531 transaction.openDatabase("p", nullptr, false);
532 transaction.openDatabase("q", nullptr, false);
533 }
534 });
535 }
536
537 //Start writing to the db from a separate process
538 QVERIFY(QProcess::startDetached(QCoreApplication::applicationDirPath() + "/dbwriter", QStringList() << testDataPath << dbName << QString::number(100000)));
539
540 for (auto future : futures) {
541 future.waitForFinished();
542 }
543
544 }
490}; 545};
491 546
492QTEST_MAIN(StorageTest) 547QTEST_MAIN(StorageTest)
diff --git a/tests/testimplementations.h b/tests/testimplementations.h
index a145265..ff9d9b8 100644
--- a/tests/testimplementations.h
+++ b/tests/testimplementations.h
@@ -33,7 +33,7 @@
33#include "mail_generated.h" 33#include "mail_generated.h"
34#include "createentity_generated.h" 34#include "createentity_generated.h"
35 35
36class TestEventAdaptorFactory : public DomainTypeAdaptorFactory<Sink::ApplicationDomain::Event, Sink::ApplicationDomain::Buffer::Event, Sink::ApplicationDomain::Buffer::EventBuilder> 36class TestEventAdaptorFactory : public DomainTypeAdaptorFactory<Sink::ApplicationDomain::Event>
37{ 37{
38public: 38public:
39 TestEventAdaptorFactory() : DomainTypeAdaptorFactory() 39 TestEventAdaptorFactory() : DomainTypeAdaptorFactory()
@@ -43,7 +43,7 @@ public:
43 virtual ~TestEventAdaptorFactory(){}; 43 virtual ~TestEventAdaptorFactory(){};
44}; 44};
45 45
46class TestMailAdaptorFactory : public DomainTypeAdaptorFactory<Sink::ApplicationDomain::Mail, Sink::ApplicationDomain::Buffer::Mail, Sink::ApplicationDomain::Buffer::MailBuilder> 46class TestMailAdaptorFactory : public DomainTypeAdaptorFactory<Sink::ApplicationDomain::Mail>
47{ 47{
48public: 48public:
49 TestMailAdaptorFactory() : DomainTypeAdaptorFactory() 49 TestMailAdaptorFactory() : DomainTypeAdaptorFactory()