69 lines
1.7 KiB
Go
69 lines
1.7 KiB
Go
// This infernal language makes me copy conditional compilation expressions around. This test should
|
|
// run if sqlite storage is enabled, period.
|
|
|
|
//go:build cgo
|
|
// +build cgo
|
|
|
|
package test
|
|
|
|
import (
|
|
"net"
|
|
"net/http"
|
|
"testing"
|
|
|
|
qt "github.com/frankban/quicktest"
|
|
|
|
"github.com/anacrolix/torrent"
|
|
"github.com/anacrolix/torrent/bencode"
|
|
"github.com/anacrolix/torrent/metainfo"
|
|
sqliteStorage "github.com/anacrolix/torrent/storage/sqlite"
|
|
)
|
|
|
|
func TestSqliteStorageClosed(t *testing.T) {
|
|
c := qt.New(t)
|
|
cfg := torrent.TestingConfig(t)
|
|
storage, err := sqliteStorage.NewDirectStorage(sqliteStorage.NewDirectStorageOpts{})
|
|
defer storage.Close()
|
|
cfg.DefaultStorage = storage
|
|
cfg.Debug = true
|
|
c.Assert(err, qt.IsNil)
|
|
cl, err := torrent.NewClient(cfg)
|
|
c.Assert(err, qt.IsNil)
|
|
defer cl.Close()
|
|
l, err := net.Listen("tcp", "localhost:0")
|
|
c.Assert(err, qt.IsNil)
|
|
defer l.Close()
|
|
// We need at least once piece to trigger a call to storage to determine completion state. We
|
|
// need non-zero content length to trigger piece hashing.
|
|
i := metainfo.Info{
|
|
Pieces: make([]byte, metainfo.HashSize),
|
|
PieceLength: 1,
|
|
Files: []metainfo.FileInfo{
|
|
{Length: 1},
|
|
},
|
|
}
|
|
mi := metainfo.MetaInfo{}
|
|
mi.InfoBytes, err = bencode.Marshal(i)
|
|
c.Assert(err, qt.IsNil)
|
|
s := http.Server{
|
|
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
mi.Write(w)
|
|
}),
|
|
}
|
|
defer s.Close()
|
|
go func() {
|
|
err := s.Serve(l)
|
|
if err != http.ErrServerClosed {
|
|
panic(err)
|
|
}
|
|
}()
|
|
// Close storage prematurely.
|
|
storage.Close()
|
|
tor, _, err := cl.AddTorrentSpec(&torrent.TorrentSpec{
|
|
InfoHash: mi.HashInfoBytes(),
|
|
Sources: []string{"http://" + l.Addr().String()},
|
|
})
|
|
c.Assert(err, qt.IsNil)
|
|
<-tor.GotInfo()
|
|
}
|