2012-06-20 13:21:32 +00:00
|
|
|
package bencode
|
|
|
|
|
|
|
|
import "testing"
|
|
|
|
import "bytes"
|
2012-06-24 11:10:27 +00:00
|
|
|
import "fmt"
|
2012-06-20 13:21:32 +00:00
|
|
|
|
|
|
|
type random_encode_test struct {
|
|
|
|
value interface{}
|
|
|
|
expected string
|
|
|
|
}
|
|
|
|
|
|
|
|
type random_struct struct {
|
|
|
|
ABC int `bencode:"abc"`
|
|
|
|
SkipThisOne string `bencode:"-"`
|
|
|
|
CDE string
|
|
|
|
}
|
|
|
|
|
2012-06-24 11:10:27 +00:00
|
|
|
type dummy struct {
|
|
|
|
a, b, c int
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *dummy) MarshalBencode() ([]byte, error) {
|
|
|
|
var b bytes.Buffer
|
2015-04-29 14:32:01 +00:00
|
|
|
_, err := fmt.Fprintf(&b, "i%dei%dei%de", d.a+1, d.b+1, d.c+1)
|
2012-06-24 11:10:27 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return b.Bytes(), nil
|
|
|
|
}
|
|
|
|
|
2012-06-20 13:21:32 +00:00
|
|
|
var random_encode_tests = []random_encode_test{
|
|
|
|
{int(10), "i10e"},
|
|
|
|
{uint(10), "i10e"},
|
|
|
|
{"hello, world", "12:hello, world"},
|
|
|
|
{true, "i1e"},
|
|
|
|
{false, "i0e"},
|
|
|
|
{int8(-8), "i-8e"},
|
|
|
|
{int16(-16), "i-16e"},
|
|
|
|
{int32(32), "i32e"},
|
|
|
|
{int64(-64), "i-64e"},
|
|
|
|
{uint8(8), "i8e"},
|
|
|
|
{uint16(16), "i16e"},
|
|
|
|
{uint32(32), "i32e"},
|
|
|
|
{uint64(64), "i64e"},
|
|
|
|
{random_struct{123, "nono", "hello"}, "d3:CDE5:hello3:abci123ee"},
|
|
|
|
{map[string]string{"a": "b", "c": "d"}, "d1:a1:b1:c1:de"},
|
|
|
|
{[]byte{1, 2, 3, 4}, "4:\x01\x02\x03\x04"},
|
|
|
|
{[4]byte{1, 2, 3, 4}, "li1ei2ei3ei4ee"},
|
|
|
|
{nil, ""},
|
|
|
|
{[]byte{}, "0:"},
|
|
|
|
{"", "0:"},
|
|
|
|
{[]int{}, "le"},
|
|
|
|
{map[string]int{}, "de"},
|
2012-06-24 11:10:27 +00:00
|
|
|
{&dummy{1, 2, 3}, "i2ei3ei4e"},
|
2012-06-20 13:21:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestRandomEncode(t *testing.T) {
|
|
|
|
for _, test := range random_encode_tests {
|
|
|
|
data, err := Marshal(test.value)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
if !bytes.Equal(data, []byte(test.expected)) {
|
|
|
|
t.Errorf("got: %s, expected: %s\n",
|
|
|
|
string(data), string(test.expected))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|