aboutsummaryrefslogtreecommitdiffstats
path: root/persistence/src/tests/dummyimpl/dummypersistence_test.cpp
blob: fa0669a994a70c52c81322657ace85d2420d6f8e (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
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
// Unit tests for dummypersistence.

#include <vespa/persistence/dummyimpl/dummypersistence.h>
#include <vespa/vespalib/testkit/testapp.h>
#include <vespa/document/base/documentid.h>
#include <vespa/document/test/make_bucket_space.h>
#include <vespa/vdslib/distribution/distribution.h>
#include <vespa/vdslib/state/clusterstate.h>
#include <vespa/config-stor-distribution.h>

using namespace storage::spi;
using namespace storage;
using document::test::makeBucketSpace;
using dummy::BucketContent;

namespace {

struct Fixture {
    BucketContent content;

    void insert(DocumentId id, Timestamp timestamp, DocumentMetaEnum meta_flags) {
        content.insert(DocEntry::create(timestamp, meta_flags, id));
    }

    Fixture() {
        insert(DocumentId("id:ns:type::test:3"), Timestamp(3), DocumentMetaEnum::NONE);
        insert(DocumentId("id:ns:type::test:1"), Timestamp(1), DocumentMetaEnum::NONE);
        insert(DocumentId("id:ns:type::test:2"), Timestamp(2), DocumentMetaEnum::NONE);
    }
};

TEST("require that empty BucketContent behaves") {
    BucketContent content;
    EXPECT_FALSE(content.hasTimestamp(Timestamp(1)));
    EXPECT_FALSE(content.getEntry(Timestamp(1)).get());
    EXPECT_FALSE(content.getEntry(DocumentId("id:ns:type::test:1")).get());
}

TEST_F("require that BucketContent can retrieve by timestamp", Fixture) {
    DocEntry::SP entry = f.content.getEntry(Timestamp(1));
    ASSERT_TRUE(entry.get());
    ASSERT_TRUE(entry->getDocumentId());
    ASSERT_EQUAL("id:ns:type::test:1", entry->getDocumentId()->toString());
}

TEST_F("require that BucketContent can retrieve by doc id", Fixture) {
    DocEntry::SP entry = f.content.getEntry(DocumentId("id:ns:type::test:2"));
    ASSERT_TRUE(entry.get());
    ASSERT_TRUE(entry->getDocumentId());
    ASSERT_EQUAL("id:ns:type::test:2", entry->getDocumentId()->toString());
}

TEST_F("require that BucketContent can check a timestamp", Fixture) {
    EXPECT_FALSE(f.content.hasTimestamp(Timestamp(0)));
    EXPECT_TRUE(f.content.hasTimestamp(Timestamp(1)));
    EXPECT_TRUE(f.content.hasTimestamp(Timestamp(2)));
    EXPECT_TRUE(f.content.hasTimestamp(Timestamp(3)));
    EXPECT_FALSE(f.content.hasTimestamp(Timestamp(4)));
}

TEST_F("require that BucketContent can provide bucket info", Fixture) {
    uint32_t lastChecksum = 0;
    EXPECT_NOT_EQUAL(lastChecksum, f.content.getBucketInfo().getChecksum());
    lastChecksum = f.content.getBucketInfo().getChecksum();
    f.insert(DocumentId("id:ns:type::test:3"), Timestamp(4), DocumentMetaEnum::NONE);
    EXPECT_NOT_EQUAL(lastChecksum, f.content.getBucketInfo().getChecksum());
    lastChecksum = f.content.getBucketInfo().getChecksum();
    f.insert(DocumentId("id:ns:type::test:2"), Timestamp(5), DocumentMetaEnum::REMOVE_ENTRY);
    EXPECT_NOT_EQUAL(lastChecksum, f.content.getBucketInfo().getChecksum());
    f.insert(DocumentId("id:ns:type::test:1"), Timestamp(6), DocumentMetaEnum::REMOVE_ENTRY);
    f.insert(DocumentId("id:ns:type::test:3"), Timestamp(7), DocumentMetaEnum::REMOVE_ENTRY);
    EXPECT_EQUAL(0u, f.content.getBucketInfo().getChecksum());
}

TEST_F("require that setClusterState sets the cluster state", Fixture) {
    lib::ClusterState s("version:1 storage:3 .1.s:d distributor:3");
    lib::Distribution d(lib::Distribution::getDefaultDistributionConfig(3, 3));
    ClusterState state(s, 1, d);

    std::shared_ptr<const document::DocumentTypeRepo> repo;
    dummy::DummyPersistence provider(repo);
    provider.setClusterState(makeBucketSpace(), state);

    EXPECT_EQUAL(false, provider.getClusterState().nodeUp());
}

}  // namespace

TEST_MAIN() { TEST_RUN_ALL(); }