summaryrefslogtreecommitdiffstats
path: root/storage/src/tests/storageserver/configurable_bucket_resolver_test.cpp
blob: c10db0a1acd2738683ab3a4a68cb860d12f17e13 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.

#include <vespa/storage/storageserver/configurable_bucket_resolver.h>
#include <vespa/document/base/documentid.h>
#include <vespa/document/bucket/fixed_bucket_spaces.h>
#include <cppunit/extensions/HelperMacros.h>

namespace storage {

using document::DocumentId;

struct ConfigurableBucketResolverTest : CppUnit::TestFixture {
    CPPUNIT_TEST_SUITE(ConfigurableBucketResolverTest);
    CPPUNIT_TEST(bucket_space_from_name_is_defined_for_default_space);
    CPPUNIT_TEST(bucket_space_from_name_is_defined_for_global_space);
    CPPUNIT_TEST(bucket_space_from_name_throws_exception_for_unknown_space);
    CPPUNIT_TEST(name_from_bucket_space_is_defined_for_default_space);
    CPPUNIT_TEST(name_from_bucket_space_is_defined_for_global_space);
    CPPUNIT_TEST(name_from_bucket_space_throws_exception_for_unknown_space);
    CPPUNIT_TEST(known_bucket_space_is_resolved_from_document_id);
    CPPUNIT_TEST(unknown_bucket_space_in_id_throws_exception);
    CPPUNIT_TEST(can_create_resolver_from_bucket_space_config);
    CPPUNIT_TEST(legacy_document_id_without_document_type_maps_to_default_space);
    CPPUNIT_TEST_SUITE_END();

    using BucketSpaceMapping = ConfigurableBucketResolver::BucketSpaceMapping;

    BucketSpaceMapping create_simple_mapping() {
        return {{"foo", document::FixedBucketSpaces::default_space()},
                {"bar", document::FixedBucketSpaces::default_space()},
                {"baz", document::FixedBucketSpaces::global_space()}};
    }

    ConfigurableBucketResolver create_empty_resolver() {
        return ConfigurableBucketResolver({});
    }

    ConfigurableBucketResolver create_simple_resolver() {
        return ConfigurableBucketResolver(create_simple_mapping());
    }

    void bucket_space_from_name_is_defined_for_default_space();
    void bucket_space_from_name_is_defined_for_global_space();
    void bucket_space_from_name_throws_exception_for_unknown_space();
    void name_from_bucket_space_is_defined_for_default_space();
    void name_from_bucket_space_is_defined_for_global_space();
    void name_from_bucket_space_throws_exception_for_unknown_space();
    void known_bucket_space_is_resolved_from_document_id();
    void unknown_bucket_space_in_id_throws_exception();
    void can_create_resolver_from_bucket_space_config();
    void legacy_document_id_without_document_type_maps_to_default_space();
};

CPPUNIT_TEST_SUITE_REGISTRATION(ConfigurableBucketResolverTest);

// TODO reduce overlap with FixedBucketSpacesTest
void ConfigurableBucketResolverTest::bucket_space_from_name_is_defined_for_default_space() {
    auto space = create_empty_resolver().bucketSpaceFromName("default");
    CPPUNIT_ASSERT_EQUAL(document::FixedBucketSpaces::default_space(), space);
}

void ConfigurableBucketResolverTest::bucket_space_from_name_is_defined_for_global_space() {
    auto space = create_empty_resolver().bucketSpaceFromName("global");
    CPPUNIT_ASSERT_EQUAL(document::FixedBucketSpaces::global_space(), space);
}

void ConfigurableBucketResolverTest::bucket_space_from_name_throws_exception_for_unknown_space() {
    try {
        create_empty_resolver().bucketSpaceFromName("bjarne");
        CPPUNIT_FAIL("Expected exception on unknown bucket space name");
    } catch (document::UnknownBucketSpaceException& e) {
    }
}

void ConfigurableBucketResolverTest::name_from_bucket_space_is_defined_for_default_space() {
    CPPUNIT_ASSERT_EQUAL(vespalib::string("default"),
                         create_empty_resolver().nameFromBucketSpace(document::FixedBucketSpaces::default_space()));
}

void ConfigurableBucketResolverTest::name_from_bucket_space_is_defined_for_global_space() {
    CPPUNIT_ASSERT_EQUAL(vespalib::string("global"),
                         create_empty_resolver().nameFromBucketSpace(document::FixedBucketSpaces::global_space()));
}

void ConfigurableBucketResolverTest::name_from_bucket_space_throws_exception_for_unknown_space() {
    try {
        create_empty_resolver().nameFromBucketSpace(document::BucketSpace(1234));
        CPPUNIT_FAIL("Expected exception on unknown bucket space value");
    } catch (document::UnknownBucketSpaceException& e) {
    }
}

void ConfigurableBucketResolverTest::known_bucket_space_is_resolved_from_document_id() {
    auto resolver = create_simple_resolver();
    CPPUNIT_ASSERT_EQUAL(document::FixedBucketSpaces::default_space(),
                         resolver.bucketFromId(DocumentId("id::foo::xyz")).getBucketSpace());
    CPPUNIT_ASSERT_EQUAL(document::FixedBucketSpaces::default_space(),
                         resolver.bucketFromId(DocumentId("id::bar::xyz")).getBucketSpace());
    CPPUNIT_ASSERT_EQUAL(document::FixedBucketSpaces::global_space(),
                         resolver.bucketFromId(DocumentId("id::baz::xyz")).getBucketSpace());
}

void ConfigurableBucketResolverTest::unknown_bucket_space_in_id_throws_exception() {
    try {
        create_simple_resolver().bucketFromId(DocumentId("id::bjarne::xyz"));
        CPPUNIT_FAIL("Expected exception on unknown document type -> bucket space mapping");
    } catch (document::UnknownBucketSpaceException& e) {
    }
}

using BucketSpacesConfigBuilder = vespa::config::content::core::BucketspacesConfigBuilder;

namespace {

BucketSpacesConfigBuilder::Documenttype make_doc_type(vespalib::stringref name, vespalib::stringref space) {
    BucketSpacesConfigBuilder::Documenttype doc_type;
    doc_type.name = name;
    doc_type.bucketspace = space;
    return doc_type;
}

}

void ConfigurableBucketResolverTest::can_create_resolver_from_bucket_space_config() {
    BucketSpacesConfigBuilder builder;
    builder.documenttype.emplace_back(make_doc_type("foo", "default"));
    builder.documenttype.emplace_back(make_doc_type("bar", "global"));
    builder.documenttype.emplace_back(make_doc_type("baz", "global"));
    auto resolver = ConfigurableBucketResolver::from_config(builder);
    CPPUNIT_ASSERT_EQUAL(document::FixedBucketSpaces::default_space(),
                         resolver->bucketFromId(DocumentId("id::foo::xyz")).getBucketSpace());
    CPPUNIT_ASSERT_EQUAL(document::FixedBucketSpaces::global_space(),
                         resolver->bucketFromId(DocumentId("id::bar::xyz")).getBucketSpace());
    CPPUNIT_ASSERT_EQUAL(document::FixedBucketSpaces::global_space(),
                         resolver->bucketFromId(DocumentId("id::baz::xyz")).getBucketSpace());
}

void ConfigurableBucketResolverTest::legacy_document_id_without_document_type_maps_to_default_space() {
    auto resolver = create_simple_resolver();
    CPPUNIT_ASSERT_EQUAL(document::FixedBucketSpaces::default_space(),
                         resolver.bucketFromId(DocumentId("userdoc:baz:1234:baz")).getBucketSpace());
}

}