torrent/peer_protocol/protocol_test.go

155 lines
3.2 KiB
Go

package peer_protocol
import (
"bufio"
"bytes"
"strings"
"testing"
"github.com/stretchr/testify/assert"
)
func TestBinaryReadSliceOfPointers(t *testing.T) {
var msg Message
r := bytes.NewBufferString("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00")
if r.Len() != 12 {
t.Fatalf("expected 12 bytes left, but there %d", r.Len())
}
for _, data := range []*Integer{&msg.Index, &msg.Begin, &msg.Length} {
err := data.Read(r)
if err != nil {
t.Fatal(err)
}
}
if r.Len() != 0 {
t.FailNow()
}
}
func TestConstants(t *testing.T) {
assert.EqualValues(t, 3, NotInterested)
assert.EqualValues(t, 14, HaveAll)
}
func TestBitfieldEncode(t *testing.T) {
bf := make([]bool, 37)
bf[2] = true
bf[7] = true
bf[32] = true
s := string(marshalBitfield(bf))
const expected = "\x21\x00\x00\x00\x80"
if s != expected {
t.Fatalf("got %#v, expected %#v", s, expected)
}
}
func TestBitfieldUnmarshal(t *testing.T) {
bf := unmarshalBitfield([]byte("\x81\x06"))
expected := make([]bool, 16)
expected[0] = true
expected[7] = true
expected[13] = true
expected[14] = true
if len(bf) != len(expected) {
t.FailNow()
}
for i := range expected {
if bf[i] != expected[i] {
t.FailNow()
}
}
}
func TestHaveEncode(t *testing.T) {
actualBytes, err := Message{
Type: Have,
Index: 42,
}.MarshalBinary()
if err != nil {
t.Fatal(err)
}
actualString := string(actualBytes)
expected := "\x00\x00\x00\x05\x04\x00\x00\x00\x2a"
if actualString != expected {
t.Fatalf("expected %#v, got %#v", expected, actualString)
}
}
func TestShortRead(t *testing.T) {
dec := Decoder{
R: bufio.NewReader(bytes.NewBufferString("\x00\x00\x00\x02\x00!")),
MaxLength: 2,
}
msg := new(Message)
err := dec.Decode(msg)
if !strings.Contains(err.Error(), "1 unused bytes in message type Choke") {
t.Fatal(err)
}
}
func TestUnexpectedEOF(t *testing.T) {
msg := new(Message)
for _, stream := range []string{
"\x00\x00\x00", // Header truncated.
"\x00\x00\x00\x01", // Expecting 1 more byte.
// Request with wrong length, and too short anyway.
"\x00\x00\x00\x06\x06\x00\x00\x00\x00\x00",
// Request truncated.
"\x00\x00\x00\x0b\x06\x00\x00\x00\x00\x00",
} {
dec := Decoder{
R: bufio.NewReader(bytes.NewBufferString(stream)),
MaxLength: 42,
}
err := dec.Decode(msg)
if err == nil {
t.Fatalf("expected an error decoding %q", stream)
}
}
}
func TestMarshalKeepalive(t *testing.T) {
b, err := (Message{
Keepalive: true,
}).MarshalBinary()
if err != nil {
t.Fatalf("error marshalling keepalive: %s", err)
}
bs := string(b)
const expected = "\x00\x00\x00\x00"
if bs != expected {
t.Fatalf("marshalled keepalive is %q, expected %q", bs, expected)
}
}
func TestMarshalPortMsg(t *testing.T) {
b, err := (Message{
Type: Port,
Port: 0xaabb,
}).MarshalBinary()
if err != nil {
t.Fatal(err)
}
if string(b) != "\x00\x00\x00\x03\x09\xaa\xbb" {
t.FailNow()
}
}
func TestUnmarshalPortMsg(t *testing.T) {
var m Message
d := Decoder{
R: bufio.NewReader(bytes.NewBufferString("\x00\x00\x00\x03\x09\xaa\xbb")),
MaxLength: 8,
}
err := d.Decode(&m)
if err != nil {
t.Fatal(err)
}
if m.Type != Port {
t.FailNow()
}
if m.Port != 0xaabb {
t.FailNow()
}
}