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"