10 qt "github.com/frankban/quicktest"
11 "github.com/stretchr/testify/assert"
12 "github.com/stretchr/testify/require"
15 type random_decode_test struct {
20 var random_decode_tests = []random_decode_test{
22 {"i-9223372036854775808e", int64(-9223372036854775808)},
24 {"29:unicode test проверка", "unicode test проверка"},
25 {"d1:ai5e1:b5:helloe", map[string]interface{}{"a": int64(5), "b": "hello"}},
26 {"li5ei10ei15ei20e7:bencodee",
27 []interface{}{int64(5), int64(10), int64(15), int64(20), "bencode"}},
28 {"ldedee", []interface{}{map[string]interface{}{}, map[string]interface{}{}}},
29 {"le", []interface{}{}},
30 {"i604919719469385652980544193299329427705624352086e", func() *big.Int {
31 ret, _ := big.NewInt(-1).SetString("604919719469385652980544193299329427705624352086", 10)
34 {"d1:rd6:\xd4/\xe2F\x00\x01e1:t3:\x9a\x87\x011:v4:TR%=1:y1:re", map[string]interface{}{
35 "r": map[string]interface{}{},
42 func TestRandomDecode(t *testing.T) {
43 for _, test := range random_decode_tests {
45 err := Unmarshal([]byte(test.data), &value)
47 t.Error(err, test.data)
50 assert.EqualValues(t, test.expected, value)
54 func TestLoneE(t *testing.T) {
56 err := Unmarshal([]byte("e"), &v)
57 se := err.(*SyntaxError)
58 require.EqualValues(t, 0, se.Offset)
61 func TestDecoderConsecutive(t *testing.T) {
62 d := NewDecoder(bytes.NewReader([]byte("i1ei2e")))
65 require.NoError(t, err)
66 require.EqualValues(t, 1, i)
68 require.NoError(t, err)
69 require.EqualValues(t, 2, i)
71 require.Equal(t, io.EOF, err)
74 func TestDecoderConsecutiveDicts(t *testing.T) {
75 bb := bytes.NewBufferString("d4:herp4:derped3:wat1:ke17:oh baby a triple!")
78 assert.EqualValues(t, "d4:herp4:derped3:wat1:ke17:oh baby a triple!", bb.Bytes())
79 assert.EqualValues(t, 0, d.Offset)
81 var m map[string]interface{}
83 require.NoError(t, d.Decode(&m))
85 assert.Equal(t, "derp", m["herp"])
86 assert.Equal(t, "d3:wat1:ke17:oh baby a triple!", bb.String())
87 assert.EqualValues(t, 14, d.Offset)
89 require.NoError(t, d.Decode(&m))
90 assert.Equal(t, "k", m["wat"])
91 assert.Equal(t, "17:oh baby a triple!", bb.String())
92 assert.EqualValues(t, 24, d.Offset)
95 require.NoError(t, d.Decode(&s))
96 assert.Equal(t, "oh baby a triple!", s)
97 assert.EqualValues(t, 44, d.Offset)
100 func check_error(t *testing.T, err error) {
106 func assert_equal(t *testing.T, x, y interface{}) {
107 if !reflect.DeepEqual(x, y) {
108 t.Errorf("got: %v (%T), expected: %v (%T)\n", x, x, y, y)
112 type unmarshalerInt struct {
116 func (me *unmarshalerInt) UnmarshalBencode(data []byte) error {
117 return Unmarshal(data, &me.x)
120 type unmarshalerString struct {
124 func (me *unmarshalerString) UnmarshalBencode(data []byte) error {
129 func TestUnmarshalerBencode(t *testing.T) {
131 var ss []unmarshalerString
132 check_error(t, Unmarshal([]byte("i71e"), &i))
133 assert_equal(t, i.x, 71)
134 check_error(t, Unmarshal([]byte("l5:hello5:fruit3:waye"), &ss))
135 assert_equal(t, ss[0].x, "5:hello")
136 assert_equal(t, ss[1].x, "5:fruit")
137 assert_equal(t, ss[2].x, "3:way")
141 func TestIgnoreUnmarshalTypeError(t *testing.T) {
143 Ignore int `bencode:",ignore_unmarshal_type_error"`
146 require.Error(t, Unmarshal([]byte("d6:Normal5:helloe"), &s))
147 assert.NoError(t, Unmarshal([]byte("d6:Ignore5:helloe"), &s))
148 qt.Assert(t, Unmarshal([]byte("d6:Ignorei42ee"), &s), qt.IsNil)
149 assert.EqualValues(t, 42, s.Ignore)
152 // Test unmarshalling []byte into something that has the same kind but
154 func TestDecodeCustomSlice(t *testing.T) {
157 // We do a longer slice then a shorter slice to see if the buffers are
159 d := NewDecoder(bytes.NewBufferString("3:\x01\x10\xff2:\x04\x0f"))
160 require.NoError(t, d.Decode(&fs3))
161 require.NoError(t, d.Decode(&fs2))
162 assert.EqualValues(t, []flag{1, 16, 255}, fs3)
163 assert.EqualValues(t, []flag{4, 15}, fs2)
166 func TestUnmarshalUnusedBytes(t *testing.T) {
168 require.EqualValues(t, ErrUnusedTrailingBytes{1}, Unmarshal([]byte("i42ee"), &i))
169 assert.EqualValues(t, 42, i)
172 func TestUnmarshalByteArray(t *testing.T) {
174 assert.NoError(t, Unmarshal([]byte("2:hi"), &ba))
175 assert.EqualValues(t, "hi", ba[:])
178 func TestDecodeDictIntoUnsupported(t *testing.T) {
179 // Any type that a dict shouldn't be unmarshallable into.
182 err := Unmarshal([]byte("d1:a1:be"), &i)
184 c.Check(err, qt.Not(qt.IsNil))
187 func TestUnmarshalDictKeyNotString(t *testing.T) {
188 // Any type that a dict shouldn't be unmarshallable into.
191 err := Unmarshal([]byte("di42e3:yese"), &i)
193 c.Check(err, qt.Not(qt.IsNil))