summaryrefslogtreecommitdiff
path: root/src/mongo/gotools/vendor/src/github.com/smartystreets/goconvey/web/server/watch/functional_core_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/gotools/vendor/src/github.com/smartystreets/goconvey/web/server/watch/functional_core_test.go')
-rw-r--r--src/mongo/gotools/vendor/src/github.com/smartystreets/goconvey/web/server/watch/functional_core_test.go419
1 files changed, 419 insertions, 0 deletions
diff --git a/src/mongo/gotools/vendor/src/github.com/smartystreets/goconvey/web/server/watch/functional_core_test.go b/src/mongo/gotools/vendor/src/github.com/smartystreets/goconvey/web/server/watch/functional_core_test.go
new file mode 100644
index 00000000000..d0f74867acc
--- /dev/null
+++ b/src/mongo/gotools/vendor/src/github.com/smartystreets/goconvey/web/server/watch/functional_core_test.go
@@ -0,0 +1,419 @@
+package watch
+
+import (
+ "fmt"
+ "testing"
+
+ . "github.com/smartystreets/goconvey/convey"
+ "github.com/smartystreets/goconvey/web/server/messaging"
+)
+
+func TestCategorize(t *testing.T) {
+ fileSystem := []*FileSystemItem{
+ {
+ Root: "/.hello",
+ Path: "/.hello",
+ Name: "hello",
+ IsFolder: true,
+ },
+ {
+ Root: "/.hello",
+ Path: "/.hello/1/hello/world.txt",
+ Name: "world.txt",
+ IsFolder: false,
+ },
+ {
+ Root: "/.hello",
+ Path: "/.hello/1/2/3/4/5/hello/world.go",
+ Name: "world.go",
+ IsFolder: false,
+ },
+ {
+ Root: "/.hello",
+ Path: "/.hello/world.go",
+ Name: "world.go",
+ IsFolder: false,
+ },
+ {
+ Root: "/.hello",
+ Path: "/.hello/hello/world.tmpl",
+ Name: "world.tmpl",
+ IsFolder: false,
+ },
+ {
+ Root: "/.hello",
+ Path: "/.hello/hello/.world.go",
+ Name: ".world.go",
+ IsFolder: false,
+ },
+ {
+ Root: "/.hello",
+ Path: "/.hello/hello/_world.go",
+ Name: ".world.go",
+ IsFolder: false,
+ },
+ {
+ Root: "/.hello",
+ Path: "/.hello/hello/flymake_world.go",
+ Name: "flymake_world.go",
+ IsFolder: false,
+ },
+ {
+ Root: "/.hello",
+ Path: "/.hello/.hello",
+ Name: ".hello",
+ IsFolder: true,
+ },
+ {
+ Root: "/.hello",
+ Path: "/.hello/.hello/hello",
+ Name: "hello",
+ IsFolder: true,
+ },
+ {
+ Root: "/.hello",
+ Path: "/.hello/.hello/world.go",
+ Name: "world.go",
+ IsFolder: false,
+ },
+ {
+ Root: "/.hello",
+ Path: "/.hello/hello/hi.goconvey",
+ Name: "hi.goconvey",
+ IsFolder: false,
+ },
+ {
+ Root: "/.hello",
+ Path: "/.hello/hello2/.goconvey",
+ Name: ".goconvey",
+ IsFolder: false,
+ },
+ {
+ Root: "/.hello",
+ Path: "/.hello/_hello",
+ Name: "_hello",
+ IsFolder: true,
+ },
+ }
+
+ Convey("A stream of file system items should be categorized correctly", t, func() {
+ items := make(chan *FileSystemItem)
+
+ go func() {
+ for _, item := range fileSystem {
+ items <- item
+ }
+ close(items)
+ }()
+
+ folders, profiles, goFiles := Categorize(items, "/.hello", []string{".go"})
+ So(folders, ShouldResemble, fileSystem[:1])
+ So(profiles, ShouldResemble, fileSystem[11:12])
+ So(goFiles, ShouldResemble, fileSystem[2:4])
+ })
+
+ Convey("A stream of file system items should be categorized correctly", t, func() {
+ items := make(chan *FileSystemItem)
+
+ go func() {
+ for _, item := range fileSystem {
+ items <- item
+ }
+ close(items)
+ }()
+
+ folders, profiles, goFiles := Categorize(items, "/.hello", []string{".go", ".tmpl"})
+ So(folders, ShouldResemble, fileSystem[:1])
+ So(profiles, ShouldResemble, fileSystem[11:12])
+ So(goFiles, ShouldResemble, fileSystem[2:5])
+ })
+}
+
+func TestParseProfile(t *testing.T) {
+ var parseProfileTestCases = []struct {
+ SKIP bool
+ description string
+ input string
+ resultIgnored bool
+ resultTestTags []string
+ resultTestArgs []string
+ }{
+ {
+ SKIP: false,
+ description: "Blank profile",
+ input: "",
+ resultIgnored: false,
+ },
+ {
+ SKIP: false,
+ description: "All lines are blank or whitespace",
+ input: "\n \n \t\t\t \n \n \n",
+ resultIgnored: false,
+ },
+ {
+ SKIP: false,
+ description: "Ignored package, no args included",
+ input: "IGNORE\n-timeout=4s",
+ resultIgnored: true,
+ },
+ {
+ SKIP: false,
+ description: "Ignore directive is commented, all args are included",
+ input: "#IGNORE\n-timeout=4s\n-parallel=5",
+ resultIgnored: false,
+ resultTestArgs: []string{"-timeout=4s", "-parallel=5"},
+ },
+ {
+ SKIP: false,
+ description: "No ignore directive, all args are included",
+ input: "-run=TestBlah\n-timeout=42s",
+ resultIgnored: false,
+ resultTestArgs: []string{"-run=TestBlah", "-timeout=42s"},
+ },
+ {
+ SKIP: false,
+ description: "Some args are commented, therefore ignored",
+ input: "-run=TestBlah\n #-timeout=42s",
+ resultIgnored: false,
+ resultTestArgs: []string{"-run=TestBlah"},
+ },
+ {
+ SKIP: false,
+ description: "All args are commented, therefore all are ignored",
+ input: "#-run=TestBlah\n//-timeout=42",
+ resultIgnored: false,
+ },
+ {
+ SKIP: false,
+ description: "We ignore certain flags like -v and -cover and -coverprofile because they are specified by the shell",
+ input: "-v\n-cover\n-coverprofile=blah.out",
+ resultIgnored: false,
+ },
+ {
+ SKIP: false,
+ description: "We allow certain coverage flags like -coverpkg and -covermode",
+ input: "-coverpkg=blah\n-covermode=atomic",
+ resultIgnored: false,
+ resultTestArgs: []string{"-coverpkg=blah", "-covermode=atomic"},
+ },
+ {
+ SKIP: false,
+ description: "We parse out -tags particularly",
+ input: "-coverpkg=blah\n-covermode=atomic\n-tags=foo,bar",
+ resultIgnored: false,
+ resultTestTags: []string{"foo", "bar"},
+ resultTestArgs: []string{"-coverpkg=blah", "-covermode=atomic"},
+ },
+ }
+
+ for i, test := range parseProfileTestCases {
+ if test.SKIP {
+ SkipConvey(fmt.Sprintf("Profile Parsing, Test Case #%d: %s (SKIPPED)", i, test.description), t, nil)
+ } else {
+ Convey(fmt.Sprintf("Profile Parsing, Test Case #%d: %s", i, test.description), t, func() {
+ ignored, testTags, testArgs := ParseProfile(test.input)
+
+ So(ignored, ShouldEqual, test.resultIgnored)
+ So(testTags, ShouldResemble, test.resultTestTags)
+ So(testArgs, ShouldResemble, test.resultTestArgs)
+ })
+ }
+ }
+}
+
+func TestCreateFolders(t *testing.T) {
+ Convey("File system items that represent folders should be converted to folder structs correctly", t, func() {
+ expected := map[string]*messaging.Folder{
+ "/root/1": {Path: "/root/1", Root: "/root"},
+ "/root/1/2": {Path: "/root/1/2", Root: "/root"},
+ "/root/1/2/3": {Path: "/root/1/2/3", Root: "/root"},
+ }
+
+ inputs := []*FileSystemItem{
+ {Path: "/root/1", Root: "/root", IsFolder: true},
+ {Path: "/root/1/2", Root: "/root", IsFolder: true},
+ {Path: "/root/1/2/3", Root: "/root", IsFolder: true},
+ }
+
+ actual := CreateFolders(inputs)
+
+ for key, actualValue := range actual {
+ So(actualValue, ShouldResemble, expected[key])
+ }
+ })
+}
+
+func TestLimitDepth(t *testing.T) {
+ Convey("Subject: Limiting folders based on relative depth from a common root", t, func() {
+
+ folders := map[string]*messaging.Folder{
+ "/root/1": {
+ Path: "/root/1",
+ Root: "/root",
+ },
+ "/root/1/2": {
+ Path: "/root/1/2",
+ Root: "/root",
+ },
+ "/root/1/2/3": {
+ Path: "/root/1/2/3",
+ Root: "/root",
+ },
+ }
+
+ Convey("When there is no depth limit", func() {
+ LimitDepth(folders, -1)
+
+ Convey("No folders should be excluded", func() {
+ So(len(folders), ShouldEqual, 3)
+ })
+ })
+
+ Convey("When there is a limit", func() {
+ LimitDepth(folders, 2)
+
+ Convey("The deepest folder (in this case) should be excluded", func() {
+ So(len(folders), ShouldEqual, 2)
+ _, exists := folders["/root/1/2/3"]
+ So(exists, ShouldBeFalse)
+ })
+ })
+ })
+}
+
+func TestAttachProfiles(t *testing.T) {
+ Convey("Subject: Attaching profile information to a folder", t, func() {
+ folders := map[string]*messaging.Folder{
+ "/root/1": {
+ Path: "/root/1",
+ Root: "/root",
+ },
+ "/root/1/2": {
+ Path: "/root/1/2",
+ Root: "/root",
+ },
+ "/root/1/2/3": {
+ Path: "/root/1/2/3",
+ Root: "/root",
+ },
+ }
+
+ profiles := []*FileSystemItem{
+ {
+ Path: "/root/too-shallow.goconvey",
+ ProfileDisabled: true,
+ ProfileArguments: []string{"1", "2"},
+ },
+ {
+ Path: "/root/1/2/hi.goconvey",
+ ProfileDisabled: true,
+ ProfileArguments: []string{"1", "2"},
+ },
+ {
+ Path: "/root/1/2/3/4/does-not-exist",
+ ProfileDisabled: true,
+ ProfileArguments: []string{"1", "2", "3", "4"},
+ },
+ }
+
+ Convey("Profiles that match folders should be merged with those folders", func() {
+ AttachProfiles(folders, profiles)
+
+ Convey("No profiles matched the first folder, so no assignments should occur", func() {
+ So(folders["/root/1"].Disabled, ShouldBeFalse)
+ So(folders["/root/1"].TestArguments, ShouldBeEmpty)
+ })
+
+ Convey("The second folder should match the first profile", func() {
+ So(folders["/root/1/2"].Disabled, ShouldBeTrue)
+ So(folders["/root/1/2"].TestArguments, ShouldResemble, []string{"1", "2"})
+ })
+
+ Convey("No profiles match the third folder so no assignments should occur", func() {
+ So(folders["/root/1/2/3"].Disabled, ShouldBeFalse)
+ So(folders["/root/1/2/3"].TestArguments, ShouldBeEmpty)
+ })
+ })
+ })
+}
+
+func TestMarkIgnored(t *testing.T) {
+ Convey("Subject: folders that have been ignored should be marked as such", t, func() {
+ folders := map[string]*messaging.Folder{
+ "/root/1": {
+ Path: "/root/1",
+ Root: "/root",
+ },
+ "/root/1/2": {
+ Path: "/root/1/2",
+ Root: "/root",
+ },
+ "/root/1/2/3": {
+ Path: "/root/1/2/3",
+ Root: "/root",
+ },
+ }
+
+ Convey("When there are no ignored folders", func() {
+ ignored := map[string]struct{}{}
+ MarkIgnored(folders, ignored)
+
+ Convey("No folders should be marked as ignored", func() {
+ So(folders["/root/1"].Ignored, ShouldBeFalse)
+ So(folders["/root/1/2"].Ignored, ShouldBeFalse)
+ So(folders["/root/1/2/3"].Ignored, ShouldBeFalse)
+ })
+ })
+ Convey("When there are ignored folders", func() {
+ ignored := map[string]struct{}{"1/2": {}}
+ MarkIgnored(folders, ignored)
+
+ Convey("The ignored folders should be marked as ignored", func() {
+ So(folders["/root/1"].Ignored, ShouldBeFalse)
+ So(folders["/root/1/2"].Ignored, ShouldBeTrue)
+ So(folders["/root/1/2/3"].Ignored, ShouldBeFalse)
+ })
+ })
+ })
+}
+
+func TestActiveFolders(t *testing.T) {
+ Convey("Subject: Folders that are not ignored or disabled are active", t, func() {
+ folders := map[string]*messaging.Folder{
+ "/root/1": {
+ Path: "/root/1",
+ Root: "/root",
+ Ignored: true,
+ },
+ "/root/1/2": {
+ Path: "/root/1/2",
+ Root: "/root",
+ },
+ "/root/1/2/3": {
+ Path: "/root/1/2/3",
+ Root: "/root",
+ Disabled: true,
+ },
+ }
+
+ active := ActiveFolders(folders)
+
+ So(len(active), ShouldEqual, 1)
+ So(active["/root/1/2"], ShouldResemble, folders["/root/1/2"])
+ })
+}
+
+func TestSum(t *testing.T) {
+ Convey("Subject: file system items within specified directores should be counted and summed", t, func() {
+ folders := map[string]*messaging.Folder{
+ "/root/1": {Path: "/root/1", Root: "/root", Ignored: true},
+ }
+ items := []*FileSystemItem{
+ {Size: 1, Modified: 3, Path: "/root/1/hi.go"},
+ {Size: 7, Modified: 13, Path: "/root/1/bye.go"},
+ {Size: 33, Modified: 45, Path: "/root/1/2/salutations.go"}, // not counted
+ }
+
+ So(Sum(folders, items), ShouldEqual, 1+3+7+13)
+ })
+}