package pack import ( "bytes" "encoding/binary" "io" "testing" "github.com/restic/restic/internal/crypto" rtest "github.com/restic/restic/internal/test" ) type countingReaderAt struct { delegate io.ReaderAt invocationCount int } func (rd *countingReaderAt) ReadAt(p []byte, off int64) (n int, err error) { rd.invocationCount++ return rd.delegate.ReadAt(p, off) } func TestReadHeaderEagerLoad(t *testing.T) { testReadHeader := func(entryCount uint, expectedReadInvocationCount int) { expectedHeader := rtest.Random(0, int(entryCount*entrySize)+crypto.Extension) buf := &bytes.Buffer{} buf.Write(rtest.Random(0, 100)) // pack blobs data buf.Write(expectedHeader) // pack header binary.Write(buf, binary.LittleEndian, uint32(len(expectedHeader))) // pack header length rd := &countingReaderAt{delegate: bytes.NewReader(buf.Bytes())} header, err := readHeader(rd, int64(buf.Len())) rtest.OK(t, err) rtest.Equals(t, expectedHeader, header) rtest.Equals(t, expectedReadInvocationCount, rd.invocationCount) } testReadHeader(1, 1) testReadHeader(eagerEntries-1, 1) testReadHeader(eagerEntries, 1) testReadHeader(eagerEntries+1, 2) }