github.com/onsi/ginkgo@v1.16.6-0.20211118180735-4e1925ba4c95/types/config_test.go (about) 1 package types_test 2 3 import ( 4 "flag" 5 "net/http" 6 7 . "github.com/onsi/ginkgo" 8 "github.com/onsi/ginkgo/types" 9 . "github.com/onsi/gomega" 10 "github.com/onsi/gomega/ghttp" 11 ) 12 13 var _ = Describe("Config", func() { 14 It("has valid deprecation doc links", func() { 15 flags := types.SuiteConfigFlags 16 flags = flags.CopyAppend(types.ParallelConfigFlags...) 17 flags = flags.CopyAppend(types.ReporterConfigFlags...) 18 flags = flags.CopyAppend(types.GinkgoCLISharedFlags...) 19 flags = flags.CopyAppend(types.GinkgoCLIRunAndWatchFlags...) 20 flags = flags.CopyAppend(types.GinkgoCLIRunFlags...) 21 flags = flags.CopyAppend(types.GinkgoCLIWatchFlags...) 22 flags = flags.CopyAppend(types.GoBuildFlags...) 23 flags = flags.CopyAppend(types.GoRunFlags...) 24 for _, flag := range flags { 25 if flag.DeprecatedDocLink != "" { 26 Ω(anchors.DocAnchors["MIGRATING_TO_V2.md"]).Should(ContainElement(flag.DeprecatedDocLink)) 27 } 28 } 29 }) 30 31 Describe("ReporterConfig", func() { 32 Describe("WillGenerateReport", func() { 33 It("returns true if it will generate a report", func() { 34 repConf := types.ReporterConfig{} 35 Ω(repConf.WillGenerateReport()).Should(BeFalse()) 36 37 repConf = types.ReporterConfig{JSONReport: "foo"} 38 Ω(repConf.WillGenerateReport()).Should(BeTrue()) 39 40 repConf = types.ReporterConfig{JUnitReport: "foo"} 41 Ω(repConf.WillGenerateReport()).Should(BeTrue()) 42 43 repConf = types.ReporterConfig{TeamcityReport: "foo"} 44 Ω(repConf.WillGenerateReport()).Should(BeTrue()) 45 }) 46 }) 47 48 Describe("Verbosity", func() { 49 It("returns the appropriate verbosity level", func() { 50 repConf := types.ReporterConfig{} 51 Ω(repConf.Verbosity()).Should(Equal(types.VerbosityLevelNormal)) 52 53 repConf = types.ReporterConfig{Succinct: true} 54 Ω(repConf.Verbosity()).Should(Equal(types.VerbosityLevelSuccinct)) 55 56 repConf = types.ReporterConfig{Verbose: true} 57 Ω(repConf.Verbosity()).Should(Equal(types.VerbosityLevelVerbose)) 58 59 repConf = types.ReporterConfig{VeryVerbose: true} 60 Ω(repConf.Verbosity()).Should(Equal(types.VerbosityLevelVeryVerbose)) 61 }) 62 63 It("can do verbosity math", func() { 64 Ω(types.VerbosityLevelNormal.LT(types.VerbosityLevelVeryVerbose)).Should(BeTrue()) 65 Ω(types.VerbosityLevelNormal.LT(types.VerbosityLevelVerbose)).Should(BeTrue()) 66 Ω(types.VerbosityLevelNormal.LT(types.VerbosityLevelNormal)).Should(BeFalse()) 67 Ω(types.VerbosityLevelNormal.LT(types.VerbosityLevelSuccinct)).Should(BeFalse()) 68 69 Ω(types.VerbosityLevelNormal.LTE(types.VerbosityLevelVeryVerbose)).Should(BeTrue()) 70 Ω(types.VerbosityLevelNormal.LTE(types.VerbosityLevelVerbose)).Should(BeTrue()) 71 Ω(types.VerbosityLevelNormal.LTE(types.VerbosityLevelNormal)).Should(BeTrue()) 72 Ω(types.VerbosityLevelNormal.LTE(types.VerbosityLevelSuccinct)).Should(BeFalse()) 73 74 Ω(types.VerbosityLevelNormal.GT(types.VerbosityLevelVeryVerbose)).Should(BeFalse()) 75 Ω(types.VerbosityLevelNormal.GT(types.VerbosityLevelVerbose)).Should(BeFalse()) 76 Ω(types.VerbosityLevelNormal.GT(types.VerbosityLevelNormal)).Should(BeFalse()) 77 Ω(types.VerbosityLevelNormal.GT(types.VerbosityLevelSuccinct)).Should(BeTrue()) 78 79 Ω(types.VerbosityLevelNormal.GTE(types.VerbosityLevelVeryVerbose)).Should(BeFalse()) 80 Ω(types.VerbosityLevelNormal.GTE(types.VerbosityLevelVerbose)).Should(BeFalse()) 81 Ω(types.VerbosityLevelNormal.GTE(types.VerbosityLevelNormal)).Should(BeTrue()) 82 Ω(types.VerbosityLevelNormal.GTE(types.VerbosityLevelSuccinct)).Should(BeTrue()) 83 84 Ω(types.VerbosityLevelNormal.Is(types.VerbosityLevelVeryVerbose)).Should(BeFalse()) 85 Ω(types.VerbosityLevelNormal.Is(types.VerbosityLevelVerbose)).Should(BeFalse()) 86 Ω(types.VerbosityLevelNormal.Is(types.VerbosityLevelNormal)).Should(BeTrue()) 87 Ω(types.VerbosityLevelNormal.Is(types.VerbosityLevelSuccinct)).Should(BeFalse()) 88 }) 89 }) 90 }) 91 92 Describe("VetConfig", func() { 93 var suiteConf types.SuiteConfig 94 var repConf types.ReporterConfig 95 var flagSet types.GinkgoFlagSet 96 var goFlagSet *flag.FlagSet 97 98 BeforeEach(func() { 99 var err error 100 goFlagSet = flag.NewFlagSet("test", flag.ContinueOnError) 101 goFlagSet.Int("count", 1, "") 102 goFlagSet.Int("parallel", 0, "") 103 flagSet, err = types.NewAttachedGinkgoFlagSet(goFlagSet, types.GinkgoFlags{}, nil, types.GinkgoFlagSections{}, types.GinkgoFlagSection{}) 104 Ω(err).ShouldNot(HaveOccurred()) 105 106 suiteConf = types.NewDefaultSuiteConfig() 107 repConf = types.NewDefaultReporterConfig() 108 }) 109 110 Context("when all is well", func() { 111 It("retuns no errors", func() { 112 errors := types.VetConfig(flagSet, suiteConf, repConf) 113 Ω(errors).Should(BeEmpty()) 114 }) 115 }) 116 117 Context("when unsupported go flags are parsed", func() { 118 BeforeEach(func() { 119 goFlagSet.Parse([]string{"-count=2", "-parallel=2"}) 120 }) 121 122 It("returns errors when unsupported go flags are set", func() { 123 errors := types.VetConfig(flagSet, suiteConf, repConf) 124 Ω(errors).Should(ConsistOf(types.GinkgoErrors.InvalidGoFlagCount(), types.GinkgoErrors.InvalidGoFlagParallel())) 125 }) 126 }) 127 128 Describe("errors related to parallelism", func() { 129 Context("when parallel total is less than one", func() { 130 BeforeEach(func() { 131 suiteConf.ParallelTotal = 0 132 }) 133 134 It("errors", func() { 135 errors := types.VetConfig(flagSet, suiteConf, repConf) 136 Ω(errors).Should(ContainElement(types.GinkgoErrors.InvalidParallelTotalConfiguration())) 137 }) 138 }) 139 140 Context("when parallel node is less than one", func() { 141 BeforeEach(func() { 142 suiteConf.ParallelProcess = 0 143 }) 144 145 It("errors", func() { 146 errors := types.VetConfig(flagSet, suiteConf, repConf) 147 Ω(errors).Should(ConsistOf(types.GinkgoErrors.InvalidParallelProcessConfiguration())) 148 }) 149 }) 150 151 Context("when parallel node is greater than parallel total", func() { 152 BeforeEach(func() { 153 suiteConf.ParallelProcess = suiteConf.ParallelTotal + 1 154 }) 155 156 It("errors", func() { 157 errors := types.VetConfig(flagSet, suiteConf, repConf) 158 Ω(errors).Should(ConsistOf(types.GinkgoErrors.InvalidParallelProcessConfiguration())) 159 }) 160 }) 161 162 Context("when running in parallel", func() { 163 var server *ghttp.Server 164 BeforeEach(func() { 165 server = ghttp.NewServer() 166 server.SetAllowUnhandledRequests(true) 167 server.SetUnhandledRequestStatusCode(http.StatusOK) 168 169 suiteConf.ParallelTotal = 2 170 suiteConf.ParallelHost = server.URL() 171 }) 172 173 AfterEach(func() { 174 server.Close() 175 }) 176 177 Context("and parallel host is not set", func() { 178 BeforeEach(func() { 179 suiteConf.ParallelHost = "" 180 }) 181 It("errors", func() { 182 errors := types.VetConfig(flagSet, suiteConf, repConf) 183 Ω(errors).Should(ConsistOf(types.GinkgoErrors.MissingParallelHostConfiguration())) 184 }) 185 }) 186 187 Context("when trying to dry run in parallel", func() { 188 BeforeEach(func() { 189 suiteConf.DryRun = true 190 }) 191 It("errors", func() { 192 errors := types.VetConfig(flagSet, suiteConf, repConf) 193 Ω(errors).Should(ConsistOf(types.GinkgoErrors.DryRunInParallelConfiguration())) 194 }) 195 }) 196 }) 197 }) 198 199 Describe("file filter errors", func() { 200 Context("with an invalid --focus-file and/or --skip-file", func() { 201 BeforeEach(func() { 202 suiteConf.FocusFiles = append(suiteConf.FocusFiles, "bloop:123a") 203 suiteConf.SkipFiles = append(suiteConf.SkipFiles, "bloop:123b") 204 }) 205 206 It("errors", func() { 207 errors := types.VetConfig(flagSet, suiteConf, repConf) 208 Ω(errors).Should(ConsistOf(types.GinkgoErrors.InvalidFileFilter("bloop:123a"), types.GinkgoErrors.InvalidFileFilter("bloop:123b"))) 209 }) 210 }) 211 }) 212 213 Describe("validating --output-interceptor-mode", func() { 214 It("errors if an invalid output interceptor mode is specified", func() { 215 suiteConf.OutputInterceptorMode = "DURP" 216 errors := types.VetConfig(flagSet, suiteConf, repConf) 217 Ω(errors).Should(ConsistOf(types.GinkgoErrors.InvalidOutputInterceptorModeConfiguration("DURP"))) 218 219 for _, value := range []string{"", "dup", "DUP", "swap", "SWAP", "none", "NONE"} { 220 suiteConf.OutputInterceptorMode = value 221 errors = types.VetConfig(flagSet, suiteConf, repConf) 222 Ω(errors).Should(BeEmpty()) 223 } 224 }) 225 }) 226 227 Context("when more than one verbosity flag is set", func() { 228 It("errors", func() { 229 repConf.Succinct, repConf.Verbose, repConf.VeryVerbose = true, true, false 230 errors := types.VetConfig(flagSet, suiteConf, repConf) 231 Ω(errors).Should(ConsistOf(types.GinkgoErrors.ConflictingVerbosityConfiguration())) 232 233 repConf.Succinct, repConf.Verbose, repConf.VeryVerbose = true, false, true 234 errors = types.VetConfig(flagSet, suiteConf, repConf) 235 Ω(errors).Should(ConsistOf(types.GinkgoErrors.ConflictingVerbosityConfiguration())) 236 237 repConf.Succinct, repConf.Verbose, repConf.VeryVerbose = false, true, true 238 errors = types.VetConfig(flagSet, suiteConf, repConf) 239 Ω(errors).Should(ConsistOf(types.GinkgoErrors.ConflictingVerbosityConfiguration())) 240 241 repConf.Succinct, repConf.Verbose, repConf.VeryVerbose = true, true, true 242 errors = types.VetConfig(flagSet, suiteConf, repConf) 243 Ω(errors).Should(ConsistOf(types.GinkgoErrors.ConflictingVerbosityConfiguration())) 244 }) 245 }) 246 }) 247 })