]> Sergey Matveev's repositories - btrtrc.git/blob - bencode/decode_test.go
Merge branch 'master' into pull-writer
[btrtrc.git] / bencode / decode_test.go
1 package bencode
2
3 import (
4         "bytes"
5         "io"
6         "math/big"
7         "reflect"
8         "testing"
9
10         "github.com/stretchr/testify/assert"
11         "github.com/stretchr/testify/require"
12 )
13
14 type random_decode_test struct {
15         data     string
16         expected interface{}
17 }
18
19 var random_decode_tests = []random_decode_test{
20         {"i57e", int64(57)},
21         {"i-9223372036854775808e", int64(-9223372036854775808)},
22         {"5:hello", "hello"},
23         {"29:unicode test проверка", "unicode test проверка"},
24         {"d1:ai5e1:b5:helloe", map[string]interface{}{"a": int64(5), "b": "hello"}},
25         {"li5ei10ei15ei20e7:bencodee",
26                 []interface{}{int64(5), int64(10), int64(15), int64(20), "bencode"}},
27         {"ldedee", []interface{}{map[string]interface{}{}, map[string]interface{}{}}},
28         {"le", []interface{}{}},
29         {"i604919719469385652980544193299329427705624352086e", func() *big.Int {
30                 ret, _ := big.NewInt(-1).SetString("604919719469385652980544193299329427705624352086", 10)
31                 return ret
32         }()},
33         {"d1:rd6:\xd4/\xe2F\x00\x01e1:t3:\x9a\x87\x011:v4:TR%=1:y1:re", map[string]interface{}{
34                 "r": map[string]interface{}{},
35                 "t": "\x9a\x87\x01",
36                 "v": "TR%=",
37                 "y": "r",
38         }},
39 }
40
41 func TestRandomDecode(t *testing.T) {
42         for _, test := range random_decode_tests {
43                 var value interface{}
44                 err := Unmarshal([]byte(test.data), &value)
45                 if err != nil {
46                         t.Error(err, test.data)
47                         continue
48                 }
49                 assert.EqualValues(t, test.expected, value)
50         }
51 }
52
53 func TestLoneE(t *testing.T) {
54         var v int
55         err := Unmarshal([]byte("e"), &v)
56         se := err.(*SyntaxError)
57         require.EqualValues(t, 0, se.Offset)
58 }
59
60 func TestDecoderConsecutive(t *testing.T) {
61         d := NewDecoder(bytes.NewReader([]byte("i1ei2e")))
62         var i int
63         err := d.Decode(&i)
64         require.NoError(t, err)
65         require.EqualValues(t, 1, i)
66         err = d.Decode(&i)
67         require.NoError(t, err)
68         require.EqualValues(t, 2, i)
69         err = d.Decode(&i)
70         require.Equal(t, io.EOF, err)
71 }
72
73 func check_error(t *testing.T, err error) {
74         if err != nil {
75                 t.Error(err)
76         }
77 }
78
79 func assert_equal(t *testing.T, x, y interface{}) {
80         if !reflect.DeepEqual(x, y) {
81                 t.Errorf("got: %v (%T), expected: %v (%T)\n", x, x, y, y)
82         }
83 }
84
85 type unmarshaler_int struct {
86         x int
87 }
88
89 func (this *unmarshaler_int) UnmarshalBencode(data []byte) error {
90         return Unmarshal(data, &this.x)
91 }
92
93 type unmarshaler_string struct {
94         x string
95 }
96
97 func (this *unmarshaler_string) UnmarshalBencode(data []byte) error {
98         this.x = string(data)
99         return nil
100 }
101
102 func TestUnmarshalerBencode(t *testing.T) {
103         var i unmarshaler_int
104         var ss []unmarshaler_string
105         check_error(t, Unmarshal([]byte("i71e"), &i))
106         assert_equal(t, i.x, 71)
107         check_error(t, Unmarshal([]byte("l5:hello5:fruit3:waye"), &ss))
108         assert_equal(t, ss[0].x, "5:hello")
109         assert_equal(t, ss[1].x, "5:fruit")
110         assert_equal(t, ss[2].x, "3:way")
111
112 }