From: Matt Joiner Date: Mon, 29 Jan 2018 07:20:48 +0000 (+1100) Subject: Some test tidying and improvements X-Git-Tag: v1.0.0~244 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=50c1cdb601a5c971574b5d562a3f1ebcd7416be3;p=btrtrc.git Some test tidying and improvements --- diff --git a/bad_storage.go b/bad_storage.go new file mode 100644 index 00000000..16fd557c --- /dev/null +++ b/bad_storage.go @@ -0,0 +1,57 @@ +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()) +} diff --git a/client_test.go b/client_test.go index 14030b5b..2cb78e5f 100644 --- a/client_test.go +++ b/client_test.go @@ -2,15 +2,12 @@ package torrent import ( "encoding/binary" - "errors" "fmt" "io" "io/ioutil" - "math/rand" "net" "os" "path/filepath" - "strings" "sync" "testing" "time" @@ -389,14 +386,14 @@ func testClientTransfer(t *testing.T, ps testClientTransferParams) { 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 @@ -404,8 +401,12 @@ func testClientTransfer(t *testing.T, ps testClientTransferParams) { 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() @@ -414,16 +415,12 @@ func testClientTransfer(t *testing.T, ps testClientTransferParams) { 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) } @@ -515,53 +512,6 @@ func TestMergingTrackersByAddingSpecs(t *testing.T) { 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()