gotools/cmd/go2junit/go2junit.go

179 lines
3.6 KiB
Go
Raw Normal View History

2024-11-20 17:47:02 +00:00
package main
2024-11-20 20:13:17 +00:00
import (
"bufio"
"encoding/json"
"encoding/xml"
"fmt"
"os"
"path/filepath"
2024-11-20 20:13:17 +00:00
)
2024-11-20 17:47:02 +00:00
func (t *Test) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
if len(t.Tests) == 0 {
start.Name = xml.Name{Local: "testcase"}
classname := ""
if t.Parent != nil {
classname = t.Parent.Name
}
var skipped *Result
if t.Skipped > 0 {
skipped = &Result{
Message: "skipped",
}
}
var failed *Result
if t.Failures > 0 {
failed = &Result{
Message: "failed",
}
}
tc := Testcase{
Name: t.Name,
// parent class name
Classname: classname,
Time: t.Time,
Skipped: skipped,
Error: nil,
Failure: failed,
SystemOut: t.SystemOut,
}
return e.EncodeElement(tc, start)
}
type Alias Test
start.Name = xml.Name{Local: "testsuite"}
return e.EncodeElement(Alias(*t), start)
}
2024-11-20 20:13:17 +00:00
func main() {
2024-11-20 20:13:17 +00:00
/*
testsuites := Testsuites{
Time: 1.23,
TImestamp: time.Now(),
Suites: []*Testsuite{
{
Name: "hello",
Tests: 0,
Failures: 0,
Errors: 0,
Disabled: 0,
Package: "",
Skipped: 0,
Time: "",
Timestamp: time.Now(),
Testsuites: []*Testsuite{
{
Name: "abc",
Tests: 0,
Failures: 0,
Errors: 0,
Disabled: 0,
Package: "",
Skipped: 0,
Time: "",
Timestamp: time.Time{},
Testsuites: nil,
Testcases: []*Testcase{
{
Name: "test",
Classname: "",
Time: "",
Skipped: nil,
Error: &Result{
Message: "error",
},
Failure: nil,
SystemOut: "",
},
},
SystemOut: "ddd",
},
},
Testcases: nil,
SystemOut: "hello",
},
},
}
*/
testsuites := Testsuites{}
if len(os.Args) != 2 && len(os.Args) != 3 {
fmt.Fprintf(os.Stderr, "Usage: go2junit <outputdir> [<prefix>]\n")
2024-11-20 20:13:17 +00:00
os.Exit(1)
}
path := os.Args[1]
path = filepath.Clean(path)
err := os.MkdirAll(path, 0755)
if err != nil {
panic(err)
2024-11-20 20:29:35 +00:00
}
prefix := ""
if len(os.Args) == 3 {
prefix = os.Args[2]
}
2024-11-20 20:13:17 +00:00
var file = os.Stdin
2024-11-20 20:13:17 +00:00
scanner := bufio.NewScanner(file)
lineno := 0
testsuites = Testsuites{}
for scanner.Scan() {
lineno++
var item TestEvent
line := scanner.Bytes()
if err := json.Unmarshal(line, &item); err != nil {
fmt.Fprintf(os.Stderr, "%d: %s: %v", lineno, line, err)
continue
}
//.fmt.Printf("Parsed %d:\n%v\n\n", lineno, item)
pkg := prefix + item.Package
2024-11-20 20:13:17 +00:00
switch item.Action {
case "start":
testsuites.Suite(item.Time, pkg)
2024-11-20 20:13:17 +00:00
case "run":
fmt.Println()
testsuites.Test(item.Time, pkg, item.Test)
2024-11-20 20:13:17 +00:00
case "output":
testsuites.Output(item.Time, pkg, item.Test, item.Output)
fmt.Printf("%s", item.Output)
2024-11-20 20:13:17 +00:00
case "pause":
testsuites.Output(item.Time, pkg, item.Test, "PAUSED")
2024-11-20 20:13:17 +00:00
case "cont":
testsuites.Output(item.Time, pkg, item.Test, "CONTINUED")
2024-11-20 20:13:17 +00:00
case "pass":
testsuites.Pass(item.Time, pkg, item.Test, item.Elapsed)
2024-11-20 20:13:17 +00:00
case "bench":
testsuites.Bench(item.Time, pkg, item.Test, item.Output, item.Elapsed)
2024-11-20 20:13:17 +00:00
case "fail":
testsuites.Fail(item.Time, pkg, item.Test, item.Elapsed)
2024-11-20 20:13:17 +00:00
case "skip":
testsuites.Skip(item.Time, pkg, item.Test)
2024-11-20 20:13:17 +00:00
}
}
testsuites.Complete()
for _, suite := range testsuites.Suites {
xml, err := xml.MarshalIndent(suite, "", " ")
if err != nil {
panic(err)
}
fname := path + "/" + suite.Name + ".xml"
dir := filepath.Dir(fname)
err = os.MkdirAll(dir, 0755)
if err != nil {
panic(err)
}
fmt.Fprintf(os.Stderr, "Writing %s\n", fname)
err = os.WriteFile(fname, xml, 0644)
if err != nil {
panic(err)
}
2024-11-20 20:13:17 +00:00
}
2024-11-20 17:47:02 +00:00
}