2016-11-18 20:48:41 +00:00
|
|
|
package lfs
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bufio"
|
|
|
|
"bytes"
|
2017-03-23 17:55:40 +00:00
|
|
|
"crypto/sha256"
|
2016-11-18 20:48:41 +00:00
|
|
|
"fmt"
|
|
|
|
"io"
|
|
|
|
"math/rand"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
2017-03-23 17:55:40 +00:00
|
|
|
"github.com/stretchr/testify/require"
|
2016-11-18 20:48:41 +00:00
|
|
|
)
|
|
|
|
|
2016-11-18 22:26:29 +00:00
|
|
|
func TestCatFileBatchScannerWithValidOutput(t *testing.T) {
|
2016-11-18 20:48:41 +00:00
|
|
|
blobs := []*Pointer{
|
|
|
|
&Pointer{
|
|
|
|
Version: "https://git-lfs.github.com/spec/v1",
|
|
|
|
Oid: "e71eefd918ea175b8f362611f981f648dbf9888ff74865077cb4c9077728f350",
|
|
|
|
Size: 123,
|
|
|
|
OidType: "sha256",
|
|
|
|
},
|
|
|
|
&Pointer{
|
|
|
|
Version: "https://git-lfs.github.com/spec/v1",
|
|
|
|
Oid: "0eb69b651be65d5a61d6bebf2c53c811a5bf8031951111000e2077f4d7fe43b1",
|
|
|
|
Size: 132,
|
|
|
|
OidType: "sha256",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
reader := fakeReaderWithRandoData(t, blobs)
|
|
|
|
if reader == nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-03-22 21:15:02 +00:00
|
|
|
scanner := &CatFileBatchScanner{r: bufio.NewReader(reader)}
|
2016-11-18 20:48:41 +00:00
|
|
|
|
2016-11-18 22:26:29 +00:00
|
|
|
for i := 0; i < 5; i++ {
|
2016-11-18 22:56:29 +00:00
|
|
|
assertNextEmptyPointer(t, scanner)
|
2016-11-18 20:48:41 +00:00
|
|
|
}
|
|
|
|
|
2016-11-18 22:26:29 +00:00
|
|
|
assertNextPointer(t, scanner, "e71eefd918ea175b8f362611f981f648dbf9888ff74865077cb4c9077728f350")
|
2016-11-18 21:48:38 +00:00
|
|
|
|
2016-11-18 22:26:29 +00:00
|
|
|
for i := 0; i < 5; i++ {
|
2016-11-18 22:56:29 +00:00
|
|
|
assertNextEmptyPointer(t, scanner)
|
2016-11-18 21:48:38 +00:00
|
|
|
}
|
|
|
|
|
2016-11-18 22:26:29 +00:00
|
|
|
assertNextPointer(t, scanner, "0eb69b651be65d5a61d6bebf2c53c811a5bf8031951111000e2077f4d7fe43b1")
|
2016-11-18 21:48:38 +00:00
|
|
|
|
|
|
|
for i := 0; i < 5; i++ {
|
2016-11-18 22:56:29 +00:00
|
|
|
assertNextEmptyPointer(t, scanner)
|
2016-11-18 21:48:38 +00:00
|
|
|
}
|
|
|
|
|
2017-03-23 18:02:35 +00:00
|
|
|
assert.False(t, scanner.Scan(""))
|
2017-03-22 21:15:02 +00:00
|
|
|
assert.Nil(t, scanner.Err())
|
2016-11-19 00:00:57 +00:00
|
|
|
assert.Nil(t, scanner.Pointer())
|
2016-11-18 22:26:29 +00:00
|
|
|
}
|
2016-11-18 21:48:38 +00:00
|
|
|
|
2017-03-23 17:55:40 +00:00
|
|
|
func TestCatFileBatchScannerWithLargeBlobs(t *testing.T) {
|
|
|
|
buf := bytes.NewBuffer(make([]byte, 0, 1025))
|
|
|
|
sha := sha256.New()
|
|
|
|
rng := rand.New(rand.NewSource(0))
|
|
|
|
|
|
|
|
_, err := io.CopyN(io.MultiWriter(sha, buf), rng, 1025)
|
|
|
|
require.Nil(t, err)
|
|
|
|
|
|
|
|
fake := bytes.NewBuffer(nil)
|
|
|
|
writeFakeBuffer(t, fake, buf.Bytes(), buf.Len())
|
|
|
|
|
|
|
|
scanner := &CatFileBatchScanner{r: bufio.NewReader(fake)}
|
|
|
|
|
2017-03-23 18:02:35 +00:00
|
|
|
require.True(t, scanner.Scan(""))
|
2017-03-23 17:55:40 +00:00
|
|
|
assert.Nil(t, scanner.Pointer())
|
|
|
|
assert.Equal(t, fmt.Sprintf("%x", sha.Sum(nil)), scanner.ContentsSha())
|
|
|
|
|
2017-03-23 18:02:35 +00:00
|
|
|
assert.False(t, scanner.Scan(""))
|
2017-03-23 17:55:40 +00:00
|
|
|
assert.Nil(t, scanner.Err())
|
|
|
|
assert.Nil(t, scanner.Pointer())
|
|
|
|
}
|
|
|
|
|
2017-03-22 21:15:02 +00:00
|
|
|
func assertNextPointer(t *testing.T, scanner *CatFileBatchScanner, oid string) {
|
2017-03-23 18:02:35 +00:00
|
|
|
assert.True(t, scanner.Scan(""))
|
2017-03-22 21:15:02 +00:00
|
|
|
assert.Nil(t, scanner.Err())
|
|
|
|
|
2016-11-19 00:00:57 +00:00
|
|
|
p := scanner.Pointer()
|
2017-03-22 21:15:02 +00:00
|
|
|
|
2016-11-18 21:48:38 +00:00
|
|
|
assert.NotNil(t, p)
|
2016-11-18 22:26:29 +00:00
|
|
|
assert.Equal(t, oid, p.Oid)
|
|
|
|
}
|
|
|
|
|
2017-03-22 21:15:02 +00:00
|
|
|
func assertNextEmptyPointer(t *testing.T, scanner *CatFileBatchScanner) {
|
2017-03-23 18:02:35 +00:00
|
|
|
assert.True(t, scanner.Scan(""))
|
2017-03-22 21:15:02 +00:00
|
|
|
assert.Nil(t, scanner.Err())
|
|
|
|
|
2016-11-19 00:00:57 +00:00
|
|
|
assert.Nil(t, scanner.Pointer())
|
2016-11-18 21:48:38 +00:00
|
|
|
}
|
|
|
|
|
2016-11-18 20:48:41 +00:00
|
|
|
func fakeReaderWithRandoData(t *testing.T, blobs []*Pointer) io.Reader {
|
|
|
|
buf := &bytes.Buffer{}
|
|
|
|
rngbuf := make([]byte, 1000) // just under blob size cutoff
|
|
|
|
rng := rand.New(rand.NewSource(0))
|
|
|
|
|
|
|
|
for i := 0; i < 5; i++ {
|
|
|
|
n, err := io.ReadFull(rng, rngbuf)
|
|
|
|
if err != nil {
|
2016-11-18 21:45:14 +00:00
|
|
|
t.Fatalf("error reading from rng: %+v", err)
|
2016-11-18 20:48:41 +00:00
|
|
|
}
|
|
|
|
writeFakeBuffer(t, buf, rngbuf, n)
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, b := range blobs {
|
|
|
|
ptrtext := b.Encoded()
|
|
|
|
writeFakeBuffer(t, buf, []byte(ptrtext), len(ptrtext))
|
|
|
|
for i := 0; i < 5; i++ {
|
|
|
|
n, err := io.ReadFull(rng, rngbuf)
|
|
|
|
if err != nil {
|
2016-11-18 21:45:14 +00:00
|
|
|
t.Fatalf("error reading from rng: %+v", err)
|
2016-11-18 20:48:41 +00:00
|
|
|
}
|
|
|
|
writeFakeBuffer(t, buf, rngbuf, n)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return bytes.NewBuffer(buf.Bytes())
|
|
|
|
}
|
|
|
|
|
|
|
|
func writeFakeBuffer(t *testing.T, buf *bytes.Buffer, by []byte, size int) {
|
|
|
|
header := fmt.Sprintf("0000000000000000000000000000000000000000 blob %d", size)
|
|
|
|
t.Log(header)
|
|
|
|
buf.WriteString(header + "\n")
|
|
|
|
buf.Write(by)
|
|
|
|
buf.Write([]byte("\n"))
|
|
|
|
}
|