diff --git a/pending-requests_test.go b/pending-requests_test.go new file mode 100644 index 00000000..5f0debdc --- /dev/null +++ b/pending-requests_test.go @@ -0,0 +1,19 @@ +package torrent + +import ( + "testing" + + qt "github.com/frankban/quicktest" + "github.com/google/go-cmp/cmp" +) + +// Ensure that cmp.Diff will detect errors as required. +func TestPendingRequestsDiff(t *testing.T) { + var a, b pendingRequests + c := qt.New(t) + diff := func() string { return cmp.Diff(a.m, b.m) } + c.Check(diff(), qt.ContentEquals, "") + a.m = []int{1, 3} + b.m = []int{1, 2, 3} + c.Check(diff(), qt.Not(qt.Equals), "") +} diff --git a/requesting.go b/requesting.go index 1d2d5e19..c1ae8ada 100644 --- a/requesting.go +++ b/requesting.go @@ -233,6 +233,7 @@ func (p *Peer) getDesiredRequestState() (desired requestState) { }) }, ) + p.t.assertPendingRequests() heap.Init(&requestHeap) for requestHeap.Len() != 0 && desired.Requests.GetCardinality() < uint64(p.nominalMaxRequests()) { requestIndex := heap.Pop(&requestHeap).(RequestIndex) diff --git a/torrent.go b/torrent.go index 222df40b..d606971d 100644 --- a/torrent.go +++ b/torrent.go @@ -30,6 +30,7 @@ import ( "github.com/anacrolix/multiless" "github.com/anacrolix/sync" "github.com/davecgh/go-spew/spew" + "github.com/google/go-cmp/cmp" "github.com/pion/datachannel" "github.com/anacrolix/torrent/bencode" @@ -1385,9 +1386,7 @@ func (t *Torrent) deletePeerConn(c *PeerConn) (ret bool) { } torrent.Add("deleted connections", 1) c.deleteAllRequests() - if t.numActivePeers() == 0 && t.haveInfo() { - t.assertNoPendingRequests() - } + t.assertPendingRequests() return } @@ -1408,8 +1407,21 @@ func (t *Torrent) numActivePeers() (num int) { return } -func (t *Torrent) assertNoPendingRequests() { - t.pendingRequests.AssertEmpty() +func (t *Torrent) assertPendingRequests() { + var actual pendingRequests + if t.haveInfo() { + actual.m = make([]int, t.numRequests()) + } + t.iterPeers(func(p *Peer) { + p.actualRequestState.Requests.Iterate(func(x uint32) bool { + actual.Inc(x) + return true + }) + }) + diff := cmp.Diff(actual.m, t.pendingRequests.m) + if diff != "" { + panic(diff) + } } func (t *Torrent) dropConnection(c *PeerConn) {