]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Add a test for storage write errors
authorMatt Joiner <anacrolix@gmail.com>
Fri, 21 Feb 2020 03:56:21 +0000 (14:56 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Fri, 21 Feb 2020 03:56:21 +0000 (14:56 +1100)
Addresses #377

test/issue377_test.go [new file with mode: 0644]

diff --git a/test/issue377_test.go b/test/issue377_test.go
new file mode 100644 (file)
index 0000000..0c2e383
--- /dev/null
@@ -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
+}