88 lines
2.0 KiB
Go
88 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"io"
|
|
"os"
|
|
|
|
"github.com/pkg/errors"
|
|
log "github.com/sirupsen/logrus"
|
|
"gotest.tools/gotestsum/internal/junitxml"
|
|
"gotest.tools/gotestsum/testjson"
|
|
)
|
|
|
|
type eventHandler struct {
|
|
formatter testjson.EventFormatter
|
|
out io.Writer
|
|
err io.Writer
|
|
jsonFile io.WriteCloser
|
|
}
|
|
|
|
func (h *eventHandler) Err(text string) error {
|
|
_, err := h.err.Write([]byte(text + "\n"))
|
|
return err
|
|
}
|
|
|
|
func (h *eventHandler) Event(event testjson.TestEvent, execution *testjson.Execution) error {
|
|
if h.jsonFile != nil {
|
|
_, err := h.jsonFile.Write(append(event.Bytes(), '\n'))
|
|
if err != nil {
|
|
return errors.Wrap(err, "failed to write JSON file")
|
|
}
|
|
}
|
|
|
|
line, err := h.formatter(event, execution)
|
|
if err != nil {
|
|
return errors.Wrap(err, "failed to format event")
|
|
}
|
|
_, err = h.out.Write([]byte(line))
|
|
return errors.Wrap(err, "failed to write event")
|
|
}
|
|
|
|
func (h *eventHandler) Close() error {
|
|
if h.jsonFile != nil {
|
|
if err := h.jsonFile.Close(); err != nil {
|
|
log.WithError(err).Error("failed to close JSON file")
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
var _ testjson.EventHandler = &eventHandler{}
|
|
|
|
func newEventHandler(opts *options, wout io.Writer, werr io.Writer) (*eventHandler, error) {
|
|
formatter := testjson.NewEventFormatter(opts.format)
|
|
if formatter == nil {
|
|
return nil, errors.Errorf("unknown format %s", opts.format)
|
|
}
|
|
handler := &eventHandler{
|
|
formatter: formatter,
|
|
out: wout,
|
|
err: werr,
|
|
}
|
|
var err error
|
|
if opts.jsonFile != "" {
|
|
handler.jsonFile, err = os.Create(opts.jsonFile)
|
|
if err != nil {
|
|
return handler, errors.Wrap(err, "failed to open JSON file")
|
|
}
|
|
}
|
|
return handler, nil
|
|
}
|
|
|
|
func writeJUnitFile(filename string, execution *testjson.Execution) error {
|
|
if filename == "" {
|
|
return nil
|
|
}
|
|
junitFile, err := os.Create(filename)
|
|
if err != nil {
|
|
return errors.Wrap(err, "failed to open JUnit file")
|
|
}
|
|
defer func() {
|
|
if err := junitFile.Close(); err != nil {
|
|
log.WithError(err).Error("failed to close JUnit file")
|
|
}
|
|
}()
|
|
|
|
return junitxml.Write(junitFile, execution)
|
|
}
|