]>
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/prepare_buffers.hpp> | |
10 | ||
11 | #include <beast/core/consuming_buffers.hpp> | |
12 | #include <beast/unit_test/suite.hpp> | |
13 | #include <boost/asio/buffer.hpp> | |
14 | #include <string> | |
15 | ||
16 | namespace beast { | |
17 | ||
18 | class prepare_buffers_test : public beast::unit_test::suite | |
19 | { | |
20 | public: | |
21 | template<class ConstBufferSequence> | |
22 | static | |
23 | std::size_t | |
24 | bsize1(ConstBufferSequence const& bs) | |
25 | { | |
26 | using boost::asio::buffer_size; | |
27 | std::size_t n = 0; | |
28 | for(auto it = bs.begin(); it != bs.end(); ++it) | |
29 | n += buffer_size(*it); | |
30 | return n; | |
31 | } | |
32 | ||
33 | template<class ConstBufferSequence> | |
34 | static | |
35 | std::size_t | |
36 | bsize2(ConstBufferSequence const& bs) | |
37 | { | |
38 | using boost::asio::buffer_size; | |
39 | std::size_t n = 0; | |
40 | for(auto it = bs.begin(); it != bs.end(); it++) | |
41 | n += buffer_size(*it); | |
42 | return n; | |
43 | } | |
44 | ||
45 | template<class ConstBufferSequence> | |
46 | static | |
47 | std::size_t | |
48 | bsize3(ConstBufferSequence const& bs) | |
49 | { | |
50 | using boost::asio::buffer_size; | |
51 | std::size_t n = 0; | |
52 | for(auto it = bs.end(); it != bs.begin();) | |
53 | n += buffer_size(*--it); | |
54 | return n; | |
55 | } | |
56 | ||
57 | template<class ConstBufferSequence> | |
58 | static | |
59 | std::size_t | |
60 | bsize4(ConstBufferSequence const& bs) | |
61 | { | |
62 | using boost::asio::buffer_size; | |
63 | std::size_t n = 0; | |
64 | for(auto it = bs.end(); it != bs.begin();) | |
65 | { | |
66 | it--; | |
67 | n += buffer_size(*it); | |
68 | } | |
69 | return n; | |
70 | } | |
71 | ||
72 | template<class ConstBufferSequence> | |
73 | static | |
74 | std::string | |
75 | to_string(ConstBufferSequence const& bs) | |
76 | { | |
77 | using boost::asio::buffer_cast; | |
78 | using boost::asio::buffer_size; | |
79 | std::string s; | |
80 | s.reserve(buffer_size(bs)); | |
81 | for(auto const& b : bs) | |
82 | s.append(buffer_cast<char const*>(b), | |
83 | buffer_size(b)); | |
84 | return s; | |
85 | } | |
86 | ||
87 | template<class BufferType> | |
88 | void testMatrix() | |
89 | { | |
90 | using boost::asio::buffer_size; | |
91 | std::string s = "Hello, world"; | |
92 | BEAST_EXPECT(s.size() == 12); | |
93 | for(std::size_t x = 1; x < 4; ++x) { | |
94 | for(std::size_t y = 1; y < 4; ++y) { | |
95 | std::size_t z = s.size() - (x + y); | |
96 | { | |
97 | std::array<BufferType, 3> bs{{ | |
98 | BufferType{&s[0], x}, | |
99 | BufferType{&s[x], y}, | |
100 | BufferType{&s[x+y], z}}}; | |
101 | for(std::size_t i = 0; i <= s.size() + 1; ++i) | |
102 | { | |
103 | auto pb = prepare_buffers(i, bs); | |
104 | BEAST_EXPECT(to_string(pb) == s.substr(0, i)); | |
105 | auto pb2 = pb; | |
106 | BEAST_EXPECT(to_string(pb2) == to_string(pb)); | |
107 | pb = prepare_buffers(0, bs); | |
108 | pb2 = pb; | |
109 | BEAST_EXPECT(buffer_size(pb2) == 0); | |
110 | pb2 = prepare_buffers(i, bs); | |
111 | BEAST_EXPECT(to_string(pb2) == s.substr(0, i)); | |
112 | } | |
113 | } | |
114 | }} | |
115 | } | |
116 | ||
117 | void testNullBuffers() | |
118 | { | |
119 | using boost::asio::buffer_copy; | |
120 | using boost::asio::buffer_size; | |
121 | using boost::asio::null_buffers; | |
122 | auto pb0 = prepare_buffers(0, null_buffers{}); | |
123 | BEAST_EXPECT(buffer_size(pb0) == 0); | |
124 | auto pb1 = prepare_buffers(1, null_buffers{}); | |
125 | BEAST_EXPECT(buffer_size(pb1) == 0); | |
126 | BEAST_EXPECT(buffer_copy(pb0, pb1) == 0); | |
127 | ||
128 | using pb_type = decltype(pb0); | |
129 | consuming_buffers<pb_type> cb(pb0); | |
130 | BEAST_EXPECT(buffer_size(cb) == 0); | |
131 | BEAST_EXPECT(buffer_copy(cb, pb1) == 0); | |
132 | cb.consume(1); | |
133 | BEAST_EXPECT(buffer_size(cb) == 0); | |
134 | BEAST_EXPECT(buffer_copy(cb, pb1) == 0); | |
135 | ||
136 | auto pbc = prepare_buffers(2, cb); | |
137 | BEAST_EXPECT(buffer_size(pbc) == 0); | |
138 | BEAST_EXPECT(buffer_copy(pbc, cb) == 0); | |
139 | } | |
140 | ||
141 | void testIterator() | |
142 | { | |
143 | using boost::asio::buffer_size; | |
144 | using boost::asio::const_buffer; | |
145 | char b[3]; | |
146 | std::array<const_buffer, 3> bs{{ | |
147 | const_buffer{&b[0], 1}, | |
148 | const_buffer{&b[1], 1}, | |
149 | const_buffer{&b[2], 1}}}; | |
150 | auto pb = prepare_buffers(2, bs); | |
151 | BEAST_EXPECT(bsize1(pb) == 2); | |
152 | BEAST_EXPECT(bsize2(pb) == 2); | |
153 | BEAST_EXPECT(bsize3(pb) == 2); | |
154 | BEAST_EXPECT(bsize4(pb) == 2); | |
155 | std::size_t n = 0; | |
156 | for(auto it = pb.end(); it != pb.begin(); --it) | |
157 | { | |
158 | decltype(pb)::const_iterator it2(std::move(it)); | |
159 | BEAST_EXPECT(buffer_size(*it2) == 1); | |
160 | it = std::move(it2); | |
161 | ++n; | |
162 | } | |
163 | BEAST_EXPECT(n == 2); | |
164 | } | |
165 | ||
166 | void run() override | |
167 | { | |
168 | testMatrix<boost::asio::const_buffer>(); | |
169 | testMatrix<boost::asio::mutable_buffer>(); | |
170 | testNullBuffers(); | |
171 | testIterator(); | |
172 | } | |
173 | }; | |
174 | ||
175 | BEAST_DEFINE_TESTSUITE(prepare_buffers,core,beast); | |
176 | ||
177 | } // beast |