--- /dev/null
+package torrent
+
+import (
+ "errors"
+ "math/rand"
+ "strings"
+
+ "github.com/anacrolix/torrent/metainfo"
+ "github.com/anacrolix/torrent/storage"
+)
+
+type badStorage struct{}
+
+var _ storage.ClientImpl = badStorage{}
+
+func (bs badStorage) OpenTorrent(*metainfo.Info, metainfo.Hash) (storage.TorrentImpl, error) {
+ return bs, nil
+}
+
+func (bs badStorage) Close() error {
+ return nil
+}
+
+func (bs badStorage) Piece(p metainfo.Piece) storage.PieceImpl {
+ return badStoragePiece{p}
+}
+
+type badStoragePiece struct {
+ p metainfo.Piece
+}
+
+var _ storage.PieceImpl = badStoragePiece{}
+
+func (p badStoragePiece) WriteAt(b []byte, off int64) (int, error) {
+ return 0, nil
+}
+
+func (p badStoragePiece) Completion() storage.Completion {
+ return storage.Completion{Complete: true, Ok: true}
+}
+
+func (p badStoragePiece) MarkComplete() error {
+ return errors.New("psyyyyyyyche")
+}
+
+func (p badStoragePiece) MarkNotComplete() error {
+ return errors.New("psyyyyyyyche")
+}
+
+func (p badStoragePiece) randomlyTruncatedDataString() string {
+ return "hello, world\n"[:rand.Intn(14)]
+}
+
+func (p badStoragePiece) ReadAt(b []byte, off int64) (n int, err error) {
+ r := strings.NewReader(p.randomlyTruncatedDataString())
+ return r.ReadAt(b, off+p.p.Offset())
+}
import (
"encoding/binary"
- "errors"
"fmt"
"io"
"io/ioutil"
- "math/rand"
"net"
"os"
"path/filepath"
- "strings"
"sync"
"testing"
"time"
cfg.DefaultStorage = ps.LeecherStorage(leecherDataDir)
}
cfg.DownloadRateLimiter = ps.LeecherDownloadRateLimiter
- // cfg.ListenAddr = "localhost:4001"
+ cfg.Seed = false
leecher, err := NewClient(cfg)
require.NoError(t, err)
defer leecher.Close()
if ps.ExportClientStatus {
testutil.ExportStatusWriter(leecher, "l")
}
- leecherGreeting, new, err := leecher.AddTorrentSpec(func() (ret *TorrentSpec) {
+ leecherTorrent, new, err := leecher.AddTorrentSpec(func() (ret *TorrentSpec) {
ret = TorrentSpecFromMetaInfo(mi)
ret.ChunkSize = 2
return
require.NoError(t, err)
assert.True(t, new)
// Now do some things with leecher and seeder.
- addClientPeer(leecherGreeting, seeder)
- r := leecherGreeting.NewReader()
+ addClientPeer(leecherTorrent, seeder)
+ // The Torrent should not be interested in obtaining peers, so the one we
+ // just added should be the only one.
+ assert.False(t, leecherTorrent.Seeding())
+ assert.EqualValues(t, 1, leecherTorrent.Stats().PendingPeers)
+ r := leecherTorrent.NewReader()
defer r.Close()
if ps.Responsive {
r.SetResponsive()
r.SetReadahead(ps.Readahead)
}
assertReadAllGreeting(t, r)
- // After one read through, we can assume certain torrent statistics.
- // These are not a strict requirement. It is however interesting to
- // follow.
- // t.Logf("%#v", seederTorrent.Stats())
- // assert.EqualValues(t, 13, seederTorrent.Stats().DataBytesWritten)
- // assert.EqualValues(t, 8, seederTorrent.Stats().ChunksWritten)
- // assert.EqualValues(t, 13, leecherGreeting.Stats().DataBytesRead)
- // assert.EqualValues(t, 8, leecherGreeting.Stats().ChunksRead)
- // Read through again for the cases where the torrent data size exceeds
- // the size of the cache.
+ assert.True(t, 13 <= seederTorrent.Stats().DataBytesWritten)
+ assert.True(t, 8 <= seederTorrent.Stats().ChunksWritten)
+ assert.True(t, 13 <= leecherTorrent.Stats().DataBytesRead)
+ assert.True(t, 8 <= leecherTorrent.Stats().ChunksRead)
+ // Try reading through again for the cases where the torrent data size
+ // exceeds the size of the cache.
assertReadAllGreeting(t, r)
}
assert.EqualValues(t, 0, len(T.trackerAnnouncers))
}
-type badStorage struct{}
-
-var _ storage.ClientImpl = badStorage{}
-
-func (bs badStorage) OpenTorrent(*metainfo.Info, metainfo.Hash) (storage.TorrentImpl, error) {
- return bs, nil
-}
-
-func (bs badStorage) Close() error {
- return nil
-}
-
-func (bs badStorage) Piece(p metainfo.Piece) storage.PieceImpl {
- return badStoragePiece{p}
-}
-
-type badStoragePiece struct {
- p metainfo.Piece
-}
-
-var _ storage.PieceImpl = badStoragePiece{}
-
-func (p badStoragePiece) WriteAt(b []byte, off int64) (int, error) {
- return 0, nil
-}
-
-func (p badStoragePiece) Completion() storage.Completion {
- return storage.Completion{Complete: true, Ok: true}
-}
-
-func (p badStoragePiece) MarkComplete() error {
- return errors.New("psyyyyyyyche")
-}
-
-func (p badStoragePiece) MarkNotComplete() error {
- return errors.New("psyyyyyyyche")
-}
-
-func (p badStoragePiece) randomlyTruncatedDataString() string {
- return "hello, world\n"[:rand.Intn(14)]
-}
-
-func (p badStoragePiece) ReadAt(b []byte, off int64) (n int, err error) {
- r := strings.NewReader(p.randomlyTruncatedDataString())
- return r.ReadAt(b, off+p.p.Offset())
-}
-
// We read from a piece which is marked completed, but is missing data.
func TestCompletedPieceWrongSize(t *testing.T) {
cfg := TestingConfig()