tracker/http/announce_test.go

172 lines
3.6 KiB
Go
Raw Normal View History

// Copyright 2014 The Chihaya Authors. All rights reserved.
2014-07-02 03:40:29 +02:00
// Use of this source code is governed by the BSD 2-Clause license,
// which can be found in the LICENSE file.
package http
import (
2014-07-16 19:53:42 +02:00
"net/http"
2014-07-02 03:40:29 +02:00
"net/http/httptest"
2014-07-16 19:53:42 +02:00
"net/url"
"reflect"
2014-07-02 03:40:29 +02:00
"testing"
2014-07-16 19:53:42 +02:00
"time"
2014-07-02 03:40:29 +02:00
"github.com/chihaya/bencode"
2014-07-02 03:40:29 +02:00
"github.com/chihaya/chihaya/config"
)
2014-07-16 02:38:17 +02:00
func TestPublicAnnounce(t *testing.T) {
2014-07-16 04:19:44 +02:00
srv, err := setupTracker(&config.DefaultConfig)
if err != nil {
t.Fatal(err)
}
2014-07-16 02:38:17 +02:00
defer srv.Close()
2014-07-02 03:40:29 +02:00
2014-07-16 02:38:17 +02:00
// Add one seeder.
peer := makePeerParams("peer1", true)
expected := makeResponse(1, 0, bencode.List{})
2014-07-16 03:07:33 +02:00
checkAnnounce(peer, expected, srv, t)
2014-07-16 02:38:17 +02:00
// Add another seeder.
peer = makePeerParams("peer2", true)
expected = makeResponse(2, 0, bencode.List{})
2014-07-16 03:07:33 +02:00
checkAnnounce(peer, expected, srv, t)
2014-07-16 02:38:17 +02:00
// Add a leecher.
peer = makePeerParams("peer3", false)
expected = makeResponse(2, 1, bencode.List{
makePeerResponse("peer1"),
makePeerResponse("peer2"),
2014-07-16 02:38:17 +02:00
})
2014-07-16 03:07:33 +02:00
checkAnnounce(peer, expected, srv, t)
2014-07-16 02:38:17 +02:00
// Remove seeder.
peer = makePeerParams("peer1", true)
2014-07-16 02:38:17 +02:00
peer["event"] = "stopped"
expected = makeResponse(1, 1, nil)
2014-07-16 03:07:33 +02:00
checkAnnounce(peer, expected, srv, t)
2014-07-16 02:38:17 +02:00
// Check seeders.
peer = makePeerParams("peer3", false)
expected = makeResponse(1, 1, bencode.List{
makePeerResponse("peer2"),
2014-07-16 02:38:17 +02:00
})
2014-07-16 03:07:33 +02:00
checkAnnounce(peer, expected, srv, t)
2014-07-16 02:38:17 +02:00
}
2014-07-02 03:40:29 +02:00
2014-07-16 19:53:42 +02:00
func TestTorrentPurging(t *testing.T) {
config := config.DefaultConfig
config.Tracker.Params = map[string]string{
"purge_inactive": "200ms",
"purge_interval": "100ms",
}
srv, err := setupTracker(&config)
if err != nil {
t.Fatal(err)
}
defer srv.Close()
torrentApiPath := srv.URL + "/torrents/" + url.QueryEscape(infoHash)
// Add one seeder.
peer := makePeerParams("peer1", true)
announce(peer, srv)
_, status, err := fetchPath(torrentApiPath)
if err != nil {
t.Fatal(err)
}
if status != http.StatusOK {
t.Fatalf("expected torrent to exist (got %s)", http.StatusText(status))
}
2014-07-16 19:53:42 +02:00
time.Sleep(1010 * time.Millisecond)
_, status, err = fetchPath(torrentApiPath)
if err != nil {
t.Fatal(err)
}
2014-07-16 19:53:42 +02:00
if status != http.StatusOK {
2014-07-16 20:00:45 +02:00
t.Fatalf("expected torrent to exist (got %s)", http.StatusText(status))
2014-07-16 19:53:42 +02:00
}
// Remove seeder.
peer = makePeerParams("peer1", true)
peer["event"] = "stopped"
announce(peer, srv)
time.Sleep(1010 * time.Millisecond)
2014-07-16 19:53:42 +02:00
_, status, err = fetchPath(torrentApiPath)
if err != nil {
t.Fatal(err)
}
if status != http.StatusNotFound {
t.Fatalf("expected torrent to have been purged (got %s)", http.StatusText(status))
}
}
func makePeerParams(id string, seed bool) params {
2014-07-16 02:38:17 +02:00
left := "1"
if seed {
left = "0"
2014-07-02 03:40:29 +02:00
}
2014-07-16 02:38:17 +02:00
return params{
"info_hash": infoHash,
"peer_id": id,
"port": "1234",
"uploaded": "0",
"downloaded": "0",
"left": left,
"compact": "0",
"numwant": "50",
2014-07-02 03:40:29 +02:00
}
}
func makePeerResponse(id string) bencode.Dict {
return bencode.Dict{
"ip": "127.0.0.1",
"peer id": id,
"port": int64(1234),
}
}
func makeResponse(seeders, leechers int64, peers bencode.List) bencode.Dict {
2014-07-16 02:38:17 +02:00
dict := bencode.Dict{
"complete": seeders,
"incomplete": leechers,
"interval": int64(1800),
"min interval": int64(900),
}
2014-07-02 03:40:29 +02:00
2014-07-16 02:38:17 +02:00
if peers != nil {
dict["peers"] = peers
}
2014-07-16 02:38:17 +02:00
return dict
}
2014-07-16 03:07:33 +02:00
func checkAnnounce(p params, expected interface{}, srv *httptest.Server, t *testing.T) bool {
body, err := announce(p, srv)
if err != nil {
t.Error(err)
2014-07-16 02:38:17 +02:00
return false
}
if e, ok := expected.(bencode.Dict); ok {
sortPeersInResponse(e)
}
2014-07-16 02:38:17 +02:00
got, err := bencode.Unmarshal(body)
if e, ok := got.(bencode.Dict); ok {
sortPeersInResponse(e)
}
if !reflect.DeepEqual(got, expected) {
t.Errorf("\ngot: %#v\nwanted: %#v", got, expected)
2014-07-16 02:38:17 +02:00
return false
}
2014-07-16 02:38:17 +02:00
return true
}