]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/beast/test/beast/websocket/utf8_checker.cpp
2 // Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
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)
7 // Official repository: https://github.com/boostorg/beast
10 // Test that header file is self-contained.
11 #include <boost/beast/websocket/detail/utf8_checker.hpp>
13 #include <boost/beast/core/buffers_suffix.hpp>
14 #include <boost/beast/core/multi_buffer.hpp>
15 #include <boost/beast/unit_test/suite.hpp>
23 class utf8_checker_test
: public beast::unit_test::suite
29 // valid single-char code points
30 for(unsigned char c
= 0; c
< 128; ++c
)
33 BEAST_EXPECT(u
.write(&c
, 1));
34 BEAST_EXPECT(u
.finish());
38 for(unsigned char c
= 128; c
< 192; ++c
)
41 BEAST_EXPECT(! u
.write(&c
, 1));
45 for(unsigned char c
= 192; c
< 224; ++c
)
50 BEAST_EXPECT(! u
.write(&c
, 1));
53 BEAST_EXPECT(u
.write(&c
, 1));
54 BEAST_EXPECT(! u
.finish());
58 // three byte sequences
59 for(unsigned char c
= 224; c
< 240; ++c
)
64 BEAST_EXPECT(! u
.write(&c
, 1));
67 BEAST_EXPECT(u
.write(&c
, 1));
68 BEAST_EXPECT(! u
.finish());
72 // four byte sequences
73 for(unsigned char c
= 240; c
< 245; ++c
)
78 BEAST_EXPECT(! u
.write(&c
, 1));
81 BEAST_EXPECT(u
.write(&c
, 1));
82 BEAST_EXPECT(! u
.finish());
87 for(unsigned char c
= 245; c
; ++c
)
90 BEAST_EXPECT(! u
.write(&c
, 1));
100 BEAST_EXPECT(! u
.write(boost::asio::buffer("\xc1\xbf", 2)));
105 // First byte valid range 194-223
106 for(auto i
: {194, 223})
108 buf
[0] = static_cast<std::uint8_t>(i
);
110 // Second byte valid range 128-191
111 for(auto j
: {128, 191})
113 buf
[1] = static_cast<std::uint8_t>(j
);
114 BEAST_EXPECT(u
.write(buf
, 2));
115 BEAST_EXPECT(u
.finish());
118 // Second byte invalid range 0-127
119 for(auto j
: {0, 127})
121 buf
[1] = static_cast<std::uint8_t>(j
);
122 BEAST_EXPECT(! u
.write(buf
, 2));
126 // Second byte invalid range 192-255
127 for(auto j
: {192, 255})
129 buf
[1] = static_cast<std::uint8_t>(j
);
130 BEAST_EXPECT(! u
.write(buf
, 2));
134 // Segmented sequence second byte invalid
135 BEAST_EXPECT(u
.write(buf
, 1));
136 BEAST_EXPECT(! u
.write(&buf
[1], 1));
142 testThreeByteSequence()
146 BEAST_EXPECT(u
.write(boost::asio::buffer("\xef\xbf\xbf", 3)));
147 BEAST_EXPECT(u
.finish());
151 // First byte valid range 224-239
152 for(auto i
: {224, 239})
154 buf
[0] = static_cast<std::uint8_t>(i
);
156 // Second byte valid range 128-191 or 160-191 or 128-159
157 std::int32_t const b
= (i
== 224 ? 160 : 128);
158 std::int32_t const e
= (i
== 237 ? 159 : 191);
161 buf
[1] = static_cast<std::uint8_t>(j
);
163 // Third byte valid range 128-191
164 for(auto k
: {128, 191})
166 buf
[2] = static_cast<std::uint8_t>(k
);
167 BEAST_EXPECT(u
.write(buf
, 3));
168 BEAST_EXPECT(u
.finish());
169 // Segmented sequence
171 BEAST_EXPECT(! u
.write(buf
, 1));
174 BEAST_EXPECT(u
.write(buf
, 1));
175 BEAST_EXPECT(u
.write(&buf
[1], 2));
178 // Segmented sequence
179 BEAST_EXPECT(u
.write(buf
, 2));
180 BEAST_EXPECT(u
.write(&buf
[2], 1));
185 // Second byte invalid range 0-159
186 for (auto l
: {0, 159})
188 buf
[1] = static_cast<std::uint8_t>(l
);
189 BEAST_EXPECT(! u
.write(buf
, 3));
191 // Segmented sequence second byte invalid
192 BEAST_EXPECT(!u
.write(buf
, 2));
195 // Second byte invalid range 192-255
196 for(auto l
: {192, 255})
198 buf
[1] = static_cast<std::uint8_t>(l
);
199 BEAST_EXPECT(! u
.write(buf
, 3));
201 // Segmented sequence second byte invalid
202 BEAST_EXPECT(!u
.write(buf
, 2));
205 buf
[1] = static_cast<std::uint8_t>(j
);
209 // Second byte invalid range 0-127
210 for(auto l
: {0, 127})
212 buf
[1] = static_cast<std::uint8_t>(l
);
213 BEAST_EXPECT(! u
.write(buf
, 3));
215 // Segmented sequence second byte invalid
216 BEAST_EXPECT(!u
.write(buf
, 2));
220 // Second byte invalid range 160-255
221 for(auto l
: {160, 255})
223 buf
[1] = static_cast<std::uint8_t>(l
);
224 BEAST_EXPECT(! u
.write(buf
, 3));
226 // Segmented sequence second byte invalid
227 BEAST_EXPECT(! u
.write(buf
, 2));
230 buf
[1] = static_cast<std::uint8_t>(j
);
234 // Third byte invalid range 0-127
235 for(auto k
: {0, 127})
237 buf
[2] = static_cast<std::uint8_t>(k
);
238 BEAST_EXPECT(! u
.write(buf
, 3));
242 // Third byte invalid range 192-255
243 for(auto k
: {192, 255})
245 buf
[2] = static_cast<std::uint8_t>(k
);
246 BEAST_EXPECT(! u
.write(buf
, 3));
250 // Segmented sequence third byte invalid
251 BEAST_EXPECT(u
.write(buf
, 2));
252 BEAST_EXPECT(! u
.write(&buf
[2], 1));
256 // Second byte invalid range 0-127 or 0-159
257 for(auto j
: {0, b
- 1})
259 buf
[1] = static_cast<std::uint8_t>(j
);
260 BEAST_EXPECT(! u
.write(buf
, 3));
264 // Second byte invalid range 160-255 or 192-255
265 for(auto j
: {e
+ 1, 255})
267 buf
[1] = static_cast<std::uint8_t>(j
);
268 BEAST_EXPECT(! u
.write(buf
, 3));
272 // Segmented sequence second byte invalid
274 BEAST_EXPECT(! u
.write(buf
, 1));
277 BEAST_EXPECT(u
.write(buf
, 1));
278 BEAST_EXPECT(!u
.write(&buf
[1], 1));
285 testFourByteSequence()
287 using boost::asio::const_buffer
;
290 // First byte valid range 240-244
291 for(auto i
: {240, 244})
293 buf
[0] = static_cast<std::uint8_t>(i
);
295 std::int32_t const b
= (i
== 240 ? 144 : 128);
296 std::int32_t const e
= (i
== 244 ? 143 : 191);
297 for(auto j
= b
; j
<= e
; ++j
)
299 buf
[1] = static_cast<std::uint8_t>(j
);
301 // Second byte valid range 144-191 or 128-191 or 128-143
302 for(auto k
: {128, 191})
304 buf
[2] = static_cast<std::uint8_t>(k
);
306 // Third byte valid range 128-191
307 for(auto n
: {128, 191})
309 // Fourth byte valid range 128-191
310 buf
[3] = static_cast<std::uint8_t>(n
);
311 BEAST_EXPECT(u
.write(buf
, 4));
312 BEAST_EXPECT(u
.finish());
313 // Segmented sequence
315 BEAST_EXPECT(! u
.write(buf
, 1));
318 BEAST_EXPECT(u
.write(buf
, 1));
319 BEAST_EXPECT(u
.write(&buf
[1], 3));
322 // Segmented sequence
323 BEAST_EXPECT(u
.write(buf
, 2));
324 BEAST_EXPECT(u
.write(&buf
[2], 2));
326 // Segmented sequence
327 BEAST_EXPECT(u
.write(buf
, 3));
328 BEAST_EXPECT(u
.write(&buf
[3], 1));
333 // Second byte invalid range 0-143
334 for(auto r
: {0, 143})
336 buf
[1] = static_cast<std::uint8_t>(r
);
337 BEAST_EXPECT(! u
.write(buf
, 4));
339 // Segmented sequence second byte invalid
340 BEAST_EXPECT(! u
.write(buf
, 2));
344 // Second byte invalid range 192-255
345 for(auto r
: {192, 255})
347 buf
[1] = static_cast<std::uint8_t>(r
);
348 BEAST_EXPECT(! u
.write(buf
, 4));
350 // Segmented sequence second byte invalid
351 BEAST_EXPECT(!u
.write(buf
, 2));
354 buf
[1] = static_cast<std::uint8_t>(j
);
358 // Second byte invalid range 0-127
359 for(auto r
: {0, 127})
361 buf
[1] = static_cast<std::uint8_t>(r
);
362 BEAST_EXPECT(! u
.write(buf
, 4));
364 // Segmented sequence second byte invalid
365 BEAST_EXPECT(! u
.write(buf
, 2));
368 // Second byte invalid range 144-255
369 for(auto r
: {144, 255})
371 buf
[1] = static_cast<std::uint8_t>(r
);
372 BEAST_EXPECT(! u
.write(buf
, 4));
374 // Segmented sequence second byte invalid
375 BEAST_EXPECT(! u
.write(buf
, 2));
378 buf
[1] = static_cast<std::uint8_t>(j
);
382 // Fourth byte invalid ranges 0-127, 192-255
383 for(auto r
: {0, 127, 192, 255})
385 buf
[3] = static_cast<std::uint8_t>(r
);
386 BEAST_EXPECT(! u
.write(buf
, 4));
390 // Segmented sequence fourth byte invalid
391 BEAST_EXPECT(u
.write(buf
, 3));
392 BEAST_EXPECT(! u
.write(&buf
[3], 1));
396 // Third byte invalid ranges 0-127, 192-255
397 for(auto r
: {0, 127, 192, 255})
399 buf
[2] = static_cast<std::uint8_t>(r
);
400 BEAST_EXPECT(! u
.write(buf
, 4));
404 // Segmented sequence third byte invalid
405 BEAST_EXPECT(u
.write(buf
, 2));
406 BEAST_EXPECT(! u
.write(&buf
[2], 1));
410 // Second byte invalid range 0-127 or 0-143
411 for(auto r
: {0, b
- 1})
413 buf
[1] = static_cast<std::uint8_t>(r
);
414 BEAST_EXPECT(! u
.write(buf
, 4));
418 // Second byte invalid range 144-255 or 192-255
419 for(auto r
: {e
+ 1, 255})
421 buf
[1] = static_cast<std::uint8_t>(r
);
422 BEAST_EXPECT(! u
.write(buf
, 4));
426 // Segmented sequence second byte invalid
428 BEAST_EXPECT(! u
.write(buf
, 1));
431 BEAST_EXPECT(u
.write(buf
, 1));
432 BEAST_EXPECT(! u
.write(&buf
[1], 1));
437 // First byte invalid range 245-255
438 for(auto r
: {245, 255})
440 buf
[0] = static_cast<std::uint8_t>(r
);
441 BEAST_EXPECT(! u
.write(buf
, 4));
447 testWithStreamBuffer()
450 // Valid UTF8 encoded text
451 std::vector
<std::vector
<std::uint8_t>> const data
{{
452 0x48,0x65,0x69,0x7A,0xC3,0xB6,0x6C,0x72,0xC3,0xBC,0x63,0x6B,
453 0x73,0x74,0x6F,0xC3,0x9F,0x61,0x62,0x64,0xC3,0xA4,0x6D,0x70,
456 0xCE,0x93,0xCE,0xB1,0xCE,0xB6,0xCE,0xAD,0xCE,0xB5,0xCF,0x82,
457 0x20,0xCE,0xBA,0xCE,0xB1,0xE1,0xBD,0xB6,0x20,0xCE,0xBC,0xCF,
458 0x85,0xCF,0x81,0xCF,0x84,0xCE,0xB9,0xE1,0xBD,0xB2,0xCF,0x82,
459 0x20,0xCE,0xB4,0xE1,0xBD,0xB2,0xCE,0xBD,0x20,0xCE,0xB8,0xE1,
460 0xBD,0xB0,0x20,0xCE,0xB2,0xCF,0x81,0xE1,0xBF,0xB6,0x20,0xCF,
461 0x80,0xCE,0xB9,0xE1,0xBD,0xB0,0x20,0xCF,0x83,0xCF,0x84,0xE1,
462 0xBD,0xB8,0x20,0xCF,0x87,0xCF,0x81,0xCF,0x85,0xCF,0x83,0xCE,
463 0xB1,0xCF,0x86,0xE1,0xBD,0xB6,0x20,0xCE,0xBE,0xCE,0xAD,0xCF,
464 0x86,0xCF,0x89,0xCF,0x84,0xCE,0xBF
466 0xC3,0x81,0x72,0x76,0xC3,0xAD,0x7A,0x74,0xC5,0xB1,0x72,0xC5,
467 0x91,0x20,0x74,0xC3,0xBC,0x6B,0xC3,0xB6,0x72,0x66,0xC3,0xBA,
468 0x72,0xC3,0xB3,0x67,0xC3,0xA9,0x70
474 for(auto const& s
: data
)
476 static std::size_t constexpr size
= 3;
477 std::size_t n
= s
.size();
479 boost::asio::const_buffer
> cb
{
480 boost::asio::const_buffer(s
.data(), n
)};
484 auto const amount
= (std::min
)(n
, size
);
485 b
.commit(boost::asio::buffer_copy(
486 b
.prepare(amount
), cb
));
490 BEAST_EXPECT(u
.write(b
.data()));
491 BEAST_EXPECT(u
.finish());
499 // switch to slow loop from alignment loop
502 for(unsigned i
= 0; i
< sizeof(buf
); i
+= 2)
507 auto p
= reinterpret_cast<char const*>(sizeof(std::size_t) * (
508 (std::uintptr_t(buf
) + sizeof(std::size_t) - 1) /
509 sizeof(std::size_t))) + 2;
511 BEAST_EXPECT(u
.write(
512 reinterpret_cast<std::uint8_t const*>(p
),
513 sizeof(buf
)-(p
-buf
)));
514 BEAST_EXPECT(u
.finish());
517 // invalid code point in the last dword of a fast run
520 auto p
= reinterpret_cast<char*>(sizeof(std::size_t) * (
521 (std::uintptr_t(buf
) + sizeof(std::size_t) - 1) /
522 sizeof(std::size_t)));
523 BOOST_ASSERT(p
+ 12 <= buf
+ sizeof(buf
));
525 *p
++ = '*'; *p
++ = '*'; *p
++ = '*'; *p
++ = '*';
526 *p
++ = '*'; *p
++ = '*'; *p
++ = '*'; *p
++ = '*';
527 p
[0] = '\x80'; // invalid
532 BEAST_EXPECT(! u
.write(reinterpret_cast<
533 std::uint8_t const*>(in
), 12));
540 testOneByteSequence();
541 testTwoByteSequence();
542 testThreeByteSequence();
543 testFourByteSequence();
544 testWithStreamBuffer();
549 BEAST_DEFINE_TESTSUITE(beast
,websocket
,utf8_checker
);