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 }