2016-11-18 20:48:41 +00:00
|
|
|
package lfs
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
2017-03-23 17:55:40 +00:00
|
|
|
"crypto/sha256"
|
2018-09-05 14:12:53 +00:00
|
|
|
"encoding/hex"
|
2016-11-18 20:48:41 +00:00
|
|
|
"fmt"
|
|
|
|
"io"
|
|
|
|
"math/rand"
|
|
|
|
"testing"
|
|
|
|
|
2017-04-04 20:14:19 +00:00
|
|
|
"github.com/git-lfs/git-lfs/git"
|
2020-06-30 16:21:08 +00:00
|
|
|
"github.com/git-lfs/gitobj/v2"
|
2016-11-18 20:48:41 +00:00
|
|
|
"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
|
|
|
)
|
|
|
|
|
2017-04-04 20:35:03 +00:00
|
|
|
func TestPointerScannerWithValidOutput(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",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2018-09-05 14:12:53 +00:00
|
|
|
be, _ := gitobj.NewMemoryBackend(nil)
|
|
|
|
db, _ := gitobj.FromBackend(be)
|
|
|
|
shas := fakeObjectsWithRandoData(t, db, blobs)
|
2016-11-18 20:48:41 +00:00
|
|
|
|
2017-04-04 20:35:03 +00:00
|
|
|
scanner := &PointerScanner{
|
2018-09-05 14:12:53 +00:00
|
|
|
scanner: git.NewObjectScannerFrom(db),
|
2017-04-04 20:14:19 +00:00
|
|
|
}
|
2018-09-05 14:12:53 +00:00
|
|
|
iter := 0
|
2016-11-18 20:48:41 +00:00
|
|
|
|
2016-11-18 22:26:29 +00:00
|
|
|
for i := 0; i < 5; i++ {
|
2018-09-05 14:12:53 +00:00
|
|
|
assertNextEmptyPointer(t, scanner, shas[iter])
|
|
|
|
iter++
|
2016-11-18 20:48:41 +00:00
|
|
|
}
|
|
|
|
|
2018-09-05 14:12:53 +00:00
|
|
|
assertNextPointer(t, scanner, shas[iter], "e71eefd918ea175b8f362611f981f648dbf9888ff74865077cb4c9077728f350")
|
|
|
|
iter++
|
2016-11-18 21:48:38 +00:00
|
|
|
|
2016-11-18 22:26:29 +00:00
|
|
|
for i := 0; i < 5; i++ {
|
2018-09-05 14:12:53 +00:00
|
|
|
assertNextEmptyPointer(t, scanner, shas[iter])
|
|
|
|
iter++
|
2016-11-18 21:48:38 +00:00
|
|
|
}
|
|
|
|
|
2018-09-05 14:12:53 +00:00
|
|
|
assertNextPointer(t, scanner, shas[iter], "0eb69b651be65d5a61d6bebf2c53c811a5bf8031951111000e2077f4d7fe43b1")
|
|
|
|
iter++
|
2016-11-18 21:48:38 +00:00
|
|
|
|
|
|
|
for i := 0; i < 5; i++ {
|
2018-09-05 14:12:53 +00:00
|
|
|
assertNextEmptyPointer(t, scanner, shas[iter])
|
|
|
|
iter++
|
2016-11-18 21:48:38 +00:00
|
|
|
}
|
2016-11-18 22:26:29 +00:00
|
|
|
}
|
2016-11-18 21:48:38 +00:00
|
|
|
|
2017-04-04 20:35:03 +00:00
|
|
|
func TestPointerScannerWithLargeBlobs(t *testing.T) {
|
2017-03-23 17:55:40 +00:00
|
|
|
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)
|
|
|
|
|
2018-09-05 14:12:53 +00:00
|
|
|
be, _ := gitobj.NewMemoryBackend(nil)
|
|
|
|
db, _ := gitobj.FromBackend(be)
|
|
|
|
|
2017-03-23 17:55:40 +00:00
|
|
|
fake := bytes.NewBuffer(nil)
|
2018-09-05 14:12:53 +00:00
|
|
|
oid := writeFakeBuffer(t, db, fake, buf.Bytes(), buf.Len())
|
2017-03-23 17:55:40 +00:00
|
|
|
|
2017-04-04 20:35:03 +00:00
|
|
|
scanner := &PointerScanner{
|
2018-09-05 14:12:53 +00:00
|
|
|
scanner: git.NewObjectScannerFrom(db),
|
2017-04-04 20:14:19 +00:00
|
|
|
}
|
2017-03-23 17:55:40 +00:00
|
|
|
|
2018-09-05 14:12:53 +00:00
|
|
|
require.True(t, scanner.Scan(oid))
|
2017-03-23 17:55:40 +00:00
|
|
|
assert.Nil(t, scanner.Pointer())
|
|
|
|
assert.Equal(t, fmt.Sprintf("%x", sha.Sum(nil)), scanner.ContentsSha())
|
|
|
|
}
|
|
|
|
|
2018-09-05 14:12:53 +00:00
|
|
|
func assertNextPointer(t *testing.T, scanner *PointerScanner, sha string, oid string) {
|
|
|
|
assert.True(t, scanner.Scan(sha))
|
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)
|
|
|
|
}
|
|
|
|
|
2018-09-05 14:12:53 +00:00
|
|
|
func assertNextEmptyPointer(t *testing.T, scanner *PointerScanner, sha string) {
|
|
|
|
assert.True(t, scanner.Scan(sha))
|
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
|
|
|
}
|
|
|
|
|
2018-09-05 14:12:53 +00:00
|
|
|
func fakeObjectsWithRandoData(t *testing.T, db *gitobj.ObjectDatabase, blobs []*Pointer) []string {
|
2016-11-18 20:48:41 +00:00
|
|
|
buf := &bytes.Buffer{}
|
|
|
|
rngbuf := make([]byte, 1000) // just under blob size cutoff
|
|
|
|
rng := rand.New(rand.NewSource(0))
|
2018-09-05 14:12:53 +00:00
|
|
|
oids := make([]string, 0)
|
2016-11-18 20:48:41 +00:00
|
|
|
|
|
|
|
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
|
|
|
}
|
2018-09-05 14:12:53 +00:00
|
|
|
oids = append(oids, writeFakeBuffer(t, db, buf, rngbuf, n))
|
2016-11-18 20:48:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
for _, b := range blobs {
|
|
|
|
ptrtext := b.Encoded()
|
2018-09-05 14:12:53 +00:00
|
|
|
oids = append(oids, writeFakeBuffer(t, db, buf, []byte(ptrtext), len(ptrtext)))
|
2016-11-18 20:48:41 +00:00
|
|
|
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
|
|
|
}
|
2018-09-05 14:12:53 +00:00
|
|
|
oids = append(oids, writeFakeBuffer(t, db, buf, rngbuf, n))
|
2016-11-18 20:48:41 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-09-05 14:12:53 +00:00
|
|
|
return oids
|
2016-11-18 20:48:41 +00:00
|
|
|
}
|
|
|
|
|
2018-09-05 14:12:53 +00:00
|
|
|
func writeFakeBuffer(t *testing.T, db *gitobj.ObjectDatabase, buf *bytes.Buffer, by []byte, size int) string {
|
|
|
|
oid, _ := db.WriteBlob(gitobj.NewBlobFromBytes(by))
|
|
|
|
return hex.EncodeToString(oid)
|
2016-11-18 20:48:41 +00:00
|
|
|
}
|