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  }