2 * Copyright (c) 2013, Peter Thorson. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above copyright
9 * notice, this list of conditions and the following disclaimer in the
10 * documentation and/or other materials provided with the distribution.
11 * * Neither the name of the WebSocket++ Project nor the
12 * names of its contributors may be used to endorse or promote products
13 * derived from this software without specific prior written permission.
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON BE LIABLE FOR ANY
19 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 //#define BOOST_TEST_DYN_LINK
28 #define BOOST_TEST_MODULE permessage_deflate
29 #include <boost/test/unit_test.hpp>
31 #include <websocketpp/error.hpp>
33 #include <websocketpp/extensions/extension.hpp>
34 #include <websocketpp/extensions/permessage_deflate/disabled.hpp>
35 #include <websocketpp/extensions/permessage_deflate/enabled.hpp>
39 #include <websocketpp/utilities.hpp>
44 typedef websocketpp::extensions::permessage_deflate::enabled<config> enabled_type;
45 typedef websocketpp::extensions::permessage_deflate::disabled<config> disabled_type;
50 websocketpp::lib::error_code ec;
51 websocketpp::err_str_pair esp;
52 websocketpp::http::attribute_list attr;
54 namespace pmde = websocketpp::extensions::permessage_deflate::error;
55 namespace pmd_mode = websocketpp::extensions::permessage_deflate::mode;
57 // Ensure the disabled extension behaves appropriately disabled
59 BOOST_AUTO_TEST_CASE( disabled_is_disabled ) {
61 BOOST_CHECK( !exts.is_implemented() );
64 BOOST_AUTO_TEST_CASE( disabled_is_off ) {
66 BOOST_CHECK( !exts.is_enabled() );
69 // Ensure the enabled version actually works
71 BOOST_AUTO_TEST_CASE( enabled_is_enabled ) {
73 BOOST_CHECK( v.exts.is_implemented() );
74 BOOST_CHECK( v.extc.is_implemented() );
78 BOOST_AUTO_TEST_CASE( enabled_starts_disabled ) {
80 BOOST_CHECK( !v.exts.is_enabled() );
81 BOOST_CHECK( !v.extc.is_enabled() );
84 BOOST_AUTO_TEST_CASE( negotiation_empty_attr ) {
87 v.esp = v.exts.negotiate(v.attr);
88 BOOST_CHECK( v.exts.is_enabled() );
89 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
90 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate");
93 BOOST_AUTO_TEST_CASE( negotiation_invalid_attr ) {
95 v.attr["foo"] = "bar";
97 v.esp = v.exts.negotiate(v.attr);
98 BOOST_CHECK( !v.exts.is_enabled() );
99 BOOST_CHECK_EQUAL( v.esp.first, pmde::make_error_code(pmde::invalid_attributes) );
100 BOOST_CHECK_EQUAL( v.esp.second, "");
103 // Negotiate server_no_context_takeover
104 BOOST_AUTO_TEST_CASE( negotiate_server_no_context_takeover_invalid ) {
106 v.attr["server_no_context_takeover"] = "foo";
108 v.esp = v.exts.negotiate(v.attr);
109 BOOST_CHECK( !v.exts.is_enabled() );
110 BOOST_CHECK_EQUAL( v.esp.first, pmde::make_error_code(pmde::invalid_attribute_value) );
111 BOOST_CHECK_EQUAL( v.esp.second, "");
114 BOOST_AUTO_TEST_CASE( negotiate_server_no_context_takeover ) {
116 v.attr["server_no_context_takeover"].clear();
118 v.esp = v.exts.negotiate(v.attr);
119 BOOST_CHECK( v.exts.is_enabled() );
120 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
121 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; server_no_context_takeover");
124 BOOST_AUTO_TEST_CASE( negotiate_server_no_context_takeover_server_initiated ) {
127 v.exts.enable_server_no_context_takeover();
128 v.esp = v.exts.negotiate(v.attr);
129 BOOST_CHECK( v.exts.is_enabled() );
130 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
131 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; server_no_context_takeover");
134 // Negotiate client_no_context_takeover
135 BOOST_AUTO_TEST_CASE( negotiate_client_no_context_takeover_invalid ) {
137 v.attr["client_no_context_takeover"] = "foo";
139 v.esp = v.exts.negotiate(v.attr);
140 BOOST_CHECK( !v.exts.is_enabled() );
141 BOOST_CHECK_EQUAL( v.esp.first, pmde::make_error_code(pmde::invalid_attribute_value) );
142 BOOST_CHECK_EQUAL( v.esp.second, "");
145 BOOST_AUTO_TEST_CASE( negotiate_client_no_context_takeover ) {
147 v.attr["client_no_context_takeover"].clear();
149 v.esp = v.exts.negotiate(v.attr);
150 BOOST_CHECK( v.exts.is_enabled() );
151 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
152 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; client_no_context_takeover");
155 BOOST_AUTO_TEST_CASE( negotiate_client_no_context_takeover_server_initiated ) {
158 v.exts.enable_client_no_context_takeover();
159 v.esp = v.exts.negotiate(v.attr);
160 BOOST_CHECK( v.exts.is_enabled() );
161 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
162 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; client_no_context_takeover");
166 // Negotiate server_max_window_bits
167 BOOST_AUTO_TEST_CASE( negotiate_server_max_window_bits_invalid ) {
170 std::vector<std::string> values;
171 values.push_back("");
172 values.push_back("foo");
173 values.push_back("7");
174 values.push_back("16");
176 std::vector<std::string>::const_iterator it;
177 for (it = values.begin(); it != values.end(); ++it) {
178 v.attr["server_max_window_bits"] = *it;
180 v.esp = v.exts.negotiate(v.attr);
181 BOOST_CHECK( !v.exts.is_enabled() );
182 BOOST_CHECK_EQUAL( v.esp.first, pmde::make_error_code(pmde::invalid_attribute_value) );
183 BOOST_CHECK_EQUAL( v.esp.second, "");
187 BOOST_AUTO_TEST_CASE( negotiate_server_max_window_bits_valid ) {
189 v.attr["server_max_window_bits"] = "8";
191 v.esp = v.exts.negotiate(v.attr);
192 BOOST_CHECK( v.exts.is_enabled() );
193 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
194 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; server_max_window_bits=8");
196 v.attr["server_max_window_bits"] = "15";
198 v.esp = v.exts.negotiate(v.attr);
199 BOOST_CHECK( v.exts.is_enabled() );
200 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
201 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate");
204 BOOST_AUTO_TEST_CASE( invalid_set_server_max_window_bits ) {
207 v.ec = v.exts.set_server_max_window_bits(7,pmd_mode::decline);
208 BOOST_CHECK_EQUAL(v.ec,pmde::make_error_code(pmde::invalid_max_window_bits));
210 v.ec = v.exts.set_server_max_window_bits(16,pmd_mode::decline);
211 BOOST_CHECK_EQUAL(v.ec,pmde::make_error_code(pmde::invalid_max_window_bits));
214 BOOST_AUTO_TEST_CASE( negotiate_server_max_window_bits_decline ) {
216 v.attr["server_max_window_bits"] = "8";
218 v.ec = v.exts.set_server_max_window_bits(15,pmd_mode::decline);
219 v.esp = v.exts.negotiate(v.attr);
220 BOOST_CHECK( v.exts.is_enabled() );
221 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
222 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
223 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate");
226 BOOST_AUTO_TEST_CASE( negotiate_server_max_window_bits_accept ) {
228 v.attr["server_max_window_bits"] = "8";
230 v.ec = v.exts.set_server_max_window_bits(15,pmd_mode::accept);
231 v.esp = v.exts.negotiate(v.attr);
232 BOOST_CHECK( v.exts.is_enabled() );
233 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
234 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
235 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; server_max_window_bits=8");
238 BOOST_AUTO_TEST_CASE( negotiate_server_max_window_bits_largest ) {
240 v.attr["server_max_window_bits"] = "8";
242 v.ec = v.exts.set_server_max_window_bits(15,pmd_mode::largest);
243 v.esp = v.exts.negotiate(v.attr);
244 BOOST_CHECK( v.exts.is_enabled() );
245 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
246 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
247 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; server_max_window_bits=8");
250 BOOST_AUTO_TEST_CASE( negotiate_server_max_window_bits_smallest ) {
252 v.attr["server_max_window_bits"] = "8";
254 v.ec = v.exts.set_server_max_window_bits(15,pmd_mode::smallest);
255 v.esp = v.exts.negotiate(v.attr);
256 BOOST_CHECK( v.exts.is_enabled() );
257 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
258 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
259 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; server_max_window_bits=8");
262 // Negotiate server_max_window_bits
263 BOOST_AUTO_TEST_CASE( negotiate_client_max_window_bits_invalid ) {
266 std::vector<std::string> values;
267 values.push_back("foo");
268 values.push_back("7");
269 values.push_back("16");
271 std::vector<std::string>::const_iterator it;
272 for (it = values.begin(); it != values.end(); ++it) {
273 v.attr["client_max_window_bits"] = *it;
275 v.esp = v.exts.negotiate(v.attr);
276 BOOST_CHECK( !v.exts.is_enabled() );
277 BOOST_CHECK_EQUAL( v.esp.first, pmde::make_error_code(pmde::invalid_attribute_value) );
278 BOOST_CHECK_EQUAL( v.esp.second, "");
282 BOOST_AUTO_TEST_CASE( negotiate_client_max_window_bits_valid ) {
285 v.attr["client_max_window_bits"].clear();
286 v.esp = v.exts.negotiate(v.attr);
287 BOOST_CHECK( v.exts.is_enabled() );
288 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
289 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate");
291 v.attr["client_max_window_bits"] = "8";
292 v.esp = v.exts.negotiate(v.attr);
293 BOOST_CHECK( v.exts.is_enabled() );
294 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
295 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; client_max_window_bits=8");
297 v.attr["client_max_window_bits"] = "15";
298 v.esp = v.exts.negotiate(v.attr);
299 BOOST_CHECK( v.exts.is_enabled() );
300 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
301 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate");
304 BOOST_AUTO_TEST_CASE( invalid_set_client_max_window_bits ) {
307 v.ec = v.exts.set_client_max_window_bits(7,pmd_mode::decline);
308 BOOST_CHECK_EQUAL(v.ec,pmde::make_error_code(pmde::invalid_max_window_bits));
310 v.ec = v.exts.set_client_max_window_bits(16,pmd_mode::decline);
311 BOOST_CHECK_EQUAL(v.ec,pmde::make_error_code(pmde::invalid_max_window_bits));
314 BOOST_AUTO_TEST_CASE( negotiate_client_max_window_bits_decline ) {
316 v.attr["client_max_window_bits"] = "8";
318 v.ec = v.exts.set_client_max_window_bits(8,pmd_mode::decline);
319 v.esp = v.exts.negotiate(v.attr);
320 BOOST_CHECK( v.exts.is_enabled() );
321 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
322 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
323 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate");
326 BOOST_AUTO_TEST_CASE( negotiate_client_max_window_bits_accept ) {
328 v.attr["client_max_window_bits"] = "8";
330 v.ec = v.exts.set_client_max_window_bits(15,pmd_mode::accept);
331 v.esp = v.exts.negotiate(v.attr);
332 BOOST_CHECK( v.exts.is_enabled() );
333 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
334 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
335 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; client_max_window_bits=8");
338 BOOST_AUTO_TEST_CASE( negotiate_client_max_window_bits_largest ) {
340 v.attr["client_max_window_bits"] = "8";
342 v.ec = v.exts.set_client_max_window_bits(15,pmd_mode::largest);
343 v.esp = v.exts.negotiate(v.attr);
344 BOOST_CHECK( v.exts.is_enabled() );
345 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
346 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
347 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; client_max_window_bits=8");
350 BOOST_AUTO_TEST_CASE( negotiate_client_max_window_bits_smallest ) {
352 v.attr["client_max_window_bits"] = "8";
354 v.ec = v.exts.set_client_max_window_bits(15,pmd_mode::smallest);
355 v.esp = v.exts.negotiate(v.attr);
356 BOOST_CHECK( v.exts.is_enabled() );
357 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
358 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
359 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; client_max_window_bits=8");
363 // Combinations with 2
364 BOOST_AUTO_TEST_CASE( negotiate_two_client_initiated1 ) {
367 v.attr["server_no_context_takeover"].clear();
368 v.attr["client_no_context_takeover"].clear();
370 v.esp = v.exts.negotiate(v.attr);
371 BOOST_CHECK( v.exts.is_enabled() );
372 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
373 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; server_no_context_takeover; client_no_context_takeover");
376 BOOST_AUTO_TEST_CASE( negotiate_two_client_initiated2 ) {
379 v.attr["server_no_context_takeover"].clear();
380 v.attr["server_max_window_bits"] = "10";
382 v.esp = v.exts.negotiate(v.attr);
383 BOOST_CHECK( v.exts.is_enabled() );
384 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
385 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; server_no_context_takeover; server_max_window_bits=10");
388 BOOST_AUTO_TEST_CASE( negotiate_two_client_initiated3 ) {
391 v.attr["server_no_context_takeover"].clear();
392 v.attr["client_max_window_bits"] = "10";
394 v.esp = v.exts.negotiate(v.attr);
395 BOOST_CHECK( v.exts.is_enabled() );
396 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
397 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; server_no_context_takeover; client_max_window_bits=10");
400 BOOST_AUTO_TEST_CASE( negotiate_two_client_initiated4 ) {
403 v.attr["client_no_context_takeover"].clear();
404 v.attr["server_max_window_bits"] = "10";
406 v.esp = v.exts.negotiate(v.attr);
407 BOOST_CHECK( v.exts.is_enabled() );
408 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
409 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; client_no_context_takeover; server_max_window_bits=10");
412 BOOST_AUTO_TEST_CASE( negotiate_two_client_initiated5 ) {
415 v.attr["client_no_context_takeover"].clear();
416 v.attr["client_max_window_bits"] = "10";
418 v.esp = v.exts.negotiate(v.attr);
419 BOOST_CHECK( v.exts.is_enabled() );
420 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
421 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; client_no_context_takeover; client_max_window_bits=10");
424 BOOST_AUTO_TEST_CASE( negotiate_two_client_initiated6 ) {
427 v.attr["server_max_window_bits"] = "10";
428 v.attr["client_max_window_bits"] = "10";
430 v.esp = v.exts.negotiate(v.attr);
431 BOOST_CHECK( v.exts.is_enabled() );
432 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
433 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; server_max_window_bits=10; client_max_window_bits=10");
436 BOOST_AUTO_TEST_CASE( negotiate_three_client_initiated1 ) {
439 v.attr["server_no_context_takeover"].clear();
440 v.attr["client_no_context_takeover"].clear();
441 v.attr["server_max_window_bits"] = "10";
443 v.esp = v.exts.negotiate(v.attr);
444 BOOST_CHECK( v.exts.is_enabled() );
445 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
446 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; server_no_context_takeover; client_no_context_takeover; server_max_window_bits=10");
449 BOOST_AUTO_TEST_CASE( negotiate_three_client_initiated2 ) {
452 v.attr["server_no_context_takeover"].clear();
453 v.attr["client_no_context_takeover"].clear();
454 v.attr["client_max_window_bits"] = "10";
456 v.esp = v.exts.negotiate(v.attr);
457 BOOST_CHECK( v.exts.is_enabled() );
458 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
459 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; server_no_context_takeover; client_no_context_takeover; client_max_window_bits=10");
462 BOOST_AUTO_TEST_CASE( negotiate_three_client_initiated3 ) {
465 v.attr["server_no_context_takeover"].clear();
466 v.attr["server_max_window_bits"] = "10";
467 v.attr["client_max_window_bits"] = "10";
469 v.esp = v.exts.negotiate(v.attr);
470 BOOST_CHECK( v.exts.is_enabled() );
471 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
472 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; server_no_context_takeover; server_max_window_bits=10; client_max_window_bits=10");
475 BOOST_AUTO_TEST_CASE( negotiate_three_client_initiated4 ) {
478 v.attr["client_no_context_takeover"].clear();
479 v.attr["server_max_window_bits"] = "10";
480 v.attr["client_max_window_bits"] = "10";
482 v.esp = v.exts.negotiate(v.attr);
483 BOOST_CHECK( v.exts.is_enabled() );
484 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
485 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; client_no_context_takeover; server_max_window_bits=10; client_max_window_bits=10");
488 BOOST_AUTO_TEST_CASE( negotiate_four_client_initiated ) {
491 v.attr["server_no_context_takeover"].clear();
492 v.attr["client_no_context_takeover"].clear();
493 v.attr["server_max_window_bits"] = "10";
494 v.attr["client_max_window_bits"] = "10";
496 v.esp = v.exts.negotiate(v.attr);
497 BOOST_CHECK( v.exts.is_enabled() );
498 BOOST_CHECK_EQUAL( v.esp.first, websocketpp::lib::error_code() );
499 BOOST_CHECK_EQUAL( v.esp.second, "permessage-deflate; server_no_context_takeover; client_no_context_takeover; server_max_window_bits=10; client_max_window_bits=10");
503 BOOST_AUTO_TEST_CASE( compress_data ) {
506 std::string compress_in = "Hello";
507 std::string compress_out;
508 std::string decompress_out;
512 v.ec = v.exts.compress(compress_in,compress_out);
513 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
515 v.ec = v.exts.decompress(reinterpret_cast<const uint8_t *>(compress_out.data()),compress_out.size(),decompress_out);
516 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
517 BOOST_CHECK_EQUAL( compress_in, decompress_out );
520 BOOST_AUTO_TEST_CASE( compress_data_multiple ) {
525 for (int i = 0; i < 2; i++) {
526 std::string compress_in = "Hello";
527 std::string compress_out;
528 std::string decompress_out;
530 v.ec = v.exts.compress(compress_in,compress_out);
531 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
533 v.ec = v.exts.decompress(reinterpret_cast<const uint8_t *>(compress_out.data()),compress_out.size(),decompress_out);
534 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
535 BOOST_CHECK_EQUAL( compress_in, decompress_out );
539 BOOST_AUTO_TEST_CASE( compress_data_large ) {
542 std::string compress_in(600,'*');
543 std::string compress_out;
544 std::string decompress_out;
546 websocketpp::http::attribute_list alist;
548 alist["server_max_window_bits"] = "8";
549 v.exts.set_server_max_window_bits(8,websocketpp::extensions::permessage_deflate::mode::smallest);
551 v.exts.negotiate(alist);
554 v.ec = v.exts.compress(compress_in,compress_out);
555 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
557 v.ec = v.exts.decompress(reinterpret_cast<const uint8_t *>(compress_out.data()),compress_out.size(),decompress_out);
558 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
559 BOOST_CHECK_EQUAL( compress_in, decompress_out );
562 BOOST_AUTO_TEST_CASE( compress_data_no_context_takeover ) {
565 std::string compress_in = "Hello";
566 std::string compress_out1;
567 std::string compress_out2;
568 std::string decompress_out;
570 websocketpp::http::attribute_list alist;
572 alist["server_no_context_takeover"].clear();
573 v.exts.enable_server_no_context_takeover();
575 v.exts.negotiate(alist);
578 v.ec = v.exts.compress(compress_in,compress_out1);
579 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
581 v.ec = v.exts.decompress(
582 reinterpret_cast<const uint8_t *>(compress_out1.data()),
583 compress_out1.size(),
586 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
587 BOOST_CHECK_EQUAL( compress_in, decompress_out );
589 decompress_out.clear();
591 v.ec = v.exts.compress(compress_in,compress_out2);
592 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
594 v.ec = v.exts.decompress(
595 reinterpret_cast<const uint8_t *>(compress_out2.data()),
596 compress_out2.size(),
599 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
600 BOOST_CHECK_EQUAL( compress_in, decompress_out );
602 BOOST_CHECK_EQUAL( compress_out1, compress_out2 );
605 BOOST_AUTO_TEST_CASE( compress_empty ) {
608 std::string compress_in;
609 std::string compress_out;
610 std::string decompress_out;
614 v.ec = v.exts.compress(compress_in,compress_out);
615 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
617 v.ec = v.exts.decompress(reinterpret_cast<const uint8_t *>(compress_out.data()),compress_out.size(),decompress_out);
619 compress_out.clear();
620 decompress_out.clear();
622 v.ec = v.exts.compress(compress_in,compress_out);
623 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
625 v.ec = v.exts.decompress(reinterpret_cast<const uint8_t *>(compress_out.data()),compress_out.size(),decompress_out);
626 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
627 BOOST_CHECK_EQUAL( compress_in, decompress_out );
630 /// @todo: more compression tests
632 * - compress at different compression levels
636 BOOST_AUTO_TEST_CASE( decompress_data ) {
639 uint8_t in[11] = {0xf2, 0x48, 0xcd, 0xc9, 0xc9, 0x07, 0x00, 0x00, 0x00, 0xff, 0xff};
641 std::string reference = "Hello";
645 v.ec = v.exts.decompress(in,11,out);
647 BOOST_CHECK_EQUAL( v.ec, websocketpp::lib::error_code() );
648 BOOST_CHECK_EQUAL( out, reference );