]> Sergey Matveev's repositories - btrtrc.git/blob - test/issue377_test.go
Add a test for storage write errors
[btrtrc.git] / test / issue377_test.go
1 package test
2
3 import (
4         "errors"
5         "os"
6         "testing"
7
8         "github.com/stretchr/testify/assert"
9         "github.com/stretchr/testify/require"
10
11         "github.com/anacrolix/torrent"
12         "github.com/anacrolix/torrent/internal/testutil"
13         "github.com/anacrolix/torrent/metainfo"
14         "github.com/anacrolix/torrent/storage"
15 )
16
17 func TestReceiveChunkStorageFailure(t *testing.T) {
18         seederDataDir, metainfo := testutil.GreetingTestTorrent()
19         defer os.RemoveAll(seederDataDir)
20         seederClientConfig := torrent.TestingConfig()
21         seederClientConfig.Debug = true
22         seederClientStorage := storage.NewMMap(seederDataDir)
23         defer seederClientStorage.Close()
24         seederClientConfig.DefaultStorage = seederClientStorage
25         seederClientConfig.Seed = true
26         seederClientConfig.Debug = true
27         seederClient, err := torrent.NewClient(seederClientConfig)
28         require.NoError(t, err)
29         defer testutil.ExportStatusWriter(seederClient, "s")()
30         leecherClientConfig := torrent.TestingConfig()
31         leecherClientConfig.Debug = true
32         leecherClient, err := torrent.NewClient(leecherClientConfig)
33         require.NoError(t, err)
34         defer testutil.ExportStatusWriter(leecherClient, "l")()
35         leecherTorrent, new, err := leecherClient.AddTorrentSpec(&torrent.TorrentSpec{
36                 InfoHash: metainfo.HashInfoBytes(),
37                 Storage:  diskFullStorage{},
38         })
39         require.NoError(t, err)
40         assert.True(t, new)
41         seederTorrent, err := seederClient.AddTorrent(metainfo)
42         require.NoError(t, err)
43         // Tell the seeder to find the leecher. Is it guaranteed seeders will always try to do this?
44         seederTorrent.AddClientPeer(leecherClient)
45         //leecherTorrent.AddClientPeer(seederClient)
46         <-leecherTorrent.GotInfo()
47         assertReadAllGreeting(t, leecherTorrent.NewReader())
48 }
49
50 type diskFullStorage struct{}
51
52 func (me diskFullStorage) ReadAt(p []byte, off int64) (n int, err error) {
53         panic("implement me")
54 }
55
56 func (me diskFullStorage) WriteAt(p []byte, off int64) (n int, err error) {
57         return 1, errors.New("disk full")
58 }
59
60 func (me diskFullStorage) MarkComplete() error {
61         panic("implement me")
62 }
63
64 func (me diskFullStorage) MarkNotComplete() error {
65         panic("implement me")
66 }
67
68 func (me diskFullStorage) Completion() storage.Completion {
69         return storage.Completion{
70                 Complete: false,
71                 Ok:       true,
72         }
73 }
74
75 func (me diskFullStorage) Piece(metainfo.Piece) storage.PieceImpl {
76         return me
77 }
78
79 func (me diskFullStorage) Close() error {
80         panic("implement me")
81 }
82
83 func (d diskFullStorage) OpenTorrent(info *metainfo.Info, infoHash metainfo.Hash) (storage.TorrentImpl, error) {
84         return d, nil
85 }