func verifyBlobs(t testing.TB, bufs []Buf, k *crypto.Key, rd io.ReaderAt, packSize uint) { written := 0 for _, buf := range bufs { written += len(buf.data) } // header length written += binary.Size(uint32(0)) // header written += len(bufs) * (binary.Size(restic.BlobType(0)) + binary.Size(uint32(0)) + len(restic.ID{})) // header crypto written += crypto.Extension // check length Equals(t, uint(written), packSize) // read and parse it again entries, err := pack.List(k, rd, int64(packSize)) OK(t, err) Equals(t, len(entries), len(bufs)) var buf []byte for i, b := range bufs { e := entries[i] Equals(t, b.id, e.ID) if len(buf) < int(e.Length) { buf = make([]byte, int(e.Length)) } buf = buf[:int(e.Length)] n, err := rd.ReadAt(buf, int64(e.Offset)) OK(t, err) buf = buf[:n] Assert(t, bytes.Equal(b.data, buf), "data for blob %v doesn't match", i) } }
func (p *Packer) Add(t restic.BlobType, id restic.ID, data []byte) (int, error) { p.m.Lock() defer p.m.Unlock() c := restic.Blob{Type: t, ID: id} n, err := p.wr.Write(data) c.Length = uint(n) c.Offset = p.bytes p.bytes += uint(n) p.blobs = append(p.blobs, c) return n, errors.Wrap(err, "Write") } var entrySize = uint(binary.Size(restic.BlobType(0)) + binary.Size(uint32(0)) + len(restic.ID{})) // headerEntry is used with encoding/binary to read and write header entries type headerEntry struct { Type uint8 Length uint32 ID restic.ID } // Finalize writes the header for all added blobs and finalizes the pack. // Returned are the number of bytes written, including the header. If the // underlying writer implements io.Closer, it is closed. func (p *Packer) Finalize() (uint, error) { p.m.Lock() defer p.m.Unlock()