diff options
Diffstat (limited to 'document/src/tests/base')
-rw-r--r-- | document/src/tests/base/.gitignore | 7 | ||||
-rw-r--r-- | document/src/tests/base/CMakeLists.txt | 19 | ||||
-rw-r--r-- | document/src/tests/base/documentid_benchmark.cpp | 21 | ||||
-rw-r--r-- | document/src/tests/base/documentid_test.cpp | 228 |
4 files changed, 275 insertions, 0 deletions
diff --git a/document/src/tests/base/.gitignore b/document/src/tests/base/.gitignore new file mode 100644 index 00000000000..bdb07eae1cb --- /dev/null +++ b/document/src/tests/base/.gitignore @@ -0,0 +1,7 @@ +*.So +*_test +*_benchmark +.depend +Makefile +document_documentid_test_app +document_documentid_benchmark_app diff --git a/document/src/tests/base/CMakeLists.txt b/document/src/tests/base/CMakeLists.txt new file mode 100644 index 00000000000..550d77d1340 --- /dev/null +++ b/document/src/tests/base/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +vespa_add_executable(document_documentid_test_app + SOURCES + documentid_test.cpp + DEPENDS + document + AFTER + document_documentconfig +) +vespa_add_test(NAME document_documentid_test_app COMMAND document_documentid_test_app) +vespa_add_executable(document_documentid_benchmark_app + SOURCES + documentid_benchmark.cpp + DEPENDS + document + AFTER + document_documentconfig +) +vespa_add_test(NAME document_documentid_benchmark_app COMMAND document_documentid_benchmark_app BENCHMARK) diff --git a/document/src/tests/base/documentid_benchmark.cpp b/document/src/tests/base/documentid_benchmark.cpp new file mode 100644 index 00000000000..16f9c9016d7 --- /dev/null +++ b/document/src/tests/base/documentid_benchmark.cpp @@ -0,0 +1,21 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +#include <vespa/document/base/documentid.h> + +using namespace document; + +int main(int argc, char *argv[]) +{ + if (argc < 3) { + fprintf(stderr, "Usage %s <docid> <count>\n", argv[0]); + } + vespalib::string s(argv[1]); + uint64_t n = strtoul(argv[2], NULL, 0); + printf("Creating documentid '%s' %ld times\n", s.c_str(), n); + printf("sizeof(IdString)=%ld, sizeof(IdIdString)=%ld\n", sizeof(IdString), sizeof(IdIdString)); + for (uint64_t i=0; i < n; i++) { + IdString::UP id = IdString::createIdString(s); + id.reset(); + } + return 0; +} + diff --git a/document/src/tests/base/documentid_test.cpp b/document/src/tests/base/documentid_test.cpp new file mode 100644 index 00000000000..62ce42c0fb6 --- /dev/null +++ b/document/src/tests/base/documentid_test.cpp @@ -0,0 +1,228 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Unit tests for documentid. + +#include <vespa/log/log.h> +LOG_SETUP("documentid_test"); +#include <vespa/fastos/fastos.h> + +#include <vespa/document/base/documentid.h> +#include <vespa/vespalib/testkit/testapp.h> + +using namespace document; +using vespalib::string; + +namespace { + +const string ns = "namespace"; +const string ns_id = "namespaceid"; +const string type = "my_type"; + +void checkId(const string &id, IdString::Type t, + const string &ns_str, const string local_id) { + DocumentId doc_id(id); + EXPECT_EQUAL(t, doc_id.getScheme().getType()); + EXPECT_EQUAL(ns_str, doc_id.getScheme().getNamespace()); + EXPECT_EQUAL(local_id, doc_id.getScheme().getNamespaceSpecific()); + EXPECT_EQUAL(id, doc_id.getScheme().toString()); +} + +template <typename IdType> +const IdType &getAs(const DocumentId &doc_id) { + const IdType *id_str = dynamic_cast<const IdType *>(&doc_id.getScheme()); + ASSERT_TRUE(id_str); + return *id_str; +} + +template <typename IdType> +void checkUser(const string &id, int64_t user_id) { + DocumentId doc_id(id); + EXPECT_EQUAL(user_id, getAs<IdType>(doc_id).getUserId()); +} + +void checkOrdering(const string &id, uint64_t ordering) { + DocumentId doc_id(id); + EXPECT_EQUAL(ordering, getAs<OrderDocIdString>(doc_id).getOrdering()); +} + +void checkGroup(const string &id, const string &group) { + DocumentId doc_id(id); + EXPECT_EQUAL(group, getAs<GroupDocIdString>(doc_id).getGroup()); +} + +void checkType(const string &id, const string &doc_type) { + DocumentId doc_id(id); + ASSERT_TRUE(doc_id.hasDocType()); + EXPECT_EQUAL(doc_type, doc_id.getDocType()); +} + +TEST("require that doc id can be parsed") { + const string id = "doc:" + ns + ":" + ns_id; + checkId(id, IdString::DOC, ns, ns_id); +} + +TEST("require that userdoc id can be parsed") { + const string id = "userdoc:" + ns + ":1234:" + ns_id; + checkId(id, IdString::USERDOC, ns, ns_id); + checkUser<UserDocIdString>(id, 1234); +} + +TEST("require that orderdoc id can be parsed") { + const string id = "orderdoc(31,19):" + ns + ":1234:1268182861:" + ns_id; + checkId(id, IdString::ORDERDOC, ns, ns_id); + checkUser<OrderDocIdString>(id, 1234); + checkOrdering(id, 1268182861); +} + +TEST("require that groupdoc id can be parsed") { + const string group = "mygroup"; + const string id = "groupdoc:" + ns + ":" + group + ":" + ns_id; + checkId(id, IdString::GROUPDOC, ns, ns_id); + checkGroup(id, group); +} + +TEST("require that id id can be parsed") { + const string id = "id:" + ns + ":" + type + "::" + ns_id; + checkId(id, IdString::ID, ns, ns_id); + checkType(id, type); +} + +TEST("require that we allow ':' in namespace specific part") { + const string nss=":a:b:c:"; + string id="id:" + ns + ":" + type + "::" + nss; + checkId(id, IdString::ID, ns, nss); + checkType(id, type); + + id="doc:" + ns + ":" + nss; + checkId(id, IdString::DOC, ns, nss); + + id="userdoc:" + ns + ":123:" + nss; + checkId(id, IdString::USERDOC, ns, nss); + checkUser<UserDocIdString>(id, 123); + + id="groupdoc:" + ns + ":123:" + nss; + checkId(id, IdString::GROUPDOC, ns, nss); + checkGroup(id, "123"); + + id="orderdoc(5,2):" + ns + ":42:007:" + nss; + checkId(id, IdString::ORDERDOC, ns, nss); +} + +TEST("require that id id can specify location") { + DocumentId id("id:ns:type:n=12345:foo"); + EXPECT_EQUAL(12345u, id.getScheme().getLocation()); + EXPECT_EQUAL(12345u, getAs<IdIdString>(id).getNumber()); +} + +TEST("require that id id's n key must be a 64-bit number") { + EXPECT_EXCEPTION(DocumentId("id:ns:type:n=abc:foo"), IdParseException, + "'n'-value must be a 64-bit number"); + DocumentId("id:ns:type:n=18446744073709551615:foo"); // ok + EXPECT_EXCEPTION(DocumentId("id:ns:type:n=18446744073709551616:foo"), + IdParseException, "'n'-value out of range"); +} + +TEST("require that id id can specify group") { + DocumentId id1("id:ns:type:g=mygroup:foo"); + DocumentId id2("id:ns:type:g=mygroup:bar"); + DocumentId id3("id:ns:type:g=other group:baz"); + EXPECT_EQUAL(id1.getScheme().getLocation(), id2.getScheme().getLocation()); + EXPECT_NOT_EQUAL(id1.getScheme().getLocation(), + id3.getScheme().getLocation()); + EXPECT_EQUAL("mygroup", getAs<IdIdString>(id1).getGroup()); +} + +TEST("require that id id location is specified by local id only by default") { + DocumentId id1("id:ns:type::locationspec"); + DocumentId id2("id:ns:type:g=locationspec:bar"); + EXPECT_EQUAL("locationspec", id1.getScheme().getNamespaceSpecific()); + EXPECT_EQUAL("bar", id2.getScheme().getNamespaceSpecific()); + EXPECT_EQUAL(id1.getScheme().getLocation(), id2.getScheme().getLocation()); +} + +TEST("require that local id can be empty") { + const string id = "userdoc:" + ns + ":1234:"; + checkId(id, IdString::USERDOC, ns, ""); + checkUser<UserDocIdString>(id, 1234); +} + +TEST("require that document ids can be assigned") { + DocumentId id1("userdoc:" + ns + ":1234:"); + DocumentId id2 = id1; + checkId(id2.toString(), IdString::USERDOC, ns, ""); + checkUser<UserDocIdString>(id2.toString(), 1234); +} + +TEST("require that illegal ids fail") { + EXPECT_EXCEPTION(DocumentId("idg:foo:bar:baz"), IdParseException, + "No scheme separator ':' found"); + EXPECT_EXCEPTION(DocumentId("id:"), IdParseException, "too short"); + EXPECT_EXCEPTION(DocumentId("id:ns"), IdParseException, + "No namespace separator ':' found"); + EXPECT_EXCEPTION(DocumentId("id:ns:type"), IdParseException, + "No document type separator ':' found"); + EXPECT_EXCEPTION(DocumentId("id:ns:type:kv_pair"), IdParseException, + "No key/value-pairs separator ':' found"); + EXPECT_EXCEPTION(DocumentId("id:ns:type:k=foo:bar"), IdParseException, + "Illegal key 'k'"); + EXPECT_EXCEPTION(DocumentId("id:ns:type:n=0,n=1:bar"), IdParseException, + "Illegal key combination in n=0,n=1"); + EXPECT_EXCEPTION(DocumentId("id:ns:type:g=foo,g=ba:bar"), IdParseException, + "Illegal key combination in g=foo,g=ba"); + EXPECT_EXCEPTION(DocumentId("id:ns:type:n=0,g=foo:bar"), IdParseException, + "Illegal key combination in n=0,g=foo"); +} + +TEST("require that key-value pairs in id id are preserved") { + const string id_str1 = "id:ns:type:n=1:foo"; + EXPECT_EQUAL(id_str1, DocumentId(id_str1).toString()); + + const string id_str2 = "id:ns:type:g=mygroup:foo"; + EXPECT_EQUAL(id_str2, DocumentId(id_str2).toString()); +} + +TEST("require that id strings reports features (hasNumber, hasGroup)") { + DocumentId none("id:ns:type::foo"); + EXPECT_FALSE(none.getScheme().hasNumber()); + EXPECT_FALSE(none.getScheme().hasGroup()); + EXPECT_EQUAL("foo", none.getScheme().getNamespaceSpecific()); + + none = DocumentId("doc:ns:foo"); + EXPECT_FALSE(none.getScheme().hasNumber()); + EXPECT_FALSE(none.getScheme().hasGroup()); + EXPECT_EQUAL("foo", none.getScheme().getNamespaceSpecific()); + + DocumentId user("id:ns:type:n=42:foo"); + EXPECT_TRUE(user.getScheme().hasNumber()); + EXPECT_FALSE(user.getScheme().hasGroup()); + EXPECT_EQUAL(42u, user.getScheme().getNumber()); + EXPECT_EQUAL("foo", user.getScheme().getNamespaceSpecific()); + + user = DocumentId("userdoc:ns:42:foo"); + EXPECT_TRUE(user.getScheme().hasNumber()); + EXPECT_FALSE(user.getScheme().hasGroup()); + EXPECT_EQUAL(42u, user.getScheme().getNumber()); + EXPECT_EQUAL("foo", user.getScheme().getNamespaceSpecific()); + + DocumentId group("id:ns:type:g=mygroup:foo"); + EXPECT_FALSE(group.getScheme().hasNumber()); + EXPECT_TRUE(group.getScheme().hasGroup()); + EXPECT_EQUAL("mygroup", group.getScheme().getGroup()); + EXPECT_EQUAL("foo", group.getScheme().getNamespaceSpecific()); + + group = DocumentId("groupdoc:ns:mygroup:foo"); + EXPECT_FALSE(group.getScheme().hasNumber()); + EXPECT_TRUE(group.getScheme().hasGroup()); + EXPECT_EQUAL("mygroup", group.getScheme().getGroup()); + EXPECT_EQUAL("foo", group.getScheme().getNamespaceSpecific()); + + DocumentId order("orderdoc(5,2):ns:42:007:foo"); + EXPECT_TRUE(order.getScheme().hasNumber()); + EXPECT_TRUE(order.getScheme().hasGroup()); + EXPECT_EQUAL(42u, order.getScheme().getNumber()); + EXPECT_EQUAL("42", order.getScheme().getGroup()); + EXPECT_EQUAL("foo", order.getScheme().getNamespaceSpecific()); +} + +} // namespace + +TEST_MAIN() { TEST_RUN_ALL(); } |