~ubuntu-branches/ubuntu/oneiric/libtorrent/oneiric

« back to all changes in this revision

Viewing changes to test/torrent/object_stream_test.cc

  • Committer: Bazaar Package Importer
  • Author(s): Rogério Brito
  • Date: 2011-03-20 01:06:18 UTC
  • mfrom: (1.1.13 upstream) (4.1.9 sid)
  • Revision ID: james.westby@ubuntu.com-20110320010618-g3wyylccqzqko73c
Tags: 0.12.7-5
* Use Steinar's "real" patch for IPv6. Addresses #490277, #618275,
  and Closes: #617791.
* Adapt libtorrent-0.12.6-ipv6-07.patch. It FTBFS otherwise.
* Add proper attibution to the IPv6 patch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "config.h"
 
2
 
 
3
#include <sstream>
 
4
#include <torrent/object.h>
 
5
 
 
6
#import "object_stream_test.h"
 
7
#import "object_test_utils.h"
 
8
 
 
9
CPPUNIT_TEST_SUITE_REGISTRATION(ObjectStreamTest);
 
10
 
 
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";
 
13
 
 
14
static const char* string_bencode = "32:aaaaaaaabbbbbbbbccccccccdddddddd";
 
15
 
 
16
void
 
17
ObjectStreamTest::testInputOrdered() {
 
18
  torrent::Object orderedObj   = create_bencode(ordered_bencode);
 
19
  torrent::Object unorderedObj = create_bencode(unordered_bencode);
 
20
 
 
21
  CPPUNIT_ASSERT(!(orderedObj.flags() & torrent::Object::flag_unordered));
 
22
  CPPUNIT_ASSERT(unorderedObj.flags() & torrent::Object::flag_unordered);
 
23
}
 
24
 
 
25
void
 
26
ObjectStreamTest::testInputNullKey() {
 
27
  torrent::Object obj = create_bencode("d0:i1e5:filesi2ee");
 
28
 
 
29
  CPPUNIT_ASSERT(!(obj.flags() & torrent::Object::flag_unordered));
 
30
}
 
31
 
 
32
void
 
33
ObjectStreamTest::testOutputMask() {
 
34
  torrent::Object normalObj = create_bencode("d1:ai1e1:bi2e1:ci3ee");
 
35
 
 
36
  CPPUNIT_ASSERT(compare_bencode(normalObj, "d1:ai1e1:bi2e1:ci3ee"));
 
37
 
 
38
  normalObj.get_key("b").set_flags(torrent::Object::flag_session_data);
 
39
  normalObj.get_key("c").set_flags(torrent::Object::flag_static_data);
 
40
 
 
41
  CPPUNIT_ASSERT(compare_bencode(normalObj, "d1:ai1e1:ci3ee", torrent::Object::flag_session_data));
 
42
}
 
43
 
 
44
//
 
45
// Testing for bugs in bencode write.
 
46
//
 
47
 
 
48
// Dummy function that invalidates the buffer once called.
 
49
 
 
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);
 
53
}
 
54
 
 
55
void
 
56
ObjectStreamTest::testBuffer() {
 
57
  char raw_buffer[16];
 
58
  torrent::object_buffer_t buffer(raw_buffer, raw_buffer + 16);
 
59
 
 
60
  torrent::Object obj = create_bencode(string_bencode);
 
61
 
 
62
  object_write_bencode_c(&object_write_to_invalidate, NULL, buffer, &obj);
 
63
}
 
64
 
 
65
static const char* single_level_bencode = "d1:ai1e1:bi2e1:cl1:ai1e1:bi2eee";
 
66
 
 
67
void
 
68
ObjectStreamTest::testReadBencodeC() {
 
69
  torrent::Object orderedObj   = create_bencode_c(ordered_bencode);
 
70
  torrent::Object unorderedObj = create_bencode_c(unordered_bencode);
 
71
 
 
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));
 
75
 
 
76
  //  torrent::Object single_level = create_bencode_c(single_level_bencode);
 
77
  torrent::Object single_level = create_bencode_c(single_level_bencode);
 
78
 
 
79
  CPPUNIT_ASSERT(compare_bencode(single_level, single_level_bencode));
 
80
}
 
81
 
 
82
bool object_write_bencode(const torrent::Object& obj, const char* original) {
 
83
  try {
 
84
    char buffer[1023];
 
85
    char* last = torrent::object_write_bencode(buffer, buffer + 1024, &obj).first;
 
86
    return std::strncmp(buffer, original, std::distance(buffer, last)) == 0;
 
87
 
 
88
  } catch (torrent::bencode_error& e) {
 
89
    return false;
 
90
  }
 
91
}
 
92
 
 
93
bool object_stream_read_skip(const char* input) {
 
94
  try {
 
95
    return torrent::object_read_bencode_skip_c(input, input + strlen(input)) == input + strlen(input);
 
96
  } catch (torrent::bencode_error& e) {
 
97
    return false;
 
98
  }
 
99
}
 
100
 
 
101
bool object_stream_read_skip_catch(const char* input) {
 
102
  try {
 
103
    torrent::object_read_bencode_skip_c(input, input + strlen(input));
 
104
    return false;
 
105
  } catch (torrent::bencode_error& e) {
 
106
    return true;
 
107
  }
 
108
}
 
109
 
 
110
void
 
111
ObjectStreamTest::test_read_skip() {
 
112
  CPPUNIT_ASSERT(object_stream_read_skip("i0e"));
 
113
  CPPUNIT_ASSERT(object_stream_read_skip("i9999e"));
 
114
 
 
115
  CPPUNIT_ASSERT(object_stream_read_skip("0:"));
 
116
  CPPUNIT_ASSERT(object_stream_read_skip("4:test"));
 
117
 
 
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"));
 
122
 
 
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"));
 
127
 
 
128
  CPPUNIT_ASSERT(object_stream_read_skip("d1:md6:ut_pexi0eee"));
 
129
}
 
130
 
 
131
void
 
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"));
 
137
 
 
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"));
 
142
}
 
143
 
 
144
void
 
145
ObjectStreamTest::test_write() {
 
146
  torrent::Object obj;
 
147
 
 
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"));
 
153
 
 
154
  obj = torrent::Object::create_map();
 
155
  obj.as_map()["a"] = (int64_t)1;
 
156
  CPPUNIT_ASSERT(object_write_bencode(obj, "d1:ai1ee"));
 
157
 
 
158
  obj.as_map()["b"] = "test";
 
159
  CPPUNIT_ASSERT(object_write_bencode(obj, "d1:ai1e1:b4:teste"));
 
160
 
 
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"));
 
164
 
 
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"));
 
168
}