github.com/getgauge/gauge@v1.6.9/execution/parallelGrpcExecution.go (about)

     1  package execution
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/getgauge/gauge-proto/go/gauge_messages"
     7  	"github.com/getgauge/gauge/execution/result"
     8  	"github.com/getgauge/gauge/gauge"
     9  	"github.com/getgauge/gauge/logger"
    10  	"github.com/getgauge/gauge/runner"
    11  )
    12  
    13  func (e *parallelExecution) executeGrpcMultithreaded() {
    14  	defer close(e.resultChan)
    15  	totalStreams := e.numberOfStreams()
    16  	e.wg.Add(totalStreams)
    17  	r, ok := e.runners[0].(*runner.GrpcRunner)
    18  	if !ok {
    19  		logger.Fatalf(true, "Expected GrpcRunner, but got %T instead. Gauge cannot use this runner.", e.runners[0])
    20  	}
    21  	r.IsExecuting = true
    22  	e.suiteResult = result.NewSuiteResult(ExecuteTags, e.startTime)
    23  	res := initSuiteDataStore(r)
    24  	if res.GetFailed() {
    25  		e.suiteResult.AddUnhandledError(fmt.Errorf("failed to initialize suite datastore. Error: %s", res.GetErrorMessage()))
    26  		return
    27  	}
    28  	e.notifyBeforeSuite()
    29  
    30  	for i := 1; i <= totalStreams; i++ {
    31  		go func(stream int) {
    32  			defer e.wg.Done()
    33  			executionInfo := newExecutionInfo(e.specCollection, r, e.pluginHandler, e.errMaps, false, stream)
    34  			se := newSimpleExecution(executionInfo, false, true)
    35  			se.execute()
    36  			e.resultChan <- se.suiteResult
    37  		}(i)
    38  	}
    39  
    40  	e.wg.Wait()
    41  	e.notifyAfterSuite()
    42  	r.IsExecuting = false
    43  	if err := r.Kill(); err != nil {
    44  		logger.Infof(true, "unable to kill runner: %s", err.Error())
    45  	}
    46  }
    47  
    48  func initSuiteDataStore(r runner.Runner) *gauge_messages.ProtoExecutionResult {
    49  	m := &gauge_messages.Message{MessageType: gauge_messages.Message_SuiteDataStoreInit,
    50  		SuiteDataStoreInitRequest: &gauge_messages.SuiteDataStoreInitRequest{}}
    51  	return r.ExecuteAndGetStatus(m)
    52  }
    53  
    54  func (e *parallelExecution) notifyBeforeSuite() {
    55  	m := &gauge_messages.Message{MessageType: gauge_messages.Message_ExecutionStarting,
    56  		ExecutionStartingRequest: &gauge_messages.ExecutionStartingRequest{
    57  			CurrentExecutionInfo: &gauge_messages.ExecutionInfo{},
    58  			Stream:               1},
    59  	}
    60  	e.pluginHandler.NotifyPlugins(m)
    61  	res := e.runners[0].ExecuteAndGetStatus(m)
    62  	e.suiteResult.PreHookMessages = res.Message
    63  	e.suiteResult.PreHookScreenshotFiles = res.ScreenshotFiles
    64  	if res.GetFailed() {
    65  		result.AddPreHook(e.suiteResult, res)
    66  	}
    67  	m.ExecutionStartingRequest.SuiteResult = gauge.ConvertToProtoSuiteResult(e.suiteResult)
    68  	e.pluginHandler.NotifyPlugins(m)
    69  }
    70  
    71  func (e *parallelExecution) notifyAfterSuite() {
    72  	m := &gauge_messages.Message{MessageType: gauge_messages.Message_ExecutionEnding,
    73  		ExecutionEndingRequest: &gauge_messages.ExecutionEndingRequest{
    74  			CurrentExecutionInfo: &gauge_messages.ExecutionInfo{},
    75  			Stream:               1,
    76  		},
    77  	}
    78  	e.pluginHandler.NotifyPlugins(m)
    79  	res := e.runners[0].ExecuteAndGetStatus(m)
    80  	e.suiteResult.PostHookMessages = res.Message
    81  	e.suiteResult.PostHookScreenshotFiles = res.ScreenshotFiles
    82  	if res.GetFailed() {
    83  		result.AddPostHook(e.suiteResult, res)
    84  	}
    85  	m.ExecutionEndingRequest.SuiteResult = gauge.ConvertToProtoSuiteResult(e.suiteResult)
    86  	e.pluginHandler.NotifyPlugins(m)
    87  }