github.com/arunkumar7540/cli@v6.45.0+incompatible/integration/helpers/reporters.go (about)

     1  package helpers
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"os"
     7  	"path/filepath"
     8  	"sort"
     9  	"strconv"
    10  	"strings"
    11  
    12  	"github.com/onsi/ginkgo"
    13  
    14  	"github.com/onsi/ginkgo/config"
    15  	"github.com/onsi/ginkgo/types"
    16  )
    17  
    18  const (
    19  	PRBuilderOutputEnvVar = "PR_BUILDER_OUTPUT_DIR"
    20  )
    21  
    22  func GetPRBuilderReporter() ginkgo.Reporter {
    23  	outputDir := os.Getenv(PRBuilderOutputEnvVar)
    24  
    25  	if outputDir == "" {
    26  		return nil
    27  	}
    28  
    29  	prBuilderReporter := NewPRBuilderReporter(outputDir)
    30  	return prBuilderReporter
    31  }
    32  
    33  type PRBuilderReporter struct {
    34  	outputFile *os.File
    35  }
    36  
    37  func NewPRBuilderReporter(outputDir string) *PRBuilderReporter {
    38  	outputFile := filepath.Join(outputDir, strconv.Itoa(ginkgo.GinkgoParallelNode()))
    39  
    40  	f, err := os.Create(outputFile)
    41  	if err != nil {
    42  		panic(err)
    43  	}
    44  
    45  	reporter := &PRBuilderReporter{outputFile: f}
    46  	return reporter
    47  }
    48  
    49  func (reporter *PRBuilderReporter) SpecDidComplete(specSummary *types.SpecSummary) {
    50  	if specSummary.Failed() {
    51  		msg := trimmedLocation(specSummary.Failure.Location)
    52  		_, err := reporter.outputFile.WriteString(msg + "\n")
    53  		if err != nil {
    54  			panic(err)
    55  		}
    56  	}
    57  }
    58  
    59  // WriteFailureSummary aggregates test failures from all parallel nodes, sorts
    60  // them, and writes the result to a file.
    61  func WriteFailureSummary(outputRoot, filename string) {
    62  	outfile, err := os.Create(filepath.Join(outputRoot, filename))
    63  	failureSummaries := make([]string, 0)
    64  	if err != nil {
    65  		panic(err)
    66  	}
    67  	err = filepath.Walk(outputRoot, func(path string, info os.FileInfo, err error) error {
    68  		if err != nil {
    69  			return err
    70  		}
    71  
    72  		if info.IsDir() {
    73  			return nil
    74  		}
    75  
    76  		if strings.Contains(path, "summary") {
    77  			return nil
    78  		}
    79  		defer os.Remove(path)
    80  		allFailures, err := ioutil.ReadFile(path)
    81  		if err != nil {
    82  			return err
    83  		}
    84  		failures := strings.Split(string(allFailures), "\n")
    85  		failureSummaries = append(failureSummaries, failures...)
    86  		return nil
    87  	})
    88  	if err != nil {
    89  		panic(err)
    90  	}
    91  	sort.Strings(failureSummaries)
    92  	anyFailures := false
    93  	var previousLine string
    94  	for _, line := range failureSummaries {
    95  		if line != "" && line != previousLine {
    96  			anyFailures = true
    97  			previousLine = line
    98  			fmt.Fprintln(outfile, line)
    99  		}
   100  	}
   101  	if !anyFailures {
   102  		err = os.Remove(filepath.Join(outputRoot, filename))
   103  	}
   104  	if err != nil {
   105  		panic(err)
   106  	}
   107  }
   108  
   109  func trimmedLocation(location types.CodeLocation) string {
   110  	splits := strings.Split(location.String(), "/cli/")
   111  	return strings.Join(splits[1:], "")
   112  }
   113  
   114  // unused members of ginkgo reporter interface
   115  
   116  func (reporter *PRBuilderReporter) AfterSuiteDidRun(setupSummary *types.SetupSummary) {}
   117  
   118  func (reporter *PRBuilderReporter) SpecSuiteDidEnd(summary *types.SuiteSummary) {}
   119  
   120  func (reporter *PRBuilderReporter) SpecSuiteWillBegin(conf config.GinkgoConfigType, summary *types.SuiteSummary) {
   121  }
   122  
   123  func (reporter *PRBuilderReporter) BeforeSuiteDidRun(setupSummary *types.SetupSummary) {}
   124  
   125  func (reporter *PRBuilderReporter) SpecWillRun(specSummary *types.SpecSummary) {}