2
0
mirror of synced 2025-02-23 14:18:13 +00:00

Add a test for storage write errors

Addresses #377
This commit is contained in:
Matt Joiner 2020-02-21 14:56:21 +11:00
parent c855c7a366
commit b16118ee18

85
test/issue377_test.go Normal file
View File

@ -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
}