File: object.cpp

package info (click to toggle)
yrmcds 1.0.4-6
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 924 kB
  • ctags: 1,346
  • sloc: cpp: 9,634; sh: 133; makefile: 97
file content (101 lines) | stat: -rw-r--r-- 2,885 bytes parent folder | download
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
#include "../src/config.hpp"
#include "../src/object.hpp"

#include <cybozu/test.hpp>

#include <cstdlib>

using yrmcds::object;
using cybozu::dynbuf;

std::size_t reset_heap_limit() {
    const char* p = std::getenv("HEAP_LIMIT");
    std::size_t n = 0;
    if( p != nullptr )
        n = (std::size_t)std::atoi(p);
    if( n == 0 )
        n = yrmcds::DEFAULT_HEAP_DATA_LIMIT;

    yrmcds::g_config.set_heap_data_limit(n);
    return n;
}

AUTOTEST(set) {
    reset_heap_limit();
    object o1("abcde", 5, 100, 0);
    cybozu_assert( o1.size() == 5 );
    cybozu_assert( o1.flags() == 100 );
    dynbuf d1(0); d1.append("abcde", 5);
    dynbuf d1_(0);
    std::uint64_t cas = o1.cas_unique();
    cybozu_assert( o1.data(d1_) == d1 );
    cybozu_assert( o1.cas_unique() == cas );

    o1.set("123", 3, 200, 200);
    cybozu_assert( o1.size() == 3 );
    cybozu_assert( o1.flags() == 200 );
    d1.reset(); d1.append("123", 3);
    cybozu_assert( o1.data(d1_) == d1 );
    cybozu_assert( o1.cas_unique() != cas );
}

AUTOTEST(append_prepend) {
    reset_heap_limit();
    object o1("abcde", 5, 100, 0);
    std::uint64_t cas = o1.cas_unique();
    o1.append("12345", 5);
    std::uint64_t cas2 = o1.cas_unique();
    cybozu_assert( o1.size() == 10 );
    cybozu_assert( cas != cas2 );
    dynbuf d1(0); d1.append("abcde12345", 10);
    dynbuf d1_(0);
    cybozu_assert( o1.data(d1_) == d1 );

    o1.prepend("#*A", 3);
    std::uint64_t cas3 = o1.cas_unique();
    cybozu_assert( o1.size() == 13 );
    cybozu_assert( cas != cas3 );
    cybozu_assert( cas2 != cas3 );
    d1.reset(); d1.append("#*Aabcde12345", 13);
    cybozu_assert( o1.data(d1_) == d1 );
}

AUTOTEST(touch) {
    reset_heap_limit();
    object o1("abcde", 5, 100, 0);
    std::uint64_t cas = o1.cas_unique();
    o1.touch(1111);
    dynbuf d1(0); d1.append("abcde", 5);
    dynbuf d1_(0);
    cybozu_assert( o1.size() == 5 );
    cybozu_assert( o1.data(d1_) == d1 );
    cybozu_assert( o1.cas_unique() == cas );
}

AUTOTEST(incr_decr) {
    if( reset_heap_limit() < 24 ) return;
    object o1("abcde", 5, 100, 0);
    cybozu_test_exception( o1.incr(3), object::not_a_number );
    object o2("123ab", 5, 100, 0);
    std::uint64_t cas = o2.cas_unique();
    std::uint64_t n = 0;
    cybozu_test_no_exception( n = o2.incr(3) );
    std::uint64_t cas2 = o2.cas_unique();
    cybozu_assert( n == 126 );
    cybozu_assert( cas != cas2 );
    n = o2.decr(3);
    std::uint64_t cas3 = o2.cas_unique();
    cybozu_assert( n == 123 );
    cybozu_assert( cas2 != cas3 );
    n = o2.decr(200);
    cybozu_assert( n == 0 );
    object o3("  18446744073709551615", 22, 100, 0);
    n = o3.decr(1);
    cybozu_assert( n == 18446744073709551614ULL );
    n = o3.incr(2);
    cybozu_assert( n == 0 );
    o3.set(" 111", 4, 0, 0);
    dynbuf d3(0); d3.append(" 111", 4);
    dynbuf d3_(0);
    cybozu_assert( o3.data(d3_) == d3 );
}