~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/util/tests/test_bencode.py

  • Committer: John Arbash Meinel
  • Date: 2009-03-30 18:42:38 UTC
  • mto: (3735.2.171 brisbane-core)
  • mto: This revision was merged to the branch mainline in revision 4280.
  • Revision ID: john@arbash-meinel.com-20090330184238-yc8t2i9wr2mjkxiu
For now, we handle the case of a root node being referenced in the unwanted set.
However, it requires buffering, which is something we want to get rid of.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# bencode structured encoding
 
2
#
 
3
# Written by Petru Paler
 
4
#
 
5
# Permission is hereby granted, free of charge, to any person
 
6
# obtaining a copy of this software and associated documentation files
 
7
# (the "Software"), to deal in the Software without restriction,
 
8
# including without limitation the rights to use, copy, modify, merge,
 
9
# publish, distribute, sublicense, and/or sell copies of the Software,
 
10
# and to permit persons to whom the Software is furnished to do so,
 
11
# subject to the following conditions:
 
12
#
 
13
# The above copyright notice and this permission notice shall be
 
14
# included in all copies or substantial portions of the Software.
 
15
#
 
16
# The Software is provided "AS IS", without warranty of any kind,
 
17
# express or implied, including but not limited to the warranties of
 
18
# merchantability,  fitness for a particular purpose and
 
19
# noninfringement. In no event shall the  authors or copyright holders
 
20
# be liable for any claim, damages or other liability, whether in an
 
21
# action of contract, tort or otherwise, arising from, out of or in
 
22
# connection with the Software or the use or other dealings in the
 
23
# Software.
 
24
 
 
25
 
 
26
from bzrlib.util.bencode import bencode, bdecode, bdecode_as_tuple, Bencached
 
27
from bzrlib.tests import TestCase
 
28
 
 
29
class TestBencode(TestCase):
 
30
    # tests moved from within the bencode module so they're not run on every
 
31
    # startup
 
32
 
 
33
    def test_bdecode(self):
 
34
        try:
 
35
            bdecode('0:0:')
 
36
            assert 0
 
37
        except ValueError:
 
38
            pass
 
39
        try:
 
40
            bdecode('ie')
 
41
            assert 0
 
42
        except ValueError:
 
43
            pass
 
44
        try:
 
45
            bdecode('i341foo382e')
 
46
            assert 0
 
47
        except ValueError:
 
48
            pass
 
49
        assert bdecode('i4e') == 4L
 
50
        assert bdecode('i0e') == 0L
 
51
        assert bdecode('i123456789e') == 123456789L
 
52
        assert bdecode('i-10e') == -10L
 
53
        try:
 
54
            bdecode('i-0e')
 
55
            assert 0
 
56
        except ValueError:
 
57
            pass
 
58
        try:
 
59
            bdecode('i123')
 
60
            assert 0
 
61
        except ValueError:
 
62
            pass
 
63
        try:
 
64
            bdecode('')
 
65
            assert 0
 
66
        except ValueError:
 
67
            pass
 
68
        try:
 
69
            bdecode('i6easd')
 
70
            assert 0
 
71
        except ValueError:
 
72
            pass
 
73
        try:
 
74
            bdecode('35208734823ljdahflajhdf')
 
75
            assert 0
 
76
        except ValueError:
 
77
            pass
 
78
        try:
 
79
            bdecode('2:abfdjslhfld')
 
80
            assert 0
 
81
        except ValueError:
 
82
            pass
 
83
        assert bdecode('0:') == ''
 
84
        assert bdecode('3:abc') == 'abc'
 
85
        assert bdecode('10:1234567890') == '1234567890'
 
86
        try:
 
87
            bdecode('02:xy')
 
88
            assert 0
 
89
        except ValueError:
 
90
            pass
 
91
        try:
 
92
            bdecode('l')
 
93
            assert 0
 
94
        except ValueError:
 
95
            pass
 
96
        assert bdecode('le') == []
 
97
        try:
 
98
            bdecode('leanfdldjfh')
 
99
            assert 0
 
100
        except ValueError:
 
101
            pass
 
102
        assert bdecode('l0:0:0:e') == ['', '', '']
 
103
        try:
 
104
            bdecode('relwjhrlewjh')
 
105
            assert 0
 
106
        except ValueError:
 
107
            pass
 
108
        assert bdecode('li1ei2ei3ee') == [1, 2, 3]
 
109
        assert bdecode('l3:asd2:xye') == ['asd', 'xy']
 
110
        assert bdecode('ll5:Alice3:Bobeli2ei3eee') == [['Alice', 'Bob'], [2, 3]]
 
111
        try:
 
112
            bdecode('d')
 
113
            assert 0
 
114
        except ValueError:
 
115
            pass
 
116
        try:
 
117
            bdecode('defoobar')
 
118
            assert 0
 
119
        except ValueError:
 
120
            pass
 
121
        assert bdecode('de') == {}
 
122
        assert bdecode('d3:agei25e4:eyes4:bluee') == {'age': 25, 'eyes': 'blue'}
 
123
        assert bdecode('d8:spam.mp3d6:author5:Alice6:lengthi100000eee') == {'spam.mp3': {'author': 'Alice', 'length': 100000}}
 
124
        try:
 
125
            bdecode('d3:fooe')
 
126
            assert 0
 
127
        except ValueError:
 
128
            pass
 
129
        try:
 
130
            bdecode('di1e0:e')
 
131
            assert 0
 
132
        except ValueError:
 
133
            pass
 
134
        try:
 
135
            bdecode('d1:b0:1:a0:e')
 
136
            assert 0
 
137
        except ValueError:
 
138
            pass
 
139
        try:
 
140
            bdecode('d1:a0:1:a0:e')
 
141
            assert 0
 
142
        except ValueError:
 
143
            pass
 
144
        try:
 
145
            bdecode('i03e')
 
146
            assert 0
 
147
        except ValueError:
 
148
            pass
 
149
        try:
 
150
            bdecode('l01:ae')
 
151
            assert 0
 
152
        except ValueError:
 
153
            pass
 
154
        try:
 
155
            bdecode('9999:x')
 
156
            assert 0
 
157
        except ValueError:
 
158
            pass
 
159
        try:
 
160
            bdecode('l0:')
 
161
            assert 0
 
162
        except ValueError:
 
163
            pass
 
164
        try:
 
165
            bdecode('d0:0:')
 
166
            assert 0
 
167
        except ValueError:
 
168
            pass
 
169
        try:
 
170
            bdecode('d0:')
 
171
            assert 0
 
172
        except ValueError:
 
173
            pass
 
174
        try:
 
175
            bdecode('00:')
 
176
            assert 0
 
177
        except ValueError:
 
178
            pass
 
179
        try:
 
180
            bdecode('l-3:e')
 
181
            assert 0
 
182
        except ValueError:
 
183
            pass
 
184
        try:
 
185
            bdecode('i-03e')
 
186
            assert 0
 
187
        except ValueError:
 
188
            pass
 
189
        bdecode('d0:i3ee')
 
190
 
 
191
 
 
192
    def test_bdecode_as_tuple(self):
 
193
        assert bdecode_as_tuple('le') == ()
 
194
        try:
 
195
            bdecode_as_tuple('leanfdldjfh')
 
196
            assert 0
 
197
        except ValueError:
 
198
            pass
 
199
        assert bdecode_as_tuple('l0:0:0:e') == ('', '', '')
 
200
        assert bdecode_as_tuple('li1ei2ei3ee') == (1, 2, 3)
 
201
        assert bdecode_as_tuple('l3:asd2:xye') == ('asd', 'xy')
 
202
        assert bdecode_as_tuple('ll5:Alice3:Bobeli2ei3eee') == (('Alice', 'Bob'),
 
203
                (2, 3))
 
204
        try:
 
205
            bdecode_as_tuple('l-3:e')
 
206
            assert 0
 
207
        except ValueError:
 
208
            pass
 
209
 
 
210
 
 
211
    def test_bencode(self):
 
212
        assert bencode(4) == 'i4e'
 
213
        assert bencode(0) == 'i0e'
 
214
        assert bencode(-10) == 'i-10e'
 
215
        assert bencode(12345678901234567890L) == 'i12345678901234567890e'
 
216
        assert bencode('') == '0:'
 
217
        assert bencode('abc') == '3:abc'
 
218
        assert bencode('1234567890') == '10:1234567890'
 
219
        assert bencode([]) == 'le'
 
220
        assert bencode([1, 2, 3]) == 'li1ei2ei3ee'
 
221
        assert bencode([['Alice', 'Bob'], [2, 3]]) == 'll5:Alice3:Bobeli2ei3eee'
 
222
        assert bencode({}) == 'de'
 
223
        assert bencode({'age': 25, 'eyes': 'blue'}) == 'd3:agei25e4:eyes4:bluee'
 
224
        assert bencode({'spam.mp3': {'author': 'Alice', 'length': 100000}}) == 'd8:spam.mp3d6:author5:Alice6:lengthi100000eee'
 
225
        assert bencode(Bencached(bencode(3))) == 'i3e'
 
226
        assert bencode(True) == 'i1e'
 
227
        assert bencode(False) == 'i0e'
 
228
        try:
 
229
            bencode({1: 'foo'})
 
230
            assert 0
 
231
        except TypeError:
 
232
            pass
 
233
 
 
234