git-lfs/git/rev_list_scanner_test.go

220 lines
6.1 KiB
Go
Raw Normal View History

2017-05-24 18:54:32 +00:00
package git
import (
"bufio"
"encoding/hex"
"errors"
"fmt"
2017-05-24 18:54:32 +00:00
"io/ioutil"
"strings"
"sync/atomic"
"testing"
"github.com/stretchr/testify/assert"
)
type ArgsTestCase struct {
Include []string
Exclude []string
Opt *ScanRefsOptions
2017-05-24 18:54:32 +00:00
ExpectedStdin string
ExpectedArgs []string
ExpectedErr string
}
func (c *ArgsTestCase) Assert(t *testing.T) {
stdin, args, err := revListArgs(c.Include, c.Exclude, c.Opt)
2017-05-24 18:54:32 +00:00
if len(c.ExpectedErr) > 0 {
assert.EqualError(t, err, c.ExpectedErr)
} else {
assert.Nil(t, err)
}
assert.EqualValues(t, c.ExpectedArgs, args)
2017-05-24 18:54:32 +00:00
if stdin != nil {
b, err := ioutil.ReadAll(stdin)
assert.Nil(t, err)
assert.Equal(t, c.ExpectedStdin, string(b))
} else if len(c.ExpectedStdin) > 0 {
t.Errorf("git: expected stdin contents %s, got none", c.ExpectedStdin)
}
}
var (
s1 = "decafdecafdecafdecafdecafdecafdecafdecaf"
s2 = "cafecafecafecafecafecafecafecafecafecafe"
)
2017-05-24 18:54:32 +00:00
func TestRevListArgs(t *testing.T) {
for desc, c := range map[string]*ArgsTestCase{
"scan refs deleted, include and exclude": {
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
2017-05-24 18:54:32 +00:00
Mode: ScanRefsMode,
SkipDeletedBlobs: false,
},
ExpectedStdin: fmt.Sprintf("%s\n^%s", s1, s2),
ExpectedArgs: []string{"rev-list", "--objects", "--do-walk", "--stdin", "--"},
2017-05-24 18:54:32 +00:00
},
"scan refs not deleted, include and exclude": {
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
2017-05-24 18:54:32 +00:00
Mode: ScanRefsMode,
SkipDeletedBlobs: true,
},
ExpectedStdin: fmt.Sprintf("%s\n^%s", s1, s2),
ExpectedArgs: []string{"rev-list", "--objects", "--no-walk", "--stdin", "--"},
2017-05-24 18:54:32 +00:00
},
"scan refs deleted, include only": {
Include: []string{s1}, Opt: &ScanRefsOptions{
2017-05-24 18:54:32 +00:00
Mode: ScanRefsMode,
SkipDeletedBlobs: false,
},
ExpectedStdin: s1,
ExpectedArgs: []string{"rev-list", "--objects", "--do-walk", "--stdin", "--"},
2017-05-24 18:54:32 +00:00
},
"scan refs not deleted, include only": {
Include: []string{s1}, Opt: &ScanRefsOptions{
2017-05-24 18:54:32 +00:00
Mode: ScanRefsMode,
SkipDeletedBlobs: true,
},
ExpectedStdin: s1,
ExpectedArgs: []string{"rev-list", "--objects", "--no-walk", "--stdin", "--"},
2017-05-24 18:54:32 +00:00
},
"scan all": {
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
2017-05-24 18:54:32 +00:00
Mode: ScanAllMode,
},
ExpectedArgs: []string{"rev-list", "--objects", "--all", "--stdin", "--"},
2017-05-24 18:54:32 +00:00
},
"scan include to remote, no skipped refs": {
Include: []string{s1}, Opt: &ScanRefsOptions{
Mode: ScanRangeToRemoteMode,
2017-05-24 18:54:32 +00:00
Remote: "origin",
SkippedRefs: []string{},
},
ExpectedStdin: s1,
ExpectedArgs: []string{"rev-list", "--objects", "--ignore-missing", "--not", "--remotes=origin", "--stdin", "--"},
2017-05-24 18:54:32 +00:00
},
"scan include to remote, skipped refs": {
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
Mode: ScanRangeToRemoteMode,
2017-05-24 18:54:32 +00:00
Remote: "origin",
SkippedRefs: []string{"a", "b", "c"},
},
ExpectedArgs: []string{"rev-list", "--objects", "--ignore-missing", "--stdin", "--"},
ExpectedStdin: s1 + "\n^" + s2 + "\na\nb\nc",
2017-05-24 18:54:32 +00:00
},
"scan unknown type": {
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
2017-05-24 18:54:32 +00:00
Mode: ScanningMode(-1),
},
ExpectedErr: "unknown scan type: -1",
},
2017-05-24 22:38:08 +00:00
"scan date order": {
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
2017-05-24 22:38:08 +00:00
Mode: ScanRefsMode,
Order: DateRevListOrder,
},
ExpectedStdin: fmt.Sprintf("%s\n^%s", s1, s2),
ExpectedArgs: []string{"rev-list", "--objects", "--date-order", "--do-walk", "--stdin", "--"},
2017-05-24 22:38:08 +00:00
},
"scan author date order": {
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
Mode: ScanRefsMode,
Order: AuthorDateRevListOrder,
},
ExpectedStdin: fmt.Sprintf("%s\n^%s", s1, s2),
ExpectedArgs: []string{"rev-list", "--objects", "--author-date-order", "--do-walk", "--stdin", "--"},
},
2017-05-24 22:38:50 +00:00
"scan topo order": {
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
2017-05-24 22:38:50 +00:00
Mode: ScanRefsMode,
Order: TopoRevListOrder,
},
ExpectedStdin: fmt.Sprintf("%s\n^%s", s1, s2),
ExpectedArgs: []string{"rev-list", "--objects", "--topo-order", "--do-walk", "--stdin", "--"},
2017-05-24 22:38:50 +00:00
},
"scan commits only": {
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
Mode: ScanRefsMode,
CommitsOnly: true,
},
ExpectedStdin: fmt.Sprintf("%s\n^%s", s1, s2),
ExpectedArgs: []string{"rev-list", "--do-walk", "--stdin", "--"},
},
"scan reverse": {
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
Mode: ScanRefsMode,
Reverse: true,
},
ExpectedStdin: fmt.Sprintf("%s\n^%s", s1, s2),
ExpectedArgs: []string{"rev-list", "--objects", "--reverse", "--do-walk", "--stdin", "--"},
},
2017-05-24 18:54:32 +00:00
} {
t.Run(desc, c.Assert)
}
}
func TestRevListScannerCallsClose(t *testing.T) {
var called uint32
err := errors.New("this is a marker error")
2017-05-24 18:54:32 +00:00
s := &RevListScanner{
closeFn: func() error {
atomic.AddUint32(&called, 1)
return err
},
}
got := s.Close()
assert.EqualValues(t, 1, atomic.LoadUint32(&called))
assert.Equal(t, err, got)
}
func TestRevListScannerTreatsCloseFnAsOptional(t *testing.T) {
s := &RevListScanner{
closeFn: nil,
}
defer func() { assert.Nil(t, recover()) }()
assert.Nil(t, s.Close())
}
func TestRevListScannerParsesLinesWithNames(t *testing.T) {
given := "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa name.dat"
s := &RevListScanner{
s: bufio.NewScanner(strings.NewReader(given)),
}
assert.True(t, s.Scan())
assert.Equal(t, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", hex.EncodeToString(s.OID()))
assert.Equal(t, "name.dat", s.Name())
2017-05-24 18:54:32 +00:00
assert.Nil(t, s.Err())
assert.False(t, s.Scan())
assert.Equal(t, "", s.Name())
2017-05-24 19:55:41 +00:00
assert.Nil(t, s.OID())
2017-05-24 18:54:32 +00:00
assert.Nil(t, s.Err())
}
func TestRevListScannerParsesLinesWithoutName(t *testing.T) {
given := "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
s := &RevListScanner{
s: bufio.NewScanner(strings.NewReader(given)),
}
assert.True(t, s.Scan())
assert.Equal(t, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", hex.EncodeToString(s.OID()))
2017-05-24 18:54:32 +00:00
assert.Nil(t, s.Err())
assert.False(t, s.Scan())
assert.Equal(t, "", s.Name())
2017-05-24 19:55:41 +00:00
assert.Nil(t, s.OID())
2017-05-24 18:54:32 +00:00
assert.Nil(t, s.Err())
}