aboutsummaryrefslogtreecommitdiffstats
path: root/searchcore/src/tests
diff options
context:
space:
mode:
Diffstat (limited to 'searchcore/src/tests')
-rw-r--r--searchcore/src/tests/proton/reference/document_db_referent_registry/CMakeLists.txt10
-rw-r--r--searchcore/src/tests/proton/reference/document_db_referent_registry/DESC1
-rw-r--r--searchcore/src/tests/proton/reference/document_db_referent_registry/FILES1
-rw-r--r--searchcore/src/tests/proton/reference/document_db_referent_registry/document_db_referent_registry_test.cpp101
-rw-r--r--searchcore/src/tests/proton/reference/gid_to_lid_mapper/CMakeLists.txt10
-rw-r--r--searchcore/src/tests/proton/reference/gid_to_lid_mapper/DESC1
-rw-r--r--searchcore/src/tests/proton/reference/gid_to_lid_mapper/FILES1
-rw-r--r--searchcore/src/tests/proton/reference/gid_to_lid_mapper/gid_to_lid_mapper_test.cpp144
8 files changed, 269 insertions, 0 deletions
diff --git a/searchcore/src/tests/proton/reference/document_db_referent_registry/CMakeLists.txt b/searchcore/src/tests/proton/reference/document_db_referent_registry/CMakeLists.txt
new file mode 100644
index 00000000000..d30602ce8e5
--- /dev/null
+++ b/searchcore/src/tests/proton/reference/document_db_referent_registry/CMakeLists.txt
@@ -0,0 +1,10 @@
+# Copyright 2017 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(searchcore_document_db_referent_registry_test_app TEST
+ SOURCES
+ document_db_referent_registry_test.cpp
+ DEPENDS
+ searchcore_reference
+ searchcore_documentmetastore
+ searchcore_bucketdb
+)
+vespa_add_test(NAME searchcore_document_db_referent_registry_test_app COMMAND searchcore_document_db_referent_registry_test_app)
diff --git a/searchcore/src/tests/proton/reference/document_db_referent_registry/DESC b/searchcore/src/tests/proton/reference/document_db_referent_registry/DESC
new file mode 100644
index 00000000000..03d7d0f167a
--- /dev/null
+++ b/searchcore/src/tests/proton/reference/document_db_referent_registry/DESC
@@ -0,0 +1 @@
+document_db_referent_registry test. Take a look at document_db_referent_registry_test.cpp for details.
diff --git a/searchcore/src/tests/proton/reference/document_db_referent_registry/FILES b/searchcore/src/tests/proton/reference/document_db_referent_registry/FILES
new file mode 100644
index 00000000000..6ba8e0632f0
--- /dev/null
+++ b/searchcore/src/tests/proton/reference/document_db_referent_registry/FILES
@@ -0,0 +1 @@
+document_db_referent_registry_test.cpp
diff --git a/searchcore/src/tests/proton/reference/document_db_referent_registry/document_db_referent_registry_test.cpp b/searchcore/src/tests/proton/reference/document_db_referent_registry/document_db_referent_registry_test.cpp
new file mode 100644
index 00000000000..dd2b14cca16
--- /dev/null
+++ b/searchcore/src/tests/proton/reference/document_db_referent_registry/document_db_referent_registry_test.cpp
@@ -0,0 +1,101 @@
+// Copyright 2017 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/stllike/string.h>
+#include <vespa/searchcore/proton/reference/document_db_referent_registry.h>
+#include <vespa/searchcore/proton/reference/i_document_db_referent.h>
+#include <thread>
+#include <vespa/log/log.h>
+LOG_SETUP("document_db_reference_registry_test");
+
+namespace proton
+{
+
+namespace
+{
+
+
+std::mutex lock;
+std::shared_ptr<IDocumentDBReferent> getFooResult;
+
+void getFooTask(const IDocumentDBReferentRegistry *registry)
+{
+ auto result = registry->getDocumentDBReferent("foo");
+ std::lock_guard<std::mutex> guard(lock);
+ getFooResult = result;
+}
+
+std::shared_ptr<IDocumentDBReferent> checkFooResult()
+{
+ std::lock_guard<std::mutex> guard(lock);
+ return getFooResult;
+}
+
+}
+
+struct MyDocumentDBReferent : public IDocumentDBReferent
+{
+ MyDocumentDBReferent()
+ {
+ }
+ virtual ~MyDocumentDBReferent() { }
+ virtual std::shared_ptr<search::AttributeVector> getAttribute(vespalib::stringref name) override {
+ (void) name;
+ return std::shared_ptr<search::AttributeVector>();
+ }
+ virtual std::shared_ptr<search::IGidToLidMapperFactory> getGidToLidMapperFactory() override {
+ return std::shared_ptr<search::IGidToLidMapperFactory>();
+ }
+};
+
+struct Fixture
+{
+
+ DocumentDBReferentRegistry _registry;
+
+ Fixture()
+ : _registry()
+ {
+ }
+
+ std::shared_ptr<MyDocumentDBReferent>
+ add(vespalib::string name) {
+ auto referent = std::make_shared<MyDocumentDBReferent>();
+ _registry.addDocumentDBReferent(name, referent);
+ return referent;
+ }
+};
+
+TEST_F("Test that we can instantiate registry with two referents", Fixture)
+{
+ auto referentFoo = f.add("foo");
+ auto referentBar = f.add("bar");
+ EXPECT_NOT_EQUAL(referentFoo.get(), referentBar.get());
+ auto referent = f._registry.getDocumentDBReferent("foo");
+ EXPECT_EQUAL(referentFoo.get(), referent.get());
+ referent = f._registry.getDocumentDBReferent("bar");
+ EXPECT_EQUAL(referentBar.get(), referent.get());
+}
+
+TEST_F("Test that we block get until related add is completed", Fixture)
+{
+ const IDocumentDBReferentRegistry &registry = f._registry;
+ std::thread getFooThread(getFooTask, &registry);
+ sleep(1);
+ std::shared_ptr<IDocumentDBReferent> nullResult;
+ EXPECT_EQUAL(nullResult.get(), checkFooResult().get());
+ auto referentFoo = f.add("foo");
+ std::shared_ptr<IDocumentDBReferent> checkResult;
+ for (int retry = 0; retry < 60 && !checkResult; ++retry) {
+ sleep(1);
+ checkResult = checkFooResult();
+ }
+ EXPECT_EQUAL(referentFoo.get(), checkResult.get());
+ getFooThread.join();
+}
+
+}
+
+TEST_MAIN()
+{
+ TEST_RUN_ALL();
+}
diff --git a/searchcore/src/tests/proton/reference/gid_to_lid_mapper/CMakeLists.txt b/searchcore/src/tests/proton/reference/gid_to_lid_mapper/CMakeLists.txt
new file mode 100644
index 00000000000..259f44e101d
--- /dev/null
+++ b/searchcore/src/tests/proton/reference/gid_to_lid_mapper/CMakeLists.txt
@@ -0,0 +1,10 @@
+# Copyright 2017 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(searchcore_gid_to_lid_mapper_test_app TEST
+ SOURCES
+ gid_to_lid_mapper_test.cpp
+ DEPENDS
+ searchcore_reference
+ searchcore_documentmetastore
+ searchcore_bucketdb
+)
+vespa_add_test(NAME searchcore_gid_to_lid_mapper_test_app COMMAND searchcore_gid_to_lid_mapper_test_app)
diff --git a/searchcore/src/tests/proton/reference/gid_to_lid_mapper/DESC b/searchcore/src/tests/proton/reference/gid_to_lid_mapper/DESC
new file mode 100644
index 00000000000..f251a0c3ac2
--- /dev/null
+++ b/searchcore/src/tests/proton/reference/gid_to_lid_mapper/DESC
@@ -0,0 +1 @@
+gid_to_lid_mapper test. Take a look at gid_to_lid_mapper_test.cpp for details.
diff --git a/searchcore/src/tests/proton/reference/gid_to_lid_mapper/FILES b/searchcore/src/tests/proton/reference/gid_to_lid_mapper/FILES
new file mode 100644
index 00000000000..13c38a92974
--- /dev/null
+++ b/searchcore/src/tests/proton/reference/gid_to_lid_mapper/FILES
@@ -0,0 +1 @@
+gid_to_lid_mapper_test.cpp
diff --git a/searchcore/src/tests/proton/reference/gid_to_lid_mapper/gid_to_lid_mapper_test.cpp b/searchcore/src/tests/proton/reference/gid_to_lid_mapper/gid_to_lid_mapper_test.cpp
new file mode 100644
index 00000000000..3506e88cea5
--- /dev/null
+++ b/searchcore/src/tests/proton/reference/gid_to_lid_mapper/gid_to_lid_mapper_test.cpp
@@ -0,0 +1,144 @@
+// Copyright 2017 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/searchcore/proton/bucketdb/bucket_db_owner.h>
+#include <vespa/searchcore/proton/documentmetastore/documentmetastore.h>
+#include <vespa/vespalib/stllike/string.h>
+#include <vespa/document/base/documentid.h>
+#include <vespa/document/bucket/bucketid.h>
+#include <vespa/searchcore/proton/reference/gid_to_lid_mapper.h>
+#include <vespa/searchcore/proton/reference/gid_to_lid_mapper_factory.h>
+#include <vespa/log/log.h>
+LOG_SETUP("gid_to_lid_mapper_test");
+
+using document::GlobalId;
+using document::BucketId;
+using document::DocumentId;
+using storage::spi::Timestamp;
+using vespalib::GenerationHandler;
+
+namespace proton {
+
+namespace {
+
+GlobalId toGid(vespalib::stringref docId) {
+ return DocumentId(docId).getGlobalId();
+}
+
+vespalib::string doc1("id:test:music::1");
+vespalib::string doc2("id:test:music::2");
+vespalib::string doc3("id:test:music::3");
+
+static constexpr uint32_t numBucketBits = UINT32_C(20);
+
+BucketId toBucketId(const GlobalId &gid) {
+ BucketId bucketId(gid.convertToBucketId());
+ bucketId.setUsedBits(numBucketBits);
+ return bucketId;
+}
+
+void assertLid(const std::unique_ptr<search::IGidToLidMapper> &mapper, const vespalib::string &docId, uint32_t lid) {
+ EXPECT_EQUAL(lid, mapper->mapGidToLid(toGid(docId)));
+}
+
+}
+
+struct Fixture
+{
+
+ BucketDBOwner::SP _bucketDB;
+ std::shared_ptr<DocumentMetaStore> _dms;
+ Timestamp _timestamp;
+ using generation_t = GenerationHandler::generation_t;
+
+ Fixture()
+ : _bucketDB(std::make_shared<BucketDBOwner>()),
+ _dms(std::make_shared<DocumentMetaStore>(_bucketDB))
+ {
+ populate();
+ }
+
+ void bumpTimeStamp() {
+ _timestamp = Timestamp(_timestamp.getValue() + 1);
+ }
+
+ void put(vespalib::stringref docId, uint32_t lid) {
+ bumpTimeStamp();
+ const GlobalId gid(toGid(docId));
+ _dms->put(gid, toBucketId(gid), _timestamp, lid);
+ _dms->commit();
+ }
+
+ uint32_t put(vespalib::stringref docId) {
+ auto inspectRes = _dms->inspect(toGid(docId));
+ uint32_t lid = inspectRes.getLid();
+ put(docId, lid);
+ return lid;
+ }
+
+ void remove(uint32_t lid) {
+ _dms->remove(lid);
+ _dms->removeComplete(lid);
+ _dms->commit();
+ }
+
+
+ void populate() {
+ put(doc1, 4);
+ put(doc2, 7);
+ _dms->constructFreeList();
+ }
+
+ std::shared_ptr<search::IGidToLidMapperFactory> getGidToLidMapperFactory() {
+ return std::make_shared<GidToLidMapperFactory>(_dms);
+ }
+
+ void assertGenerations(generation_t currentGeneration, generation_t firstUsedGeneration)
+ {
+ (void) currentGeneration;
+ (void) firstUsedGeneration;
+#if 1
+ const GenerationHandler &handler = _dms->getGenerationHandler();
+ EXPECT_EQUAL(currentGeneration, handler.getCurrentGeneration());
+ EXPECT_EQUAL(firstUsedGeneration, handler.getFirstUsedGeneration());
+#endif
+ }
+};
+
+TEST_F("Test that we can use gid mapper to get lids", Fixture)
+{
+ auto factory = f.getGidToLidMapperFactory();
+ auto mapper = factory->getMapper();
+ TEST_DO(assertLid(mapper, doc1, 4));
+ TEST_DO(assertLid(mapper, doc2, 7));
+ TEST_DO(assertLid(mapper, doc3, 0));
+}
+
+TEST_F("Test that mapper holds read guard", Fixture)
+{
+ TEST_DO(f.assertGenerations(3, 3));
+ auto factory = f.getGidToLidMapperFactory();
+ uint32_t lid3 = f.put(doc3);
+ EXPECT_EQUAL(1u, lid3);
+ TEST_DO(assertLid(factory->getMapper(), doc3, 1));
+ TEST_DO(f.assertGenerations(4, 4));
+ // Remove and readd withoug guard, old docid can be reused
+ f.remove(lid3);
+ lid3 = f.put(doc3);
+ EXPECT_EQUAL(1u, lid3);
+ TEST_DO(assertLid(factory->getMapper(), doc3, 1));
+ TEST_DO(f.assertGenerations(7, 7));
+ // Remove and readd withoug guard, old docid cannot be reused
+ auto mapper = factory->getMapper();
+ f.remove(lid3);
+ lid3 = f.put(doc3);
+ EXPECT_EQUAL(2u, lid3);
+ TEST_DO(assertLid(mapper, doc3, 2));
+ TEST_DO(f.assertGenerations(10, 7));
+}
+
+}
+
+TEST_MAIN()
+{
+ TEST_RUN_ALL();
+}