summaryrefslogtreecommitdiff
path: root/src/mongo/gotools/vendor/src/github.com/smartystreets/goconvey/web/server/watch/integration_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/gotools/vendor/src/github.com/smartystreets/goconvey/web/server/watch/integration_test.go')
-rw-r--r--src/mongo/gotools/vendor/src/github.com/smartystreets/goconvey/web/server/watch/integration_test.go200
1 files changed, 200 insertions, 0 deletions
diff --git a/src/mongo/gotools/vendor/src/github.com/smartystreets/goconvey/web/server/watch/integration_test.go b/src/mongo/gotools/vendor/src/github.com/smartystreets/goconvey/web/server/watch/integration_test.go
new file mode 100644
index 00000000000..e26ad48c47a
--- /dev/null
+++ b/src/mongo/gotools/vendor/src/github.com/smartystreets/goconvey/web/server/watch/integration_test.go
@@ -0,0 +1,200 @@
+package watch
+
+import (
+ "bytes"
+ "io/ioutil"
+ "log"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "runtime"
+ "testing"
+ "time"
+
+ . "github.com/smartystreets/goconvey/convey"
+ "github.com/smartystreets/goconvey/web/server/messaging"
+)
+
+func TestWatcher(t *testing.T) {
+ if testing.Short() {
+ t.Skip("Skipping potentially long-running integration test...")
+ return
+ }
+
+ log.SetFlags(log.LstdFlags | log.Lshortfile | log.Lmicroseconds)
+ output := new(bytes.Buffer)
+ log.SetOutput(output)
+ defer func() { t.Log(output.String()) }()
+
+ _, filename, _, _ := runtime.Caller(0)
+ originalRoot := filepath.Join(filepath.Dir(filename), "integration_testing")
+ temporary, err := ioutil.TempDir("/tmp", "goconvey")
+ if err != nil {
+ t.Fatal(err)
+ }
+ root := filepath.Join(temporary, "integration_testing")
+ sub := filepath.Join(root, "sub")
+
+ err = CopyDir(originalRoot, root)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer func() {
+ err = os.RemoveAll(temporary)
+ if err != nil {
+ t.Fatal(err)
+ }
+ }()
+
+ var ( // commands
+ pause = messaging.WatcherCommand{Instruction: messaging.WatcherPause}
+ resume = messaging.WatcherCommand{Instruction: messaging.WatcherResume}
+
+ ignore = messaging.WatcherCommand{Instruction: messaging.WatcherIgnore, Details: sub}
+ reinstate = messaging.WatcherCommand{Instruction: messaging.WatcherReinstate, Details: sub}
+
+ adjustToSub = messaging.WatcherCommand{Instruction: messaging.WatcherAdjustRoot, Details: sub}
+ adjustToRoot = messaging.WatcherCommand{Instruction: messaging.WatcherAdjustRoot, Details: root}
+
+ execute = messaging.WatcherCommand{Instruction: messaging.WatcherExecute}
+
+ bogus = messaging.WatcherCommand{Instruction: 42}
+
+ stop = messaging.WatcherCommand{Instruction: messaging.WatcherStop}
+ )
+
+ Convey("Subject: Watcher operations", t, func() {
+ input := make(chan messaging.WatcherCommand)
+ output := make(chan messaging.Folders)
+ excludedDirs := []string{}
+ watcher := NewWatcher(root, -1, time.Millisecond, input, output, ".go", excludedDirs)
+
+ go watcher.Listen()
+
+ Convey("Initial scan results", func() {
+ go func() { input <- stop }()
+
+ results := []messaging.Folders{}
+ for result := range output {
+ results = append(results, result)
+ }
+
+ So(len(results), ShouldEqual, 1)
+ })
+
+ Convey("Manual execution produces additional results", func() {
+ go func() {
+ input <- execute
+ input <- stop
+ }()
+
+ results := []messaging.Folders{}
+ for result := range output {
+ results = append(results, result)
+ }
+
+ So(len(results), ShouldEqual, 2)
+ So(len(results[0]), ShouldEqual, 2)
+ So(len(results[1]), ShouldEqual, 2)
+ })
+
+ Convey("Ignore and Reinstate commands are not reflected in the scan results", func() {
+ go func() {
+ input <- ignore
+ input <- reinstate
+ input <- stop
+ }()
+
+ results := []messaging.Folders{}
+ for result := range output {
+ results = append(results, result)
+ }
+
+ So(len(results), ShouldEqual, 1)
+ So(results[0][sub].Ignored, ShouldBeFalse) // initial
+ })
+
+ Convey("Adjusting the root changes the number of folders in the scanned results", func() {
+ go func() {
+ input <- adjustToSub
+ input <- adjustToRoot
+ input <- stop
+ }()
+
+ results := []messaging.Folders{}
+ for result := range output {
+ results = append(results, result)
+ }
+
+ So(len(results), ShouldEqual, 3)
+ So(len(results[0]), ShouldEqual, 2) // initial
+ So(len(results[1]), ShouldEqual, 1) // root moved to sub
+ So(len(results[2]), ShouldEqual, 2) // root moved back to original location
+ })
+
+ Convey("A bogus command does not cause any additional scanning beyond the initial scan", func() {
+ go func() {
+ input <- bogus
+ input <- stop
+ }()
+
+ results := []messaging.Folders{}
+ for result := range output {
+ results = append(results, result)
+ }
+
+ So(len(results), ShouldEqual, 1) // initial scan
+ })
+
+ Convey("Scanning occurs as a result of a file system update", func() {
+ go func() {
+ time.Sleep(time.Second)
+ exec.Command("touch", filepath.Join(root, "main.go")).Run()
+ time.Sleep(time.Second)
+ input <- stop
+ }()
+
+ results := []messaging.Folders{}
+ for result := range output {
+ results = append(results, result)
+ }
+
+ So(len(results), ShouldEqual, 2)
+ })
+
+ Convey("Scanning does not occur as a result of resuming after a pause", func() {
+ go func() {
+ input <- pause
+ input <- resume
+ input <- stop
+ }()
+
+ results := []messaging.Folders{}
+ for result := range output {
+ results = append(results, result)
+ }
+
+ So(len(results), ShouldEqual, 1)
+ })
+
+ Convey("Scanning should not occur when the watcher is paused", func() {
+ go func() {
+ input <- pause
+ for x := 0; x < 2; x++ {
+ time.Sleep(time.Millisecond * 250)
+ exec.Command("touch", filepath.Join(root, "main.go")).Run()
+ time.Sleep(time.Millisecond * 250)
+ }
+ input <- resume
+ input <- stop
+ }()
+
+ results := []messaging.Folders{}
+ for result := range output {
+ results = append(results, result)
+ }
+
+ So(len(results), ShouldEqual, 2)
+ })
+ })
+}