diff options
Diffstat (limited to 'searchcore/src/tests/proton/reference/document_db_reference_registry/document_db_reference_registry_test.cpp')
-rw-r--r-- | searchcore/src/tests/proton/reference/document_db_reference_registry/document_db_reference_registry_test.cpp | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/searchcore/src/tests/proton/reference/document_db_reference_registry/document_db_reference_registry_test.cpp b/searchcore/src/tests/proton/reference/document_db_reference_registry/document_db_reference_registry_test.cpp new file mode 100644 index 00000000000..26a2f38e640 --- /dev/null +++ b/searchcore/src/tests/proton/reference/document_db_reference_registry/document_db_reference_registry_test.cpp @@ -0,0 +1,94 @@ +// 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_reference_registry.h> +#include <vespa/searchcore/proton/test/mock_document_db_reference.h> +#include <thread> +#include <vespa/log/log.h> +LOG_SETUP("document_db_reference_registry_test"); + +namespace proton +{ + +namespace +{ + + +std::mutex lock; +std::shared_ptr<IDocumentDBReference> getFooResult; + +void getFooTask(const IDocumentDBReferenceRegistry *registry) +{ + auto result = registry->get("foo"); + std::lock_guard<std::mutex> guard(lock); + getFooResult = result; +} + +std::shared_ptr<IDocumentDBReference> checkFooResult() +{ + std::lock_guard<std::mutex> guard(lock); + return getFooResult; +} + +} + +struct Fixture +{ + DocumentDBReferenceRegistry _registry; + + Fixture() + : _registry() + { + } + + test::MockDocumentDBReference::SP + add(vespalib::string name) { + auto reference = std::make_shared<test::MockDocumentDBReference>(); + _registry.add(name, reference); + return reference; + } +}; + +TEST_F("Test that we can instantiate registry with two references", Fixture) +{ + auto referenceFoo = f.add("foo"); + auto referenceBar = f.add("bar"); + EXPECT_NOT_EQUAL(referenceFoo.get(), referenceBar.get()); + auto reference = f._registry.get("foo"); + EXPECT_EQUAL(referenceFoo.get(), reference.get()); + reference = f._registry.get("bar"); + EXPECT_EQUAL(referenceBar.get(), reference.get()); +} + +TEST_F("Test that we block get until related add is completed", Fixture) +{ + const IDocumentDBReferenceRegistry ®istry = f._registry; + std::thread getFooThread(getFooTask, ®istry); + sleep(1); + std::shared_ptr<IDocumentDBReference> nullResult; + EXPECT_EQUAL(nullResult.get(), checkFooResult().get()); + auto referenceFoo = f.add("foo"); + std::shared_ptr<IDocumentDBReference> checkResult; + for (int retry = 0; retry < 60 && !checkResult; ++retry) { + sleep(1); + checkResult = checkFooResult(); + } + EXPECT_EQUAL(referenceFoo.get(), checkResult.get()); + getFooThread.join(); +} + +TEST_F("Test that tryGet method can fail", Fixture) +{ + auto referenceFoo = f.add("foo"); + auto reference = f._registry.tryGet("foo"); + EXPECT_EQUAL(referenceFoo.get(), reference.get()); + reference = f._registry.tryGet("bar"); + EXPECT_TRUE(reference.get() == nullptr); +} + +} + +TEST_MAIN() +{ + TEST_RUN_ALL(); +} |