aboutsummaryrefslogtreecommitdiffstats
path: root/vespalib/src/tests/util/generation_hold_list/generation_hold_list_test.cpp
blob: 2d8da961433835a6a354ca79c4f436975d289007 (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
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.

#include <vespa/vespalib/gtest/gtest.h>
#include <vespa/vespalib/util/generation_hold_list.hpp>
#include <vespa/vespalib/util/generationholder.h>
#include <cstdint>

using namespace vespalib;

using MyElem = GenerationHeldBase;
using generation_t = GenerationHandler::generation_t;

TEST(GenerationHolderTest, holding_of_unique_ptr_elements_with_tracking_of_held_bytes)
{
    GenerationHolder h;
    h.insert(std::make_unique<MyElem>(3));
    h.assign_generation(0);
    h.insert(std::make_unique<MyElem>(5));
    h.assign_generation(1);
    h.insert(std::make_unique<MyElem>(7));
    h.assign_generation(2);
    h.insert(std::make_unique<MyElem>(11));
    h.assign_generation(4);
    EXPECT_EQ(3 + 5 + 7 + 11, h.get_held_bytes());

    h.reclaim(0);
    EXPECT_EQ(3 + 5 + 7 + 11, h.get_held_bytes());
    h.reclaim(1);
    EXPECT_EQ(5 + 7 + 11, h.get_held_bytes());
    h.reclaim(2);
    EXPECT_EQ(7 + 11, h.get_held_bytes());

    h.insert(std::make_unique<MyElem>(13));
    h.assign_generation(6);
    EXPECT_EQ(7 + 11 + 13, h.get_held_bytes());

    h.reclaim(6);
    EXPECT_EQ(13, h.get_held_bytes());
    h.reclaim(7);
    EXPECT_EQ(0, h.get_held_bytes());
    h.reclaim(7);
    EXPECT_EQ(0, h.get_held_bytes());
}

TEST(GenerationHolderTest, reclaim_all_clears_everything)
{
    GenerationHolder h;
    h.insert(std::make_unique<MyElem>(3));
    h.insert(std::make_unique<MyElem>(5));
    h.assign_generation(1);
    h.reclaim_all();
    EXPECT_EQ(0, h.get_held_bytes());
}

using IntVector = std::vector<int32_t>;
using IntHoldList = GenerationHoldList<int32_t, false, true>;

struct IntHoldListTest : public testing::Test {
    IntHoldList h;
    IntHoldListTest() : h() {}
    void assert_reclaim(const IntVector& exp, generation_t oldest_used_gen) {
        IntVector act;
        h.reclaim(oldest_used_gen, [&](int elem){ act.push_back(elem); });
        EXPECT_EQ(exp, act);
    }
    void assert_reclaim_all(const IntVector& exp) {
        IntVector act;
        h.reclaim_all([&](int elem){ act.push_back(elem); });
        EXPECT_EQ(exp, act);
    }
};

TEST_F(IntHoldListTest, reclaim_calls_callback_for_reclaimed_elements)
{
    h.insert(3);
    h.assign_generation(1);
    h.insert(5);
    h.insert(7);
    h.assign_generation(2);

    assert_reclaim({}, 1);
    assert_reclaim({3}, 2);
    assert_reclaim({5, 7}, 3);
}

TEST_F(IntHoldListTest, reclaim_all_calls_callback_for_all_elements)
{
    h.insert(3);
    h.insert(5);
    h.assign_generation(2);
    assert_reclaim_all({3, 5});
    assert_reclaim_all({});
}

GTEST_MAIN_RUN_ALL_TESTS()