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  })