4
#include <torrent/object.h>
6
#import "object_stream_test.h"
7
#import "object_test_utils.h"
9
CPPUNIT_TEST_SUITE_REGISTRATION(ObjectStreamTest);
11
static const char* ordered_bencode = "d1:ei0e4:ipv44:XXXX4:ipv616:XXXXXXXXXXXXXXXX1:md11:upload_onlyi3e12:ut_holepunchi4e11:ut_metadatai2e6:ut_pexi1ee13:metadata_sizei15408e1:pi16033e4:reqqi255e1:v15:uuTorrent 1.8.46:yourip4:XXXXe";
12
static const char* unordered_bencode = "d1:ei0e1:md11:upload_onlyi3e12:ut_holepunchi4e11:ut_metadatai2e6:ut_pexi1ee4:ipv44:XXXX4:ipv616:XXXXXXXXXXXXXXXX13:metadata_sizei15408e1:pi16033e4:reqqi255e1:v15:uuTorrent 1.8.46:yourip4:XXXXe";
14
static const char* string_bencode = "32:aaaaaaaabbbbbbbbccccccccdddddddd";
17
ObjectStreamTest::testInputOrdered() {
18
torrent::Object orderedObj = create_bencode(ordered_bencode);
19
torrent::Object unorderedObj = create_bencode(unordered_bencode);
21
CPPUNIT_ASSERT(!(orderedObj.flags() & torrent::Object::flag_unordered));
22
CPPUNIT_ASSERT(unorderedObj.flags() & torrent::Object::flag_unordered);
26
ObjectStreamTest::testInputNullKey() {
27
torrent::Object obj = create_bencode("d0:i1e5:filesi2ee");
29
CPPUNIT_ASSERT(!(obj.flags() & torrent::Object::flag_unordered));
33
ObjectStreamTest::testOutputMask() {
34
torrent::Object normalObj = create_bencode("d1:ai1e1:bi2e1:ci3ee");
36
CPPUNIT_ASSERT(compare_bencode(normalObj, "d1:ai1e1:bi2e1:ci3ee"));
38
normalObj.get_key("b").set_flags(torrent::Object::flag_session_data);
39
normalObj.get_key("c").set_flags(torrent::Object::flag_static_data);
41
CPPUNIT_ASSERT(compare_bencode(normalObj, "d1:ai1e1:ci3ee", torrent::Object::flag_session_data));
45
// Testing for bugs in bencode write.
48
// Dummy function that invalidates the buffer once called.
50
torrent::object_buffer_t
51
object_write_to_invalidate(void* data, torrent::object_buffer_t buffer) {
52
return torrent::object_buffer_t(buffer.second, buffer.second);
56
ObjectStreamTest::testBuffer() {
58
torrent::object_buffer_t buffer(raw_buffer, raw_buffer + 16);
60
torrent::Object obj = create_bencode(string_bencode);
62
object_write_bencode_c(&object_write_to_invalidate, NULL, buffer, &obj);
65
static const char* single_level_bencode = "d1:ai1e1:bi2e1:cl1:ai1e1:bi2eee";
68
ObjectStreamTest::testReadBencodeC() {
69
torrent::Object orderedObj = create_bencode_c(ordered_bencode);
70
torrent::Object unorderedObj = create_bencode_c(unordered_bencode);
72
CPPUNIT_ASSERT(!(orderedObj.flags() & torrent::Object::flag_unordered));
73
CPPUNIT_ASSERT(unorderedObj.flags() & torrent::Object::flag_unordered);
74
CPPUNIT_ASSERT(compare_bencode(orderedObj, ordered_bencode));
76
// torrent::Object single_level = create_bencode_c(single_level_bencode);
77
torrent::Object single_level = create_bencode_c(single_level_bencode);
79
CPPUNIT_ASSERT(compare_bencode(single_level, single_level_bencode));
82
bool object_write_bencode(const torrent::Object& obj, const char* original) {
85
char* last = torrent::object_write_bencode(buffer, buffer + 1024, &obj).first;
86
return std::strncmp(buffer, original, std::distance(buffer, last)) == 0;
88
} catch (torrent::bencode_error& e) {
93
bool object_stream_read_skip(const char* input) {
95
return torrent::object_read_bencode_skip_c(input, input + strlen(input)) == input + strlen(input);
96
} catch (torrent::bencode_error& e) {
101
bool object_stream_read_skip_catch(const char* input) {
103
torrent::object_read_bencode_skip_c(input, input + strlen(input));
105
} catch (torrent::bencode_error& e) {
111
ObjectStreamTest::test_read_skip() {
112
CPPUNIT_ASSERT(object_stream_read_skip("i0e"));
113
CPPUNIT_ASSERT(object_stream_read_skip("i9999e"));
115
CPPUNIT_ASSERT(object_stream_read_skip("0:"));
116
CPPUNIT_ASSERT(object_stream_read_skip("4:test"));
118
CPPUNIT_ASSERT(object_stream_read_skip("le"));
119
CPPUNIT_ASSERT(object_stream_read_skip("li1ee"));
120
CPPUNIT_ASSERT(object_stream_read_skip("llee"));
121
CPPUNIT_ASSERT(object_stream_read_skip("ll1:a1:bel1:c1:dee"));
123
CPPUNIT_ASSERT(object_stream_read_skip("de"));
124
CPPUNIT_ASSERT(object_stream_read_skip("d1:ai1e1:b1:xe"));
125
CPPUNIT_ASSERT(object_stream_read_skip("d1:ali1eee"));
126
CPPUNIT_ASSERT(object_stream_read_skip("d1:ad1:bi1eee"));
128
CPPUNIT_ASSERT(object_stream_read_skip("d1:md6:ut_pexi0eee"));
132
ObjectStreamTest::test_read_skip_invalid() {
133
CPPUNIT_ASSERT(object_stream_read_skip_catch(""));
134
CPPUNIT_ASSERT(object_stream_read_skip_catch("i"));
135
CPPUNIT_ASSERT(object_stream_read_skip_catch("1"));
136
CPPUNIT_ASSERT(object_stream_read_skip_catch("d"));
138
CPPUNIT_ASSERT(object_stream_read_skip_catch("llllllll" "llllllll" "llllllll" "llllllll"
139
"llllllll" "llllllll" "llllllll" "llllllll"
140
"llllllll" "llllllll" "llllllll" "llllllll"
141
"llllllll" "llllllll" "llllllll" "llllllll"));
145
ObjectStreamTest::test_write() {
148
CPPUNIT_ASSERT(object_write_bencode(torrent::Object(), ""));
149
CPPUNIT_ASSERT(object_write_bencode(torrent::Object((int64_t)1), "i1e"));
150
CPPUNIT_ASSERT(object_write_bencode(torrent::Object("test"), "4:test"));
151
CPPUNIT_ASSERT(object_write_bencode(torrent::Object::create_list(), "le"));
152
CPPUNIT_ASSERT(object_write_bencode(torrent::Object::create_map(), "de"));
154
obj = torrent::Object::create_map();
155
obj.as_map()["a"] = (int64_t)1;
156
CPPUNIT_ASSERT(object_write_bencode(obj, "d1:ai1ee"));
158
obj.as_map()["b"] = "test";
159
CPPUNIT_ASSERT(object_write_bencode(obj, "d1:ai1e1:b4:teste"));
161
obj.as_map()["c"] = torrent::Object::create_list();
162
obj.as_map()["c"].as_list().push_back("foo");
163
CPPUNIT_ASSERT(object_write_bencode(obj, "d1:ai1e1:b4:test1:cl3:fooee"));
165
obj.as_map()["c"].as_list().push_back(torrent::Object());
166
obj.as_map()["d"] = torrent::Object();
167
CPPUNIT_ASSERT(object_write_bencode(obj, "d1:ai1e1:b4:test1:cl3:fooee"));