diff options
author | Tor Egge <Tor.Egge@yahoo-inc.com> | 2017-02-17 14:09:42 +0000 |
---|---|---|
committer | Tor Egge <Tor.Egge@yahoo-inc.com> | 2017-02-17 14:09:42 +0000 |
commit | 39b0109937c1fc18904f663dc4e626342b059b77 (patch) | |
tree | 3cbdc67cad632583b52ce0e809fdb34dcd4299fe /searchcore | |
parent | eca2aa078e4c9daeeaf53636cd5f3a78856c7909 (diff) |
Add unit test for gid to lid change listener.
Diffstat (limited to 'searchcore')
5 files changed, 118 insertions, 0 deletions
diff --git a/searchcore/CMakeLists.txt b/searchcore/CMakeLists.txt index 7546389aeb6..e98e1af15e6 100644 --- a/searchcore/CMakeLists.txt +++ b/searchcore/CMakeLists.txt @@ -117,6 +117,7 @@ vespa_define_module( src/tests/proton/persistenceconformance src/tests/proton/persistenceengine src/tests/proton/proton + src/tests/proton/reference/gid_to_lid_change_listener src/tests/proton/reference/gid_to_lid_mapper src/tests/proton/reference/document_db_referent_registry src/tests/proton/reprocessing/attribute_reprocessing_initializer diff --git a/searchcore/src/tests/proton/reference/gid_to_lid_change_listener/CMakeLists.txt b/searchcore/src/tests/proton/reference/gid_to_lid_change_listener/CMakeLists.txt new file mode 100644 index 00000000000..f51f0110f7f --- /dev/null +++ b/searchcore/src/tests/proton/reference/gid_to_lid_change_listener/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_change_listener_test_app TEST + SOURCES + gid_to_lid_change_listener_test.cpp + DEPENDS + searchcore_reference + searchcore_documentmetastore + searchcore_bucketdb +) +vespa_add_test(NAME searchcore_gid_to_lid_change_listener_test_app COMMAND searchcore_gid_to_lid_change_listener_test_app) diff --git a/searchcore/src/tests/proton/reference/gid_to_lid_change_listener/DESC b/searchcore/src/tests/proton/reference/gid_to_lid_change_listener/DESC new file mode 100644 index 00000000000..ab26dd60a1b --- /dev/null +++ b/searchcore/src/tests/proton/reference/gid_to_lid_change_listener/DESC @@ -0,0 +1 @@ +gid_to_lid_change_listener test. Take a look at gid_to_lid_change_listener_test.cpp for details. diff --git a/searchcore/src/tests/proton/reference/gid_to_lid_change_listener/FILES b/searchcore/src/tests/proton/reference/gid_to_lid_change_listener/FILES new file mode 100644 index 00000000000..ad1848502a5 --- /dev/null +++ b/searchcore/src/tests/proton/reference/gid_to_lid_change_listener/FILES @@ -0,0 +1 @@ +gid_to_lid_change_listener_test.cpp diff --git a/searchcore/src/tests/proton/reference/gid_to_lid_change_listener/gid_to_lid_change_listener_test.cpp b/searchcore/src/tests/proton/reference/gid_to_lid_change_listener/gid_to_lid_change_listener_test.cpp new file mode 100644 index 00000000000..fb762bd0d44 --- /dev/null +++ b/searchcore/src/tests/proton/reference/gid_to_lid_change_listener/gid_to_lid_change_listener_test.cpp @@ -0,0 +1,105 @@ +// 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/document/base/documentid.h> +#include <vespa/searchlib/common/sequencedtaskexecutor.h> +#include <vespa/searchcore/proton/common/monitored_refcount.h> +#include <vespa/searchcore/proton/reference/gid_to_lid_change_listener.h> +#include <vespa/log/log.h> +LOG_SETUP("gid_to_lid_change_listener_test"); + +using document::GlobalId; +using document::BucketId; +using document::DocumentId; +using vespalib::GenerationHandler; +using search::attribute::Config; +using search::attribute::BasicType; +using search::attribute::ReferenceAttribute; + +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"); + +} + +struct Fixture +{ + std::shared_ptr<ReferenceAttribute> _attr; + search::SequencedTaskExecutor _writer; + MonitoredRefCount _refCount; + std::unique_ptr<GidToLidChangeListener> _listener; + + Fixture() + : _attr(std::make_shared<ReferenceAttribute>("test", Config(BasicType::REFERENCE))), + _writer(1), + _refCount(), + _listener() + { + } + + void ensureDocIdLimit(uint32_t docIdLimit) { + while (_attr->getNumDocs() < docIdLimit) { + uint32_t newDocId = 0u; + _attr->addDoc(newDocId); + _attr->commit(); + } + } + + void set(uint32_t doc, const GlobalId &gid) { + _attr->update(doc, gid); + } + + void commit() { _attr->commit(); } + + const ReferenceAttribute::Reference *getRef(uint32_t doc) { + return _attr->getReference(doc); + } + + void assertRefLid(uint32_t expLid, uint32_t doc) { + auto ref = getRef(doc); + EXPECT_TRUE(ref != nullptr); + EXPECT_EQUAL(expLid, ref->lid()); + } + + void allocListener() { + _listener = std::make_unique<GidToLidChangeListener>(_writer, _attr, _refCount); + } + + void notifyGidToLidChange(const GlobalId &gid, uint32_t referencedDoc) { + _listener->notifyGidToLidChange(gid, referencedDoc); + } +}; + +TEST_F("Test that we can use gid to lid change listener", Fixture) +{ + f.ensureDocIdLimit(4); + f.set(1, toGid(doc1)); + f.set(2, toGid(doc2)); + f.set(3, toGid(doc1)); + f.commit(); + TEST_DO(f.assertRefLid(0, 1)); + TEST_DO(f.assertRefLid(0, 2)); + TEST_DO(f.assertRefLid(0, 3)); + f.allocListener(); + f.notifyGidToLidChange(toGid(doc1), 10); + f.notifyGidToLidChange(toGid(doc2), 20); + f.notifyGidToLidChange(toGid(doc3), 30); + TEST_DO(f.assertRefLid(10, 1)); + TEST_DO(f.assertRefLid(20, 2)); + TEST_DO(f.assertRefLid(10, 3)); +} + +} + +TEST_MAIN() +{ + TEST_RUN_ALL(); +} |