]> Sergey Matveev's repositories - btrtrc.git/blobdiff - peer_protocol/protocol_test.go
Drop support for go 1.20
[btrtrc.git] / peer_protocol / protocol_test.go
index 3c04aff85f23e9258a095cde464e4c15cda6bfc1..df01a1a676f49dc26907f6ab135864b590b6b577 100644 (file)
@@ -1,16 +1,36 @@
 package peer_protocol
 
 import (
+       "bufio"
+       "bytes"
+       "strings"
        "testing"
+
+       "github.com/stretchr/testify/assert"
 )
 
-func TestConstants(t *testing.T) {
-       // check that iota works as expected in the const block
-       if NotInterested != 3 {
+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
@@ -49,8 +69,86 @@ func TestHaveEncode(t *testing.T) {
                t.Fatal(err)
        }
        actualString := string(actualBytes)
-       expected := "\x04\x00\x00\x00\x2a"
+       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()
+       }
+}