From a2e14f79c288b2e602cbef0e74fd08311ae4d22f Mon Sep 17 00:00:00 2001 From: Justin Li <jli.justinli@gmail.com> Date: Wed, 16 Jul 2014 20:08:03 -0400 Subject: [PATCH] Add peer purging test, and ensure the purging routine runs whenever a tracker is created --- http/announce_test.go | 48 ++++++++++++++++++++++++++++++------------- http/http.go | 14 ++++++------- 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/http/announce_test.go b/http/announce_test.go index 1183333..13f338b 100644 --- a/http/announce_test.go +++ b/http/announce_test.go @@ -56,13 +56,8 @@ func TestPublicAnnounce(t *testing.T) { } func TestTorrentPurging(t *testing.T) { - config := config.DefaultConfig - config.Tracker.Params = map[string]string{ - "purge_inactive": "200ms", - "purge_interval": "100ms", - } - - srv, err := setupTracker(&config) + cfg := config.DefaultConfig + srv, err := setupTracker(&cfg) if err != nil { t.Fatal(err) } @@ -82,21 +77,46 @@ func TestTorrentPurging(t *testing.T) { t.Fatalf("expected torrent to exist (got %s)", http.StatusText(status)) } - time.Sleep(1010 * time.Millisecond) + // Remove seeder. + peer = makePeerParams("peer1", true) + peer["event"] = "stopped" + announce(peer, srv) + _, 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 TestStalePeerPurging(t *testing.T) { + cfg := config.DefaultConfig + cfg.Announce = config.Duration{10 * time.Millisecond} + + srv, err := setupTracker(&cfg) + 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)) } - // Remove seeder. - peer = makePeerParams("peer1", true) - peer["event"] = "stopped" - announce(peer, srv) - - time.Sleep(1010 * time.Millisecond) + // Let them expire. + time.Sleep(50 * time.Millisecond) _, status, err = fetchPath(torrentApiPath) if err != nil { diff --git a/http/http.go b/http/http.go index 6db42ef..aaaf286 100644 --- a/http/http.go +++ b/http/http.go @@ -36,6 +36,13 @@ func NewTracker(cfg *config.Config) (*Tracker, error) { return nil, err } + go tracker.PurgeInactivePeers( + tp, + cfg.PurgeInactiveTorrents, + cfg.Announce.Duration*2, + cfg.Announce.Duration, + ) + return &Tracker{ cfg: cfg, pool: tp, @@ -99,13 +106,6 @@ func Serve(cfg *config.Config) { glog.Fatal("New: ", err) } - go tracker.PurgeInactivePeers( - t.pool, - cfg.PurgeInactiveTorrents, - cfg.Announce.Duration*2, - cfg.Announce.Duration, - ) - glog.V(0).Info("Starting on ", cfg.Addr) graceful.Run(cfg.Addr, cfg.RequestTimeout.Duration, NewRouter(t, cfg)) }