File indexing completed on 2024-05-12 05:26:22
0001 #include <QTest> 0002 0003 #include <QDebug> 0004 #include <QString> 0005 0006 #include "common/storage/entitystore.h" 0007 #include "common/adaptorfactoryregistry.h" 0008 #include "common/definitions.h" 0009 #include "testimplementations.h" 0010 0011 class EntityStoreTest : public QObject 0012 { 0013 Q_OBJECT 0014 private: 0015 QString resourceInstanceIdentifier{"resourceId"}; 0016 0017 private slots: 0018 void initTestCase() 0019 { 0020 Sink::AdaptorFactoryRegistry::instance().registerFactory<Sink::ApplicationDomain::Mail, TestMailAdaptorFactory>("test"); 0021 Sink::AdaptorFactoryRegistry::instance().registerFactory<Sink::ApplicationDomain::Event, TestEventAdaptorFactory>("test"); 0022 } 0023 0024 void cleanup() 0025 { 0026 Sink::Storage::DataStore(Sink::storageLocation(), resourceInstanceIdentifier).removeFromDisk(); 0027 } 0028 0029 void testCleanup() 0030 { 0031 } 0032 0033 void testFullScan() 0034 { 0035 using namespace Sink; 0036 ResourceContext resourceContext{resourceInstanceIdentifier.toUtf8(), "dummy", AdaptorFactoryRegistry::instance().getFactories("test")}; 0037 Storage::EntityStore store(resourceContext, {}); 0038 0039 auto mail = ApplicationDomain::ApplicationDomainType::createEntity<ApplicationDomain::Mail>("res1"); 0040 mail.setExtractedMessageId("messageid"); 0041 mail.setExtractedSubject("boo"); 0042 /* 0043 * FIXME This triggers "Error while removing value: "f" "\n\xAE\xDC\xA8|xH\x92\x95\xCC\r\xA7\xAF\xDB}\x9E" "Error on mdb_del: -30798 MDB_NOTFOUND: No matching key/data pair found" Code: 4 Db: "resourceIdmail.index.draft"": 0044 * 0045 * We don't apply the defaults as we should initially, because we don't go via the flatbuffer file that contains the defaults in the first place. This results in this particular case in the draft flag to be invalid instead of false, and thus we end up trying to modify something different in the index than what we added originally. 0046 * This is true for both create and remove. In the modify case we then get the correct defaults because we load the latest revision from disk, which is based on the flatbuffers file 0047 * 0048 * We now just use setDraft to initialize the entity and get rid of the message. We would of course have to do this for all indexed properties, 0049 * but we really have to find a better solution than that. 0050 */ 0051 mail.setDraft(false); 0052 0053 auto mail2 = ApplicationDomain::ApplicationDomainType::createEntity<ApplicationDomain::Mail>("res1"); 0054 mail2.setExtractedMessageId("messageid2"); 0055 mail2.setExtractedSubject("foo"); 0056 0057 auto mail3 = ApplicationDomain::ApplicationDomainType::createEntity<ApplicationDomain::Mail>("res1"); 0058 mail3.setExtractedMessageId("messageid2"); 0059 mail3.setExtractedSubject("foo"); 0060 0061 store.startTransaction(Storage::DataStore::ReadWrite); 0062 store.add("mail", mail, false); 0063 store.add("mail", mail2, false); 0064 store.add("mail", mail3, false); 0065 0066 mail.setExtractedSubject("foo"); 0067 0068 store.modify("mail", mail, QByteArrayList{}, false); 0069 0070 { 0071 const auto ids = store.fullScan("mail"); 0072 0073 QCOMPARE(ids.size(), 3); 0074 QVERIFY(ids.contains(Sink::Storage::Identifier::fromDisplayByteArray(mail.identifier()))); 0075 QVERIFY(ids.contains(Sink::Storage::Identifier::fromDisplayByteArray(mail2.identifier()))); 0076 QVERIFY(ids.contains(Sink::Storage::Identifier::fromDisplayByteArray(mail3.identifier()))); 0077 } 0078 0079 store.remove("mail", mail3, false); 0080 store.commitTransaction(); 0081 0082 { 0083 const auto ids = store.fullScan("mail"); 0084 0085 QCOMPARE(ids.size(), 2); 0086 QVERIFY(ids.contains(Sink::Storage::Identifier::fromDisplayByteArray(mail.identifier()))); 0087 QVERIFY(ids.contains(Sink::Storage::Identifier::fromDisplayByteArray(mail2.identifier()))); 0088 } 0089 } 0090 0091 void testExistsAndContains() 0092 { 0093 0094 using namespace Sink; 0095 ResourceContext resourceContext{resourceInstanceIdentifier.toUtf8(), "dummy", AdaptorFactoryRegistry::instance().getFactories("test")}; 0096 Storage::EntityStore store(resourceContext, {}); 0097 0098 auto mail = ApplicationDomain::ApplicationDomainType::createEntity<ApplicationDomain::Mail>("res1"); 0099 mail.setExtractedMessageId("messageid"); 0100 mail.setExtractedSubject("boo"); 0101 //FIXME see above 0102 mail.setDraft(false); 0103 0104 auto mail2 = ApplicationDomain::ApplicationDomainType::createEntity<ApplicationDomain::Mail>("res1"); 0105 mail2.setExtractedMessageId("messageid2"); 0106 mail2.setExtractedSubject("foo"); 0107 0108 auto mail3 = ApplicationDomain::ApplicationDomainType::createEntity<ApplicationDomain::Mail>("res1"); 0109 mail3.setExtractedMessageId("messageid2"); 0110 mail3.setExtractedSubject("foo"); 0111 0112 auto event = ApplicationDomain::ApplicationDomainType::createEntity<ApplicationDomain::Event>("res1"); 0113 event.setExtractedUid("messageid2"); 0114 event.setExtractedSummary("foo"); 0115 0116 store.startTransaction(Storage::DataStore::ReadWrite); 0117 store.add("mail", mail, false); 0118 store.add("mail", mail2, false); 0119 store.add("mail", mail3, false); 0120 store.add("event", event, false); 0121 0122 mail.setExtractedSubject("foo"); 0123 0124 store.modify("mail", mail, QByteArrayList{}, false); 0125 store.remove("mail", mail3, false); 0126 store.commitTransaction(); 0127 0128 QVERIFY(store.contains("mail", mail.identifier())); 0129 QVERIFY(store.contains("mail", mail2.identifier())); 0130 QVERIFY(store.contains("mail", mail3.identifier())); 0131 QVERIFY(store.contains("event", event.identifier())); 0132 0133 QVERIFY(store.exists("mail", mail.identifier())); 0134 QVERIFY(store.exists("mail", mail2.identifier())); 0135 QVERIFY(!store.exists("mail", mail3.identifier())); 0136 QVERIFY(store.exists("event", event.identifier())); 0137 } 0138 0139 void readAll() 0140 { 0141 using namespace Sink; 0142 ResourceContext resourceContext{resourceInstanceIdentifier.toUtf8(), "dummy", AdaptorFactoryRegistry::instance().getFactories("test")}; 0143 Storage::EntityStore store(resourceContext, {}); 0144 0145 auto mail = ApplicationDomain::ApplicationDomainType::createEntity<ApplicationDomain::Mail>("res1"); 0146 mail.setExtractedMessageId("messageid"); 0147 mail.setExtractedSubject("boo"); 0148 //FIXME see above 0149 mail.setDraft(false); 0150 0151 auto mail2 = ApplicationDomain::ApplicationDomainType::createEntity<ApplicationDomain::Mail>("res1"); 0152 mail2.setExtractedMessageId("messageid2"); 0153 mail2.setExtractedSubject("foo"); 0154 0155 auto mail3 = ApplicationDomain::ApplicationDomainType::createEntity<ApplicationDomain::Mail>("res1"); 0156 mail3.setExtractedMessageId("messageid2"); 0157 mail3.setExtractedSubject("foo"); 0158 0159 store.startTransaction(Storage::DataStore::ReadWrite); 0160 store.add("mail", mail, false); 0161 store.add("mail", mail2, false); 0162 store.add("mail", mail3, false); 0163 0164 mail.setExtractedSubject("foo"); 0165 0166 store.modify("mail", mail, QByteArrayList{}, false); 0167 store.remove("mail", mail3, false); 0168 store.commitTransaction(); 0169 0170 store.startTransaction(Storage::DataStore::ReadOnly); 0171 { 0172 //We get every uid once 0173 QList<QByteArray> uids; 0174 store.readAllUids("mail", [&] (const QByteArray &uid) { 0175 uids << uid; 0176 }); 0177 QCOMPARE(uids.size(), 2); 0178 } 0179 0180 { 0181 //We get the latest version of every entity once 0182 QList<QByteArray> uids; 0183 store.readAll("mail", [&] (const ApplicationDomain::ApplicationDomainType &entity) { 0184 //The first revision should be superseeded by the modification 0185 QCOMPARE(entity.getProperty(ApplicationDomain::Mail::Subject::name).toString(), QString::fromLatin1("foo")); 0186 uids << entity.identifier(); 0187 }); 0188 QCOMPARE(uids.size(), 2); 0189 } 0190 0191 store.abortTransaction(); 0192 0193 } 0194 }; 0195 0196 QTEST_MAIN(EntityStoreTest) 0197 #include "entitystoretest.moc"