Skip to content

Commit

Permalink
Add unit test for relative availability after HaveNone
Browse files Browse the repository at this point in the history
Could help with #813.
  • Loading branch information
anacrolix committed Feb 19, 2023
1 parent 48b3e66 commit e8971ea
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 6 deletions.
2 changes: 1 addition & 1 deletion peerconn.go
Original file line number Diff line number Diff line change
Expand Up @@ -899,7 +899,7 @@ func (cn *PeerConn) onPeerSentHaveAll() error {
}

func (cn *PeerConn) peerSentHaveNone() error {
if cn.peerSentHaveAll {
if !cn.peerSentHaveAll {
cn.t.decPeerPieceAvailability(&cn.Peer)
}
cn._peerPieces.Clear()
Expand Down
3 changes: 3 additions & 0 deletions prioritized_peers.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ func (me *prioritizedPeers) Each(f func(PeerInfo)) {
}

func (me *prioritizedPeers) Len() int {
if me == nil || me.om == nil {
return 0
}
return me.om.Len()
}

Expand Down
14 changes: 9 additions & 5 deletions torrent.go
Original file line number Diff line number Diff line change
Expand Up @@ -894,17 +894,21 @@ func (t *Torrent) close(wg *sync.WaitGroup) (err error) {
if t.storage != nil {
t.deletePieceRequestOrder()
}
t.assertAllPiecesRelativeAvailabilityZero()
t.pex.Reset()
t.cl.event.Broadcast()
t.pieceStateChanges.Close()
t.updateWantPeersEvent()
return
}

func (t *Torrent) assertAllPiecesRelativeAvailabilityZero() {
for i := range t.pieces {
p := t.piece(i)
if p.relativeAvailability != 0 {
panic(fmt.Sprintf("piece %v has relative availability %v", i, p.relativeAvailability))
}
}
t.pex.Reset()
t.cl.event.Broadcast()
t.pieceStateChanges.Close()
t.updateWantPeersEvent()
return
}

func (t *Torrent) requestOffset(r Request) int64 {
Expand Down
36 changes: 36 additions & 0 deletions torrent_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,14 @@ import (
"net"
"os"
"path/filepath"
"sync"
"testing"

"github.com/anacrolix/generics"
"github.com/anacrolix/log"
"github.com/anacrolix/missinggo/v2"
"github.com/anacrolix/missinggo/v2/bitmap"
qt "github.com/frankban/quicktest"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

Expand Down Expand Up @@ -215,3 +219,35 @@ func TestTorrentMetainfoIncompleteMetadata(t *testing.T) {
assert.False(t, tt.haveAllMetadataPieces())
assert.Nil(t, tt.Metainfo().InfoBytes)
}

func TestRelativeAvailabilityHaveNone(t *testing.T) {
c := qt.New(t)
var err error
cl := Client{
config: TestingConfig(t),
}
tt := Torrent{
cl: &cl,
logger: log.Default,
gotMetainfoC: make(chan struct{}),
}
tt.setChunkSize(2)
generics.MakeMapIfNil(&tt.conns)
pc := PeerConn{}
pc.t = &tt
pc.peerImpl = &pc
pc.initRequestState()
generics.InitNew(&pc.callbacks)
tt.conns[&pc] = struct{}{}
err = pc.peerSentHave(0)
c.Assert(err, qt.IsNil)
info := testutil.Greeting.Info(5)
err = tt.setInfo(&info)
c.Assert(err, qt.IsNil)
tt.onSetInfo()
err = pc.peerSentHaveNone()
c.Assert(err, qt.IsNil)
var wg sync.WaitGroup
tt.close(&wg)
tt.assertAllPiecesRelativeAvailabilityZero()
}

0 comments on commit e8971ea

Please sign in to comment.