]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // |
2 | // Copyright (c) 2013-2017 Vinnie Falco (vinnie dot falco at gmail dot com) | |
3 | // | |
4 | // Distributed under the Boost Software License, Version 1.0. (See accompanying | |
5 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
6 | // | |
7 | ||
8 | // Test that header file is self-contained. | |
9 | #include <beast/core/consuming_buffers.hpp> | |
10 | ||
11 | #include "buffer_test.hpp" | |
12 | #include <beast/core/to_string.hpp> | |
13 | #include <beast/unit_test/suite.hpp> | |
14 | #include <boost/asio/buffer.hpp> | |
15 | #include <string> | |
16 | ||
17 | namespace beast { | |
18 | ||
19 | class consuming_buffers_test : public beast::unit_test::suite | |
20 | { | |
21 | public: | |
22 | template<class BufferSequence> | |
23 | static | |
24 | consuming_buffers<BufferSequence> | |
25 | consumed_buffers(BufferSequence const& bs, std::size_t n) | |
26 | { | |
27 | consuming_buffers<BufferSequence> cb(bs); | |
28 | cb.consume(n); | |
29 | return cb; | |
30 | } | |
31 | ||
32 | template<class Buffers1, class Buffers2> | |
33 | static | |
34 | bool | |
35 | eq(Buffers1 const& lhs, Buffers2 const& rhs) | |
36 | { | |
37 | return to_string(lhs) == to_string(rhs); | |
38 | } | |
39 | ||
40 | template<class ConstBufferSequence> | |
41 | void | |
42 | expect_size(std::size_t n, ConstBufferSequence const& buffers) | |
43 | { | |
44 | BEAST_EXPECT(test::size_pre(buffers) == n); | |
45 | BEAST_EXPECT(test::size_post(buffers) == n); | |
46 | BEAST_EXPECT(test::size_rev_pre(buffers) == n); | |
47 | BEAST_EXPECT(test::size_rev_post(buffers) == n); | |
48 | } | |
49 | ||
50 | void testMatrix() | |
51 | { | |
52 | using boost::asio::buffer; | |
53 | using boost::asio::const_buffer; | |
54 | char buf[12]; | |
55 | std::string const s = "Hello, world"; | |
56 | BEAST_EXPECT(s.size() == sizeof(buf)); | |
57 | buffer_copy(buffer(buf), buffer(s)); | |
58 | BEAST_EXPECT(to_string(buffer(buf)) == s); | |
59 | for(std::size_t i = 1; i < 4; ++i) { | |
60 | for(std::size_t j = 1; j < 4; ++j) { | |
61 | for(std::size_t x = 1; x < 4; ++x) { | |
62 | for(std::size_t y = 1; y < 4; ++y) { | |
63 | std::size_t k = sizeof(buf) - (i + j); | |
64 | std::size_t z = sizeof(buf) - (x + y); | |
65 | { | |
66 | std::array<const_buffer, 3> bs{{ | |
67 | const_buffer{&buf[0], i}, | |
68 | const_buffer{&buf[i], j}, | |
69 | const_buffer{&buf[i+j], k}}}; | |
70 | consuming_buffers<decltype(bs)> cb(bs); | |
71 | BEAST_EXPECT(to_string(cb) == s); | |
72 | expect_size(s.size(), cb); | |
73 | cb.consume(0); | |
74 | BEAST_EXPECT(eq(cb, consumed_buffers(bs, 0))); | |
75 | BEAST_EXPECT(to_string(cb) == s); | |
76 | expect_size(s.size(), cb); | |
77 | cb.consume(x); | |
78 | BEAST_EXPECT(to_string(cb) == s.substr(x)); | |
79 | BEAST_EXPECT(eq(cb, consumed_buffers(bs, x))); | |
80 | cb.consume(y); | |
81 | BEAST_EXPECT(to_string(cb) == s.substr(x+y)); | |
82 | BEAST_EXPECT(eq(cb, consumed_buffers(bs, x+y))); | |
83 | cb.consume(z); | |
84 | BEAST_EXPECT(to_string(cb) == ""); | |
85 | BEAST_EXPECT(eq(cb, consumed_buffers(bs, x+y+z))); | |
86 | cb.consume(1); | |
87 | BEAST_EXPECT(to_string(cb) == ""); | |
88 | BEAST_EXPECT(eq(cb, consumed_buffers(bs, x+y+z))); | |
89 | } | |
90 | }}}} | |
91 | } | |
92 | ||
93 | void testNullBuffers() | |
94 | { | |
95 | using boost::asio::buffer_copy; | |
96 | using boost::asio::buffer_size; | |
97 | using boost::asio::null_buffers; | |
98 | consuming_buffers<null_buffers> cb( | |
99 | null_buffers{}); | |
100 | BEAST_EXPECT(buffer_size(cb) == 0); | |
101 | consuming_buffers<null_buffers> cb2( | |
102 | null_buffers{}); | |
103 | BEAST_EXPECT(buffer_copy(cb2, cb) == 0); | |
104 | } | |
105 | ||
106 | void testIterator() | |
107 | { | |
108 | using boost::asio::const_buffer; | |
109 | std::array<const_buffer, 3> ba; | |
110 | consuming_buffers<decltype(ba)> cb(ba); | |
111 | std::size_t n = 0; | |
112 | for(auto it = cb.end(); it != cb.begin(); --it) | |
113 | ++n; | |
114 | BEAST_EXPECT(n == 3); | |
115 | } | |
116 | ||
117 | void run() override | |
118 | { | |
119 | testMatrix(); | |
120 | testNullBuffers(); | |
121 | testIterator(); | |
122 | } | |
123 | }; | |
124 | ||
125 | BEAST_DEFINE_TESTSUITE(consuming_buffers,core,beast); | |
126 | ||
127 | } // beast |