github.com/anacrolix/torrent@v1.61.0/tracker/http/http_test.go (about)

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