summaryrefslogtreecommitdiffstats
path: root/tests/pipelinetest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/pipelinetest.cpp')
-rw-r--r--tests/pipelinetest.cpp65
1 files changed, 58 insertions, 7 deletions
diff --git a/tests/pipelinetest.cpp b/tests/pipelinetest.cpp
index 0268ec5..45e2fbb 100644
--- a/tests/pipelinetest.cpp
+++ b/tests/pipelinetest.cpp
@@ -101,23 +101,25 @@ QByteArray createEntityCommand(const flatbuffers::FlatBufferBuilder &entityFbb)
101 return command; 101 return command;
102} 102}
103 103
104QByteArray modifyEntityCommand(const flatbuffers::FlatBufferBuilder &entityFbb, const QByteArray &uid, qint64 revision) 104QByteArray modifyEntityCommand(const flatbuffers::FlatBufferBuilder &entityFbb, const QByteArray &uid, qint64 revision, QStringList modifiedProperties = {"summary"}, bool replayToSource = true)
105{ 105{
106 flatbuffers::FlatBufferBuilder fbb; 106 flatbuffers::FlatBufferBuilder fbb;
107 auto type = fbb.CreateString(Sink::ApplicationDomain::getTypeName<Sink::ApplicationDomain::Event>().toStdString().data()); 107 auto type = fbb.CreateString(Sink::ApplicationDomain::getTypeName<Sink::ApplicationDomain::Event>().toStdString().data());
108 auto id = fbb.CreateString(std::string(uid.constData(), uid.size())); 108 auto id = fbb.CreateString(std::string(uid.constData(), uid.size()));
109 auto summaryProperty = fbb.CreateString("summary"); 109 std::vector<flatbuffers::Offset<flatbuffers::String>> modifiedVector;
110 std::vector<flatbuffers::Offset<flatbuffers::String>> modified; 110 for (const auto &modified : modifiedProperties) {
111 modified.push_back(summaryProperty); 111 modifiedVector.push_back(fbb.CreateString(modified.toStdString()));
112 }
112 auto delta = fbb.CreateVector<uint8_t>(entityFbb.GetBufferPointer(), entityFbb.GetSize()); 113 auto delta = fbb.CreateVector<uint8_t>(entityFbb.GetBufferPointer(), entityFbb.GetSize());
113 auto modifiedProperties = fbb.CreateVector(modified); 114 auto modifiedPropertiesVector = fbb.CreateVector(modifiedVector);
114 // auto delta = Sink::EntityBuffer::appendAsVector(fbb, buffer.constData(), buffer.size());
115 Sink::Commands::ModifyEntityBuilder builder(fbb); 115 Sink::Commands::ModifyEntityBuilder builder(fbb);
116 builder.add_domainType(type); 116 builder.add_domainType(type);
117 builder.add_delta(delta); 117 builder.add_delta(delta);
118 builder.add_revision(revision); 118 builder.add_revision(revision);
119 builder.add_entityId(id); 119 builder.add_entityId(id);
120 builder.add_modifiedProperties(modifiedProperties); 120 builder.add_modifiedProperties(modifiedPropertiesVector);
121 builder.add_replayToSource(replayToSource);
122
121 auto location = builder.Finish(); 123 auto location = builder.Finish();
122 Sink::Commands::FinishModifyEntityBuffer(fbb, location); 124 Sink::Commands::FinishModifyEntityBuffer(fbb, location);
123 125
@@ -401,6 +403,55 @@ private slots:
401 QCOMPARE(testProcessor->deletedSummaries.at(0), QByteArray("summary2")); 403 QCOMPARE(testProcessor->deletedSummaries.at(0), QByteArray("summary2"));
402 } 404 }
403 } 405 }
406
407 void testModifyWithConflict()
408 {
409 flatbuffers::FlatBufferBuilder entityFbb;
410 auto command = createEntityCommand(createEvent(entityFbb, "summary", "description"));
411
412 Sink::Pipeline pipeline(getContext(), {"test"});
413
414 auto adaptorFactory = QSharedPointer<TestEventAdaptorFactory>::create();
415
416 // Create the initial revision
417 pipeline.startTransaction();
418 pipeline.newEntity(command.constData(), command.size());
419 pipeline.commit();
420
421 // Get uid of written entity
422 auto keys = getKeys(instanceIdentifier(), "event.main");
423 QCOMPARE(keys.size(), 1);
424 const auto key = keys.first();
425 const auto uid = Sink::Storage::DataStore::uidFromKey(key);
426
427 //Simulate local modification
428 {
429 entityFbb.Clear();
430 auto modifyCommand = modifyEntityCommand(createEvent(entityFbb, "summaryLocal"), uid, 1, {"summary"}, true);
431 pipeline.startTransaction();
432 pipeline.modifiedEntity(modifyCommand.constData(), modifyCommand.size());
433 pipeline.commit();
434 }
435
436
437 //Simulate remote modification
438 //We assume the remote modification is not overly smart and always marks all properties as changed.
439 {
440 entityFbb.Clear();
441 auto modifyCommand = modifyEntityCommand(createEvent(entityFbb, "summaryRemote", "descriptionRemote"), uid, 2, {"summary", "description"}, false);
442 pipeline.startTransaction();
443 pipeline.modifiedEntity(modifyCommand.constData(), modifyCommand.size());
444 pipeline.commit();
445 }
446
447 // Ensure we've got the new revision with the modification
448 auto buffer = getEntity(instanceIdentifier(), "event.main", Sink::Storage::DataStore::assembleKey(uid, 3));
449 QVERIFY(!buffer.isEmpty());
450 Sink::EntityBuffer entityBuffer(buffer.data(), buffer.size());
451 auto adaptor = adaptorFactory->createAdaptor(entityBuffer.entity());
452 QVERIFY2(adaptor->getProperty("summary").toString() == QString("summaryLocal"), "The local modification was reverted.");
453 QVERIFY2(adaptor->getProperty("description").toString() == QString("descriptionRemote"), "The remote modification was not applied.");
454 }
404}; 455};
405 456
406QTEST_MAIN(PipelineTest) 457QTEST_MAIN(PipelineTest)