]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/beast/test/beast/websocket/utf8_checker.cpp
2 // Copyright (c) 2016-2019 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/_experimental/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
)
62 BEAST_EXPECT(u
.write(&c
, 1));
63 BEAST_EXPECT(! u
.finish());
66 // four byte sequences
67 for(unsigned char c
= 240; c
< 245; ++c
)
71 BEAST_EXPECT(u
.write(&c
, 1));
72 BEAST_EXPECT(! u
.finish());
76 for(unsigned char c
= 245; c
; ++c
)
79 BEAST_EXPECT(! u
.write(&c
, 1));
89 BEAST_EXPECT(! u
.write(net::buffer("\xc1\xbf", 2)));
94 // First byte valid range 194-223
95 for(auto i
: {194, 223})
97 buf
[0] = static_cast<std::uint8_t>(i
);
99 // Second byte valid range 128-191
100 for(auto j
: {128, 191})
102 buf
[1] = static_cast<std::uint8_t>(j
);
103 BEAST_EXPECT(u
.write(buf
, 2));
104 BEAST_EXPECT(u
.finish());
107 // Second byte invalid range 0-127
108 for(auto j
: {0, 127})
110 buf
[1] = static_cast<std::uint8_t>(j
);
111 BEAST_EXPECT(! u
.write(buf
, 2));
115 // Second byte invalid range 192-255
116 for(auto j
: {192, 255})
118 buf
[1] = static_cast<std::uint8_t>(j
);
119 BEAST_EXPECT(! u
.write(buf
, 2));
123 // Segmented sequence second byte invalid
124 BEAST_EXPECT(u
.write(buf
, 1));
125 BEAST_EXPECT(! u
.write(&buf
[1], 1));
131 testThreeByteSequence()
135 BEAST_EXPECT(u
.write(net::buffer("\xef\xbf\xbf", 3)));
136 BEAST_EXPECT(u
.finish());
140 // First byte valid range 224-239
141 for(auto i
: {224, 239})
143 buf
[0] = static_cast<std::uint8_t>(i
);
145 // Second byte valid range 128-191 or 160-191 or 128-159
146 std::int32_t const b
= (i
== 224 ? 160 : 128);
147 std::int32_t const e
= (i
== 237 ? 159 : 191);
150 buf
[1] = static_cast<std::uint8_t>(j
);
152 // Third byte valid range 128-191
153 for(auto k
: {128, 191})
155 buf
[2] = static_cast<std::uint8_t>(k
);
156 BEAST_EXPECT(u
.write(buf
, 3));
157 BEAST_EXPECT(u
.finish());
158 // Segmented sequence
161 BEAST_EXPECT(u
.write(buf
, 1));
162 BEAST_EXPECT(!u
.finish());
166 BEAST_EXPECT(u
.write(buf
, 1));
167 BEAST_EXPECT(u
.write(&buf
[1], 2));
170 // Segmented sequence
171 BEAST_EXPECT(u
.write(buf
, 2));
172 BEAST_EXPECT(u
.write(&buf
[2], 1));
177 // Second byte invalid range 0-159
178 for (auto l
: {0, 159})
180 buf
[1] = static_cast<std::uint8_t>(l
);
181 BEAST_EXPECT(! u
.write(buf
, 3));
183 // Segmented sequence second byte invalid
184 BEAST_EXPECT(!u
.write(buf
, 2));
187 // Second byte invalid range 192-255
188 for(auto l
: {192, 255})
190 buf
[1] = static_cast<std::uint8_t>(l
);
191 BEAST_EXPECT(! u
.write(buf
, 3));
193 // Segmented sequence second byte invalid
194 BEAST_EXPECT(!u
.write(buf
, 2));
197 buf
[1] = static_cast<std::uint8_t>(j
);
201 // Second byte invalid range 0-127
202 for(auto l
: {0, 127})
204 buf
[1] = static_cast<std::uint8_t>(l
);
205 BEAST_EXPECT(! u
.write(buf
, 3));
207 // Segmented sequence second byte invalid
208 BEAST_EXPECT(!u
.write(buf
, 2));
212 // Second byte invalid range 160-255
213 for(auto l
: {160, 255})
215 buf
[1] = static_cast<std::uint8_t>(l
);
216 BEAST_EXPECT(! u
.write(buf
, 3));
218 // Segmented sequence second byte invalid
219 BEAST_EXPECT(! u
.write(buf
, 2));
222 buf
[1] = static_cast<std::uint8_t>(j
);
226 // Third byte invalid range 0-127
227 for(auto k
: {0, 127})
229 buf
[2] = static_cast<std::uint8_t>(k
);
230 BEAST_EXPECT(! u
.write(buf
, 3));
234 // Third byte invalid range 192-255
235 for(auto k
: {192, 255})
237 buf
[2] = static_cast<std::uint8_t>(k
);
238 BEAST_EXPECT(! u
.write(buf
, 3));
242 // Segmented sequence third byte invalid
243 BEAST_EXPECT(u
.write(buf
, 2));
244 BEAST_EXPECT(! u
.write(&buf
[2], 1));
248 // Second byte invalid range 0-127 or 0-159
249 for(auto j
: {0, b
- 1})
251 buf
[1] = static_cast<std::uint8_t>(j
);
252 BEAST_EXPECT(! u
.write(buf
, 3));
256 // Second byte invalid range 160-255 or 192-255
257 for(auto j
: {e
+ 1, 255})
259 buf
[1] = static_cast<std::uint8_t>(j
);
260 BEAST_EXPECT(! u
.write(buf
, 3));
264 // Segmented sequence second byte invalid
266 BEAST_EXPECT(u
.write(buf
, 1));
267 BEAST_EXPECT(!u
.finish());
271 BEAST_EXPECT(u
.write(buf
, 1));
272 BEAST_EXPECT(!u
.write(&buf
[1], 1));
279 testFourByteSequence()
281 using net::const_buffer
;
284 // First byte valid range 240-244
285 for(auto i
: {240, 244})
287 buf
[0] = static_cast<std::uint8_t>(i
);
289 std::int32_t const b
= (i
== 240 ? 144 : 128);
290 std::int32_t const e
= (i
== 244 ? 143 : 191);
291 for(auto j
= b
; j
<= e
; ++j
)
293 buf
[1] = static_cast<std::uint8_t>(j
);
295 // Second byte valid range 144-191 or 128-191 or 128-143
296 for(auto k
: {128, 191})
298 buf
[2] = static_cast<std::uint8_t>(k
);
300 // Third byte valid range 128-191
301 for(auto n
: {128, 191})
303 // Fourth byte valid range 128-191
304 buf
[3] = static_cast<std::uint8_t>(n
);
305 BEAST_EXPECT(u
.write(buf
, 4));
306 BEAST_EXPECT(u
.finish());
307 // Segmented sequence
308 BEAST_EXPECT(u
.write(buf
, 1));
309 BEAST_EXPECT(u
.write(&buf
[1], 3));
311 // Segmented sequence
312 BEAST_EXPECT(u
.write(buf
, 2));
313 BEAST_EXPECT(u
.write(&buf
[2], 2));
315 // Segmented sequence
316 BEAST_EXPECT(u
.write(buf
, 3));
317 BEAST_EXPECT(u
.write(&buf
[3], 1));
322 // Second byte invalid range 0-143
323 for(auto r
: {0, 143})
325 buf
[1] = static_cast<std::uint8_t>(r
);
326 BEAST_EXPECT(! u
.write(buf
, 4));
328 // Segmented sequence second byte invalid
329 BEAST_EXPECT(! u
.write(buf
, 2));
333 // Second byte invalid range 192-255
334 for(auto r
: {192, 255})
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));
343 buf
[1] = static_cast<std::uint8_t>(j
);
347 // Second byte invalid range 0-127
348 for(auto r
: {0, 127})
350 buf
[1] = static_cast<std::uint8_t>(r
);
351 BEAST_EXPECT(! u
.write(buf
, 4));
353 // Segmented sequence second byte invalid
354 BEAST_EXPECT(! u
.write(buf
, 2));
357 // Second byte invalid range 144-255
358 for(auto r
: {144, 255})
360 buf
[1] = static_cast<std::uint8_t>(r
);
361 BEAST_EXPECT(! u
.write(buf
, 4));
363 // Segmented sequence second byte invalid
364 BEAST_EXPECT(! u
.write(buf
, 2));
367 buf
[1] = static_cast<std::uint8_t>(j
);
371 // Fourth byte invalid ranges 0-127, 192-255
372 for(auto r
: {0, 127, 192, 255})
374 buf
[3] = static_cast<std::uint8_t>(r
);
375 BEAST_EXPECT(! u
.write(buf
, 4));
379 // Segmented sequence fourth byte invalid
380 BEAST_EXPECT(u
.write(buf
, 3));
381 BEAST_EXPECT(! u
.write(&buf
[3], 1));
385 // Third byte invalid ranges 0-127, 192-255
386 for(auto r
: {0, 127, 192, 255})
388 buf
[2] = static_cast<std::uint8_t>(r
);
389 BEAST_EXPECT(! u
.write(buf
, 4));
393 // Segmented sequence third byte invalid
394 BEAST_EXPECT(u
.write(buf
, 2));
395 BEAST_EXPECT(! u
.write(&buf
[2], 1));
399 // Second byte invalid range 0-127 or 0-143
400 for(auto r
: {0, b
- 1})
402 buf
[1] = static_cast<std::uint8_t>(r
);
403 BEAST_EXPECT(! u
.write(buf
, 4));
407 // Second byte invalid range 144-255 or 192-255
408 for(auto r
: {e
+ 1, 255})
410 buf
[1] = static_cast<std::uint8_t>(r
);
411 BEAST_EXPECT(! u
.write(buf
, 4));
415 // Segmented sequence second byte invalid
416 BEAST_EXPECT(u
.write(buf
, 1));
417 BEAST_EXPECT(! u
.write(&buf
[1], 1));
422 // First byte invalid range 245-255
423 for(auto r
: {245, 255})
425 buf
[0] = static_cast<std::uint8_t>(r
);
426 BEAST_EXPECT(! u
.write(buf
, 4));
432 testWithStreamBuffer()
435 // Valid UTF8 encoded text
436 std::vector
<std::vector
<std::uint8_t>> const data
{{
437 0x48,0x65,0x69,0x7A,0xC3,0xB6,0x6C,0x72,0xC3,0xBC,0x63,0x6B,
438 0x73,0x74,0x6F,0xC3,0x9F,0x61,0x62,0x64,0xC3,0xA4,0x6D,0x70,
441 0xCE,0x93,0xCE,0xB1,0xCE,0xB6,0xCE,0xAD,0xCE,0xB5,0xCF,0x82,
442 0x20,0xCE,0xBA,0xCE,0xB1,0xE1,0xBD,0xB6,0x20,0xCE,0xBC,0xCF,
443 0x85,0xCF,0x81,0xCF,0x84,0xCE,0xB9,0xE1,0xBD,0xB2,0xCF,0x82,
444 0x20,0xCE,0xB4,0xE1,0xBD,0xB2,0xCE,0xBD,0x20,0xCE,0xB8,0xE1,
445 0xBD,0xB0,0x20,0xCE,0xB2,0xCF,0x81,0xE1,0xBF,0xB6,0x20,0xCF,
446 0x80,0xCE,0xB9,0xE1,0xBD,0xB0,0x20,0xCF,0x83,0xCF,0x84,0xE1,
447 0xBD,0xB8,0x20,0xCF,0x87,0xCF,0x81,0xCF,0x85,0xCF,0x83,0xCE,
448 0xB1,0xCF,0x86,0xE1,0xBD,0xB6,0x20,0xCE,0xBE,0xCE,0xAD,0xCF,
449 0x86,0xCF,0x89,0xCF,0x84,0xCE,0xBF
451 0xC3,0x81,0x72,0x76,0xC3,0xAD,0x7A,0x74,0xC5,0xB1,0x72,0xC5,
452 0x91,0x20,0x74,0xC3,0xBC,0x6B,0xC3,0xB6,0x72,0x66,0xC3,0xBA,
453 0x72,0xC3,0xB3,0x67,0xC3,0xA9,0x70
459 for(auto const& s
: data
)
461 static std::size_t constexpr size
= 3;
462 std::size_t n
= s
.size();
464 net::const_buffer
> cb
{
465 net::const_buffer(s
.data(), n
)};
469 auto const amount
= (std::min
)(n
, size
);
470 b
.commit(net::buffer_copy(
471 b
.prepare(amount
), cb
));
475 BEAST_EXPECT(u
.write(b
.data()));
476 BEAST_EXPECT(u
.finish());
484 // switch to slow loop from alignment loop
487 for(unsigned i
= 0; i
< sizeof(buf
); i
+= 2)
492 auto p
= reinterpret_cast<char const*>(sizeof(std::size_t) * (
493 (std::uintptr_t(buf
) + sizeof(std::size_t) - 1) /
494 sizeof(std::size_t))) + 2;
496 BEAST_EXPECT(u
.write(
497 reinterpret_cast<std::uint8_t const*>(p
),
498 sizeof(buf
)-(p
-buf
)));
499 BEAST_EXPECT(u
.finish());
502 // invalid code point in the last dword of a fast run
505 auto p
= reinterpret_cast<char*>(sizeof(std::size_t) * (
506 (std::uintptr_t(buf
) + sizeof(std::size_t) - 1) /
507 sizeof(std::size_t)));
508 BOOST_ASSERT(p
+ 12 <= buf
+ sizeof(buf
));
510 *p
++ = '*'; *p
++ = '*'; *p
++ = '*'; *p
++ = '*';
511 *p
++ = '*'; *p
++ = '*'; *p
++ = '*'; *p
++ = '*';
512 p
[0] = '\x80'; // invalid
517 BEAST_EXPECT(! u
.write(reinterpret_cast<
518 std::uint8_t const*>(in
), 12));
525 std::vector
<std::vector
<std::uint8_t>> const data
{
526 { 's','t','a','r','t', 0xE0 },
527 { 0xA6, 0x81, 'e','n','d' } };
529 for(auto const& s
: data
)
531 std::size_t n
= s
.size();
532 buffers_suffix
<net::const_buffer
> cb
{net::const_buffer(s
.data(), n
)};
536 auto const amount
= (std::min
)(n
, std::size_t(3)/*size*/);
537 b
.commit(net::buffer_copy(b
.prepare(amount
), cb
));
541 BEAST_EXPECT(u
.write(b
.data()));
543 BEAST_EXPECT(u
.finish());
547 AutobahnTest(std::vector
<std::vector
<std::uint8_t>>&& data
, std::vector
<bool> result
)
549 BEAST_EXPECT(data
.size() == result
.size());
551 for(std::size_t i
= 0; i
< data
.size(); ++i
)
553 auto const& s
= data
[i
];
555 std::size_t n
= s
.size();
556 buffers_suffix
<net::const_buffer
> cb
{net::const_buffer(s
.data(), n
)};
560 auto const amount
= (std::min
)(n
, std::size_t(3)/*size*/);
561 b
.commit(net::buffer_copy(b
.prepare(amount
), cb
));
565 BEAST_EXPECT(u
.write(b
.data()) == result
[i
]);
572 testOneByteSequence();
573 testTwoByteSequence();
574 testThreeByteSequence();
575 testFourByteSequence();
576 testWithStreamBuffer();
580 AutobahnTest(std::vector
<std::vector
<std::uint8_t>>{
581 { 0xCE, 0xBA, 0xE1, 0xBD, 0xB9, 0xCF, 0x83, 0xCE, 0xBC, 0xCE, 0xB5, 0xF4 },
582 { 0x90 }, { 0x80, 0x80, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64 } },
583 { true, false, false});
585 AutobahnTest(std::vector
<std::vector
<std::uint8_t>>{
586 { 0xCE, 0xBA, 0xE1, 0xBD, 0xB9, 0xCF, 0x83, 0xCE, 0xBC, 0xCE, 0xB5, 0xF4 },
592 BEAST_DEFINE_TESTSUITE(beast
,websocket
,utf8_checker
);