14 "bitbucket.org/anacrolix/go.torrent/testutil"
17 fusefs "bazil.org/fuse/fs"
18 "bitbucket.org/anacrolix/go.torrent"
19 "github.com/anacrolix/libtorgo/metainfo"
22 func TestTCPAddrString(t *testing.T) {
24 IP: net.IPv4(127, 0, 0, 1),
28 l, err := net.Listen("tcp4", "localhost:3000")
33 c, err := net.Dial("tcp", l.Addr().String())
38 ras := c.RemoteAddr().String()
44 type testLayout struct {
48 Metainfo *metainfo.MetaInfo
51 func (me *testLayout) Destroy() error {
52 return os.RemoveAll(me.BaseDir)
55 func newGreetingLayout() (tl testLayout, err error) {
56 tl.BaseDir, err = ioutil.TempDir("", "torrentfs")
60 tl.Completed = filepath.Join(tl.BaseDir, "completed")
61 os.Mkdir(tl.Completed, 0777)
62 tl.MountDir = filepath.Join(tl.BaseDir, "mnt")
63 os.Mkdir(tl.MountDir, 0777)
64 name := testutil.CreateDummyTorrentData(tl.Completed)
65 metaInfoBuf := &bytes.Buffer{}
66 testutil.CreateMetaInfo(name, metaInfoBuf)
67 tl.Metainfo, err = metainfo.Load(metaInfoBuf)
71 func TestUnmountWedged(t *testing.T) {
72 layout, err := newGreetingLayout()
77 err := layout.Destroy()
82 client := torrent.Client{
83 DataDir: filepath.Join(layout.BaseDir, "incomplete"),
84 DisableTrackers: true,
87 log.Printf("%+v", *layout.Metainfo)
88 client.AddTorrent(layout.Metainfo)
90 fuseConn, err := fuse.Mount(layout.MountDir)
95 server := fusefs.Server{
97 Debug: func(msg interface{}) {
101 server.Serve(fuseConn)
104 if err := fuseConn.MountError; err != nil {
108 ioutil.ReadFile(filepath.Join(layout.MountDir, layout.Metainfo.Name))
110 time.Sleep(time.Second)
112 time.Sleep(time.Second)
113 err = fuse.Unmount(layout.MountDir)
117 err = fuseConn.Close()
123 func TestDownloadOnDemand(t *testing.T) {
124 layout, err := newGreetingLayout()
128 seeder := torrent.Client{
129 DataDir: layout.Completed,
130 Listener: func() net.Listener {
131 conn, err := net.Listen("tcp", ":0")
137 DisableTrackers: true,
139 defer seeder.Listener.Close()
142 err = seeder.AddMagnet(fmt.Sprintf("magnet:?xt=urn:btih:%x", layout.Metainfo.InfoHash))
146 leecher := torrent.Client{
147 DataDir: filepath.Join(layout.BaseDir, "download"),
148 DownloadStrategy: &torrent.ResponsiveDownloadStrategy{},
149 DisableTrackers: true,
153 leecher.AddTorrent(layout.Metainfo)
154 leecher.AddPeers(torrent.BytesInfoHash(layout.Metainfo.InfoHash), []torrent.Peer{func() torrent.Peer {
155 tcpAddr := seeder.Listener.Addr().(*net.TCPAddr)
162 mountDir := layout.MountDir
163 fuseConn, err := fuse.Mount(layout.MountDir)
168 if err := fuse.Unmount(mountDir); err != nil {
173 if err := fusefs.Serve(fuseConn, fs); err != nil {
176 if err := fuseConn.Close(); err != nil {
181 if fuseConn.MountError != nil {
182 t.Fatal(fuseConn.MountError)
185 time.Sleep(10 * time.Second)
186 if err := fuse.Unmount(mountDir); err != nil {
190 content, err := ioutil.ReadFile(filepath.Join(mountDir, "greeting"))
194 if string(content) != testutil.GreetingFileContents {