]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Add test checking that cancel works
authorMatt Joiner <anacrolix@gmail.com>
Fri, 26 Feb 2016 11:10:29 +0000 (22:10 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Fri, 26 Feb 2016 11:10:29 +0000 (22:10 +1100)
client_test.go

index 95f25f867135731171cd19b18245698e90315f90..e4cf03ea36b0b80b892215eb59d9678a8e3511ca 100644 (file)
@@ -772,3 +772,95 @@ func TestAddMetainfoWithNodes(t *testing.T) {
        assert.Len(t, tt.torrent.Trackers, 5)
        assert.EqualValues(t, 6, cl.DHT().NumNodes())
 }
+
+type testDownloadCancelParams struct {
+       Responsive                bool
+       Readahead                 int64
+       SetReadahead              bool
+       ExportClientStatus        bool
+       SetLeecherStorageCapacity bool
+       LeecherStorageCapacity    int64
+       Cancel                    bool
+}
+
+func testDownloadCancel(t *testing.T, ps testDownloadCancelParams) {
+       greetingTempDir, mi := testutil.GreetingTestTorrent()
+       defer os.RemoveAll(greetingTempDir)
+       cfg := TestingConfig
+       cfg.Seed = true
+       cfg.DataDir = greetingTempDir
+       seeder, err := NewClient(&cfg)
+       require.NoError(t, err)
+       defer seeder.Close()
+       if ps.ExportClientStatus {
+               testutil.ExportStatusWriter(seeder, "s")
+       }
+       seeder.AddTorrentSpec(TorrentSpecFromMetaInfo(mi))
+       leecherDataDir, err := ioutil.TempDir("", "")
+       require.NoError(t, err)
+       defer os.RemoveAll(leecherDataDir)
+       cfg.TorrentDataOpener = func() TorrentDataOpener {
+               fc, err := filecache.NewCache(leecherDataDir)
+               require.NoError(t, err)
+               if ps.SetLeecherStorageCapacity {
+                       fc.SetCapacity(ps.LeecherStorageCapacity)
+               }
+               store := pieceStore.New(fileCacheDataBackend.New(fc))
+               return func(mi *metainfo.Info) Data {
+                       return store.OpenTorrentData(mi)
+               }
+       }()
+       leecher, _ := NewClient(&cfg)
+       defer leecher.Close()
+       if ps.ExportClientStatus {
+               testutil.ExportStatusWriter(leecher, "l")
+       }
+       leecherGreeting, new, err := leecher.AddTorrentSpec(func() (ret *TorrentSpec) {
+               ret = TorrentSpecFromMetaInfo(mi)
+               ret.ChunkSize = 2
+               return
+       }())
+       require.NoError(t, err)
+       assert.True(t, new)
+       psc := leecherGreeting.SubscribePieceStateChanges()
+       defer psc.Close()
+       leecherGreeting.DownloadAll()
+       if ps.Cancel {
+               leecherGreeting.CancelPieces(0, leecherGreeting.NumPieces())
+       }
+       leecherGreeting.AddPeers([]Peer{
+               Peer{
+                       IP:   missinggo.AddrIP(seeder.ListenAddr()),
+                       Port: missinggo.AddrPort(seeder.ListenAddr()),
+               },
+       })
+       completes := make(map[int]bool, 3)
+values:
+       for {
+               started := time.Now()
+               select {
+               case _v := <-psc.Values:
+                       log.Print(time.Since(started))
+                       v := _v.(PieceStateChange)
+                       completes[v.Index] = v.Complete
+               case <-time.After(10 * time.Millisecond):
+                       break values
+               }
+       }
+       if ps.Cancel {
+               assert.EqualValues(t, map[int]bool{0: false, 1: false, 2: false}, completes)
+       } else {
+               assert.EqualValues(t, map[int]bool{0: true, 1: true, 2: true}, completes)
+       }
+
+}
+
+func TestTorrentDownloadAll(t *testing.T) {
+       testDownloadCancel(t, testDownloadCancelParams{})
+}
+
+func TestTorrentDownloadAllThenCancel(t *testing.T) {
+       testDownloadCancel(t, testDownloadCancelParams{
+               Cancel: true,
+       })
+}