aboutsummaryrefslogtreecommitdiffstats
path: root/vespalib/src/tests/slime/external_data_value/external_data_value_test.cpp
blob: 1a1465cea600dc379eb3178d3b07db7b74781a83 (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
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.

#include <vespa/vespalib/testkit/test_kit.h>
#include <vespa/vespalib/data/slime/slime.h>

using namespace vespalib::slime::convenience;
using vespalib::slime::ExternalMemory;

struct MyMem : ExternalMemory {
    const std::vector<char> space;
    MyMem(Memory memory)
        : space(memory.data, memory.data + memory.size) {}
    Memory get() const override {
        return Memory(&space[0], space.size());
    }
    static UP create(Memory memory) {
        return std::make_unique<MyMem>(memory);
    }
};

void verify_data(const Inspector &pos, Memory expect) {
    EXPECT_TRUE(pos.valid());
    EXPECT_EQUAL(vespalib::slime::DATA::ID, pos.type().getId());
    EXPECT_EQUAL(pos.asString(), Memory());
    EXPECT_EQUAL(pos.asData(), expect);
}

TEST("require that external memory can be used for data values") {
    Slime slime;
    TEST_DO(verify_data(slime.setData(MyMem::create("foo")), Memory("foo")));
    TEST_DO(verify_data(slime.get(), Memory("foo")));
}

TEST("require that nullptr external memory gives empty data value") {
    Slime slime;
    TEST_DO(verify_data(slime.setData(ExternalMemory::UP(nullptr)), Memory("")));
    TEST_DO(verify_data(slime.get(), Memory("")));
}

TEST("require that external memory can be used with array data values") {
    Slime slime;
    TEST_DO(verify_data(slime.setArray().addData(MyMem::create("foo")), Memory("foo")));
    TEST_DO(verify_data(slime.get()[0], Memory("foo")));
}

TEST("require that external memory can be used with object data values (name)") {
    Slime slime;
    TEST_DO(verify_data(slime.setObject().setData("field", MyMem::create("foo")), Memory("foo")));
    TEST_DO(verify_data(slime.get()["field"], Memory("foo")));
}

TEST("require that external memory can be used with object data values (symbol)") {
    Slime slime;
    TEST_DO(verify_data(slime.setObject().setData(Symbol(5), MyMem::create("foo")), Memory("foo")));
    TEST_DO(verify_data(slime.get()[Symbol(5)], Memory("foo")));
}

TEST("require that external memory can be used with slime inserter") {
    Slime slime;
    SlimeInserter inserter(slime);
    TEST_DO(verify_data(inserter.insertData(MyMem::create("foo")), Memory("foo")));
    TEST_DO(verify_data(slime.get(), Memory("foo")));
}

TEST("require that external memory can be used with array inserter") {
    Slime slime;
    ArrayInserter inserter(slime.setArray());
    TEST_DO(verify_data(inserter.insertData(MyMem::create("foo")), Memory("foo")));
    TEST_DO(verify_data(slime.get()[0], Memory("foo")));
}

TEST("require that external memory can be used with object inserter") {
    Slime slime;
    ObjectInserter inserter(slime.setObject(), "field");
    TEST_DO(verify_data(inserter.insertData(MyMem::create("foo")), Memory("foo")));
    TEST_DO(verify_data(slime.get()["field"], Memory("foo")));
}

TEST("require that external memory can be used with object symbol inserter") {
    Slime slime;
    ObjectSymbolInserter inserter(slime.setObject(), Symbol(5));
    TEST_DO(verify_data(inserter.insertData(MyMem::create("foo")), Memory("foo")));
    TEST_DO(verify_data(slime.get()[Symbol(5)], Memory("foo")));
}

TEST_MAIN() { TEST_RUN_ALL(); }