handler.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package main
  2. import (
  3. "io"
  4. "os"
  5. "github.com/pkg/errors"
  6. log "github.com/sirupsen/logrus"
  7. "gotest.tools/gotestsum/internal/junitxml"
  8. "gotest.tools/gotestsum/testjson"
  9. )
  10. type eventHandler struct {
  11. formatter testjson.EventFormatter
  12. out io.Writer
  13. err io.Writer
  14. jsonFile io.WriteCloser
  15. }
  16. func (h *eventHandler) Err(text string) error {
  17. _, err := h.err.Write([]byte(text + "\n"))
  18. return err
  19. }
  20. func (h *eventHandler) Event(event testjson.TestEvent, execution *testjson.Execution) error {
  21. if h.jsonFile != nil {
  22. _, err := h.jsonFile.Write(append(event.Bytes(), '\n'))
  23. if err != nil {
  24. return errors.Wrap(err, "failed to write JSON file")
  25. }
  26. }
  27. line, err := h.formatter(event, execution)
  28. if err != nil {
  29. return errors.Wrap(err, "failed to format event")
  30. }
  31. _, err = h.out.Write([]byte(line))
  32. return errors.Wrap(err, "failed to write event")
  33. }
  34. func (h *eventHandler) Close() error {
  35. if h.jsonFile != nil {
  36. if err := h.jsonFile.Close(); err != nil {
  37. log.WithError(err).Error("failed to close JSON file")
  38. }
  39. }
  40. return nil
  41. }
  42. var _ testjson.EventHandler = &eventHandler{}
  43. func newEventHandler(opts *options, wout io.Writer, werr io.Writer) (*eventHandler, error) {
  44. formatter := testjson.NewEventFormatter(opts.format)
  45. if formatter == nil {
  46. return nil, errors.Errorf("unknown format %s", opts.format)
  47. }
  48. handler := &eventHandler{
  49. formatter: formatter,
  50. out: wout,
  51. err: werr,
  52. }
  53. var err error
  54. if opts.jsonFile != "" {
  55. handler.jsonFile, err = os.Create(opts.jsonFile)
  56. if err != nil {
  57. return handler, errors.Wrap(err, "failed to open JSON file")
  58. }
  59. }
  60. return handler, nil
  61. }
  62. func writeJUnitFile(filename string, execution *testjson.Execution) error {
  63. if filename == "" {
  64. return nil
  65. }
  66. junitFile, err := os.Create(filename)
  67. if err != nil {
  68. return errors.Wrap(err, "failed to open JUnit file")
  69. }
  70. defer func() {
  71. if err := junitFile.Close(); err != nil {
  72. log.WithError(err).Error("failed to close JUnit file")
  73. }
  74. }()
  75. return junitxml.Write(junitFile, execution)
  76. }