github.com/getgauge/gauge@v1.6.9/execution/saveResult.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 "os" 11 "path/filepath" 12 13 "sync" 14 15 "github.com/getgauge/common" 16 "github.com/getgauge/gauge/config" 17 "github.com/getgauge/gauge/execution/event" 18 "github.com/getgauge/gauge/execution/result" 19 "github.com/getgauge/gauge/gauge" 20 "github.com/getgauge/gauge/logger" 21 "google.golang.org/protobuf/proto" 22 ) 23 24 const ( 25 dotGauge = ".gauge" 26 lastRunResult = "last_run_result" 27 ) 28 29 // ListenSuiteEndAndSaveResult listens to execution events and writes the failed scenarios to JSON file 30 func ListenSuiteEndAndSaveResult(wg *sync.WaitGroup) { 31 ch := make(chan event.ExecutionEvent) 32 event.Register(ch, event.SuiteEnd) 33 wg.Add(1) 34 35 go func() { 36 for { 37 e := <-ch 38 if e.Topic == event.SuiteEnd { 39 writeResult(e.Result.(*result.SuiteResult)) 40 wg.Done() 41 } 42 } 43 }() 44 } 45 46 func writeResult(res *result.SuiteResult) { 47 dotGaugeDir := filepath.Join(config.ProjectRoot, dotGauge) 48 resultFile := filepath.Join(config.ProjectRoot, dotGauge, lastRunResult) 49 if err := os.MkdirAll(dotGaugeDir, common.NewDirectoryPermissions); err != nil { 50 logger.Errorf(true, "Failed to create directory in %s. Reason: %s", dotGaugeDir, err.Error()) 51 } 52 r, err := proto.Marshal(gauge.ConvertToProtoSuiteResult(res)) 53 if err != nil { 54 logger.Errorf(true, "Unable to marshal suite execution result, skipping save. %s", err.Error()) 55 } 56 err = os.WriteFile(resultFile, r, common.NewFilePermissions) 57 if err != nil { 58 logger.Errorf(true, "Failed to write to %s. Reason: %s", resultFile, err.Error()) 59 } else { 60 logger.Debugf(true, "Last run result saved to %s", resultFile) 61 } 62 }