import (
"errors"
+ "io"
"os"
"sync"
"testing"
+ "testing/iotest"
"github.com/anacrolix/log"
- pp "github.com/anacrolix/torrent/peer_protocol"
-
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/anacrolix/torrent"
"github.com/anacrolix/torrent/internal/testutil"
"github.com/anacrolix/torrent/metainfo"
+ pp "github.com/anacrolix/torrent/peer_protocol"
"github.com/anacrolix/torrent/storage"
)
func testReceiveChunkStorageFailure(t *testing.T, seederFast bool) {
seederDataDir, metainfo := testutil.GreetingTestTorrent()
defer os.RemoveAll(seederDataDir)
- seederClientConfig := torrent.TestingConfig()
+ seederClientConfig := torrent.TestingConfig(t)
seederClientConfig.Debug = true
justOneNetwork(seederClientConfig)
seederClientStorage := storage.NewMMap(seederDataDir)
seederClient, err := torrent.NewClient(seederClientConfig)
require.NoError(t, err)
defer seederClient.Close()
- defer testutil.ExportStatusWriter(seederClient, "s")()
- leecherClientConfig := torrent.TestingConfig()
+ defer testutil.ExportStatusWriter(seederClient, "s", t)()
+ leecherClientConfig := torrent.TestingConfig(t)
leecherClientConfig.Debug = true
+ // Don't require fast extension, whether the seeder will provide it or not (so we can test mixed
+ // cases).
+ leecherClientConfig.MinPeerExtensions.SetBit(pp.ExtensionBitFast, false)
justOneNetwork(leecherClientConfig)
leecherClient, err := torrent.NewClient(leecherClientConfig)
require.NoError(t, err)
defer leecherClient.Close()
- defer testutil.ExportStatusWriter(leecherClient, "l")()
+ defer testutil.ExportStatusWriter(leecherClient, "l", t)()
info, err := metainfo.UnmarshalInfo()
require.NoError(t, err)
leecherStorage := diskFullStorage{
// Tell the seeder to find the leecher. Is it guaranteed seeders will always try to do this?
seederTorrent.AddClientPeer(leecherClient)
<-leecherTorrent.GotInfo()
- assertReadAllGreeting(t, leecherTorrent.NewReader())
+ r := leecherTorrent.Files()[0].NewReader()
+ defer r.Close()
+ // We can't use assertReadAllGreeting here, because the default storage write error handler
+ // disables data downloads, which now causes Readers to error when they're blocked.
+ if false {
+ assertReadAllGreeting(t, leecherTorrent.NewReader())
+ } else {
+ for func() bool {
+ // We don't seem to need to seek, but that's probably just because the storage failure is
+ // happening on the first read.
+ r.Seek(0, io.SeekStart)
+ if err := iotest.TestReader(r, []byte(testutil.GreetingFileContents)); err != nil {
+ t.Logf("got error while reading: %v", err)
+ return true
+ }
+ return false
+ }() {
+ }
+ }
// TODO: Check that PeerConns fastEnabled matches seederFast?
- //select {}
+ // select {}
}
type pieceState struct {
}
}
-func (me diskFullStorage) Close() error {
+func (me *diskFullStorage) Close() error {
return nil
}
-func (d diskFullStorage) OpenTorrent(info *metainfo.Info, infoHash metainfo.Hash) (storage.TorrentImpl, error) {
- return &d, nil
+func (d *diskFullStorage) OpenTorrent(info *metainfo.Info, infoHash metainfo.Hash) (storage.TorrentImpl, error) {
+ return storage.TorrentImpl{Piece: d.Piece, Close: d.Close}, nil
}
type pieceImpl struct {