1 // Copyright (c) 2012-2016 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
6 #include <support/allocators/zeroafterfree.h>
7 #include <test/test_bitcoin.h>
9 #include <boost/assign/std/vector.hpp> // for 'operator+=()'
10 #include <boost/test/unit_test.hpp>
12 using namespace boost::assign
; // bring 'operator+=()' into scope
14 BOOST_FIXTURE_TEST_SUITE(streams_tests
, BasicTestingSetup
)
16 BOOST_AUTO_TEST_CASE(streams_vector_writer
)
20 unsigned char bytes
[] = { 3, 4, 5, 6 };
21 std::vector
<unsigned char> vch
;
23 // Each test runs twice. Serializing a second time at the same starting
24 // point should yield the same results, even if the first test grew the
27 CVectorWriter(SER_NETWORK
, INIT_PROTO_VERSION
, vch
, 0, a
, b
);
28 BOOST_CHECK((vch
== std::vector
<unsigned char>{{1, 2}}));
29 CVectorWriter(SER_NETWORK
, INIT_PROTO_VERSION
, vch
, 0, a
, b
);
30 BOOST_CHECK((vch
== std::vector
<unsigned char>{{1, 2}}));
33 CVectorWriter(SER_NETWORK
, INIT_PROTO_VERSION
, vch
, 2, a
, b
);
34 BOOST_CHECK((vch
== std::vector
<unsigned char>{{0, 0, 1, 2}}));
35 CVectorWriter(SER_NETWORK
, INIT_PROTO_VERSION
, vch
, 2, a
, b
);
36 BOOST_CHECK((vch
== std::vector
<unsigned char>{{0, 0, 1, 2}}));
40 CVectorWriter(SER_NETWORK
, INIT_PROTO_VERSION
, vch
, 2, a
, b
);
41 BOOST_CHECK((vch
== std::vector
<unsigned char>{{0, 0, 1, 2, 0}}));
42 CVectorWriter(SER_NETWORK
, INIT_PROTO_VERSION
, vch
, 2, a
, b
);
43 BOOST_CHECK((vch
== std::vector
<unsigned char>{{0, 0, 1, 2, 0}}));
47 CVectorWriter(SER_NETWORK
, INIT_PROTO_VERSION
, vch
, 3, a
, b
);
48 BOOST_CHECK((vch
== std::vector
<unsigned char>{{0, 0, 0, 1, 2}}));
49 CVectorWriter(SER_NETWORK
, INIT_PROTO_VERSION
, vch
, 3, a
, b
);
50 BOOST_CHECK((vch
== std::vector
<unsigned char>{{0, 0, 0, 1, 2}}));
54 CVectorWriter(SER_NETWORK
, INIT_PROTO_VERSION
, vch
, 4, a
, b
);
55 BOOST_CHECK((vch
== std::vector
<unsigned char>{{0, 0, 0, 0, 1, 2}}));
56 CVectorWriter(SER_NETWORK
, INIT_PROTO_VERSION
, vch
, 4, a
, b
);
57 BOOST_CHECK((vch
== std::vector
<unsigned char>{{0, 0, 0, 0, 1, 2}}));
60 CVectorWriter(SER_NETWORK
, INIT_PROTO_VERSION
, vch
, 0, FLATDATA(bytes
));
61 BOOST_CHECK((vch
== std::vector
<unsigned char>{{3, 4, 5, 6}}));
62 CVectorWriter(SER_NETWORK
, INIT_PROTO_VERSION
, vch
, 0, FLATDATA(bytes
));
63 BOOST_CHECK((vch
== std::vector
<unsigned char>{{3, 4, 5, 6}}));
67 CVectorWriter(SER_NETWORK
, INIT_PROTO_VERSION
, vch
, 2, a
, FLATDATA(bytes
), b
);
68 BOOST_CHECK((vch
== std::vector
<unsigned char>{{8, 8, 1, 3, 4, 5, 6, 2}}));
69 CVectorWriter(SER_NETWORK
, INIT_PROTO_VERSION
, vch
, 2, a
, FLATDATA(bytes
), b
);
70 BOOST_CHECK((vch
== std::vector
<unsigned char>{{8, 8, 1, 3, 4, 5, 6, 2}}));
74 BOOST_AUTO_TEST_CASE(streams_serializedata_xor
)
77 std::vector
<char> expected_xor
;
78 std::vector
<unsigned char> key
;
79 CDataStream
ds(in
, 0, 0);
86 std::string(expected_xor
.begin(), expected_xor
.end()),
87 std::string(ds
.begin(), ds
.end()));
90 expected_xor
+= '\xf0','\x0f';
92 // Single character key
95 ds
.insert(ds
.begin(), in
.begin(), in
.end());
101 std::string(expected_xor
.begin(), expected_xor
.end()),
102 std::string(ds
.begin(), ds
.end()));
104 // Multi character key
107 expected_xor
.clear();
109 expected_xor
+= '\x0f','\x00';
112 ds
.insert(ds
.begin(), in
.begin(), in
.end());
115 key
+= '\xff','\x0f';
119 std::string(expected_xor
.begin(), expected_xor
.end()),
120 std::string(ds
.begin(), ds
.end()));
123 BOOST_AUTO_TEST_SUITE_END()