gotools/cmd/go2junit/go2junit.go
2024-11-20 22:19:24 +01:00

138 lines
2.8 KiB
Go

package main
import (
"bufio"
"encoding/json"
"encoding/xml"
"fmt"
"os"
"path/filepath"
)
func main() {
/*
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 {
fmt.Fprintf(os.Stderr, "Usage: go2junit <outputdir> \n")
os.Exit(1)
}
path := os.Args[1]
path = filepath.Clean(path)
err := os.MkdirAll(path, 0755)
if err != nil {
panic(err)
}
var file = os.Stdin
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)
switch item.Action {
case "start":
testsuites.Suite(item.Time, item.Package)
case "run":
testsuites.Test(item.Time, item.Package, item.Test)
case "output":
testsuites.Output(item.Time, item.Package, item.Test, item.Output)
fmt.Printf("%s", item.Output)
case "pause":
testsuites.Output(item.Time, item.Package, item.Test, "PAUSED")
case "cont":
testsuites.Output(item.Time, item.Package, item.Test, "CONTINUED")
case "pass":
testsuites.Pass(item.Time, item.Package, item.Test, item.Elapsed)
case "bench":
testsuites.Bench(item.Time, item.Package, item.Test, item.Output, item.Elapsed)
case "fail":
testsuites.Fail(item.Time, item.Package, item.Test, item.Elapsed)
case "skip":
testsuites.Skip(item.Time, item.Package, item.Test)
}
}
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)
}
}
}