mirror of https://github.com/restic/restic.git
backend: test that a wrong hash fails an upload
This commit is contained in:
parent
7c1903e1ee
commit
f4c5dec05d
|
@ -611,6 +611,52 @@ func (s *Suite) TestSaveError(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type wrongByteReader struct {
|
||||||
|
restic.ByteReader
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *wrongByteReader) Hash() []byte {
|
||||||
|
h := b.ByteReader.Hash()
|
||||||
|
modHash := make([]byte, len(h))
|
||||||
|
copy(modHash, h)
|
||||||
|
// flip a bit in the hash
|
||||||
|
modHash[0] ^= 0x01
|
||||||
|
return modHash
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestSaveWrongHash tests that uploads with a wrong hash fail
|
||||||
|
func (s *Suite) TestSaveWrongHash(t *testing.T) {
|
||||||
|
seedRand(t)
|
||||||
|
|
||||||
|
b := s.open(t)
|
||||||
|
defer s.close(t, b)
|
||||||
|
// nothing to do if the backend doesn't support external hashes
|
||||||
|
if b.Hasher() == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
length := rand.Intn(1<<23) + 200000
|
||||||
|
data := test.Random(25, length)
|
||||||
|
var id restic.ID
|
||||||
|
copy(id[:], data)
|
||||||
|
|
||||||
|
// test that upload with hash mismatch fails
|
||||||
|
h := restic.Handle{Type: restic.PackFile, Name: id.String()}
|
||||||
|
err := b.Save(context.TODO(), h, &wrongByteReader{ByteReader: *restic.NewByteReader(data, b.Hasher())})
|
||||||
|
exists, err2 := b.Test(context.TODO(), h)
|
||||||
|
if err2 != nil {
|
||||||
|
t.Fatal(err2)
|
||||||
|
}
|
||||||
|
_ = s.delayedRemove(t, b, h)
|
||||||
|
if err == nil {
|
||||||
|
t.Fatal("upload with wrong hash did not fail")
|
||||||
|
}
|
||||||
|
t.Logf("%v", err)
|
||||||
|
if exists {
|
||||||
|
t.Fatal("Backend returned an error but stored the file anyways")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var filenameTests = []struct {
|
var filenameTests = []struct {
|
||||||
name string
|
name string
|
||||||
data string
|
data string
|
||||||
|
|
Loading…
Reference in New Issue