2 * Copyright Andrey Semashev 2007 - 2015.
3 * Distributed under the Boost Software License, Version 1.0.
4 * (See accompanying file LICENSE_1_0.txt or copy at
5 * http://www.boost.org/LICENSE_1_0.txt)
8 * \file util_manip_dump.cpp
9 * \author Andrey Semashev
12 * \brief This header contains tests for the dump manipulator.
15 #define BOOST_TEST_MODULE util_manip_dump
22 #include <boost/test/unit_test.hpp>
23 #include <boost/log/utility/manipulators/dump.hpp>
24 #include "char_definitions.hpp"
26 namespace logging
= boost::log
;
28 // Test a short data region
29 BOOST_AUTO_TEST_CASE_TEMPLATE(unbounded_binary_lowercase_short_dump
, CharT
, char_types
)
31 typedef CharT char_type
;
32 typedef std::basic_ostringstream
< char_type
> ostream_type
;
34 std::vector
< unsigned char > data
;
45 ostream_type strm_dump
;
46 strm_dump
<< logging::dump(&data
[0], data
.size());
48 ostream_type strm_correct
;
49 strm_correct
<< "01 02 03 64 6e 78 c8 d2 dc";
51 BOOST_CHECK(equal_strings(strm_dump
.str(), strm_correct
.str()));
54 // Test a short data region with uppercase formatting
55 BOOST_AUTO_TEST_CASE_TEMPLATE(unbounded_binary_uppercase_short_dump
, CharT
, char_types
)
57 typedef CharT char_type
;
58 typedef std::basic_ostringstream
< char_type
> ostream_type
;
60 std::vector
< unsigned char > data
;
71 ostream_type strm_dump
;
72 strm_dump
<< std::uppercase
<< logging::dump(&data
[0], data
.size());
74 ostream_type strm_correct
;
75 strm_correct
<< "01 02 03 64 6E 78 C8 D2 DC";
77 BOOST_CHECK(equal_strings(strm_dump
.str(), strm_correct
.str()));
80 // Test void pointer handling
81 BOOST_AUTO_TEST_CASE_TEMPLATE(unbounded_binary_pvoid_dump
, CharT
, char_types
)
83 typedef CharT char_type
;
84 typedef std::basic_ostringstream
< char_type
> ostream_type
;
86 std::vector
< unsigned char > data
;
97 ostream_type strm_dump
;
98 strm_dump
<< logging::dump((void*)&data
[0], data
.size());
100 ostream_type strm_correct
;
101 strm_correct
<< "01 02 03 64 6e 78 c8 d2 dc";
103 BOOST_CHECK(equal_strings(strm_dump
.str(), strm_correct
.str()));
106 // Test a large data region
107 BOOST_AUTO_TEST_CASE_TEMPLATE(unbounded_binary_large_dump
, CharT
, char_types
)
109 typedef CharT char_type
;
110 typedef std::basic_ostringstream
< char_type
> ostream_type
;
112 std::vector
< unsigned char > data
;
113 ostream_type strm_correct
;
114 for (unsigned int i
= 0; i
< 1024; ++i
)
116 unsigned char n
= static_cast< unsigned char >(i
);
120 strm_correct
<< std::hex
<< std::setw(2) << std::setfill(static_cast< char_type
>('0')) << static_cast< unsigned int >(n
);
123 ostream_type strm_dump
;
124 strm_dump
<< logging::dump(&data
[0], data
.size());
126 BOOST_CHECK(equal_strings(strm_dump
.str(), strm_correct
.str()));
129 // Test SIMD tail handling
130 BOOST_AUTO_TEST_CASE_TEMPLATE(unbounded_binary_tail_dump
, CharT
, char_types
)
132 typedef CharT char_type
;
133 typedef std::basic_ostringstream
< char_type
> ostream_type
;
135 std::vector
< unsigned char > data
;
136 ostream_type strm_correct
;
137 // 1023 makes it very unlikely for the buffer to end at 16 or 32 byte boundary, which makes the dump algorithm to process the tail in a special way
138 for (unsigned int i
= 0; i
< 1023; ++i
)
140 unsigned char n
= static_cast< unsigned char >(i
);
144 strm_correct
<< std::hex
<< std::setw(2) << std::setfill(static_cast< char_type
>('0')) << static_cast< unsigned int >(n
);
147 ostream_type strm_dump
;
148 strm_dump
<< logging::dump(&data
[0], data
.size());
150 BOOST_CHECK(equal_strings(strm_dump
.str(), strm_correct
.str()));
154 BOOST_AUTO_TEST_CASE_TEMPLATE(bounded_binary_dump
, CharT
, char_types
)
156 typedef CharT char_type
;
157 typedef std::basic_ostringstream
< char_type
> ostream_type
;
159 std::vector
< unsigned char > data
;
160 ostream_type strm_correct
;
161 for (unsigned int i
= 0; i
< 1024; ++i
)
163 unsigned char n
= static_cast< unsigned char >(i
);
170 strm_correct
<< std::hex
<< std::setw(2) << std::setfill(static_cast< char_type
>('0')) << static_cast< unsigned int >(n
);
174 strm_correct
<< std::dec
<< std::setfill(static_cast< char_type
>(' ')) << " and " << 524u << " bytes more";
176 ostream_type strm_dump
;
177 strm_dump
<< logging::dump(&data
[0], data
.size(), 500);
179 BOOST_CHECK(equal_strings(strm_dump
.str(), strm_correct
.str()));
183 BOOST_AUTO_TEST_CASE_TEMPLATE(unbounded_element_dump
, CharT
, char_types
)
185 typedef CharT char_type
;
186 typedef std::basic_ostringstream
< char_type
> ostream_type
;
188 std::vector
< unsigned int > data
;
189 data
.push_back(0x01020a0b);
190 data
.push_back(0x03040c0d);
191 data
.push_back(0x05060e0f);
193 ostream_type strm_dump
;
194 strm_dump
<< logging::dump_elements(&data
[0], data
.size());
196 ostream_type strm_correct
;
197 const unsigned char* p
= reinterpret_cast< const unsigned char* >(&data
[0]);
198 std::size_t size
= data
.size() * sizeof(unsigned int);
199 for (unsigned int i
= 0; i
< size
; ++i
)
201 unsigned char n
= p
[i
];
204 strm_correct
<< std::hex
<< std::setw(2) << std::setfill(static_cast< char_type
>('0')) << static_cast< unsigned int >(n
);
207 BOOST_CHECK(equal_strings(strm_dump
.str(), strm_correct
.str()));
210 // Test bounded array dump
211 BOOST_AUTO_TEST_CASE_TEMPLATE(bounded_element_dump
, CharT
, char_types
)
213 typedef CharT char_type
;
214 typedef std::basic_ostringstream
< char_type
> ostream_type
;
216 std::vector
< unsigned int > data
;
217 data
.push_back(0x01020a0b);
218 data
.push_back(0x03040c0d);
219 data
.push_back(0x05060e0f);
221 ostream_type strm_dump
;
222 strm_dump
<< logging::dump_elements(&data
[0], data
.size(), 2);
224 ostream_type strm_correct
;
225 const unsigned char* p
= reinterpret_cast< const unsigned char* >(&data
[0]);
226 std::size_t size
= 2 * sizeof(unsigned int);
227 for (unsigned int i
= 0; i
< size
; ++i
)
229 unsigned char n
= p
[i
];
232 strm_correct
<< std::hex
<< std::setw(2) << std::setfill(static_cast< char_type
>('0')) << static_cast< unsigned int >(n
);
235 strm_correct
<< std::dec
<< std::setfill(static_cast< char_type
>(' ')) << " and " << (data
.size() - 2) * sizeof(unsigned int) << " bytes more";
237 BOOST_CHECK(equal_strings(strm_dump
.str(), strm_correct
.str()));