2016-05-07 16:12:34 +00:00
|
|
|
package fs
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io"
|
2016-10-07 10:39:39 +00:00
|
|
|
"sort"
|
2016-05-07 16:12:34 +00:00
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
2016-06-12 14:06:02 +00:00
|
|
|
"github.com/pkg/errors"
|
2016-05-07 16:12:34 +00:00
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestListerNew(t *testing.T) {
|
|
|
|
o := NewLister()
|
|
|
|
assert.Equal(t, Config.Checkers, o.buffer)
|
|
|
|
assert.Equal(t, false, o.abort)
|
|
|
|
assert.Equal(t, MaxLevel, o.level)
|
|
|
|
}
|
|
|
|
|
2016-06-12 14:06:02 +00:00
|
|
|
var errNotImpl = errors.New("not implemented")
|
2016-05-07 16:12:34 +00:00
|
|
|
|
|
|
|
type mockObject string
|
|
|
|
|
2016-09-10 10:29:57 +00:00
|
|
|
func (o mockObject) String() string { return string(o) }
|
|
|
|
func (o mockObject) Fs() Info { return nil }
|
|
|
|
func (o mockObject) Remote() string { return string(o) }
|
|
|
|
func (o mockObject) Hash(HashType) (string, error) { return "", errNotImpl }
|
|
|
|
func (o mockObject) ModTime() (t time.Time) { return t }
|
|
|
|
func (o mockObject) Size() int64 { return 0 }
|
|
|
|
func (o mockObject) Storable() bool { return true }
|
|
|
|
func (o mockObject) SetModTime(time.Time) error { return errNotImpl }
|
|
|
|
func (o mockObject) Open(options ...OpenOption) (io.ReadCloser, error) { return nil, errNotImpl }
|
|
|
|
func (o mockObject) Update(in io.Reader, src ObjectInfo) error { return errNotImpl }
|
|
|
|
func (o mockObject) Remove() error { return errNotImpl }
|
2016-05-07 16:12:34 +00:00
|
|
|
|
|
|
|
type mockFs struct {
|
|
|
|
listFn func(o ListOpts, dir string)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f *mockFs) List(o ListOpts, dir string) {
|
|
|
|
defer o.Finished()
|
|
|
|
f.listFn(o, dir)
|
|
|
|
}
|
|
|
|
|
2016-10-07 10:39:39 +00:00
|
|
|
func (f *mockFs) NewObject(remote string) (Object, error) {
|
|
|
|
return mockObject(remote), nil
|
|
|
|
}
|
|
|
|
|
2016-05-07 16:12:34 +00:00
|
|
|
func TestListerStart(t *testing.T) {
|
|
|
|
f := &mockFs{}
|
|
|
|
ranList := false
|
|
|
|
f.listFn = func(o ListOpts, dir string) {
|
|
|
|
ranList = true
|
|
|
|
}
|
|
|
|
o := NewLister().Start(f, "")
|
|
|
|
objs, dirs, err := o.GetAll()
|
|
|
|
require.Nil(t, err)
|
|
|
|
assert.Len(t, objs, 0)
|
|
|
|
assert.Len(t, dirs, 0)
|
|
|
|
assert.Equal(t, true, ranList)
|
|
|
|
}
|
|
|
|
|
2016-10-07 10:39:39 +00:00
|
|
|
func TestListerStartWithFiles(t *testing.T) {
|
|
|
|
f := &mockFs{}
|
|
|
|
ranList := false
|
|
|
|
f.listFn = func(o ListOpts, dir string) {
|
|
|
|
ranList = true
|
|
|
|
}
|
|
|
|
filter, err := NewFilter()
|
|
|
|
require.NoError(t, err)
|
|
|
|
wantNames := []string{"potato", "sausage", "rutabaga", "carrot", "lettuce"}
|
|
|
|
sort.Strings(wantNames)
|
|
|
|
for _, name := range wantNames {
|
|
|
|
err = filter.AddFile(name)
|
|
|
|
require.NoError(t, err)
|
|
|
|
}
|
|
|
|
o := NewLister().SetFilter(filter).Start(f, "")
|
|
|
|
objs, dirs, err := o.GetAll()
|
|
|
|
require.Nil(t, err)
|
|
|
|
assert.Len(t, dirs, 0)
|
|
|
|
assert.Equal(t, false, ranList)
|
|
|
|
var gotNames []string
|
|
|
|
for _, obj := range objs {
|
|
|
|
gotNames = append(gotNames, obj.Remote())
|
|
|
|
}
|
|
|
|
sort.Strings(gotNames)
|
|
|
|
assert.Equal(t, wantNames, gotNames)
|
|
|
|
}
|
|
|
|
|
2016-05-07 16:12:34 +00:00
|
|
|
func TestListerSetLevel(t *testing.T) {
|
|
|
|
o := NewLister()
|
|
|
|
o.SetLevel(1)
|
|
|
|
assert.Equal(t, 1, o.level)
|
|
|
|
o.SetLevel(0)
|
|
|
|
assert.Equal(t, 0, o.level)
|
|
|
|
o.SetLevel(-1)
|
|
|
|
assert.Equal(t, MaxLevel, o.level)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListerSetFilter(t *testing.T) {
|
|
|
|
filter := &Filter{}
|
|
|
|
o := NewLister().SetFilter(filter)
|
|
|
|
assert.Equal(t, filter, o.filter)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListerLevel(t *testing.T) {
|
|
|
|
o := NewLister()
|
|
|
|
assert.Equal(t, MaxLevel, o.Level())
|
|
|
|
o.SetLevel(123)
|
|
|
|
assert.Equal(t, 123, o.Level())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListerSetBuffer(t *testing.T) {
|
|
|
|
o := NewLister()
|
|
|
|
o.SetBuffer(2)
|
|
|
|
assert.Equal(t, 2, o.buffer)
|
|
|
|
o.SetBuffer(1)
|
|
|
|
assert.Equal(t, 1, o.buffer)
|
|
|
|
o.SetBuffer(0)
|
|
|
|
assert.Equal(t, 1, o.buffer)
|
|
|
|
o.SetBuffer(-1)
|
|
|
|
assert.Equal(t, 1, o.buffer)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListerBuffer(t *testing.T) {
|
|
|
|
o := NewLister()
|
|
|
|
assert.Equal(t, Config.Checkers, o.Buffer())
|
|
|
|
o.SetBuffer(123)
|
|
|
|
assert.Equal(t, 123, o.Buffer())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListerAdd(t *testing.T) {
|
|
|
|
f := &mockFs{}
|
|
|
|
objs := []Object{
|
|
|
|
mockObject("1"),
|
|
|
|
mockObject("2"),
|
|
|
|
}
|
|
|
|
f.listFn = func(o ListOpts, dir string) {
|
|
|
|
for _, obj := range objs {
|
|
|
|
assert.Equal(t, false, o.Add(obj))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
o := NewLister().Start(f, "")
|
|
|
|
gotObjs, gotDirs, err := o.GetAll()
|
|
|
|
require.Nil(t, err)
|
|
|
|
assert.Equal(t, objs, gotObjs)
|
|
|
|
assert.Len(t, gotDirs, 0)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListerAddDir(t *testing.T) {
|
|
|
|
f := &mockFs{}
|
|
|
|
dirs := []*Dir{
|
|
|
|
&Dir{Name: "1"},
|
|
|
|
&Dir{Name: "2"},
|
|
|
|
}
|
|
|
|
f.listFn = func(o ListOpts, dir string) {
|
|
|
|
for _, dir := range dirs {
|
|
|
|
assert.Equal(t, false, o.AddDir(dir))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
o := NewLister().Start(f, "")
|
|
|
|
gotObjs, gotDirs, err := o.GetAll()
|
|
|
|
require.Nil(t, err)
|
|
|
|
assert.Len(t, gotObjs, 0)
|
|
|
|
assert.Equal(t, dirs, gotDirs)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListerIncludeDirectory(t *testing.T) {
|
|
|
|
o := NewLister()
|
|
|
|
assert.Equal(t, true, o.IncludeDirectory("whatever"))
|
|
|
|
filter, err := NewFilter()
|
|
|
|
require.Nil(t, err)
|
|
|
|
require.NotNil(t, filter)
|
|
|
|
require.Nil(t, filter.AddRule("!"))
|
|
|
|
require.Nil(t, filter.AddRule("+ potato/*"))
|
|
|
|
require.Nil(t, filter.AddRule("- *"))
|
|
|
|
o.SetFilter(filter)
|
|
|
|
assert.Equal(t, false, o.IncludeDirectory("floop"))
|
|
|
|
assert.Equal(t, true, o.IncludeDirectory("potato"))
|
|
|
|
assert.Equal(t, false, o.IncludeDirectory("potato/sausage"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListerSetError(t *testing.T) {
|
|
|
|
f := &mockFs{}
|
|
|
|
f.listFn = func(o ListOpts, dir string) {
|
|
|
|
assert.Equal(t, false, o.Add(mockObject("1")))
|
|
|
|
o.SetError(errNotImpl)
|
|
|
|
assert.Equal(t, true, o.Add(mockObject("2")))
|
|
|
|
o.SetError(errors.New("not signalled"))
|
|
|
|
assert.Equal(t, true, o.AddDir(&Dir{Name: "2"}))
|
|
|
|
}
|
|
|
|
o := NewLister().Start(f, "")
|
|
|
|
gotObjs, gotDirs, err := o.GetAll()
|
|
|
|
assert.Equal(t, err, errNotImpl)
|
|
|
|
assert.Nil(t, gotObjs)
|
|
|
|
assert.Nil(t, gotDirs)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListerIsFinished(t *testing.T) {
|
|
|
|
f := &mockFs{}
|
|
|
|
f.listFn = func(o ListOpts, dir string) {
|
|
|
|
assert.Equal(t, false, o.IsFinished())
|
|
|
|
o.Finished()
|
|
|
|
assert.Equal(t, true, o.IsFinished())
|
|
|
|
}
|
|
|
|
o := NewLister().Start(f, "")
|
|
|
|
gotObjs, gotDirs, err := o.GetAll()
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Len(t, gotObjs, 0)
|
|
|
|
assert.Len(t, gotDirs, 0)
|
|
|
|
}
|
|
|
|
|
|
|
|
func testListerGet(t *testing.T) *Lister {
|
|
|
|
f := &mockFs{}
|
|
|
|
f.listFn = func(o ListOpts, dir string) {
|
|
|
|
assert.Equal(t, false, o.Add(mockObject("1")))
|
|
|
|
assert.Equal(t, false, o.AddDir(&Dir{Name: "2"}))
|
|
|
|
}
|
|
|
|
return NewLister().Start(f, "")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListerGet(t *testing.T) {
|
|
|
|
o := testListerGet(t)
|
|
|
|
obj, dir, err := o.Get()
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, obj.Remote(), "1")
|
|
|
|
assert.Nil(t, dir)
|
|
|
|
obj, dir, err = o.Get()
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Nil(t, obj)
|
|
|
|
assert.Equal(t, dir.Name, "2")
|
|
|
|
obj, dir, err = o.Get()
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Nil(t, obj)
|
|
|
|
assert.Nil(t, dir)
|
|
|
|
assert.Equal(t, true, o.IsFinished())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListerGetObject(t *testing.T) {
|
|
|
|
o := testListerGet(t)
|
|
|
|
obj, err := o.GetObject()
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, obj.Remote(), "1")
|
|
|
|
obj, err = o.GetObject()
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Nil(t, obj)
|
|
|
|
assert.Equal(t, true, o.IsFinished())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListerGetDir(t *testing.T) {
|
|
|
|
o := testListerGet(t)
|
|
|
|
dir, err := o.GetDir()
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, dir.Name, "2")
|
|
|
|
dir, err = o.GetDir()
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Nil(t, dir)
|
|
|
|
assert.Equal(t, true, o.IsFinished())
|
|
|
|
}
|
|
|
|
|
|
|
|
func testListerGetError(t *testing.T) *Lister {
|
|
|
|
f := &mockFs{}
|
|
|
|
f.listFn = func(o ListOpts, dir string) {
|
|
|
|
o.SetError(errNotImpl)
|
|
|
|
}
|
|
|
|
return NewLister().Start(f, "")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListerGetError(t *testing.T) {
|
|
|
|
o := testListerGetError(t)
|
|
|
|
obj, dir, err := o.Get()
|
|
|
|
assert.Equal(t, err, errNotImpl)
|
|
|
|
assert.Nil(t, obj)
|
|
|
|
assert.Nil(t, dir)
|
|
|
|
obj, dir, err = o.Get()
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Nil(t, obj)
|
|
|
|
assert.Nil(t, dir)
|
|
|
|
assert.Equal(t, true, o.IsFinished())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListerGetObjectError(t *testing.T) {
|
|
|
|
o := testListerGetError(t)
|
|
|
|
obj, err := o.GetObject()
|
|
|
|
assert.Equal(t, err, errNotImpl)
|
|
|
|
assert.Nil(t, obj)
|
|
|
|
obj, err = o.GetObject()
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Nil(t, obj)
|
|
|
|
assert.Equal(t, true, o.IsFinished())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListerGetDirError(t *testing.T) {
|
|
|
|
o := testListerGetError(t)
|
|
|
|
dir, err := o.GetDir()
|
|
|
|
assert.Equal(t, err, errNotImpl)
|
|
|
|
assert.Nil(t, dir)
|
|
|
|
dir, err = o.GetDir()
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Nil(t, dir)
|
|
|
|
assert.Equal(t, true, o.IsFinished())
|
|
|
|
}
|
|
|
|
|
|
|
|
func testListerGetAll(t *testing.T) (*Lister, []Object, []*Dir) {
|
|
|
|
objs := []Object{
|
|
|
|
mockObject("1f"),
|
|
|
|
mockObject("2f"),
|
|
|
|
mockObject("3f"),
|
|
|
|
}
|
|
|
|
dirs := []*Dir{
|
|
|
|
&Dir{Name: "1d"},
|
|
|
|
&Dir{Name: "2d"},
|
|
|
|
}
|
|
|
|
f := &mockFs{}
|
|
|
|
f.listFn = func(o ListOpts, dir string) {
|
|
|
|
assert.Equal(t, false, o.Add(objs[0]))
|
|
|
|
assert.Equal(t, false, o.Add(objs[1]))
|
|
|
|
assert.Equal(t, false, o.AddDir(dirs[0]))
|
|
|
|
assert.Equal(t, false, o.Add(objs[2]))
|
|
|
|
assert.Equal(t, false, o.AddDir(dirs[1]))
|
|
|
|
}
|
|
|
|
return NewLister().Start(f, ""), objs, dirs
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListerGetAll(t *testing.T) {
|
|
|
|
o, objs, dirs := testListerGetAll(t)
|
|
|
|
gotObjs, gotDirs, err := o.GetAll()
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, objs, gotObjs)
|
|
|
|
assert.Equal(t, dirs, gotDirs)
|
|
|
|
assert.Equal(t, true, o.IsFinished())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListerGetObjects(t *testing.T) {
|
|
|
|
o, objs, _ := testListerGetAll(t)
|
|
|
|
gotObjs, err := o.GetObjects()
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, objs, gotObjs)
|
|
|
|
assert.Equal(t, true, o.IsFinished())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListerGetDirs(t *testing.T) {
|
|
|
|
o, _, dirs := testListerGetAll(t)
|
|
|
|
gotDirs, err := o.GetDirs()
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, dirs, gotDirs)
|
|
|
|
assert.Equal(t, true, o.IsFinished())
|
|
|
|
}
|
|
|
|
|
|
|
|
func testListerGetAllError(t *testing.T) *Lister {
|
|
|
|
f := &mockFs{}
|
|
|
|
f.listFn = func(o ListOpts, dir string) {
|
|
|
|
o.SetError(errNotImpl)
|
|
|
|
}
|
|
|
|
return NewLister().Start(f, "")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListerGetAllError(t *testing.T) {
|
|
|
|
o := testListerGetAllError(t)
|
|
|
|
gotObjs, gotDirs, err := o.GetAll()
|
|
|
|
assert.Equal(t, errNotImpl, err)
|
|
|
|
assert.Len(t, gotObjs, 0)
|
|
|
|
assert.Len(t, gotDirs, 0)
|
|
|
|
assert.Equal(t, true, o.IsFinished())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListerGetObjectsError(t *testing.T) {
|
|
|
|
o := testListerGetAllError(t)
|
|
|
|
gotObjs, err := o.GetObjects()
|
|
|
|
assert.Equal(t, errNotImpl, err)
|
|
|
|
assert.Len(t, gotObjs, 0)
|
|
|
|
assert.Equal(t, true, o.IsFinished())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestListerGetDirsError(t *testing.T) {
|
|
|
|
o := testListerGetAllError(t)
|
|
|
|
gotDirs, err := o.GetDirs()
|
|
|
|
assert.Equal(t, errNotImpl, err)
|
|
|
|
assert.Len(t, gotDirs, 0)
|
|
|
|
assert.Equal(t, true, o.IsFinished())
|
|
|
|
}
|