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) {}