From 3c05bc8cb6a5d98e396e65746816bfab56ddc376 Mon Sep 17 00:00:00 2001 From: Eyal Posener Date: Sun, 22 Jan 2017 02:12:25 +0200 Subject: [PATCH] Fail package in case of build error In case of build error, the unittest fail, but the junit-report with the set-exit-code flag on returns status code 0. This commit will make it return the right status code. --- go-junit-report.go | 2 +- go-junit-report_test.go | 83 ++++++++++++++++++++++++++------------- parser/parser.go | 33 ++++++++++++++-- tests/13-report.xml | 8 ++++ tests/13-syntax-error.txt | 2 + 5 files changed, 95 insertions(+), 33 deletions(-) create mode 100644 tests/13-report.xml create mode 100644 tests/13-syntax-error.txt diff --git a/go-junit-report.go b/go-junit-report.go index bf388b0..4ab76f2 100644 --- a/go-junit-report.go +++ b/go-junit-report.go @@ -37,7 +37,7 @@ func main() { os.Exit(1) } - if setExitCode && report.Failures() > 0 { + if setExitCode && report.Failed() { os.Exit(1) } } diff --git a/go-junit-report_test.go b/go-junit-report_test.go index 4b23b44..8649512 100644 --- a/go-junit-report_test.go +++ b/go-junit-report_test.go @@ -27,8 +27,9 @@ var testCases = []TestCase{ report: &parser.Report{ Packages: []parser.Package{ { - Name: "package/name", - Time: 160, + Name: "package/name", + Time: 160, + Result: parser.PASS, Tests: []*parser.Test{ { Name: "TestZ", @@ -53,8 +54,9 @@ var testCases = []TestCase{ report: &parser.Report{ Packages: []parser.Package{ { - Name: "package/name", - Time: 151, + Name: "package/name", + Time: 151, + Result: parser.FAIL, Tests: []*parser.Test{ { Name: "TestOne", @@ -84,8 +86,9 @@ var testCases = []TestCase{ report: &parser.Report{ Packages: []parser.Package{ { - Name: "package/name", - Time: 150, + Name: "package/name", + Time: 150, + Result: parser.PASS, Tests: []*parser.Test{ { Name: "TestOne", @@ -112,8 +115,9 @@ var testCases = []TestCase{ report: &parser.Report{ Packages: []parser.Package{ { - Name: "package/name", - Time: 160, + Name: "package/name", + Time: 160, + Result: parser.PASS, Tests: []*parser.Test{ { Name: "TestOne", @@ -138,8 +142,9 @@ var testCases = []TestCase{ report: &parser.Report{ Packages: []parser.Package{ { - Name: "package/name", - Time: 160, + Name: "package/name", + Time: 160, + Result: parser.PASS, Tests: []*parser.Test{ { Name: "TestOne", @@ -165,8 +170,9 @@ var testCases = []TestCase{ report: &parser.Report{ Packages: []parser.Package{ { - Name: "package/name1", - Time: 160, + Name: "package/name1", + Time: 160, + Result: parser.PASS, Tests: []*parser.Test{ { Name: "TestOne", @@ -183,8 +189,9 @@ var testCases = []TestCase{ }, }, { - Name: "package/name2", - Time: 151, + Name: "package/name2", + Time: 151, + Result: parser.FAIL, Tests: []*parser.Test{ { Name: "TestOne", @@ -215,8 +222,9 @@ var testCases = []TestCase{ report: &parser.Report{ Packages: []parser.Package{ { - Name: "test/package", - Time: 160, + Name: "test/package", + Time: 160, + Result: parser.PASS, Tests: []*parser.Test{ { Name: "TestOne", @@ -242,8 +250,9 @@ var testCases = []TestCase{ report: &parser.Report{ Packages: []parser.Package{ { - Name: "github.com/dmitris/test-go-junit-report", - Time: 440, + Name: "github.com/dmitris/test-go-junit-report", + Time: 440, + Result: parser.PASS, Tests: []*parser.Test{ { Name: "TestDoFoo", @@ -268,8 +277,9 @@ var testCases = []TestCase{ report: &parser.Report{ Packages: []parser.Package{ { - Name: "package/name", - Time: 160, + Name: "package/name", + Time: 160, + Result: parser.PASS, Tests: []*parser.Test{ { Name: "TestZ", @@ -295,8 +305,9 @@ var testCases = []TestCase{ report: &parser.Report{ Packages: []parser.Package{ { - Name: "package1/foo", - Time: 400, + Name: "package1/foo", + Time: 400, + Result: parser.PASS, Tests: []*parser.Test{ { Name: "TestA", @@ -314,8 +325,9 @@ var testCases = []TestCase{ CoveragePct: "10.0", }, { - Name: "package2/bar", - Time: 4200, + Name: "package2/bar", + Time: 4200, + Result: parser.PASS, Tests: []*parser.Test{ { Name: "TestC", @@ -335,8 +347,9 @@ var testCases = []TestCase{ report: &parser.Report{ Packages: []parser.Package{ { - Name: "package/name", - Time: 50, + Name: "package/name", + Time: 50, + Result: parser.PASS, Tests: []*parser.Test{ { Name: "TestOne", @@ -361,8 +374,9 @@ var testCases = []TestCase{ report: &parser.Report{ Packages: []parser.Package{ { - Name: "package/name", - Time: 50, + Name: "package/name", + Time: 50, + Result: parser.FAIL, Tests: []*parser.Test{ { Name: "TestOne", @@ -487,6 +501,19 @@ var testCases = []TestCase{ }, }, }, + { + name: "13-syntax-error.txt", + reportName: "13-report.xml", + report: &parser.Report{ + Packages: []parser.Package{ + { + Name: "package/name", + Result: parser.FAIL, + Tests: []*parser.Test{}, + }, + }, + }, + }, } func TestParser(t *testing.T) { diff --git a/parser/parser.go b/parser/parser.go index 88da817..f141f1c 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -29,6 +29,7 @@ type Package struct { Time int Tests []*Test CoveragePct string + Result Result } // Test contains the results of a single test. @@ -40,10 +41,11 @@ type Test struct { } var ( - regexStatus = regexp.MustCompile(`^\s*--- (PASS|FAIL|SKIP): (.+) \((\d+\.\d+)(?: seconds|s)\)$`) - regexCoverage = regexp.MustCompile(`^coverage:\s+(\d+\.\d+)%\s+of\s+statements$`) - regexResult = regexp.MustCompile(`^(ok|FAIL)\s+(.+)\s(\d+\.\d+)s(?:\s+coverage:\s+(\d+\.\d+)%\s+of\s+statements)?$`) - regexOutput = regexp.MustCompile(`( )*\t(.*)`) + regexStatus = regexp.MustCompile(`^\s*--- (PASS|FAIL|SKIP): (.+) \((\d+\.\d+)(?: seconds|s)\)$`) + regexCoverage = regexp.MustCompile(`^coverage:\s+(\d+\.\d+)%\s+of\s+statements$`) + regexResult = regexp.MustCompile(`^(ok|FAIL)\s+(.+)\s(\d+\.\d+)s(?:\s+coverage:\s+(\d+\.\d+)%\s+of\s+statements)?$`) + regexBuildFailure = regexp.MustCompile(`^FAIL\s+(.+)\s\[build failed]$`) + regexOutput = regexp.MustCompile(`( )*\t(.*)`) ) // Parse parses go test output from reader r and returns a report with the @@ -66,6 +68,9 @@ func Parse(r io.Reader, pkgName string) (*Report, error) { // coverage percentage report for current package var coveragePct string + // whole package test result + packageResult := FAIL + // parse lines for { l, _, err := reader.ReadLine() @@ -88,6 +93,9 @@ func Parse(r io.Reader, pkgName string) (*Report, error) { } else if matches := regexResult.FindStringSubmatch(line); len(matches) == 5 { if matches[4] != "" { coveragePct = matches[4] + if matches[0] == "ok" { + packageResult = PASS + } } // all tests in this package are finished @@ -96,12 +104,19 @@ func Parse(r io.Reader, pkgName string) (*Report, error) { Time: parseTime(matches[3]), Tests: tests, CoveragePct: coveragePct, + Result: packageResult, }) tests = make([]*Test, 0) coveragePct = "" cur = "" testsTime = 0 + } else if matches := regexBuildFailure.FindStringSubmatch(line); len(matches) == 2 { + report.Packages = append(report.Packages, Package{ + Name: matches[1], + Result: FAIL, + }) + } else if matches := regexStatus.FindStringSubmatch(line); len(matches) == 4 { cur = matches[2] test := findTest(tests, cur) @@ -143,6 +158,7 @@ func Parse(r io.Reader, pkgName string) (*Report, error) { Time: testsTime, Tests: tests, CoveragePct: coveragePct, + Result: packageResult, }) } @@ -180,3 +196,12 @@ func (r *Report) Failures() int { return count } + +func (r *Report) Failed() bool { + for _, p := range r.Packages { + if p.Result == FAIL { + return true + } + } + return false +} diff --git a/tests/13-report.xml b/tests/13-report.xml new file mode 100644 index 0000000..1d6d23a --- /dev/null +++ b/tests/13-report.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/tests/13-syntax-error.txt b/tests/13-syntax-error.txt new file mode 100644 index 0000000..0a4d5ce --- /dev/null +++ b/tests/13-syntax-error.txt @@ -0,0 +1,2 @@ +package/name/file_test.go:9: undefined: x +FAIL package/name [build failed]