diff --git a/testdata/01-report.xml b/testdata/01-report.xml
index 503f071..11db67d 100644
--- a/testdata/01-report.xml
+++ b/testdata/01-report.xml
@@ -1,10 +1,10 @@
-
+
-
-
+
+
diff --git a/testdata/02-report.xml b/testdata/02-report.xml
index 74fdb72..06a003f 100644
--- a/testdata/02-report.xml
+++ b/testdata/02-report.xml
@@ -1,13 +1,16 @@
-
+
-
- file_test.go:11: Error message
file_test.go:11: Longer
error
message.
+
+
-
+
diff --git a/testdata/03-report.xml b/testdata/03-report.xml
index 48a0fc8..4cb4d4a 100644
--- a/testdata/03-report.xml
+++ b/testdata/03-report.xml
@@ -1,12 +1,12 @@
-
+
-
+
-
+
diff --git a/testdata/04-report.xml b/testdata/04-report.xml
index edcb4ea..23618ba 100644
--- a/testdata/04-report.xml
+++ b/testdata/04-report.xml
@@ -1,10 +1,10 @@
-
+
-
-
+
+
diff --git a/testdata/05-report.xml b/testdata/05-report.xml
index 029550e..6709b1d 100644
--- a/testdata/05-report.xml
+++ b/testdata/05-report.xml
@@ -1,9 +1,9 @@
-
+
-
-
+
+
diff --git a/testdata/06-report.xml b/testdata/06-report.xml
index 2271733..7994e4b 100644
--- a/testdata/06-report.xml
+++ b/testdata/06-report.xml
@@ -1,19 +1,22 @@
-
+
-
-
+
+
-
+
-
- file_test.go:11: Error message
file_test.go:11: Longer
error
message.
+
+
-
+
diff --git a/testdata/07-report.xml b/testdata/07-report.xml
index 0eb95bd..05f1479 100644
--- a/testdata/07-report.xml
+++ b/testdata/07-report.xml
@@ -1,10 +1,10 @@
-
+
-
-
+
+
diff --git a/testdata/08-report.xml b/testdata/08-report.xml
index 9a69e95..2f5974a 100644
--- a/testdata/08-report.xml
+++ b/testdata/08-report.xml
@@ -1,10 +1,10 @@
-
+
-
-
+
+
diff --git a/testdata/09-report.xml b/testdata/09-report.xml
index aa67423..b3742bd 100644
--- a/testdata/09-report.xml
+++ b/testdata/09-report.xml
@@ -1,11 +1,11 @@
-
+
-
-
+
+
diff --git a/testdata/10-report.xml b/testdata/10-report.xml
index a9a4cb5..298aeda 100644
--- a/testdata/10-report.xml
+++ b/testdata/10-report.xml
@@ -1,18 +1,18 @@
-
+
-
-
+
+
-
+
-
+
diff --git a/testdata/11-report.xml b/testdata/11-report.xml
index 8c494ec..0d1ba9d 100644
--- a/testdata/11-report.xml
+++ b/testdata/11-report.xml
@@ -1,10 +1,10 @@
-
+
-
-
+
+
diff --git a/testdata/12-report.xml b/testdata/12-report.xml
index fcb9c48..619f9a3 100644
--- a/testdata/12-report.xml
+++ b/testdata/12-report.xml
@@ -1,36 +1,38 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
- example.go:12: Expected abc OBTAINED:
xyz
example.go:123: Expected and obtained are different.
+
+
-
+
-
-
+
+
-
- example.go:371: This should not fail!
+
+
diff --git a/testdata/13-report.xml b/testdata/13-report.xml
index a183850..ae66973 100644
--- a/testdata/13-report.xml
+++ b/testdata/13-report.xml
@@ -1,39 +1,42 @@
-
+
-
+
-
+
-
+
-
+
-
- failing1/failing_test.go:15: undefined: x
+
+
-
+
-
- failing2/another_failing_test.go:20: undefined: y
+
+
-
+
-
- setupfailing1/failing_test.go:4: cannot find package "other/package" in any of:
/path/vendor (vendor tree)
/path/go/root (from $GOROOT)
/path/go/path (from $GOPATH)
+
+
diff --git a/testdata/131-report.xml b/testdata/131-report.xml
new file mode 100644
index 0000000..5256322
--- /dev/null
+++ b/testdata/131-report.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/testdata/14-report.xml b/testdata/14-report.xml
index 57cce23..18e4b7f 100644
--- a/testdata/14-report.xml
+++ b/testdata/14-report.xml
@@ -1,19 +1,21 @@
-
+
-
- panic: init
stacktrace
+
+
-
+
-
- panic: init
stacktrace
+
+
diff --git a/testdata/15-report.xml b/testdata/15-report.xml
index edc61a7..f97312d 100644
--- a/testdata/15-report.xml
+++ b/testdata/15-report.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/testdata/16-report.xml b/testdata/16-report.xml
index b14d270..56ae1e4 100644
--- a/testdata/16-report.xml
+++ b/testdata/16-report.xml
@@ -1,11 +1,11 @@
-
+
-
-
-
+
+
+
diff --git a/testdata/17-report.xml b/testdata/17-report.xml
index 005a994..d272124 100644
--- a/testdata/17-report.xml
+++ b/testdata/17-report.xml
@@ -1,11 +1,45 @@
-
+
-
- test output
2 0xc4200153d0
==================
WARNING: DATA RACE
Write at 0x00c4200153d0 by goroutine 7:
race_test.TestRace.func1()
race_test.go:13 +0x3b
Previous write at 0x00c4200153d0 by goroutine 6:
race_test.TestRace()
race_test.go:15 +0x136
testing.tRunner()
/usr/local/Cellar/go/1.8.3/libexec/src/testing/testing.go:657 +0x107
Goroutine 7 (running) created at:
race_test.TestRace()
race_test.go:14 +0x125
testing.tRunner()
/usr/local/Cellar/go/1.8.3/libexec/src/testing/testing.go:657 +0x107
Goroutine 6 (running) created at:
testing.(*T).Run()
/usr/local/Cellar/go/1.8.3/libexec/src/testing/testing.go:697 +0x543
testing.runTests.func1()
/usr/local/Cellar/go/1.8.3/libexec/src/testing/testing.go:882 +0xaa
testing.tRunner()
/usr/local/Cellar/go/1.8.3/libexec/src/testing/testing.go:657 +0x107
testing.runTests()
/usr/local/Cellar/go/1.8.3/libexec/src/testing/testing.go:888 +0x4e0
testing.(*M).Run()
/usr/local/Cellar/go/1.8.3/libexec/src/testing/testing.go:822 +0x1c3
main.main()
_test/_testmain.go:52 +0x20f
==================
testing.go:610: race detected during execution of test
+
+
diff --git a/testdata/18-report.xml b/testdata/18-report.xml
index a9a4cb5..298aeda 100644
--- a/testdata/18-report.xml
+++ b/testdata/18-report.xml
@@ -1,18 +1,18 @@
-
+
-
-
+
+
-
+
-
+
diff --git a/testdata/19-report.xml b/testdata/19-report.xml
index 503f071..11db67d 100644
--- a/testdata/19-report.xml
+++ b/testdata/19-report.xml
@@ -1,10 +1,10 @@
-
+
-
-
+
+
diff --git a/testdata/20-report.xml b/testdata/20-report.xml
index 212d0cd..b78f72d 100644
--- a/testdata/20-report.xml
+++ b/testdata/20-report.xml
@@ -1,17 +1,21 @@
-
+
-
- Message from first
Supplemental from first
parallel_test.go:14: FirstTest error
+
+
-
- Message from second
parallel_test.go:23: SecondTest error
+
+
-
- Message from third
parallel_test.go:32: ThirdTest error
+
+
diff --git a/testdata/21-report.xml b/testdata/21-report.xml
index 69e2bff..10cc8d2 100644
--- a/testdata/21-report.xml
+++ b/testdata/21-report.xml
@@ -1,9 +1,9 @@
-
+
-
+
diff --git a/testdata/22-report.xml b/testdata/22-report.xml
index 3661e0c..5cccd17 100644
--- a/testdata/22-report.xml
+++ b/testdata/22-report.xml
@@ -1,11 +1,11 @@
-
+
-
-
+
+
diff --git a/testdata/23-report.xml b/testdata/23-report.xml
index c406683..63ba3f9 100644
--- a/testdata/23-report.xml
+++ b/testdata/23-report.xml
@@ -1,11 +1,11 @@
-
+
-
-
+
+
diff --git a/testdata/24-report.xml b/testdata/24-report.xml
index 396b06c..305d403 100644
--- a/testdata/24-report.xml
+++ b/testdata/24-report.xml
@@ -1,14 +1,14 @@
-
+
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/testdata/25-report.xml b/testdata/25-report.xml
index 47e4af7..00fb0cf 100644
--- a/testdata/25-report.xml
+++ b/testdata/25-report.xml
@@ -1,10 +1,10 @@
-
+
-
-
+
+
diff --git a/testdata/26-report.xml b/testdata/26-report.xml
index a758e87..273a6d4 100644
--- a/testdata/26-report.xml
+++ b/testdata/26-report.xml
@@ -1,21 +1,21 @@
-
+
-
-
+
+
-
+
-
-
-
-
+
+
+
+
diff --git a/testdata/27-report.xml b/testdata/27-report.xml
index 6049ee4..792cf19 100644
--- a/testdata/27-report.xml
+++ b/testdata/27-report.xml
@@ -1,12 +1,12 @@
-
+
-
-
-
+
+
+
diff --git a/testdata/28-report.xml b/testdata/28-report.xml
index 5208fb5..74a4fb0 100644
--- a/testdata/28-report.xml
+++ b/testdata/28-report.xml
@@ -1,10 +1,10 @@
-
+
-
+
diff --git a/testdata/29-report.xml b/testdata/29-report.xml
index edb3434..e64584f 100644
--- a/testdata/29-report.xml
+++ b/testdata/29-report.xml
@@ -1,10 +1,10 @@
-
+
-
+
diff --git a/testdata/30-report.xml b/testdata/30-report.xml
index a647d9c..8e91aae 100644
--- a/testdata/30-report.xml
+++ b/testdata/30-report.xml
@@ -1,43 +1,69 @@
-
+
-
- multi
line
stdout
single-line stdout
example_test.go:13: single-line error
example_test.go:14: multi
line
error
+
+
-
- multi
line
stdout
single-line stdout
+
+
-
- example_test.go:26: single-line error
example_test.go:27: multi
line
error
+
+
-
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
- 1 multi
line
stdout
1 single-line stdout
example_test.go:65: 1 single-line error
example_test.go:66: 1 multi
line
error
+
+
-
- 2 multi
line
stdout
2 single-line stdout
+
+
-
- example_test.go:78: 3 single-line error
example_test.go:79: 3 multi
line
error
+
+
-
-
+
+
-
-
-
-
+
+
+
+
diff --git a/testdata/31-report.xml b/testdata/31-report.xml
index a183850..ae66973 100644
--- a/testdata/31-report.xml
+++ b/testdata/31-report.xml
@@ -1,39 +1,42 @@
-
+
-
+
-
+
-
+
-
+
-
- failing1/failing_test.go:15: undefined: x
+
+
-
+
-
- failing2/another_failing_test.go:20: undefined: y
+
+
-
+
-
- setupfailing1/failing_test.go:4: cannot find package "other/package" in any of:
/path/vendor (vendor tree)
/path/go/root (from $GOROOT)
/path/go/path (from $GOPATH)
+
+
diff --git a/testdata/32-report.xml b/testdata/32-report.xml
index 4666169..314ba57 100644
--- a/testdata/32-report.xml
+++ b/testdata/32-report.xml
@@ -1,12 +1,12 @@
-
+
-
-
- panic: panic
+
+
+
diff --git a/testdata/33-report.xml b/testdata/33-report.xml
index 34eabc3..cf6436b 100644
--- a/testdata/33-report.xml
+++ b/testdata/33-report.xml
@@ -1,11 +1,11 @@
-
+
-
-
+
+
diff --git a/testdata/34-report.xml b/testdata/34-report.xml
index 18e3f34..d5cb86d 100644
--- a/testdata/34-report.xml
+++ b/testdata/34-report.xml
@@ -1,16 +1,16 @@
-
+
-
+
-
+
diff --git a/testdata/generate-golden.go b/testdata/generate-golden.go
new file mode 100644
index 0000000..5b38736
--- /dev/null
+++ b/testdata/generate-golden.go
@@ -0,0 +1,129 @@
+//go:generate go run generate-golden.go -w
+
+package main
+
+import (
+ "encoding/xml"
+ "flag"
+ "fmt"
+ "io"
+ "os"
+ "path/filepath"
+ "strings"
+ "time"
+
+ "github.com/jstemmer/go-junit-report/v2/pkg/junit"
+ "github.com/jstemmer/go-junit-report/v2/pkg/parser/gotest"
+)
+
+var verbose bool
+
+type Settings struct {
+ skipXMLHeader bool
+ packageName string
+}
+
+var fileSettings = map[string]Settings{
+ "05-no_xml_header.txt": {skipXMLHeader: true},
+ "06-mixed.txt": {skipXMLHeader: true},
+ "07-compiled_test.txt": {packageName: "test/package"},
+}
+
+func main() {
+ var writeFiles bool
+ flag.BoolVar(&verbose, "v", false, "verbose logging")
+ flag.BoolVar(&writeFiles, "w", false, "write output xml files")
+ flag.Parse()
+
+ files, err := filepath.Glob("*.txt")
+ if err != nil {
+ exitf("error listing files: %v\n", err)
+ }
+
+ for _, file := range files {
+ outName := outputName(file)
+ if err := createReportFromInput(file, outName, writeFiles); err != nil {
+ logf("error creating report: %v\n", err)
+ continue
+ }
+ if writeFiles {
+ logf("report written to %s\n", outName)
+ }
+ }
+}
+
+func logf(msg string, args ...interface{}) {
+ if verbose {
+ fmt.Printf(msg, args...)
+ }
+}
+
+func exitf(msg string, args ...interface{}) {
+ fmt.Fprintf(os.Stderr, msg, args...)
+ os.Exit(1)
+}
+
+func outputName(input string) string {
+ dir, name := filepath.Split(input)
+ var out string
+ if idx := strings.IndexByte(name, '-'); idx > -1 {
+ out = input[:idx+1] + "report.xml"
+ } else {
+ out = strings.TrimSuffix(name, filepath.Ext(name)) + "report.xml"
+ }
+ return filepath.Join(dir, out)
+}
+
+func createReportFromInput(inputFile, outputFile string, write bool) error {
+ in, err := os.Open(inputFile)
+ if err != nil {
+ return err
+ }
+ defer in.Close()
+
+ out := io.Discard
+ if write {
+ f, err := os.Create(outputFile)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+ out = f
+ }
+ return writeReport(in, out, fileSettings[inputFile])
+}
+
+func writeReport(in io.Reader, out io.Writer, settings Settings) error {
+ parser := gotest.New(
+ gotest.PackageName(settings.packageName),
+ gotest.TimestampFunc(func() time.Time {
+ return time.Date(2022, 1, 1, 0, 0, 0, 0, time.UTC)
+ }),
+ )
+
+ report, err := parser.Parse(in)
+ if err != nil {
+ return err
+ }
+ for i := range report.Packages {
+ report.Packages[i].SetProperty("go.version", "1.0")
+ }
+ testsuites := junit.CreateFromReport(report, "hostname")
+
+ if !settings.skipXMLHeader {
+ if _, err := fmt.Fprintf(out, xml.Header); err != nil {
+ return err
+ }
+ }
+
+ enc := xml.NewEncoder(out)
+ enc.Indent("", "\t")
+ if err := enc.Encode(testsuites); err != nil {
+ return err
+ }
+ if err := enc.Flush(); err != nil {
+ return err
+ }
+ _, err = fmt.Fprintf(out, "\n")
+ return err
+}