backend: Check that backends do not close the reader
This commit is contained in:
parent
c99a44b122
commit
925a3cfad7
1 changed files with 52 additions and 0 deletions
|
@ -6,8 +6,10 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
"restic"
|
"restic"
|
||||||
|
"restic/errors"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -271,6 +273,16 @@ func TestLoad(t testing.TB) {
|
||||||
test.OK(t, b.Remove(restic.DataFile, id.String()))
|
test.OK(t, b.Remove(restic.DataFile, id.String()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type errorCloser struct {
|
||||||
|
io.Reader
|
||||||
|
t testing.TB
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ec errorCloser) Close() error {
|
||||||
|
ec.t.Error("forbidden method close was called")
|
||||||
|
return errors.New("forbidden method close was called")
|
||||||
|
}
|
||||||
|
|
||||||
// TestSave tests saving data in the backend.
|
// TestSave tests saving data in the backend.
|
||||||
func TestSave(t testing.TB) {
|
func TestSave(t testing.TB) {
|
||||||
b := open(t)
|
b := open(t)
|
||||||
|
@ -312,6 +324,46 @@ func TestSave(t testing.TB) {
|
||||||
t.Fatalf("error removing item: %v", err)
|
t.Fatalf("error removing item: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// test saving from a tempfile
|
||||||
|
tmpfile, err := ioutil.TempFile("", "restic-backend-save-test-")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
length := rand.Intn(1<<23) + 200000
|
||||||
|
data := test.Random(23, length)
|
||||||
|
copy(id[:], data)
|
||||||
|
|
||||||
|
if _, err = tmpfile.Write(data); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err = tmpfile.Seek(0, 0); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
h := restic.Handle{Type: restic.DataFile, Name: id.String()}
|
||||||
|
|
||||||
|
// wrap the tempfile in an errorCloser, so we can detect if the backend
|
||||||
|
// closes the reader
|
||||||
|
err = b.Save(h, errorCloser{t: t, Reader: tmpfile})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = tmpfile.Close(); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = os.Remove(tmpfile.Name()); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = b.Remove(h.Type, h.Name)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("error removing item: %v", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var filenameTests = []struct {
|
var filenameTests = []struct {
|
||||||
|
|
Loading…
Add table
Reference in a new issue