From b16118ee18557ba27f6b636c3a300a1f41996aa0 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Fri, 21 Feb 2020 14:56:21 +1100 Subject: [PATCH] Add a test for storage write errors Addresses #377 --- test/issue377_test.go | 85 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 test/issue377_test.go diff --git a/test/issue377_test.go b/test/issue377_test.go new file mode 100644 index 00000000..0c2e3837 --- /dev/null +++ b/test/issue377_test.go @@ -0,0 +1,85 @@ +package test + +import ( + "errors" + "os" + "testing" + + "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" + "github.com/anacrolix/torrent/storage" +) + +func TestReceiveChunkStorageFailure(t *testing.T) { + seederDataDir, metainfo := testutil.GreetingTestTorrent() + defer os.RemoveAll(seederDataDir) + seederClientConfig := torrent.TestingConfig() + seederClientConfig.Debug = true + seederClientStorage := storage.NewMMap(seederDataDir) + defer seederClientStorage.Close() + seederClientConfig.DefaultStorage = seederClientStorage + seederClientConfig.Seed = true + seederClientConfig.Debug = true + seederClient, err := torrent.NewClient(seederClientConfig) + require.NoError(t, err) + defer testutil.ExportStatusWriter(seederClient, "s")() + leecherClientConfig := torrent.TestingConfig() + leecherClientConfig.Debug = true + leecherClient, err := torrent.NewClient(leecherClientConfig) + require.NoError(t, err) + defer testutil.ExportStatusWriter(leecherClient, "l")() + leecherTorrent, new, err := leecherClient.AddTorrentSpec(&torrent.TorrentSpec{ + InfoHash: metainfo.HashInfoBytes(), + Storage: diskFullStorage{}, + }) + require.NoError(t, err) + assert.True(t, new) + seederTorrent, err := seederClient.AddTorrent(metainfo) + require.NoError(t, err) + // Tell the seeder to find the leecher. Is it guaranteed seeders will always try to do this? + seederTorrent.AddClientPeer(leecherClient) + //leecherTorrent.AddClientPeer(seederClient) + <-leecherTorrent.GotInfo() + assertReadAllGreeting(t, leecherTorrent.NewReader()) +} + +type diskFullStorage struct{} + +func (me diskFullStorage) ReadAt(p []byte, off int64) (n int, err error) { + panic("implement me") +} + +func (me diskFullStorage) WriteAt(p []byte, off int64) (n int, err error) { + return 1, errors.New("disk full") +} + +func (me diskFullStorage) MarkComplete() error { + panic("implement me") +} + +func (me diskFullStorage) MarkNotComplete() error { + panic("implement me") +} + +func (me diskFullStorage) Completion() storage.Completion { + return storage.Completion{ + Complete: false, + Ok: true, + } +} + +func (me diskFullStorage) Piece(metainfo.Piece) storage.PieceImpl { + return me +} + +func (me diskFullStorage) Close() error { + panic("implement me") +} + +func (d diskFullStorage) OpenTorrent(info *metainfo.Info, infoHash metainfo.Hash) (storage.TorrentImpl, error) { + return d, nil +} -- 2.44.0