diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/CMakeLists.txt | 3 | ||||
-rw-r--r-- | tests/dbwriter.cpp | 45 | ||||
-rw-r--r-- | tests/domainadaptortest.cpp | 63 | ||||
-rw-r--r-- | tests/hawd/state.cpp | 2 | ||||
-rw-r--r-- | tests/interresourcemovetest.cpp | 2 | ||||
-rw-r--r-- | tests/mailquerybenchmark.cpp | 8 | ||||
-rw-r--r-- | tests/mailsynctest.cpp | 51 | ||||
-rw-r--r-- | tests/mailtest.cpp | 20 | ||||
-rw-r--r-- | tests/mailthreadtest.cpp | 6 | ||||
-rw-r--r-- | tests/messagequeuetest.cpp | 2 | ||||
-rw-r--r-- | tests/notificationtest.cpp | 21 | ||||
-rw-r--r-- | tests/querytest.cpp | 138 | ||||
-rw-r--r-- | tests/storagetest.cpp | 55 | ||||
-rw-r--r-- | tests/testimplementations.h | 4 |
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 | |||
16 | qt5_use_modules(sink_test Core Test Concurrent) | 16 | qt5_use_modules(sink_test Core Test Concurrent) |
17 | target_link_libraries(sink_test sink libhawd KF5::Mime) | 17 | target_link_libraries(sink_test sink libhawd KF5::Mime) |
18 | 18 | ||
19 | add_executable(dbwriter dbwriter.cpp) | ||
20 | target_link_libraries(dbwriter sink) | ||
21 | |||
19 | include(SinkTest) | 22 | include(SinkTest) |
20 | 23 | ||
21 | manual_tests ( | 24 | manual_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 | |||
5 | int 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 | ||
17 | class TestFactory : public DomainTypeAdaptorFactory<Sink::ApplicationDomain::Event, Sink::ApplicationDomain::Buffer::Event, Sink::ApplicationDomain::Buffer::EventBuilder> | 17 | class TestFactory : public DomainTypeAdaptorFactory<Sink::ApplicationDomain::Event> |
18 | { | 18 | { |
19 | public: | 19 | public: |
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 | ||
27 | class TestMailFactory : public DomainTypeAdaptorFactory<Sink::ApplicationDomain::Mail, Sink::ApplicationDomain::Buffer::Mail, Sink::ApplicationDomain::Buffer::MailBuilder> | 23 | class TestMailFactory : public DomainTypeAdaptorFactory<Sink::ApplicationDomain::Mail> |
28 | { | 24 | { |
29 | public: | 25 | public: |
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); | 29 | class TestContactFactory : public DomainTypeAdaptorFactory<Sink::ApplicationDomain::Contact> |
34 | } | 30 | { |
31 | public: | ||
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 | ||
144 | QTEST_MAIN(DomainAdaptorTest) | 179 | QTEST_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 | ||
54 | private slots: | 54 | private 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 @@ | |||
33 | using namespace Sink; | 33 | using namespace Sink; |
34 | using namespace Sink::ApplicationDomain; | 34 | using namespace Sink::ApplicationDomain; |
35 | 35 | ||
36 | SINK_DEBUG_AREA("mailsynctest") | ||
37 | |||
38 | void MailSyncTest::initTestCase() | 36 | void 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 @@ | |||
31 | using namespace Sink; | 31 | using namespace Sink; |
32 | using namespace Sink::ApplicationDomain; | 32 | using namespace Sink::ApplicationDomain; |
33 | 33 | ||
34 | SINK_DEBUG_AREA("mailtest") | ||
35 | |||
36 | void MailTest::initTestCase() | 34 | void 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 | ||
12 | SINK_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 | ||
492 | QTEST_MAIN(StorageTest) | 547 | QTEST_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 | ||
36 | class TestEventAdaptorFactory : public DomainTypeAdaptorFactory<Sink::ApplicationDomain::Event, Sink::ApplicationDomain::Buffer::Event, Sink::ApplicationDomain::Buffer::EventBuilder> | 36 | class TestEventAdaptorFactory : public DomainTypeAdaptorFactory<Sink::ApplicationDomain::Event> |
37 | { | 37 | { |
38 | public: | 38 | public: |
39 | TestEventAdaptorFactory() : DomainTypeAdaptorFactory() | 39 | TestEventAdaptorFactory() : DomainTypeAdaptorFactory() |
@@ -43,7 +43,7 @@ public: | |||
43 | virtual ~TestEventAdaptorFactory(){}; | 43 | virtual ~TestEventAdaptorFactory(){}; |
44 | }; | 44 | }; |
45 | 45 | ||
46 | class TestMailAdaptorFactory : public DomainTypeAdaptorFactory<Sink::ApplicationDomain::Mail, Sink::ApplicationDomain::Buffer::Mail, Sink::ApplicationDomain::Buffer::MailBuilder> | 46 | class TestMailAdaptorFactory : public DomainTypeAdaptorFactory<Sink::ApplicationDomain::Mail> |
47 | { | 47 | { |
48 | public: | 48 | public: |
49 | TestMailAdaptorFactory() : DomainTypeAdaptorFactory() | 49 | TestMailAdaptorFactory() : DomainTypeAdaptorFactory() |