File: test_callback_buffer.cpp

package info (click to toggle)
libosmium 2.23.0-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,564 kB
  • sloc: cpp: 53,570; sh: 148; makefile: 19
file content (101 lines) | stat: -rw-r--r-- 2,884 bytes parent folder | download | duplicates (8)
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 "catch.hpp"

#include <osmium/builder/attr.hpp>
#include <osmium/memory/callback_buffer.hpp>

#include <iterator>

using namespace osmium::builder::attr; // NOLINT(google-build-using-namespace)

TEST_CASE("Callback buffer") {
    osmium::memory::CallbackBuffer cb;

    REQUIRE(cb.buffer().committed() == 0);

    osmium::builder::add_node(cb.buffer(), _id(1));
    osmium::builder::add_node(cb.buffer(), _id(2));
    osmium::builder::add_node(cb.buffer(), _id(3));

    auto c = cb.buffer().committed();
    REQUIRE(c > 0);

    REQUIRE(std::distance(cb.buffer().begin(), cb.buffer().end()) == 3);
    auto buffer = cb.read();

    REQUIRE(cb.buffer().committed() == 0);
    REQUIRE(buffer.committed() == c);
    REQUIRE(std::distance(cb.buffer().begin(), cb.buffer().end()) == 0);

    // no callback defined, so nothing will happen
    cb.flush();
}

TEST_CASE("Callback buffer with callback triggering every time") {
    int run = 0;

    osmium::memory::CallbackBuffer cb{[&](osmium::memory::Buffer&& buffer){
        REQUIRE(buffer.committed() > 0);
        REQUIRE(std::distance(buffer.begin(), buffer.end()) == 1);
        ++run;
    }, 1000, 10};

    osmium::builder::add_node(cb.buffer(), _id(1));
    REQUIRE(cb.buffer().committed() > 10);
    cb.possibly_flush();
    osmium::builder::add_node(cb.buffer(), _id(2));
    REQUIRE(cb.buffer().committed() > 10);
    cb.possibly_flush();
    osmium::builder::add_node(cb.buffer(), _id(3));
    REQUIRE(cb.buffer().committed() > 10);
    cb.possibly_flush();

    REQUIRE(run == 3);
    REQUIRE(std::distance(cb.buffer().begin(), cb.buffer().end()) == 0);
}

TEST_CASE("Callback buffer with callback triggering sometimes") {
    int run = 0;

    osmium::memory::CallbackBuffer cb{[&](osmium::memory::Buffer&& buffer){
        REQUIRE(buffer.committed() > 0);
        ++run;
    }, 1000, 100};

    osmium::builder::add_node(cb.buffer(), _id(1));
    REQUIRE(cb.buffer().committed() < 100);
    cb.possibly_flush();
    osmium::builder::add_node(cb.buffer(), _id(2));
    cb.possibly_flush();
    osmium::builder::add_node(cb.buffer(), _id(3));
    cb.possibly_flush();

    REQUIRE(run < 3);
}

TEST_CASE("Callback buffer with callback set later") {
    int run = 0;

    osmium::memory::CallbackBuffer cb{1000, 10};

    osmium::builder::add_node(cb.buffer(), _id(1));
    cb.possibly_flush();
    osmium::builder::add_node(cb.buffer(), _id(2));
    cb.possibly_flush();
    osmium::builder::add_node(cb.buffer(), _id(3));

    cb.set_callback([&](osmium::memory::Buffer&& buffer){
        REQUIRE(buffer.committed() > 0);
        REQUIRE(std::distance(buffer.begin(), buffer.end()) == 3);
        ++run;
    });

    REQUIRE(std::distance(cb.buffer().begin(), cb.buffer().end()) == 3);

    cb.possibly_flush();

    REQUIRE(std::distance(cb.buffer().begin(), cb.buffer().end()) == 0);

    REQUIRE(run == 1);
}