]> Sergey Matveev's repositories - btrtrc.git/blob - tracker/udp/udp_test.go
862aec73d572d0ebd0e360a674ed7b6c033e04a8
[btrtrc.git] / tracker / udp / udp_test.go
1 package udp
2
3 import (
4         "bytes"
5         "encoding/binary"
6         "io"
7         "net"
8         "testing"
9
10         "github.com/anacrolix/dht/v2/krpc"
11         "github.com/stretchr/testify/require"
12 )
13
14 // Ensure net.IPs are stored big-endian, to match the way they're read from
15 // the wire.
16 func TestNetIPv4Bytes(t *testing.T) {
17         ip := net.IP([]byte{127, 0, 0, 1})
18         if ip.String() != "127.0.0.1" {
19                 t.FailNow()
20         }
21         if string(ip) != "\x7f\x00\x00\x01" {
22                 t.Fatal([]byte(ip))
23         }
24 }
25
26 func TestMarshalAnnounceResponse(t *testing.T) {
27         peers := krpc.CompactIPv4NodeAddrs{
28                 {[]byte{127, 0, 0, 1}, 2},
29                 {[]byte{255, 0, 0, 3}, 4},
30         }
31         b, err := peers.MarshalBinary()
32         require.NoError(t, err)
33         require.EqualValues(t,
34                 "\x7f\x00\x00\x01\x00\x02\xff\x00\x00\x03\x00\x04",
35                 b)
36         require.EqualValues(t, 12, binary.Size(AnnounceResponseHeader{}))
37 }
38
39 // Failure to write an entire packet to UDP is expected to given an error.
40 func TestLongWriteUDP(t *testing.T) {
41         t.Parallel()
42         l, err := net.ListenUDP("udp4", nil)
43         require.NoError(t, err)
44         defer l.Close()
45         c, err := net.DialUDP("udp", nil, l.LocalAddr().(*net.UDPAddr))
46         if err != nil {
47                 t.Fatal(err)
48         }
49         defer c.Close()
50         for msgLen := 1; ; msgLen *= 2 {
51                 n, err := c.Write(make([]byte, msgLen))
52                 if err != nil {
53                         require.Contains(t, err.Error(), "message too long")
54                         return
55                 }
56                 if n < msgLen {
57                         t.FailNow()
58                 }
59         }
60 }
61
62 func TestShortBinaryRead(t *testing.T) {
63         var data ResponseHeader
64         err := binary.Read(bytes.NewBufferString("\x00\x00\x00\x01"), binary.BigEndian, &data)
65         if err != io.ErrUnexpectedEOF {
66                 t.FailNow()
67         }
68 }
69
70 func TestConvertInt16ToInt(t *testing.T) {
71         i := 50000
72         if int(uint16(int16(i))) != 50000 {
73                 t.FailNow()
74         }
75 }