Skip to content

Commit

Permalink
Merge pull request #1 from fasmat/feature/add-fail-flag-to-parse
Browse files Browse the repository at this point in the history
Add -fail flag that results in parse exiting with an error exit code
  • Loading branch information
fasmat committed Sep 19, 2021
2 parents 4c3fa79 + 616f070 commit 5bea69b
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 17 deletions.
18 changes: 8 additions & 10 deletions cmd/go2junit/actions.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ func actionParse(c *cli.Context) error {
}
defer w.Close()

return parse(w, r, c.App.ErrWriter)
parse(w, r, c.Bool("fail"))
return nil
}

func actionTest(c *cli.Context) error {
Expand All @@ -48,13 +49,11 @@ func actionTest(c *cli.Context) error {
}
defer w.Close()

parseErrChan := make(chan error)
parseChan := make(chan error)
pipeReader, pipeWriter := io.Pipe()
go func() {
if err := parse(w, pipeReader, c.App.ErrWriter); err != nil {
parseErrChan <- err
}
close(parseErrChan)
parse(w, pipeReader, true)
close(parseChan)
pipeReader.Close()
}()

Expand All @@ -66,17 +65,16 @@ func actionTest(c *cli.Context) error {
cmd.Stdout = pipeWriter
cmd.Stderr = c.App.ErrWriter
err := cmd.Run()

pipeWriter.Close()
if err != nil {
testErrChan <- err
}
close(testErrChan)
}()

for err := range parseErrChan {
return err
}
<-parseChan

for err := range testErrChan {
return err
}
Expand Down
4 changes: 4 additions & 0 deletions cmd/go2junit/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ func main() {
Aliases: []string{"o"},
Usage: "write output to `FILE` (defaults to stdout if not set)",
},
&cli.StringFlag{
Name: "fail",
Usage: "return ",
},
},
},
{
Expand Down
26 changes: 19 additions & 7 deletions cmd/go2junit/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@ import (
"bytes"
"encoding/json"
"encoding/xml"
"fmt"
"io"
"log"
"os"
"strconv"

"github.com/fasmat/go2junit/types"
)

func parse(w io.Writer, r io.Reader, errWriter io.Writer) error {
func parse(w io.Writer, r io.Reader, fail bool) {
scanner := bufio.NewScanner(r)

// suites -> suite
Expand All @@ -21,6 +22,9 @@ func parse(w io.Writer, r io.Reader, errWriter io.Writer) error {
// suites -> suite -> testcase
cases := make(map[string]map[string]*types.Testcase)

// keeps track if any test failed
testfailed := false

for scanner.Scan() {
var event types.TestEvent
if err := json.NewDecoder(bytes.NewBuffer(scanner.Bytes())).Decode(&event); err != nil {
Expand Down Expand Up @@ -50,13 +54,14 @@ func parse(w io.Writer, r io.Reader, errWriter io.Writer) error {
case "pass":
fallthrough
case "fail":
testfailed = true
fallthrough
case "skip":
suite.TimeAttr = strconv.FormatFloat(event.Elapsed, 'f', 2, 64)
continue
default:
fmt.Fprintf(errWriter, "unknown package action found:\n%+v\n", event)
return fmt.Errorf("failed to parse input, please report this error to github.com/fasmat/go2junit")
log.Printf("unknown package action found: %+v\n", event)
log.Fatal("failed to parse input, please report this error to github.com/fasmat/go2junit")
}
}

Expand Down Expand Up @@ -84,8 +89,8 @@ func parse(w io.Writer, r io.Reader, errWriter io.Writer) error {
MessageAttr: "test failed",
}
default:
fmt.Fprintf(errWriter, "unknown test action found: %+v\n", event)
return fmt.Errorf("failed to parse input, please report this error to github.com/fasmat/go2junit")
log.Printf("unknown test action found: %+v\n", event)
log.Fatal("failed to parse input, please report this error to github.com/fasmat/go2junit")
}
}

Expand Down Expand Up @@ -116,5 +121,12 @@ func parse(w io.Writer, r io.Reader, errWriter io.Writer) error {
testsuites.TestsAttr = strconv.Itoa(testtotal)
testsuites.ErrorsAttr = strconv.Itoa(errortotal)

return xml.NewEncoder(w).Encode(testsuites)
if err := xml.NewEncoder(w).Encode(testsuites); err != nil {
log.Println("failed to encode xml")
log.Fatal(err)
}

if fail && testfailed {
os.Exit(1)
}
}

0 comments on commit 5bea69b

Please sign in to comment.