torrent/bencode/encode_test.go

91 lines
1.9 KiB
Go

package bencode
import (
"bytes"
"fmt"
"math/big"
"testing"
"github.com/stretchr/testify/assert"
)
type random_encode_test struct {
value interface{}
expected string
}
type random_struct struct {
ABC int `bencode:"abc"`
SkipThisOne string `bencode:"-"`
CDE string
}
type dummy struct {
a, b, c int
}
func (d *dummy) MarshalBencode() ([]byte, error) {
var b bytes.Buffer
_, err := fmt.Fprintf(&b, "i%dei%dei%de", d.a+1, d.b+1, d.c+1)
if err != nil {
return nil, err
}
return b.Bytes(), nil
}
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"},
{&dummy{1, 2, 3}, "i2ei3ei4e"},
{struct {
A *string
}{nil}, "d1:A0:e"},
{struct {
A *string
}{new(string)}, "d1:A0:e"},
{struct {
A *string `bencode:",omitempty"`
}{nil}, "de"},
{struct {
A *string `bencode:",omitempty"`
}{new(string)}, "d1:A0:e"},
{bigIntFromString("62208002200000000000"), "i62208002200000000000e"},
{*bigIntFromString("62208002200000000000"), "i62208002200000000000e"},
}
func bigIntFromString(s string) *big.Int {
bi, ok := new(big.Int).SetString(s, 10)
if !ok {
panic(s)
}
return bi
}
func TestRandomEncode(t *testing.T) {
for _, test := range random_encode_tests {
data, err := Marshal(test.value)
assert.NoError(t, err, "%s", test)
assert.EqualValues(t, test.expected, string(data))
}
}