github.com/getgauge/gauge@v1.6.9/execution/parallelExecution_test.go (about) 1 /*---------------------------------------------------------------- 2 * Copyright (c) ThoughtWorks, Inc. 3 * Licensed under the Apache License, Version 2.0 4 * See LICENSE in the project root for license information. 5 *----------------------------------------------------------------*/ 6 7 package execution 8 9 import ( 10 "testing" 11 12 "net" 13 14 "github.com/getgauge/gauge-proto/go/gauge_messages" 15 "github.com/getgauge/gauge/env" 16 "github.com/getgauge/gauge/execution/result" 17 "github.com/getgauge/gauge/gauge" 18 "github.com/getgauge/gauge/runner" 19 . "gopkg.in/check.v1" 20 ) 21 22 func Test(t *testing.T) { TestingT(t) } 23 24 type MySuite struct{} 25 26 var _ = Suite(&MySuite{}) 27 28 func (s *MySuite) TestNumberOfStreams(c *C) { 29 specs := createSpecsList(6) 30 e := parallelExecution{numberOfExecutionStreams: 5, specCollection: gauge.NewSpecCollection(specs, false)} 31 c.Assert(e.numberOfStreams(), Equals, 5) 32 33 specs = createSpecsList(6) 34 e = parallelExecution{numberOfExecutionStreams: 10, specCollection: gauge.NewSpecCollection(specs, false)} 35 c.Assert(e.numberOfStreams(), Equals, 6) 36 37 specs = createSpecsList(0) 38 e = parallelExecution{numberOfExecutionStreams: 17, specCollection: gauge.NewSpecCollection(specs, false)} 39 c.Assert(e.numberOfStreams(), Equals, 0) 40 } 41 42 func getValidationErrorMap() *gauge.BuildErrors { 43 return &gauge.BuildErrors{ 44 SpecErrs: make(map[*gauge.Specification][]error), 45 ScenarioErrs: make(map[*gauge.Scenario][]error), 46 StepErrs: make(map[*gauge.Step]error), 47 } 48 } 49 50 func (s *MySuite) TestAggregationOfSuiteResult(c *C) { 51 e := parallelExecution{errMaps: getValidationErrorMap()} 52 suiteRes1 := &result.SuiteResult{ExecutionTime: 1, SpecsFailedCount: 1, IsFailed: true, SpecResults: []*result.SpecResult{{}, {}}} 53 suiteRes2 := &result.SuiteResult{ExecutionTime: 3, SpecsFailedCount: 0, IsFailed: false, SpecResults: []*result.SpecResult{{}, {}}} 54 suiteRes3 := &result.SuiteResult{ExecutionTime: 5, SpecsFailedCount: 0, IsFailed: false, SpecResults: []*result.SpecResult{{}, {}}} 55 var suiteResults []*result.SuiteResult 56 suiteResults = append(suiteResults, suiteRes1, suiteRes2, suiteRes3) 57 e.aggregateResults(suiteResults) 58 59 aggregatedRes := e.suiteResult 60 c.Assert(aggregatedRes.SpecsFailedCount, Equals, 1) 61 c.Assert(aggregatedRes.IsFailed, Equals, true) 62 c.Assert(len(aggregatedRes.SpecResults), Equals, 6) 63 c.Assert(aggregatedRes.SpecsSkippedCount, Equals, 0) 64 } 65 66 func (s *MySuite) TestAggregationOfSuiteResultWithUnhandledErrors(c *C) { 67 e := parallelExecution{} 68 suiteRes1 := &result.SuiteResult{IsFailed: true, UnhandledErrors: []error{streamExecError{specsSkipped: []string{"spec1", "spec2"}, message: "Runner failed to start"}}} 69 suiteRes2 := &result.SuiteResult{IsFailed: false, UnhandledErrors: []error{streamExecError{specsSkipped: []string{"spec3", "spec4"}, message: "Runner failed to start"}}} 70 suiteRes3 := &result.SuiteResult{IsFailed: false} 71 suiteRes4 := &result.SuiteResult{SpecResults: []*result.SpecResult{{Skipped: true}}} 72 var suiteResults []*result.SuiteResult 73 suiteResults = append(suiteResults, suiteRes1, suiteRes2, suiteRes3, suiteRes4) 74 e.aggregateResults(suiteResults) 75 76 aggregatedRes := e.suiteResult 77 c.Assert(len(aggregatedRes.UnhandledErrors), Equals, 2) 78 c.Assert(aggregatedRes.UnhandledErrors[0].Error(), Equals, "The following specifications could not be executed:\n"+ 79 "spec1\n"+ 80 "spec2\n"+ 81 "Reason : Runner failed to start.") 82 c.Assert(aggregatedRes.UnhandledErrors[1].Error(), Equals, "The following specifications could not be executed:\n"+ 83 "spec3\n"+ 84 "spec4\n"+ 85 "Reason : Runner failed to start.") 86 err := (aggregatedRes.UnhandledErrors[0]).(streamExecError) 87 c.Assert(len(err.specsSkipped), Equals, 2) 88 c.Assert(aggregatedRes.SpecsSkippedCount, Equals, 1) 89 } 90 91 func (s *MySuite) TestAggregationOfSuiteResultWithHook(c *C) { 92 e := parallelExecution{errMaps: getValidationErrorMap()} 93 suiteRes1 := &result.SuiteResult{PreSuite: &gauge_messages.ProtoHookFailure{}} 94 suiteRes2 := &result.SuiteResult{PreSuite: &gauge_messages.ProtoHookFailure{}} 95 suiteRes3 := &result.SuiteResult{PostSuite: &gauge_messages.ProtoHookFailure{}} 96 var suiteResults []*result.SuiteResult 97 suiteResults = append(suiteResults, suiteRes1, suiteRes2, suiteRes3) 98 e.aggregateResults(suiteResults) 99 100 aggregatedRes := e.suiteResult 101 c.Assert(aggregatedRes.PreSuite, Equals, suiteRes2.PreSuite) 102 c.Assert(aggregatedRes.PostSuite, Equals, suiteRes3.PostSuite) 103 } 104 105 func (s *MySuite) TestIsMultiThreadedWithEnvSetToFalse(c *C) { 106 e := parallelExecution{errMaps: getValidationErrorMap()} 107 108 env.EnableMultiThreadedExecution = func() bool { return false } 109 110 c.Assert(false, Equals, e.isMultithreaded()) 111 } 112 113 func (s *MySuite) TestIsMultiThreadedWithRunnerWhenSupportsMultithreading(c *C) { 114 e := parallelExecution{errMaps: getValidationErrorMap(), runners: []runner.Runner{&fakeRunner{isMultiThreaded: true}}} 115 116 env.EnableMultiThreadedExecution = func() bool { return true } 117 118 c.Assert(true, Equals, e.isMultithreaded()) 119 } 120 121 func (s *MySuite) TestIsMultiThreadedWithRunnerWhenDoesNotSupportMultithreading(c *C) { 122 e := parallelExecution{errMaps: getValidationErrorMap(), runners: []runner.Runner{&fakeRunner{isMultiThreaded: false}}} 123 124 env.EnableMultiThreadedExecution = func() bool { return true } 125 126 c.Assert(false, Equals, e.isMultithreaded()) 127 } 128 129 type fakeRunner struct { 130 isMultiThreaded bool 131 } 132 133 func (f *fakeRunner) ExecuteMessageWithTimeout(m *gauge_messages.Message) (*gauge_messages.Message, error) { 134 return nil, nil 135 } 136 137 func (f *fakeRunner) ExecuteAndGetStatus(m *gauge_messages.Message) *gauge_messages.ProtoExecutionResult { 138 return nil 139 } 140 func (f *fakeRunner) Alive() bool { 141 return false 142 } 143 func (f *fakeRunner) Kill() error { 144 return nil 145 } 146 func (f *fakeRunner) Connection() net.Conn { 147 return nil 148 } 149 func (f *fakeRunner) IsMultithreaded() bool { 150 return f.isMultiThreaded 151 } 152 153 func (f *fakeRunner) Info() *runner.RunnerInfo { 154 return nil 155 } 156 func (f *fakeRunner) Pid() int { 157 return 0 158 }