log.SetFlags(log.LstdFlags | log.Llongfile)
}
-var TestingConfig = Config{
- ListenAddr: "localhost:0",
- NoDHT: true,
- DisableTrackers: true,
- DataDir: "/tmp/anacrolix",
- DHTConfig: dht.ServerConfig{
- NoDefaultBootstrap: true,
- },
- Debug: true,
+func TestingConfig() *Config {
+ return &Config{
+ ListenAddr: "localhost:0",
+ NoDHT: true,
+ DisableTrackers: true,
+ DataDir: func() string {
+ ret, err := ioutil.TempDir("", "")
+ if err != nil {
+ panic(err)
+ }
+ return ret
+ }(),
+ DHTConfig: dht.ServerConfig{
+ NoDefaultBootstrap: true,
+ },
+ Debug: true,
+ }
}
func TestClientDefault(t *testing.T) {
- cl, err := NewClient(&TestingConfig)
+ cl, err := NewClient(TestingConfig())
+ require.NoError(t, err)
+ cl.Close()
+}
+
+func TestBoltPieceCompletionClosedWhenClientClosed(t *testing.T) {
+ cfg := TestingConfig()
+ pc, err := storage.NewBoltPieceCompletion(cfg.DataDir)
+ require.NoError(t, err)
+ ci := storage.NewFileWithCompletion(cfg.DataDir, pc)
+ defer ci.Close()
+ cfg.DefaultStorage = ci
+ cl, err := NewClient(cfg)
+ require.NoError(t, err)
+ cl.Close()
+ // And again, https://github.com/anacrolix/torrent/issues/158
+ cl, err = NewClient(cfg)
require.NoError(t, err)
cl.Close()
}
func TestAddDropTorrent(t *testing.T) {
- cl, err := NewClient(&TestingConfig)
+ cl, err := NewClient(TestingConfig())
require.NoError(t, err)
defer cl.Close()
dir, mi := testutil.GreetingTestTorrent()
pieceStateChanges: pubsub.NewPubSub(),
}
tor.chunkSize = 2
- tor.storageOpener = storage.NewClient(storage.NewFile("/dev/null"))
+ tor.storageOpener = storage.NewClient(storage.NewFileWithCompletion("/dev/null", storage.NewMapPieceCompletion()))
// Needed to lock for asynchronous piece verification.
tor.cl = new(Client)
err := tor.setInfoBytes(mi.InfoBytes)
func TestTwoClientsArbitraryPorts(t *testing.T) {
for i := 0; i < 2; i++ {
- cl, err := NewClient(&TestingConfig)
+ cl, err := NewClient(TestingConfig())
if err != nil {
t.Fatal(err)
}
}
func TestAddDropManyTorrents(t *testing.T) {
- cl, err := NewClient(&TestingConfig)
+ cl, err := NewClient(TestingConfig())
require.NoError(t, err)
defer cl.Close()
for i := range iter.N(1000) {
greetingTempDir, mi := testutil.GreetingTestTorrent()
defer os.RemoveAll(greetingTempDir)
// Create seeder and a Torrent.
- cfg := TestingConfig
+ cfg := TestingConfig()
cfg.Seed = true
cfg.UploadRateLimiter = ps.SeederUploadRateLimiter
// cfg.ListenAddr = "localhost:4000"
if ps.SeederStorage != nil {
cfg.DefaultStorage = ps.SeederStorage(greetingTempDir)
+ defer cfg.DefaultStorage.Close()
} else {
cfg.DataDir = greetingTempDir
}
- seeder, err := NewClient(&cfg)
+ seeder, err := NewClient(cfg)
require.NoError(t, err)
defer seeder.Close()
if ps.ExportClientStatus {
}
cfg.DownloadRateLimiter = ps.LeecherDownloadRateLimiter
// cfg.ListenAddr = "localhost:4001"
- leecher, err := NewClient(&cfg)
+ leecher, err := NewClient(cfg)
require.NoError(t, err)
defer leecher.Close()
if ps.ExportClientStatus {
leecherGreeting, new, err := leecher.AddTorrentSpec(func() (ret *TorrentSpec) {
ret = TorrentSpecFromMetaInfo(mi)
ret.ChunkSize = 2
- ret.Storage = storage.NewFile(leecherDataDir)
return
}())
require.NoError(t, err)
func TestSeedAfterDownloading(t *testing.T) {
greetingTempDir, mi := testutil.GreetingTestTorrent()
defer os.RemoveAll(greetingTempDir)
- cfg := TestingConfig
+ cfg := TestingConfig()
cfg.Seed = true
cfg.DataDir = greetingTempDir
- seeder, err := NewClient(&cfg)
+ seeder, err := NewClient(cfg)
require.NoError(t, err)
defer seeder.Close()
testutil.ExportStatusWriter(seeder, "s")
cfg.DataDir, err = ioutil.TempDir("", "")
require.NoError(t, err)
defer os.RemoveAll(cfg.DataDir)
- leecher, err := NewClient(&cfg)
+ leecher, err := NewClient(cfg)
require.NoError(t, err)
defer leecher.Close()
testutil.ExportStatusWriter(leecher, "l")
cfg.DataDir, err = ioutil.TempDir("", "")
require.NoError(t, err)
defer os.RemoveAll(cfg.DataDir)
- leecherLeecher, _ := NewClient(&cfg)
+ leecherLeecher, _ := NewClient(cfg)
defer leecherLeecher.Close()
testutil.ExportStatusWriter(leecherLeecher, "ll")
leecherGreeting, _, _ := leecher.AddTorrentSpec(func() (ret *TorrentSpec) {
}
func TestMergingTrackersByAddingSpecs(t *testing.T) {
- cl, err := NewClient(&TestingConfig)
+ cl, err := NewClient(TestingConfig())
require.NoError(t, err)
defer cl.Close()
spec := TorrentSpec{}
// We read from a piece which is marked completed, but is missing data.
func TestCompletedPieceWrongSize(t *testing.T) {
- cfg := TestingConfig
+ cfg := TestingConfig()
cfg.DefaultStorage = badStorage{}
- cl, err := NewClient(&cfg)
+ cl, err := NewClient(cfg)
require.NoError(t, err)
defer cl.Close()
info := metainfo.Info{
}
func BenchmarkAddLargeTorrent(b *testing.B) {
- cfg := TestingConfig
+ cfg := TestingConfig()
cfg.DisableTCP = true
cfg.DisableUTP = true
cfg.ListenAddr = "redonk"
- cl, err := NewClient(&cfg)
+ cl, err := NewClient(cfg)
require.NoError(b, err)
defer cl.Close()
for range iter.N(b.N) {
func TestResponsive(t *testing.T) {
seederDataDir, mi := testutil.GreetingTestTorrent()
defer os.RemoveAll(seederDataDir)
- cfg := TestingConfig
+ cfg := TestingConfig()
cfg.Seed = true
cfg.DataDir = seederDataDir
- seeder, err := NewClient(&cfg)
+ seeder, err := NewClient(cfg)
require.Nil(t, err)
defer seeder.Close()
seeder.AddTorrentSpec(TorrentSpecFromMetaInfo(mi))
leecherDataDir, err := ioutil.TempDir("", "")
require.Nil(t, err)
defer os.RemoveAll(leecherDataDir)
- cfg = TestingConfig
+ cfg = TestingConfig()
cfg.DataDir = leecherDataDir
- leecher, err := NewClient(&cfg)
+ leecher, err := NewClient(cfg)
require.Nil(t, err)
defer leecher.Close()
leecherTorrent, _, _ := leecher.AddTorrentSpec(func() (ret *TorrentSpec) {
func TestTorrentDroppedDuringResponsiveRead(t *testing.T) {
seederDataDir, mi := testutil.GreetingTestTorrent()
defer os.RemoveAll(seederDataDir)
- cfg := TestingConfig
+ cfg := TestingConfig()
cfg.Seed = true
cfg.DataDir = seederDataDir
- seeder, err := NewClient(&cfg)
+ seeder, err := NewClient(cfg)
require.Nil(t, err)
defer seeder.Close()
seeder.AddTorrentSpec(TorrentSpecFromMetaInfo(mi))
leecherDataDir, err := ioutil.TempDir("", "")
require.Nil(t, err)
defer os.RemoveAll(leecherDataDir)
- cfg = TestingConfig
+ cfg = TestingConfig()
cfg.DataDir = leecherDataDir
- leecher, err := NewClient(&cfg)
+ leecher, err := NewClient(cfg)
require.Nil(t, err)
defer leecher.Close()
leecherTorrent, _, _ := leecher.AddTorrentSpec(func() (ret *TorrentSpec) {
func TestDHTInheritBlocklist(t *testing.T) {
ipl := iplist.New(nil)
require.NotNil(t, ipl)
- cfg := TestingConfig
+ cfg := TestingConfig()
cfg.IPBlocklist = ipl
cfg.NoDHT = false
- cl, err := NewClient(&cfg)
+ cl, err := NewClient(cfg)
require.NoError(t, err)
defer cl.Close()
require.Equal(t, ipl, cl.DHT().IPBlocklist())
// Check that stuff is merged in subsequent AddTorrentSpec for the same
// infohash.
func TestAddTorrentSpecMerging(t *testing.T) {
- cl, err := NewClient(&TestingConfig)
+ cl, err := NewClient(TestingConfig())
require.NoError(t, err)
defer cl.Close()
dir, mi := testutil.GreetingTestTorrent()
func TestTorrentDroppedBeforeGotInfo(t *testing.T) {
dir, mi := testutil.GreetingTestTorrent()
os.RemoveAll(dir)
- cl, _ := NewClient(&TestingConfig)
+ cl, _ := NewClient(TestingConfig())
defer cl.Close()
tt, _, _ := cl.AddTorrentSpec(&TorrentSpec{
InfoHash: mi.HashInfoBytes(),
assert.NoError(t, err)
}
}
- cfg := TestingConfig
+ cfg := TestingConfig()
// TODO: Disable network option?
cfg.DisableTCP = true
cfg.DisableUTP = true
cfg.DefaultStorage = filePieceStore
- cl, err := NewClient(&cfg)
+ cl, err := NewClient(cfg)
require.NoError(t, err)
defer cl.Close()
tt, err := cl.AddTorrent(greetingMetainfo)
}
func TestAddMetainfoWithNodes(t *testing.T) {
- cfg := TestingConfig
+ cfg := TestingConfig()
cfg.NoDHT = false
// For now, we want to just jam the nodes into the table, without
// verifying them first. Also the DHT code doesn't support mixing secure
// and insecure nodes if security is enabled (yet).
cfg.DHTConfig.NoSecurity = true
- cl, err := NewClient(&cfg)
+ cl, err := NewClient(cfg)
require.NoError(t, err)
defer cl.Close()
assert.EqualValues(t, cl.DHT().NumNodes(), 0)
func testDownloadCancel(t *testing.T, ps testDownloadCancelParams) {
greetingTempDir, mi := testutil.GreetingTestTorrent()
defer os.RemoveAll(greetingTempDir)
- cfg := TestingConfig
+ cfg := TestingConfig()
cfg.Seed = true
cfg.DataDir = greetingTempDir
- seeder, err := NewClient(&cfg)
+ seeder, err := NewClient(cfg)
require.NoError(t, err)
defer seeder.Close()
if ps.ExportClientStatus {
}
cfg.DefaultStorage = storage.NewResourcePieces(fc.AsResourceProvider())
cfg.DataDir = leecherDataDir
- leecher, _ := NewClient(&cfg)
+ leecher, _ := NewClient(cfg)
defer leecher.Close()
if ps.ExportClientStatus {
testutil.ExportStatusWriter(leecher, "l")
// Ensure that it's an error for a peer to send an invalid have message.
func TestPeerInvalidHave(t *testing.T) {
- cl, err := NewClient(&TestingConfig)
+ cl, err := NewClient(TestingConfig())
require.NoError(t, err)
defer cl.Close()
info := metainfo.Info{
func TestPieceCompletedInStorageButNotClient(t *testing.T) {
greetingTempDir, greetingMetainfo := testutil.GreetingTestTorrent()
defer os.RemoveAll(greetingTempDir)
- cfg := TestingConfig
+ cfg := TestingConfig()
cfg.DataDir = greetingTempDir
- seeder, err := NewClient(&TestingConfig)
+ seeder, err := NewClient(TestingConfig())
require.NoError(t, err)
seeder.AddTorrentSpec(&TorrentSpec{
InfoBytes: greetingMetainfo.InfoBytes,
// Check that when the listen port is 0, all the protocols listened on have
// the same port, and it isn't zero.
func TestClientDynamicListenPortAllProtocols(t *testing.T) {
- cl, err := NewClient(&TestingConfig)
+ cl, err := NewClient(TestingConfig())
require.NoError(t, err)
defer cl.Close()
assert.NotEqual(t, 0, missinggo.AddrPort(cl.ListenAddr()))
}
func TestClientDynamicListenTCPOnly(t *testing.T) {
- cfg := TestingConfig
+ cfg := TestingConfig()
cfg.DisableUTP = true
- cl, err := NewClient(&cfg)
+ cl, err := NewClient(cfg)
require.NoError(t, err)
defer cl.Close()
assert.NotEqual(t, 0, missinggo.AddrPort(cl.ListenAddr()))
}
func TestClientDynamicListenUTPOnly(t *testing.T) {
- cfg := TestingConfig
+ cfg := TestingConfig()
cfg.DisableTCP = true
- cl, err := NewClient(&cfg)
+ cl, err := NewClient(cfg)
require.NoError(t, err)
defer cl.Close()
assert.NotEqual(t, 0, missinggo.AddrPort(cl.ListenAddr()))
}
func TestClientDynamicListenPortNoProtocols(t *testing.T) {
- cfg := TestingConfig
+ cfg := TestingConfig()
cfg.DisableTCP = true
cfg.DisableUTP = true
- cl, err := NewClient(&cfg)
+ cl, err := NewClient(cfg)
require.NoError(t, err)
defer cl.Close()
assert.Nil(t, cl.ListenAddr())
func TestSetMaxEstablishedConn(t *testing.T) {
var tts []*Torrent
ih := testutil.GreetingMetaInfo().HashInfoBytes()
- cfg := TestingConfig
for i := range iter.N(3) {
- cl, err := NewClient(&cfg)
+ cl, err := NewClient(TestingConfig())
require.NoError(t, err)
defer cl.Close()
tt, _ := cl.AddTorrentInfoHash(ih)
// https://github.com/anacrolix/torrent/issues/114
func TestMultipleTorrentsWithEncryption(t *testing.T) {
- cfg := TestingConfig
+ cfg := TestingConfig()
cfg.DisableUTP = true
cfg.Seed = true
cfg.DataDir = filepath.Join(cfg.DataDir, "server")
cfg.Debug = true
cfg.ForceEncryption = true
os.Mkdir(cfg.DataDir, 0755)
- server, err := NewClient(&cfg)
+ server, err := NewClient(cfg)
require.NoError(t, err)
defer server.Close()
testutil.ExportStatusWriter(server, "s")
magnet1 := makeMagnet(t, server, cfg.DataDir, "test1")
makeMagnet(t, server, cfg.DataDir, "test2")
- cfg = TestingConfig
+ cfg = TestingConfig()
cfg.DisableUTP = true
cfg.DataDir = filepath.Join(cfg.DataDir, "client")
cfg.Debug = true
cfg.ForceEncryption = true
- client, err := NewClient(&cfg)
+ client, err := NewClient(cfg)
require.NoError(t, err)
defer client.Close()
testutil.ExportStatusWriter(client, "c")