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 Yahoo. 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(); }
|