]> Sergey Matveev's repositories - btrtrc.git/blob - fs/torrentfs_test.go
Improvements to pending chunks; extract testutil
[btrtrc.git] / fs / torrentfs_test.go
1 package torrentfs
2
3 import (
4         "bytes"
5         "io/ioutil"
6         "net"
7         "os"
8         "path/filepath"
9         "testing"
10         "time"
11
12         "bitbucket.org/anacrolix/go.torrent/testutil"
13
14         "bazil.org/fuse"
15         fusefs "bazil.org/fuse/fs"
16         "bitbucket.org/anacrolix/go.torrent"
17         metainfo "github.com/nsf/libtorgo/torrent"
18 )
19
20 func TestTCPAddrString(t *testing.T) {
21         ta := &net.TCPAddr{
22                 IP:   net.IPv4(127, 0, 0, 1),
23                 Port: 3000,
24         }
25         s := ta.String()
26         l, err := net.Listen("tcp4", "localhost:3000")
27         if err != nil {
28                 t.Fatal(err)
29         }
30         defer l.Close()
31         c, err := net.Dial("tcp", l.Addr().String())
32         if err != nil {
33                 t.Fatal(err)
34         }
35         defer c.Close()
36         ras := c.RemoteAddr().String()
37         if ras != s {
38                 t.FailNow()
39         }
40 }
41
42 func TestDownloadOnDemand(t *testing.T) {
43         dir, err := ioutil.TempDir("", "torrentfs")
44         if err != nil {
45                 t.Fatal(err)
46         }
47         defer func() {
48                 if err := os.RemoveAll(dir); err != nil {
49                         t.Error(err)
50                 }
51         }()
52         t.Logf("test directory: %s", dir)
53         finishedDir := filepath.Join(dir, "finished")
54         os.Mkdir(finishedDir, 0777)
55         name := testutil.CreateDummyTorrentData(finishedDir)
56         metaInfoBuf := &bytes.Buffer{}
57         testutil.CreateMetaInfo(name, metaInfoBuf)
58         metaInfo, err := metainfo.Load(metaInfoBuf)
59         seeder := torrent.Client{
60                 DataDir: finishedDir,
61                 Listener: func() net.Listener {
62                         conn, err := net.Listen("tcp", ":0")
63                         if err != nil {
64                                 panic(err)
65                         }
66                         return conn
67                 }(),
68         }
69         defer seeder.Listener.Close()
70         seeder.Start()
71         defer seeder.Stop()
72         seeder.AddTorrent(metaInfo)
73         leecher := torrent.Client{
74                 DataDir: filepath.Join(dir, "download"),
75         }
76         leecher.Start()
77         defer leecher.Stop()
78         leecher.AddTorrent(metaInfo)
79         leecher.AddPeers(torrent.BytesInfoHash(metaInfo.InfoHash), []torrent.Peer{func() torrent.Peer {
80                 tcpAddr := seeder.Listener.Addr().(*net.TCPAddr)
81                 return torrent.Peer{
82                         IP:   tcpAddr.IP,
83                         Port: tcpAddr.Port,
84                 }
85         }()})
86         mountDir := filepath.Join(dir, "mnt")
87         os.Mkdir(mountDir, 0777)
88         fs := New(&leecher)
89         fuseConn, err := fuse.Mount(mountDir)
90         if err != nil {
91                 t.Fatal(err)
92         }
93         defer func() {
94                 if err := fuse.Unmount(mountDir); err != nil {
95                         t.Fatal(err)
96                 }
97         }()
98         go func() {
99                 if err := fusefs.Serve(fuseConn, fs); err != nil {
100                         t.Fatal(err)
101                 }
102                 if err := fuseConn.Close(); err != nil {
103                         t.Fatal(err)
104                 }
105         }()
106         <-fuseConn.Ready
107         if fuseConn.MountError != nil {
108                 t.Fatal(fuseConn.MountError)
109         }
110         go func() {
111                 time.Sleep(10 * time.Second)
112                 fuse.Unmount(mountDir)
113         }()
114         content, err := ioutil.ReadFile(filepath.Join(mountDir, "greeting"))
115         if err != nil {
116                 t.Fatal(err)
117         }
118         if string(content) != testutil.GreetingFileContents {
119                 t.FailNow()
120         }
121 }