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  }