1
0
Fork 0
mirror of https://github.com/restic/restic.git synced 2025-03-30 00:00:14 +01:00

repository/packer: add unit test for Merge method

This commit is contained in:
Michael Eischer 2025-03-24 17:04:02 +01:00
parent 37aa4f824f
commit ccb92f5bf0
2 changed files with 46 additions and 9 deletions

View file

@ -163,6 +163,8 @@ func makeHeader(blobs []restic.Blob) ([]byte, error) {
return buf, nil
}
// Merge merges another packer into the current packer. Both packers must not be
// finalized yet.
func (p *Packer) Merge(other *Packer, otherData io.Reader) error {
other.m.Lock()
defer other.m.Unlock()

View file

@ -25,15 +25,7 @@ type Buf struct {
}
func newPack(t testing.TB, k *crypto.Key, lengths []int) ([]Buf, []byte, uint) {
bufs := []Buf{}
for _, l := range lengths {
b := make([]byte, l)
_, err := io.ReadFull(rand.Reader, b)
rtest.OK(t, err)
h := sha256.Sum256(b)
bufs = append(bufs, Buf{data: b, id: h})
}
bufs := createBuffers(t, lengths)
// pack blobs
var buf bytes.Buffer
@ -49,6 +41,18 @@ func newPack(t testing.TB, k *crypto.Key, lengths []int) ([]Buf, []byte, uint) {
return bufs, buf.Bytes(), p.Size()
}
func createBuffers(t testing.TB, lengths []int) []Buf {
bufs := []Buf{}
for _, l := range lengths {
b := make([]byte, l)
_, err := io.ReadFull(rand.Reader, b)
rtest.OK(t, err)
h := sha256.Sum256(b)
bufs = append(bufs, Buf{data: b, id: h})
}
return bufs
}
func verifyBlobs(t testing.TB, bufs []Buf, k *crypto.Key, rd io.ReaderAt, packSize uint) {
written := 0
for _, buf := range bufs {
@ -144,3 +148,34 @@ func TestShortPack(t *testing.T) {
rtest.OK(t, b.Save(context.TODO(), handle, backend.NewByteReader(packData, b.Hasher())))
verifyBlobs(t, bufs, k, backend.ReaderAt(context.TODO(), b, handle), packSize)
}
func TestPackMerge(t *testing.T) {
k := crypto.NewRandomKey()
bufs := createBuffers(t, []int{1000, 5000, 2000, 3000, 4000, 1500})
splitAt := 3
// Fill packers
var buf1 bytes.Buffer
packer1 := pack.NewPacker(k, &buf1)
for _, b := range bufs[:splitAt] {
_, err := packer1.Add(restic.TreeBlob, b.id, b.data, 2*len(b.data))
rtest.OK(t, err)
}
var buf2 bytes.Buffer
packer2 := pack.NewPacker(k, &buf2)
for _, b := range bufs[splitAt:] {
_, err := packer2.Add(restic.DataBlob, b.id, b.data, 2*len(b.data))
rtest.OK(t, err)
}
err := packer1.Merge(packer2, &buf2)
rtest.OK(t, err)
err = packer1.Finalize()
rtest.OK(t, err)
// Verify all blobs are present in the merged pack
verifyBlobs(t, bufs, k, bytes.NewReader(buf1.Bytes()), packer1.Size())
rtest.Equals(t, len(bufs), packer1.Count())
}