From b16118ee18557ba27f6b636c3a300a1f41996aa0 Mon Sep 17 00:00:00 2001
From: Matt Joiner <anacrolix@gmail.com>
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.51.0