File: test_writer_with_mock_encoder.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 (106 lines) | stat: -rw-r--r-- 3,141 bytes parent folder | download | duplicates (6)
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
102
103
104
105
106
#include "catch.hpp"

#include "utils.hpp"

#include <osmium/io/compression.hpp>
#include <osmium/io/detail/output_format.hpp>
#include <osmium/io/detail/queue_util.hpp>
#include <osmium/io/writer.hpp>
#include <osmium/io/xml_input.hpp>

#include <stdexcept>
#include <string>
#include <utility>

class MockOutputFormat : public osmium::io::detail::OutputFormat {

    std::string m_fail_in;

public:

    MockOutputFormat(osmium::thread::Pool& pool, const osmium::io::File& /*file*/, osmium::io::detail::future_string_queue_type& output_queue, std::string fail_in) :
        OutputFormat(pool, output_queue),
        m_fail_in(std::move(fail_in)) {
    }

    void write_header(const osmium::io::Header& /*header*/) final {
        if (m_fail_in == "header") {
            throw std::logic_error{"header"};
        }
        send_to_output_queue(std::string{"header"});
    }

    void write_buffer(osmium::memory::Buffer&& /*buffer*/) final {
        if (m_fail_in == "write") {
            throw std::logic_error{"write"};
        }
        send_to_output_queue(std::string{"write"});
    }

    void write_end() final {
        if (m_fail_in == "write_end") {
            throw std::logic_error{"write_end"};
        }
        send_to_output_queue(std::string{"end"});
    }

}; // class MockOutputFormat

TEST_CASE("Test Writer with MockOutputFormat") {

    std::string fail_in;

    osmium::io::detail::OutputFormatFactory::instance().register_output_format(
        osmium::io::file_format::xml,
        [&](osmium::thread::Pool& pool, const osmium::io::File& file, osmium::io::detail::future_string_queue_type& output_queue) {
            return new MockOutputFormat{pool, file, output_queue, fail_in};
    });

    osmium::io::Header header;
    header.set("generator", "test_writer_with_mock_encoder.cpp");

    osmium::io::Reader reader{with_data_dir("t/io/data.osm")};
    osmium::memory::Buffer buffer = reader.read();
    REQUIRE(buffer);
    REQUIRE(buffer.committed() > 0);
    REQUIRE_FALSE(buffer.select<osmium::OSMObject>().empty());
    REQUIRE(buffer.select<osmium::OSMObject>().size() > 0); // NOLINT(readability-container-size-empty)

    SECTION("error in header") {

        fail_in = "header";

        REQUIRE_THROWS_AS([&](){
            osmium::io::Writer writer("test-writer-mock-fail-on-construction.osm", header, osmium::io::overwrite::allow);
            writer(std::move(buffer));
            writer.close();
        }(), std::logic_error);

    }

    SECTION("error in write") {

        fail_in = "write";

        REQUIRE_THROWS_AS([&](){
            osmium::io::Writer writer("test-writer-mock-fail-on-construction.osm", header, osmium::io::overwrite::allow);
            writer(std::move(buffer));
            writer.close();
        }(), std::logic_error);

    }

    SECTION("error in write_end") {

        fail_in = "write_end";

        REQUIRE_THROWS_AS([&](){
            osmium::io::Writer writer("test-writer-mock-fail-on-construction.osm", header, osmium::io::overwrite::allow);
            writer(std::move(buffer));
            writer.close();
        }(), std::logic_error);

    }

}