-
Notifications
You must be signed in to change notification settings - Fork 226
/
Copy pathgo-junit-report.go
101 lines (87 loc) · 2.11 KB
/
go-junit-report.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package gojunitreport
import (
"encoding/json"
"encoding/xml"
"fmt"
"io"
"os"
"time"
"github.com/jstemmer/go-junit-report/v2/gtr"
"github.com/jstemmer/go-junit-report/v2/junit"
"github.com/jstemmer/go-junit-report/v2/parser/gotest"
)
type parser interface {
Parse(r io.Reader) (gtr.Report, error)
Events() []gotest.Event
}
// Config contains the go-junit-report command configuration.
type Config struct {
Parser string
Hostname string
PackageName string
SkipXMLHeader bool
SubtestMode gotest.SubtestMode
Properties map[string]string
TimestampFunc func() time.Time
// For debugging
PrintEvents bool
}
// Run runs the go-junit-report command and returns the generated report.
func (c Config) Run(input io.Reader, output io.Writer) (*gtr.Report, error) {
var p parser
switch c.Parser {
case "gotest":
p = gotest.NewParser(c.gotestOptions()...)
case "gojson":
p = gotest.NewJSONParser(c.gotestOptions()...)
default:
return nil, fmt.Errorf("invalid parser: %s", c.Parser)
}
report, err := p.Parse(input)
if err != nil {
return nil, fmt.Errorf("error parsing input: %w", err)
}
if c.PrintEvents {
enc := json.NewEncoder(os.Stderr)
for _, event := range p.Events() {
if err := enc.Encode(event); err != nil {
return nil, err
}
}
}
for i := range report.Packages {
for k, v := range c.Properties {
report.Packages[i].SetProperty(k, v)
}
}
if err = c.writeXML(output, report); err != nil {
return nil, err
}
return &report, nil
}
func (c Config) writeXML(w io.Writer, report gtr.Report) error {
testsuites := junit.CreateFromReport(report, c.Hostname)
if !c.SkipXMLHeader {
_, err := fmt.Fprintf(w, xml.Header)
if err != nil {
return err
}
}
enc := xml.NewEncoder(w)
enc.Indent("", "\t")
if err := enc.Encode(testsuites); err != nil {
return err
}
if err := enc.Flush(); err != nil {
return err
}
_, err := fmt.Fprintf(w, "\n")
return err
}
func (c Config) gotestOptions() []gotest.Option {
return []gotest.Option{
gotest.PackageName(c.PackageName),
gotest.SetSubtestMode(c.SubtestMode),
gotest.TimestampFunc(c.TimestampFunc),
}
}