summaryrefslogtreecommitdiff
path: root/pkg/hooks/monitor_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/hooks/monitor_test.go')
-rw-r--r--pkg/hooks/monitor_test.go195
1 files changed, 193 insertions, 2 deletions
diff --git a/pkg/hooks/monitor_test.go b/pkg/hooks/monitor_test.go
index 78e8d3fe5..b3af4bb43 100644
--- a/pkg/hooks/monitor_test.go
+++ b/pkg/hooks/monitor_test.go
@@ -14,7 +14,7 @@ import (
"golang.org/x/text/language"
)
-func TestMonitorGood(t *testing.T) {
+func TestMonitorOneDirGood(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
dir, err := ioutil.TempDir("", "hooks-test-")
if err != nil {
@@ -92,7 +92,7 @@ func TestMonitorGood(t *testing.T) {
})
t.Run("bad-addition", func(t *testing.T) {
- err = ioutil.WriteFile(jsonPath, []byte("{\"version\": \"-1\"]}"), 0644)
+ err = ioutil.WriteFile(jsonPath, []byte("{\"version\": \"-1\"}"), 0644)
if err != nil {
t.Fatal(err)
}
@@ -118,6 +118,197 @@ func TestMonitorGood(t *testing.T) {
assert.Equal(t, context.Canceled, err)
}
+func TestMonitorTwoDirGood(t *testing.T) {
+ ctx, cancel := context.WithCancel(context.Background())
+ primaryDir, err := ioutil.TempDir("", "hooks-test-primary-")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(primaryDir)
+
+ fallbackDir, err := ioutil.TempDir("", "hooks-test-fallback-")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer os.RemoveAll(fallbackDir)
+
+ lang, err := language.Parse("und-u-va-posix")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ manager, err := New(ctx, []string{fallbackDir, primaryDir}, []string{}, lang)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ sync := make(chan error, 2)
+ go manager.Monitor(ctx, sync)
+ err = <-sync
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ fallbackPath := filepath.Join(fallbackDir, "a.json")
+ fallbackJSON := []byte(fmt.Sprintf("{\"version\": \"1.0.0\", \"hook\": {\"path\": \"%s\"}, \"when\": {\"always\": true}, \"stages\": [\"prestart\"]}", path))
+ fallbackInjected := &rspec.Hooks{
+ Prestart: []rspec.Hook{
+ {
+ Path: path,
+ },
+ },
+ }
+
+ t.Run("good-fallback-addition", func(t *testing.T) {
+ err = ioutil.WriteFile(fallbackPath, fallbackJSON, 0644)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ time.Sleep(100 * time.Millisecond) // wait for monitor to notice
+
+ config := &rspec.Spec{}
+ _, err = manager.Hooks(config, map[string]string{}, false)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ assert.Equal(t, fallbackInjected, config.Hooks)
+ })
+
+ primaryPath := filepath.Join(primaryDir, "a.json")
+ primaryJSON := []byte(fmt.Sprintf("{\"version\": \"1.0.0\", \"hook\": {\"path\": \"%s\", \"timeout\": 1}, \"when\": {\"always\": true}, \"stages\": [\"prestart\"]}", path))
+ one := 1
+ primaryInjected := &rspec.Hooks{
+ Prestart: []rspec.Hook{
+ {
+ Path: path,
+ Timeout: &one,
+ },
+ },
+ }
+
+ t.Run("good-primary-override", func(t *testing.T) {
+ err = ioutil.WriteFile(primaryPath, primaryJSON, 0644)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ time.Sleep(100 * time.Millisecond) // wait for monitor to notice
+
+ config := &rspec.Spec{}
+ _, err = manager.Hooks(config, map[string]string{}, false)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ assert.Equal(t, primaryInjected, config.Hooks)
+ })
+
+ t.Run("good-fallback-removal", func(t *testing.T) {
+ err = os.Remove(fallbackPath)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ time.Sleep(100 * time.Millisecond) // wait for monitor to notice
+
+ config := &rspec.Spec{}
+ _, err = manager.Hooks(config, map[string]string{}, false)
+ if err != nil {
+ t.Fatal(err)
+ }
+ assert.Equal(t, primaryInjected, config.Hooks) // masked by primary
+ })
+
+ t.Run("good-fallback-restore", func(t *testing.T) {
+ err = ioutil.WriteFile(fallbackPath, fallbackJSON, 0644)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ time.Sleep(100 * time.Millisecond) // wait for monitor to notice
+
+ config := &rspec.Spec{}
+ _, err = manager.Hooks(config, map[string]string{}, false)
+ if err != nil {
+ t.Fatal(err)
+ }
+ assert.Equal(t, primaryInjected, config.Hooks) // masked by primary
+ })
+
+ t.Run("bad-primary-addition", func(t *testing.T) {
+ err = ioutil.WriteFile(primaryPath, []byte("{\"version\": \"-1\"}"), 0644)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ time.Sleep(100 * time.Millisecond) // wait for monitor to notice
+
+ config := &rspec.Spec{}
+ expected := config.Hooks
+ _, err = manager.Hooks(config, map[string]string{}, false)
+ if err != nil {
+ t.Fatal(err)
+ }
+ assert.Equal(t, expected, config.Hooks)
+ })
+
+ t.Run("good-primary-removal", func(t *testing.T) {
+ err = os.Remove(primaryPath)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ time.Sleep(100 * time.Millisecond) // wait for monitor to notice
+
+ config := &rspec.Spec{}
+ _, err = manager.Hooks(config, map[string]string{}, false)
+ if err != nil {
+ t.Fatal(err)
+ }
+ assert.Equal(t, fallbackInjected, config.Hooks)
+ })
+
+ t.Run("good-non-json-addition", func(t *testing.T) {
+ err = ioutil.WriteFile(filepath.Join(fallbackDir, "README"), []byte("Hello"), 0644)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ time.Sleep(100 * time.Millisecond) // wait for monitor to notice
+
+ config := &rspec.Spec{}
+ _, err = manager.Hooks(config, map[string]string{}, false)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ assert.Equal(t, fallbackInjected, config.Hooks)
+ })
+
+ t.Run("good-fallback-removal", func(t *testing.T) {
+ err = os.Remove(fallbackPath)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ time.Sleep(100 * time.Millisecond) // wait for monitor to notice
+
+ config := &rspec.Spec{}
+ expected := config.Hooks
+ _, err = manager.Hooks(config, map[string]string{}, false)
+ if err != nil {
+ t.Fatal(err)
+ }
+ assert.Equal(t, expected, config.Hooks)
+ })
+
+ cancel()
+ err = <-sync
+ assert.Equal(t, context.Canceled, err)
+}
+
func TestMonitorBadWatcher(t *testing.T) {
ctx := context.Background()