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))
 }