2018-06-22 07:01:36 -05:00
|
|
|
package gaper
|
2018-06-20 20:40:09 -05:00
|
|
|
|
|
|
|
import (
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
2018-06-22 20:00:23 -05:00
|
|
|
"runtime"
|
2018-06-20 20:40:09 -05:00
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestWatcherDefaultValues(t *testing.T) {
|
|
|
|
pollInterval := 0
|
|
|
|
watchItems := []string{filepath.Join("testdata", "server")}
|
|
|
|
var ignoreItems []string
|
|
|
|
var extensions []string
|
|
|
|
|
2018-07-22 08:30:30 -05:00
|
|
|
wCfg := WatcherConfig{
|
|
|
|
DefaultIgnore: true,
|
|
|
|
PollInterval: pollInterval,
|
|
|
|
WatchItems: watchItems,
|
|
|
|
IgnoreItems: ignoreItems,
|
|
|
|
Extensions: extensions,
|
|
|
|
}
|
|
|
|
wt, err := NewWatcher(wCfg)
|
2018-06-20 20:40:09 -05:00
|
|
|
|
2018-06-22 20:00:23 -05:00
|
|
|
expectedPath := "testdata/server"
|
|
|
|
if runtime.GOOS == OSWindows {
|
|
|
|
expectedPath = "testdata\\server"
|
|
|
|
}
|
|
|
|
|
2018-07-12 08:27:07 -05:00
|
|
|
w := wt.(*watcher)
|
2018-06-20 20:40:09 -05:00
|
|
|
assert.Nil(t, err, "wacher error")
|
2018-07-12 08:27:07 -05:00
|
|
|
assert.Equal(t, 500, w.pollInterval)
|
|
|
|
assert.Equal(t, map[string]bool{expectedPath: true}, w.watchItems)
|
|
|
|
assert.Len(t, w.ignoreItems, 0)
|
|
|
|
assert.Equal(t, map[string]bool{".go": true}, w.allowedExtensions)
|
2018-06-20 20:40:09 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestWatcherGlobPath(t *testing.T) {
|
|
|
|
pollInterval := 0
|
|
|
|
watchItems := []string{filepath.Join("testdata", "server")}
|
|
|
|
ignoreItems := []string{"./testdata/**/*_test.go"}
|
|
|
|
var extensions []string
|
|
|
|
|
2018-07-22 08:30:30 -05:00
|
|
|
wCfg := WatcherConfig{
|
|
|
|
DefaultIgnore: true,
|
|
|
|
PollInterval: pollInterval,
|
|
|
|
WatchItems: watchItems,
|
|
|
|
IgnoreItems: ignoreItems,
|
|
|
|
Extensions: extensions,
|
|
|
|
}
|
|
|
|
wt, err := NewWatcher(wCfg)
|
2018-06-20 20:40:09 -05:00
|
|
|
assert.Nil(t, err, "wacher error")
|
2018-07-12 08:27:07 -05:00
|
|
|
w := wt.(*watcher)
|
|
|
|
assert.Equal(t, map[string]bool{"testdata/server/main_test.go": true}, w.ignoreItems)
|
2018-06-22 19:44:26 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestWatcherRemoveOverlapdPaths(t *testing.T) {
|
|
|
|
pollInterval := 0
|
|
|
|
watchItems := []string{filepath.Join("testdata", "server")}
|
2018-07-24 19:31:19 -05:00
|
|
|
ignoreItems := []string{"./testdata/server/**/*", "./testdata/server"}
|
2018-06-22 19:44:26 -05:00
|
|
|
var extensions []string
|
|
|
|
|
2018-07-22 08:30:30 -05:00
|
|
|
wCfg := WatcherConfig{
|
|
|
|
DefaultIgnore: true,
|
|
|
|
PollInterval: pollInterval,
|
|
|
|
WatchItems: watchItems,
|
|
|
|
IgnoreItems: ignoreItems,
|
|
|
|
Extensions: extensions,
|
|
|
|
}
|
|
|
|
wt, err := NewWatcher(wCfg)
|
2018-06-22 19:44:26 -05:00
|
|
|
assert.Nil(t, err, "wacher error")
|
2018-07-12 08:27:07 -05:00
|
|
|
w := wt.(*watcher)
|
|
|
|
assert.Equal(t, map[string]bool{"./testdata/server": true}, w.ignoreItems)
|
2018-06-20 20:40:09 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestWatcherWatchChange(t *testing.T) {
|
|
|
|
srvdir := filepath.Join("testdata", "server")
|
|
|
|
hiddendir := filepath.Join("testdata", "hidden-test")
|
|
|
|
|
|
|
|
hiddenfile1 := filepath.Join("testdata", ".hidden-file")
|
|
|
|
hiddenfile2 := filepath.Join("testdata", ".hidden-folder", ".gitkeep")
|
|
|
|
mainfile := filepath.Join("testdata", "server", "main.go")
|
|
|
|
testfile := filepath.Join("testdata", "server", "main_test.go")
|
|
|
|
|
|
|
|
pollInterval := 0
|
|
|
|
watchItems := []string{srvdir, hiddendir}
|
|
|
|
ignoreItems := []string{testfile}
|
|
|
|
extensions := []string{"go"}
|
|
|
|
|
2018-07-22 08:30:30 -05:00
|
|
|
wCfg := WatcherConfig{
|
|
|
|
DefaultIgnore: true,
|
|
|
|
PollInterval: pollInterval,
|
|
|
|
WatchItems: watchItems,
|
|
|
|
IgnoreItems: ignoreItems,
|
|
|
|
Extensions: extensions,
|
|
|
|
}
|
|
|
|
w, err := NewWatcher(wCfg)
|
2018-06-20 20:40:09 -05:00
|
|
|
assert.Nil(t, err, "wacher error")
|
|
|
|
|
|
|
|
go w.Watch()
|
|
|
|
time.Sleep(time.Millisecond * 500)
|
|
|
|
|
|
|
|
// update hidden files and dirs to check builtin hidden ignore is working
|
2022-08-08 09:40:24 -05:00
|
|
|
err = os.Chtimes(hiddenfile1, time.Now(), time.Now())
|
|
|
|
assert.Nil(t, err, "chtimes error")
|
|
|
|
|
|
|
|
err = os.Chtimes(hiddenfile2, time.Now(), time.Now())
|
|
|
|
assert.Nil(t, err, "chtimes error")
|
2018-06-20 20:40:09 -05:00
|
|
|
|
|
|
|
// update testfile first to check ignore is working
|
2022-08-08 09:40:24 -05:00
|
|
|
err = os.Chtimes(testfile, time.Now(), time.Now())
|
|
|
|
assert.Nil(t, err, "chtimes error")
|
2018-06-20 20:40:09 -05:00
|
|
|
|
|
|
|
time.Sleep(time.Millisecond * 500)
|
2022-08-08 09:40:24 -05:00
|
|
|
err = os.Chtimes(mainfile, time.Now(), time.Now())
|
|
|
|
assert.Nil(t, err, "chtimes error")
|
2018-06-20 20:40:09 -05:00
|
|
|
|
|
|
|
select {
|
2018-07-12 08:27:07 -05:00
|
|
|
case event := <-w.Events():
|
2018-06-20 20:40:09 -05:00
|
|
|
assert.Equal(t, mainfile, event)
|
2018-07-12 08:27:07 -05:00
|
|
|
case err := <-w.Errors():
|
2018-06-20 20:40:09 -05:00
|
|
|
assert.Nil(t, err, "wacher event error")
|
|
|
|
}
|
|
|
|
}
|
2018-07-24 19:31:19 -05:00
|
|
|
|
|
|
|
func TestWatcherIgnoreFile(t *testing.T) {
|
|
|
|
testCases := []struct {
|
|
|
|
name, file, ignoreFile string
|
|
|
|
defaultIgnore, expectIgnore bool
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
name: "with default ignore enabled it ignores vendor folder",
|
|
|
|
file: "vendor",
|
|
|
|
defaultIgnore: true,
|
|
|
|
expectIgnore: true,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "without default ignore enabled it does not ignore vendor folder",
|
|
|
|
file: "vendor",
|
|
|
|
defaultIgnore: false,
|
|
|
|
expectIgnore: false,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "with default ignore enabled it ignores test file",
|
|
|
|
file: filepath.Join("testdata", "server", "main_test.go"),
|
|
|
|
defaultIgnore: true,
|
|
|
|
expectIgnore: true,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "with default ignore enabled it does no ignore non test files which have test in the name",
|
|
|
|
file: filepath.Join("testdata", "ignore-test-name.txt"),
|
|
|
|
defaultIgnore: true,
|
|
|
|
expectIgnore: false,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "without default ignore enabled it does not ignore test file",
|
|
|
|
file: filepath.Join("testdata", "server", "main_test.go"),
|
|
|
|
defaultIgnore: false,
|
|
|
|
expectIgnore: false,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "with default ignore enabled it ignores ignored items",
|
|
|
|
file: filepath.Join("testdata", "server", "main.go"),
|
|
|
|
ignoreFile: filepath.Join("testdata", "server", "main.go"),
|
|
|
|
defaultIgnore: true,
|
|
|
|
expectIgnore: true,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "without default ignore enabled it ignores ignored items",
|
|
|
|
file: filepath.Join("testdata", "server", "main.go"),
|
|
|
|
ignoreFile: filepath.Join("testdata", "server", "main.go"),
|
|
|
|
defaultIgnore: false,
|
|
|
|
expectIgnore: true,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2019-11-12 15:37:44 -06:00
|
|
|
// create vendor folder for testing
|
|
|
|
if err := os.MkdirAll("vendor", os.ModePerm); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2018-07-24 19:31:19 -05:00
|
|
|
for _, tc := range testCases {
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
|
|
srvdir := "."
|
|
|
|
|
|
|
|
watchItems := []string{srvdir}
|
|
|
|
ignoreItems := []string{}
|
|
|
|
if len(tc.ignoreFile) > 0 {
|
|
|
|
ignoreItems = append(ignoreItems, tc.ignoreFile)
|
|
|
|
}
|
|
|
|
extensions := []string{"go"}
|
|
|
|
|
|
|
|
wCfg := WatcherConfig{
|
|
|
|
DefaultIgnore: tc.defaultIgnore,
|
|
|
|
WatchItems: watchItems,
|
|
|
|
IgnoreItems: ignoreItems,
|
|
|
|
Extensions: extensions,
|
|
|
|
}
|
|
|
|
w, err := NewWatcher(wCfg)
|
|
|
|
assert.Nil(t, err, "wacher error")
|
|
|
|
|
|
|
|
wt := w.(*watcher)
|
|
|
|
|
|
|
|
filePath := tc.file
|
|
|
|
file, err := os.Open(filePath)
|
|
|
|
if err != nil {
|
2019-11-12 15:37:44 -06:00
|
|
|
t.Fatal(err)
|
2018-07-24 19:31:19 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
fileInfo, err := file.Stat()
|
|
|
|
if err != nil {
|
2019-11-12 15:37:44 -06:00
|
|
|
t.Fatal(err)
|
2018-07-24 19:31:19 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
assert.Equal(t, tc.expectIgnore, wt.ignoreFile(filePath, fileInfo))
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestWatcherResolvePaths(t *testing.T) {
|
|
|
|
testCases := []struct {
|
|
|
|
name string
|
|
|
|
paths []string
|
|
|
|
extensions, expectPaths map[string]bool
|
|
|
|
err error
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
name: "remove duplicated paths",
|
|
|
|
paths: []string{"testdata/test-duplicated-paths", "testdata/test-duplicated-paths"},
|
|
|
|
extensions: map[string]bool{".txt": true},
|
|
|
|
expectPaths: map[string]bool{"testdata/test-duplicated-paths": true},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "remove duplicated paths from glob",
|
|
|
|
paths: []string{"testdata/test-duplicated-paths", "testdata/test-duplicated-paths/**/*"},
|
|
|
|
extensions: map[string]bool{".txt": true},
|
|
|
|
expectPaths: map[string]bool{"testdata/test-duplicated-paths": true},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "remove duplicated paths from glob with inverse order",
|
|
|
|
paths: []string{"testdata/test-duplicated-paths/**/*", "testdata/test-duplicated-paths"},
|
|
|
|
extensions: map[string]bool{".txt": true},
|
|
|
|
expectPaths: map[string]bool{"testdata/test-duplicated-paths": true},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, tc := range testCases {
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
|
|
paths, err := resolvePaths(tc.paths, tc.extensions)
|
|
|
|
if tc.err == nil {
|
|
|
|
assert.Nil(t, err, "resolve path error")
|
|
|
|
assert.Equal(t, tc.expectPaths, paths)
|
|
|
|
} else {
|
|
|
|
assert.Equal(t, tc.err, err)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|