]> Sergey Matveev's repositories - btrtrc.git/blob - tracker/http/http_test.go
7fd98a5d1bda74666c2d4b44c2d5954f1da7fe6e
[btrtrc.git] / tracker / http / http_test.go
1 package httpTracker
2
3 import (
4         "net/url"
5         "testing"
6
7         "github.com/anacrolix/torrent/bencode"
8         "github.com/anacrolix/torrent/tracker/udp"
9         qt "github.com/frankban/quicktest"
10         "github.com/stretchr/testify/assert"
11         "github.com/stretchr/testify/require"
12 )
13
14 func TestUnmarshalHTTPResponsePeerDicts(t *testing.T) {
15         var hr HttpResponse
16         require.NoError(t, bencode.Unmarshal(
17                 []byte("d5:peersl"+
18                         "d2:ip7:1.2.3.47:peer id20:thisisthe20bytepeeri4:porti9999ee"+
19                         "d2:ip39:2001:0db8:85a3:0000:0000:8a2e:0370:73347:peer id20:thisisthe20bytepeeri4:porti9998ee"+
20                         "e"+
21                         "6:peers618:123412341234123456"+
22                         "e"),
23                 &hr))
24
25         require.Len(t, hr.Peers.List, 2)
26         assert.Equal(t, []byte("thisisthe20bytepeeri"), hr.Peers.List[0].ID)
27         assert.EqualValues(t, 9999, hr.Peers.List[0].Port)
28         assert.EqualValues(t, 9998, hr.Peers.List[1].Port)
29         assert.NotNil(t, hr.Peers.List[0].IP)
30         assert.NotNil(t, hr.Peers.List[1].IP)
31
32         assert.Len(t, hr.Peers6, 1)
33         assert.EqualValues(t, "1234123412341234", hr.Peers6[0].IP)
34         assert.EqualValues(t, 0x3536, hr.Peers6[0].Port)
35 }
36
37 func TestUnmarshalHttpResponseNoPeers(t *testing.T) {
38         var hr HttpResponse
39         require.NoError(t, bencode.Unmarshal(
40                 []byte("d6:peers618:123412341234123456e"),
41                 &hr,
42         ))
43         require.Len(t, hr.Peers.List, 0)
44         assert.Len(t, hr.Peers6, 1)
45 }
46
47 func TestUnmarshalHttpResponsePeers6NotCompact(t *testing.T) {
48         var hr HttpResponse
49         require.Error(t, bencode.Unmarshal(
50                 []byte("d6:peers6lee"),
51                 &hr,
52         ))
53 }
54
55 // Checks that infohash bytes that correspond to spaces are escaped with %20 instead of +. See
56 // https://github.com/anacrolix/torrent/issues/534
57 func TestSetAnnounceInfohashParamWithSpaces(t *testing.T) {
58         someUrl := &url.URL{}
59         ihBytes := [20]uint8{
60                 0x2b, 0x76, 0xa, 0xa1, 0x78, 0x93, 0x20, 0x30, 0xc8, 0x47,
61                 0xdc, 0xdf, 0x8e, 0xae, 0xbf, 0x56, 0xa, 0x1b, 0xd1, 0x6c,
62         }
63         setAnnounceParams(
64                 someUrl,
65                 &udp.AnnounceRequest{
66                         InfoHash: ihBytes,
67                 },
68                 AnnounceOpt{})
69         t.Logf("%q", someUrl)
70         qt.Assert(t, someUrl.Query().Get("info_hash"), qt.Equals, string(ihBytes[:]))
71         qt.Check(t,
72                 someUrl.String(),
73                 qt.Contains,
74                 "info_hash=%2Bv%0A%A1x%93%200%C8G%DC%DF%8E%AE%BFV%0A%1B%D1l")
75 }