third_party/go/src/bitbucket/tebeka/go2xunit: update for go1.5
Change-Id: Ic091a7d17ea317b366ce6af7a79cc104e556f2cc
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/ChangeLog b/go/src/bitbucket.org/tebeka/go2xunit/ChangeLog
index b107cdb..d118cae 100644
--- a/go/src/bitbucket.org/tebeka/go2xunit/ChangeLog
+++ b/go/src/bitbucket.org/tebeka/go2xunit/ChangeLog
@@ -1,3 +1,25 @@
+2015-07-18 version 1.2.2
+ * Support go 1.5 test output (github issue #23)
+
+2015-06-25 version 1.2.1
+ * Ignore SetUpTest and TearDownTest (@pippio in github PR #22)
+
+2015-06-16 version 1.2.0
+ * Support xunit.net (@tischda in github PR #21)
+ * More testing (@tischda in github PR #21)
+
+2014-12-16 version 1.1.1
+ * Better error message (github issue #19)
+
+2014-08-21 version 1.1.0
+ * Support for testify (Joakim Lundborg PR #6)
+
+2014-08-21 version 1.0.0
+ * Bumping to 1.0.0, it's been long enough :)
+
+2014-08-14 version 0.3.1
+ * Fixed two small errors found by "go vet"
+
2014-06-04 version 0.3.0
* Option to fail on data races (Jiri Sima in bitbucket PR #5)
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/LICENSE b/go/src/bitbucket.org/tebeka/go2xunit/LICENSE.txt
similarity index 93%
rename from go/src/bitbucket.org/tebeka/go2xunit/LICENSE
rename to go/src/bitbucket.org/tebeka/go2xunit/LICENSE.txt
index 6956048..34e01ad 100644
--- a/go/src/bitbucket.org/tebeka/go2xunit/LICENSE
+++ b/go/src/bitbucket.org/tebeka/go2xunit/LICENSE.txt
@@ -1,4 +1,4 @@
-Copyright (c) 2012,2013 Miki Tebeka <miki.tebeka@gmail.com>.
+Copyright (c) 2012-2015 Miki Tebeka <miki.tebeka@gmail.com>.
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/README.google b/go/src/bitbucket.org/tebeka/go2xunit/README.google
index 1f146a9..163c094 100644
--- a/go/src/bitbucket.org/tebeka/go2xunit/README.google
+++ b/go/src/bitbucket.org/tebeka/go2xunit/README.google
@@ -1,5 +1,5 @@
-URL: https://bitbucket.org/tebeka/go2xunit/get/77968f802fb3.zip
-Version: 77968f802fb3852e199209e2c78092b717714a2c
+URL: https://bitbucket.org/tebeka/go2xunit/get/d45000af2242dd0e7b8c7b07d82a1068adc5fd40.zip
+Version: d45000af2242dd0e7b8c7b07d82a1068adc5fd40
License: MIT
License File: LICENSE
@@ -8,5 +8,5 @@
in Jenkins/Hudson).
Local Modifications:
-- go/vcl/4807: modified the map2arr() function to output map values in
- a deterministic order to avoid test flakiness
+- fix demo/mmath_test.go
+- add +build ignore to demo-gocheck/mmath_test.go to avoid bringing in another dependency
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/README.md b/go/src/bitbucket.org/tebeka/go2xunit/README.md
index 0a973de..c761a07 100644
--- a/go/src/bitbucket.org/tebeka/go2xunit/README.md
+++ b/go/src/bitbucket.org/tebeka/go2xunit/README.md
@@ -1,7 +1,7 @@
-# go2xunit 0.2.12
+# go2xunit
-Converts `go test -v` (or `gocheck -vv`) output to xunit compatible XML output
-(used in [Jenkins][jenkins]/[Hudson][hudson]).
+Converts `go test -v` (or `gocheck -vv`) output to xunit or [xunit.net][xnet]
+compatible XML output (used in [Jenkins][jenkins]/[Hudson][hudson]).
# Install
@@ -18,7 +18,7 @@
go test -v | go2xunit -output tests.xml
-`go2xunit` also works with [gocheck][gocheck].
+`go2xunit` also works with [gocheck][gocheck], and [testify][testify].
go test -gocheck.vv | go2xunit -gocheck -output tests.xml
@@ -32,8 +32,12 @@
go2xunit -fail -input $outfile -output tests.xml
-Contact
-=======
+# Related
+
+* [testing: add -json flag for json
+ results](https://github.com/golang/go/issues/2981) open bug
+
+# Contact
Miki Tebeka <miki.tebeka@gmail.com>
Bug reports go [here][bugs].
@@ -42,4 +46,6 @@
[jenkins]: http://jenkins-ci.org/
[hudson]: http://hudson-ci.org/
[gocheck]: http://labix.org/gocheck
+[testify]: http://godoc.org/github.com/stretchr/testify
[bugs]: https://bitbucket.org/tebeka/go2xunit/issues
+[xnet]: https://xunit.codeplex.com/wikipage?title=XmlFormat
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/data/gocheck-empty.out b/go/src/bitbucket.org/tebeka/go2xunit/data/gocheck-empty.out
new file mode 100644
index 0000000..787d773
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/data/gocheck-empty.out
@@ -0,0 +1,2 @@
+PASS
+ok github.com/tischda/mmath 0.039s
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/data/gocheck-nofiles.out b/go/src/bitbucket.org/tebeka/go2xunit/data/gocheck-nofiles.out
new file mode 100644
index 0000000..b37956c
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/data/gocheck-nofiles.out
@@ -0,0 +1 @@
+? github.com/tischda/mmath [no test files]
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/data/gocheck-panic.out b/go/src/bitbucket.org/tebeka/go2xunit/data/gocheck-panic.out
new file mode 100644
index 0000000..3d0a96d
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/data/gocheck-panic.out
@@ -0,0 +1,44 @@
+START: mmath_test.go:22: MySuite.TestAdd
+PASS: mmath_test.go:22: MySuite.TestAdd 0.001s
+
+START: mmath_test.go:42: MySuite.TestDiv
+mmath_test.go:45:
+ c.Assert(z, Equals, float64(x)/float64(y))
+... obtained int = 0
+... expected float64 = 0.6666666666666666
+
+FAIL: mmath_test.go:42: MySuite.TestDiv
+
+START: mmath_test.go:35: MySuite.TestMul
+SKIP: mmath_test.go:35: MySuite.TestMul (not implemented)
+
+START: mmath_test.go:17: MySuite.TestPanic
+... Panic: (PC=0x42546C)
+
+c:/go/src/runtime/asm_amd64.s:401
+ in call16
+c:/go/src/runtime/panic.go:387
+ in gopanic
+c:/go/src/log/log.go:307
+ in Panic
+mmath.go:22
+ in Panic
+mmath_test.go:18
+ in MySuite.TestPanic
+c:/go/src/runtime/asm_amd64.s:401
+ in call16
+c:/go/src/reflect/value.go:419
+ in Value.call
+c:/go/src/reflect/value.go:296
+ in Value.Call
+c:/go/src/runtime/asm_amd64.s:2232
+ in goexit
+PANIC: mmath_test.go:17: MySuite.TestPanic
+
+START: mmath_test.go:28: MySuite.TestSub
+PASS: mmath_test.go:28: MySuite.TestSub 0.000s
+
+--- FAIL: Test (0.00s)
+FAIL
+exit status 1
+FAIL github.com/tischda/mmath 0.040s
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/data/gocheck-setup-miss.out b/go/src/bitbucket.org/tebeka/go2xunit/data/gocheck-setup-miss.out
new file mode 100644
index 0000000..e322796
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/data/gocheck-setup-miss.out
@@ -0,0 +1,18 @@
+=== RUN Test
+START: foobar_test.go:17: FoobarSuite.SetUpSuite
+foobar_test.go:19:
+ c.Assert(err, gc.IsNil)
+... value *os.PathError = &os.PathError{Op:"stat", Path:"testdata/regexes.yaml", Err:0x2} ("stat testdata/regexes.yaml: no such file or directory")
+
+FAIL: foobar_test.go:17: FoobarSuite.SetUpSuite
+
+START: foobar_test.go:79: FoobarSuite.TestFrob
+MISS: foobar_test.go:79: FoobarSuite.TestFrob
+
+START: foobar_test.go:102: FoobarSuite.TestThing
+MISS: foobar_test.go:102: FoobarSuite.TestThing
+
+OOPS: 82 passed, 1 FAILED, 2 MISSED
+--- FAIL: Test (2.37s)
+FAIL
+FAIL github.com/you/yourproject/foobar 2.383s
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/data/gotest-1.5.out b/go/src/bitbucket.org/tebeka/go2xunit/data/gotest-1.5.out
new file mode 100644
index 0000000..b0d4f6a
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/data/gotest-1.5.out
@@ -0,0 +1,12 @@
+=== RUN TestAdd
+--- PASS: TestAdd (0.00s)
+=== RUN TestSub
+--- PASS: TestSub (0.00s)
+=== RUN TestMul
+--- PASS: TestMul (0.00s)
+=== RUN TestDiv
+--- FAIL: TestDiv (0.00s)
+ mmath_test.go:35: 2/3 != 0.666667
+FAIL
+exit status 1
+FAIL _/home/miki/Projects/go/src/bitbucket.org/tebeka/go2xunit/demo 0.002s
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/data/gotest-testify-suite.out b/go/src/bitbucket.org/tebeka/go2xunit/data/gotest-testify-suite.out
new file mode 100644
index 0000000..5c32dc6
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/data/gotest-testify-suite.out
@@ -0,0 +1,10 @@
+=== RUN TestSuite
+=== RUN TestA
+--- PASS: TestA (0.01 seconds)
+=== RUN TestB
+--- PASS: TestB (0.02 seconds)
+--- PASS: TestSuite (0.03 seconds)
+=== RUN TestC
+--- PASS: TestC (0.04 seconds)
+PASS
+ok testify-suite 0.071s
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/demo-gocheck/README.md b/go/src/bitbucket.org/tebeka/go2xunit/demo-gocheck/README.md
new file mode 100644
index 0000000..8afec40
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/demo-gocheck/README.md
@@ -0,0 +1,24 @@
+# Demo Project for Using go2xunit
+
+Install `go2xunit` with `go get bitbucket.org/tebeka/go2xunit`
+
+Use run-jenkins.sh to run Jenkins (see Jenkins download instructions in the script).
+
+Then configure Jenkins like the configuration screen below, note the
+"Execute Shell" and "Publish JUnit test result report" sections.
+
+You after running, you should see test results like the below.
+
+
+## Configuration Screen
+
+![Configuration Screen](screenshots/config.png)
+
+## Test Results - Overview
+
+![Tests Overview](screenshots/build-overrview.png)
+
+## Test Results - Detailed
+
+![Tests Detailed](screenshots/build-tests.png)
+
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/demo-gocheck/jenkins.sh b/go/src/bitbucket.org/tebeka/go2xunit/demo-gocheck/jenkins.sh
new file mode 100755
index 0000000..e2c26fa
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/demo-gocheck/jenkins.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+# Test script run by jenkins
+
+outfile=gotest.out
+
+go test -gocheck.vv | tee $outfile
+go2xunit -gocheck -fail -input $outfile -output tests.xml
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/demo-gocheck/mmath.go b/go/src/bitbucket.org/tebeka/go2xunit/demo-gocheck/mmath.go
new file mode 100644
index 0000000..2f21125
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/demo-gocheck/mmath.go
@@ -0,0 +1,17 @@
+package mmath
+
+func Add(x, y int) int {
+ return x + y
+}
+
+func Sub(x, y int) int {
+ return x - y
+}
+
+func Mul(x, y int) int {
+ return x * y
+}
+
+func Div(x, y int) int {
+ return x / y
+}
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/demo-gocheck/mmath_test.go b/go/src/bitbucket.org/tebeka/go2xunit/demo-gocheck/mmath_test.go
new file mode 100644
index 0000000..1c4b27c
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/demo-gocheck/mmath_test.go
@@ -0,0 +1,41 @@
+// +build ignore
+
+package mmath
+
+import (
+ . "launchpad.net/gocheck"
+ "testing"
+)
+
+type MySuite struct{}
+var _ = Suite(&MySuite{})
+
+// Hook up gocheck into the "go test" runner.
+func Test(t *testing.T) {
+ TestingT(t)
+}
+
+func (s *MySuite) TestAdd(c *C) {
+ x, y := 1, 2
+ z := Add(x, y)
+ c.Assert(z, Equals, x+y)
+}
+
+func (s *MySuite) TestSub(c *C) {
+ x, y := 1, 2
+ z := Sub(x, y)
+
+ c.Assert(z, Equals, x-y)
+}
+
+func (s *MySuite) TestMul(c *C) {
+ x, y := 2, 3
+ z := Mul(x, y)
+ c.Assert(z, Equals, x*y)
+}
+
+func (s *MySuite) TestDiv(c *C) {
+ x, y := 2, 3
+ z := Div(x, y)
+ c.Assert(z, Equals, float64(x)/float64(y))
+}
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/demo-gocheck/run-jenkins.sh b/go/src/bitbucket.org/tebeka/go2xunit/demo-gocheck/run-jenkins.sh
new file mode 100755
index 0000000..4aa1a66
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/demo-gocheck/run-jenkins.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+# Run Jenkins as daemon on port 8000
+
+# You can download jenkins.war from http://mirrors.jenkins-ci.org/war/latest/jenkins.war
+
+java -jar jenkins.war \
+ --logfile=${PWD}/jenkins.log \
+ --httpPort=8000 \
+ --daemon
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/go2xunit.go b/go/src/bitbucket.org/tebeka/go2xunit/go2xunit.go
index b7728bd..efcd717 100644
--- a/go/src/bitbucket.org/tebeka/go2xunit/go2xunit.go
+++ b/go/src/bitbucket.org/tebeka/go2xunit/go2xunit.go
@@ -8,23 +8,27 @@
"log"
"os"
"regexp"
- "sort"
+ "strconv"
"strings"
"text/template"
+ "time"
)
+// Time when the test was run
+var runTime time.Time
+
const (
- version = "0.3.0"
+ version = "1.2.2"
// gotest regular expressions
// === RUN TestAdd
- gt_startRE = "^=== RUN:? ([a-zA-Z_][^[:space:]]*)"
+ gt_startRE = "^=== RUN:?[[:space:]]+([a-zA-Z_][^[:space:]]*)"
// --- PASS: TestSub (0.00 seconds)
// --- FAIL: TestSubFail (0.00 seconds)
// --- SKIP: TestSubSkip (0.00 seconds)
- gt_endRE = "^--- (PASS|FAIL|SKIP): ([a-zA-Z_][^[:space:]]*) \\((\\d+(.\\d+)?)"
+ gt_endRE = "^--- (PASS|FAIL|SKIP):[[:space:]]+([a-zA-Z_][^[:space:]]*) \\((\\d+(.\\d+)?)"
// FAIL _/home/miki/Projects/goroot/src/xunit 0.004s
// ok _/home/miki/Projects/goroot/src/anotherTest 0.000s
@@ -39,9 +43,14 @@
// START: mmath_test.go:16: MySuite.TestAdd
gc_startRE = "START: [^:]+:[^:]+: ([A-Za-z_][[:word:]]*).([A-Za-z_][[:word:]]*)"
+
// PASS: mmath_test.go:16: MySuite.TestAdd 0.000s
// FAIL: mmath_test.go:35: MySuite.TestDiv
- gc_endRE = "(PASS|FAIL): [^:]+:[^:]+: ([A-Za-z_][[:word:]]*).([A-Za-z_][[:word:]]*)([[:space:]]+([0-9]+.[0-9]+))?"
+ gc_endRE = "(PASS|FAIL|SKIP|PANIC|MISS): [^:]+:[^:]+: ([A-Za-z_][[:word:]]*).([A-Za-z_][[:word:]]*)[[:space:]]?([0-9]+.[0-9]+)?"
+
+ // FAIL go2xunit/demo-gocheck 0.008s
+ // ok go2xunit/demo-gocheck 0.008s
+ gc_suiteRE = "^(ok|FAIL)[ \t]+([^ \t]+)[ \t]+(\\d+.\\d+)"
)
var (
@@ -52,6 +61,7 @@
Name, Time, Message string
Failed bool
Skipped bool
+ Passed bool
}
type Suite struct {
@@ -61,9 +71,51 @@
Tests []*Test
}
+type SuiteStack struct {
+ nodes []*Suite
+ count int
+}
+
+// Push adds a node to the stack.
+func (s *SuiteStack) Push(n *Suite) {
+ s.nodes = append(s.nodes[:s.count], n)
+ s.count++
+}
+
+// Pop removes and returns a node from the stack in last to first order.
+func (s *SuiteStack) Pop() *Suite {
+ if s.count == 0 {
+ return nil
+ }
+ s.count--
+ return s.nodes[s.count]
+}
+
type TestResults struct {
- Suites []*Suite
- Multi bool
+ Suites []*Suite
+ Assembly string
+ RunDate string
+ RunTime string
+ Time string
+ Total int
+ Passed int
+ Failed int
+ Skipped int
+}
+
+// calculate grand total for all suites
+func (r *TestResults) calcTotals() {
+ totalTime, _ := strconv.ParseFloat(r.Time, 64)
+ for _, suite := range r.Suites {
+ r.Passed += suite.NumPassed()
+ r.Failed += suite.NumFailed()
+ r.Skipped += suite.NumSkipped()
+
+ suiteTime, _ := strconv.ParseFloat(suite.Time, 64)
+ totalTime += suiteTime
+ r.Time = fmt.Sprintf("%.3f", totalTime)
+ }
+ r.Total = r.Passed + r.Skipped + r.Failed
}
func (suite *Suite) NumFailed() int {
@@ -88,6 +140,19 @@
return count
}
+// Number of passed tests in the suite
+func (suite *Suite) NumPassed() int {
+ count := 0
+ for _, test := range suite.Tests {
+ if test.Passed {
+ count++
+ }
+ }
+
+ return count
+}
+
+// Number of tests in the suite
func (suite *Suite) Count() int {
return len(suite.Tests)
}
@@ -114,7 +179,7 @@
var curTest *Test
var curSuite *Suite
var out []string
-
+ suiteStack := SuiteStack{}
// Handles a test that ended with a panic.
handlePanic := func() {
curTest.Failed = true
@@ -159,7 +224,12 @@
if tokens != nil {
if curTest != nil {
// This occurs when the last test ended with a panic.
- handlePanic()
+ if suiteStack.count == 0 {
+ suiteStack.Push(curSuite)
+ curSuite = &Suite{Name: curTest.Name}
+ } else {
+ handlePanic()
+ }
}
if e := appendError(); e != nil {
return nil, e
@@ -173,13 +243,22 @@
tokens = find_end(line)
if tokens != nil {
if curTest == nil {
- return nil, fmt.Errorf("%d: orphan end test", lnum)
+ if suiteStack.count > 0 {
+ prevSuite := suiteStack.Pop()
+ suites = append(suites, curSuite)
+ curSuite = prevSuite
+ continue
+ } else {
+ return nil, fmt.Errorf("%d: orphan end test", lnum)
+ }
}
if tokens[2] != curTest.Name {
- return nil, fmt.Errorf("%d: name mismatch", lnum)
+ err := fmt.Errorf("%d: name mismatch (try disabling parallel mode)", lnum)
+ return nil, err
}
curTest.Failed = (tokens[1] == "FAIL") || (failOnRace && hasDatarace(out))
curTest.Skipped = (tokens[1] == "SKIP")
+ curTest.Passed = (tokens[1] == "PASS")
curTest.Time = tokens[3]
curTest.Message = strings.Join(out, "\n")
curSuite.Tests = append(curSuite.Tests, curTest)
@@ -218,75 +297,88 @@
return suites, nil
}
-func map2arr(m map[string]*Suite) []*Suite {
- arr := []*Suite{}
- keys := []string{}
- for key, _ := range m {
- keys = append(keys, key)
- }
- sort.Strings(keys)
- for _, key := range keys {
- /* FIXME:
- suite.Status =
- suite.Time =
- */
- arr = append(arr, m[key])
- }
- return arr
-}
-
// gc_Parse parses output of "go test -gocheck.vv", returns a list of tests
// See data/gocheck.out for an example
func gc_Parse(rd io.Reader) ([]*Suite, error) {
find_start := regexp.MustCompile(gc_startRE).FindStringSubmatch
find_end := regexp.MustCompile(gc_endRE).FindStringSubmatch
+ find_suite := regexp.MustCompile(gc_suiteRE).FindStringSubmatch
scanner := bufio.NewScanner(rd)
- var test *Test
- var suites = make(map[string]*Suite)
+ var suites = make([]*Suite, 0)
var suiteName string
+ var suite *Suite
+
+ var testName string
var out []string
for lnum := 1; scanner.Scan(); lnum++ {
line := scanner.Text()
+
tokens := find_start(line)
if len(tokens) > 0 {
- if test != nil {
+ if tokens[2] == "SetUpTest" || tokens[2] == "TearDownTest" {
+ continue
+ }
+ if testName != "" {
return nil, fmt.Errorf("%d: start in middle\n", lnum)
}
suiteName = tokens[1]
- test = &Test{Name: tokens[2]}
+ testName = tokens[2]
out = []string{}
continue
}
tokens = find_end(line)
if len(tokens) > 0 {
- if test == nil {
+ if tokens[3] == "SetUpTest" || tokens[3] == "TearDownTest" {
+ continue
+ }
+ if testName == "" {
return nil, fmt.Errorf("%d: orphan end", lnum)
}
- if (tokens[2] != suiteName) || (tokens[3] != test.Name) {
+ if (tokens[2] != suiteName) || (tokens[3] != testName) {
return nil, fmt.Errorf("%d: suite/name mismatch", lnum)
}
+ test := &Test{Name: testName}
test.Message = strings.Join(out, "\n")
test.Time = tokens[4]
- test.Failed = (tokens[1] == "FAIL")
+ test.Failed = (tokens[1] == "FAIL") || (tokens[1] == "PANIC")
+ test.Passed = (tokens[1] == "PASS")
+ test.Skipped = (tokens[1] == "SKIP" || tokens[1] == "MISS")
- suite, ok := suites[suiteName]
- if !ok {
+ if suite == nil || suite.Name != suiteName {
suite = &Suite{Name: suiteName}
+ suites = append(suites, suite)
}
suite.Tests = append(suite.Tests, test)
- suites[suiteName] = suite
- test = nil
+ testName = ""
suiteName = ""
out = []string{}
continue
}
- if test != nil {
+ // last "suite" is test summary
+ tokens = find_suite(line)
+ if tokens != nil {
+ if suite == nil {
+ suite = &Suite{Name: tokens[2], Status: tokens[1], Time: tokens[3]}
+ suites = append(suites, suite)
+ } else {
+ suite.Status = tokens[1]
+ suite.Time = tokens[3]
+ }
+
+ testName = ""
+ suiteName = ""
+ out = []string{}
+
+ continue
+ }
+
+ if testName != "" {
out = append(out, line)
}
}
@@ -295,7 +387,7 @@
return nil, err
}
- return map2arr(suites), nil
+ return suites, nil
}
func hasFailures(suites []*Suite) bool {
@@ -307,8 +399,10 @@
return false
}
-var xmlTemplate string = `<?xml version="1.0" encoding="utf-8"?>
-{{if .Multi}}<testsuites>{{end}}
+const (
+ xmlDeclaration = `<?xml version="1.0" encoding="utf-8"?>`
+
+ xunitTemplate string = `
{{range $suite := .Suites}} <testsuite name="{{.Name}}" tests="{{.Count}}" errors="0" failures="{{.NumFailed}}" skip="{{.NumSkipped}}">
{{range $test := $suite.Tests}} <testcase classname="{{$suite.Name}}" name="{{$test.Name}}" time="{{$test.Time}}">
{{if $test.Skipped }} <skipped/> {{end}}
@@ -316,31 +410,73 @@
<![CDATA[{{$test.Message}}]]>
</failure>{{end}} </testcase>
{{end}} </testsuite>
-{{end}}{{if .Multi}}</testsuites>{{end}}
+{{end}}`
+
+ multiTemplate string = `
+<testsuites>` + xunitTemplate + `</testsuites>
`
+ // https://xunit.codeplex.com/wikipage?title=XmlFormat
+ xunitNetTemplate string = `
+<assembly name="{{.Assembly}}"
+ run-date="{{.RunDate}}" run-time="{{.RunTime}}"
+ configFile="none"
+ time="{{.Time}}"
+ total="{{.Total}}"
+ passed="{{.Passed}}"
+ failed="{{.Failed}}"
+ skipped="{{.Skipped}}"
+ environment="n/a"
+ test-framework="golang">
+{{range $suite := .Suites}}
+ <class time="{{.Time}}" name="{{.Name}}"
+ total="{{.Count}}"
+ passed="{{.NumPassed}}"
+ failed="{{.NumFailed}}"
+ skipped="{{.NumSkipped}}">
+{{range $test := $suite.Tests}}
+ <test name="{{$test.Name}}"
+ type="test"
+ method="{{$test.Name}}"
+ result={{if $test.Skipped }}"Skip"{{else if $test.Failed }}"Fail"{{else if $test.Passed }}"Pass"{{end}}
+ time="{{$test.Time}}">
+ {{if $test.Failed }} <failure exception-type="go.error">
+ <message><![CDATA[{{$test.Message}}]]></message>
+ </failure>
+ {{end}}</test>
+{{end}}
+ </class>
+{{end}}
+</assembly>
+`
+)
+
// writeXML exits xunit XML of tests to out
-func writeXML(suites []*Suite, out io.Writer, bamboo bool) {
+func writeXML(suites []*Suite, out io.Writer, xmlTemplate string) {
testsResult := TestResults{
- Suites: suites,
- Multi: bamboo || (len(suites) > 1),
+ Suites: suites,
+ Assembly: suites[len(suites)-1].Name,
+ RunDate: runTime.Format("2006-01-02"),
+ RunTime: fmt.Sprintf("%02d:%02d:%02d", runTime.Hour(), runTime.Minute(), runTime.Second()),
}
+ testsResult.calcTotals()
t := template.New("test template")
- t, err := t.Parse(xmlTemplate)
+
+ t, err := t.Parse(xmlDeclaration + xmlTemplate)
if err != nil {
- fmt.Println("Error en parse %v", err)
+ fmt.Printf("Error in parse %v\n", err)
return
}
err = t.Execute(out, testsResult)
if err != nil {
- fmt.Println("Error en execute %v", err)
+ fmt.Printf("Error in execute %v\n", err)
return
}
}
-// getInput return input io.Reader from file name, if file name is - it will
+// getInput return input io.File from file name, if file name is - it will
// return os.Stdin
-func getInput(filename string) (io.Reader, error) {
+func getInput(filename string) (*os.File, error) {
if filename == "-" || filename == "" {
return os.Stdin, nil
}
@@ -348,9 +484,9 @@
return os.Open(filename)
}
-// getInput return output io.Writer from file name, if file name is - it will
+// getInput return output io.File from file name, if file name is - it will
// return os.Stdout
-func getOutput(filename string) (io.Writer, error) {
+func getOutput(filename string) (*os.File, error) {
if filename == "-" || filename == "" {
return os.Stdout, nil
}
@@ -370,21 +506,37 @@
return nil, nil, fmt.Errorf("can't open %s for writing: %s", outputFile, err)
}
+ setRunTimeFrom(input)
+
return input, output, nil
}
+// set test execution time from file date
+func setRunTimeFrom(file *os.File) {
+ statinfo, err := file.Stat()
+ checkFatal(err)
+ runTime = statinfo.ModTime()
+}
+
+func checkFatal(err error) {
+ if err != nil {
+ log.Fatalln(err)
+ }
+}
+
func main() {
inputFile := flag.String("input", "", "input file (default to stdin)")
outputFile := flag.String("output", "", "output file (default to stdout)")
fail := flag.Bool("fail", false, "fail (non zero exit) if any test failed")
showVersion := flag.Bool("version", false, "print version and exit")
bamboo := flag.Bool("bamboo", false, "xml compatible with Atlassian's Bamboo")
+ xunitnet := flag.Bool("xunitnet", false, "xml compatible with xunit.net")
is_gocheck := flag.Bool("gocheck", false, "parse gocheck output")
flag.BoolVar(&failOnRace, "fail-on-race", false, "mark test as failing if it exposes a data race")
flag.Parse()
if *showVersion {
- fmt.Println(version)
+ fmt.Printf("go2xunit %s\n", version)
os.Exit(0)
}
@@ -395,6 +547,10 @@
log.Fatalf("error: %s does not take parameters (did you mean -input?)", os.Args[0])
}
+ if *bamboo && *xunitnet {
+ log.Fatalf("error: -bamboo and -xunitnet are mutually exclusive")
+ }
+
input, output, err := getIO(*inputFile, *outputFile)
if err != nil {
log.Fatalf("error: %s", err)
@@ -417,7 +573,14 @@
os.Exit(1)
}
- writeXML(suites, output, *bamboo)
+ xmlTemplate := xunitTemplate
+ if *xunitnet {
+ xmlTemplate = xunitNetTemplate
+ } else if *bamboo || (len(suites) > 1) {
+ xmlTemplate = multiTemplate
+ }
+
+ writeXML(suites, output, xmlTemplate)
if *fail && hasFailures(suites) {
os.Exit(1)
}
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/go2xunit_test.go b/go/src/bitbucket.org/tebeka/go2xunit/go2xunit_test.go
index 75b9969..15d440e 100644
--- a/go/src/bitbucket.org/tebeka/go2xunit/go2xunit_test.go
+++ b/go/src/bitbucket.org/tebeka/go2xunit/go2xunit_test.go
@@ -297,7 +297,7 @@
t.Fatalf("bad number of suites %d != %d", len(suites), nsuites)
}
- suite := suites[0]
+ suite := suites[1]
ntests := 3
if len(suite.Tests) != ntests {
t.Fatalf("bad number of tests %d != %d", len(suite.Tests), ntests)
@@ -407,3 +407,13 @@
t.Fatalf("unexpected failure")
}
}
+
+func Test_TestifySuite(t *testing.T) {
+ suites, err := loadGotest("data/gotest-testify-suite.out", t)
+ if err != nil {
+ t.Fatalf("Failed to parse")
+ }
+ if len(suites) != 2 {
+ t.Fatalf("Wrong number of suites", len(suites))
+ }
+}
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/io_test.go b/go/src/bitbucket.org/tebeka/go2xunit/io_test.go
new file mode 100644
index 0000000..5a206a3
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/io_test.go
@@ -0,0 +1,126 @@
+package main
+
+import (
+ "bytes"
+ "io"
+ "io/ioutil"
+ "log"
+ "os"
+ "testing"
+ "time"
+)
+
+var goCheckFiles []string = []string{
+ "gocheck-pass.out",
+ "gocheck-fail.out",
+ "gocheck-panic.out",
+ "gocheck-nofiles.out",
+ "gocheck-empty.out",
+ "gocheck-setup-miss.out",
+}
+
+var goTestFiles []string = []string{
+ "gotest.out",
+ "gotest-0.out",
+ "gotest-datarace.out",
+ "gotest-empty.out",
+ "gotest-fail.out",
+ "gotest-log.out",
+ "gotest-multi.out",
+ "gotest-multierror.out",
+ "gotest-nofiles.out",
+ "gotest-num.out",
+ "gotest-panic.out",
+ "gotest-pass.out",
+ "gotest-testify-suite.out",
+ "gotest-1.5.out",
+}
+
+func Test_XMLOuptutGoCheckXUnit(t *testing.T) {
+ for _, filename := range goCheckFiles {
+ suites, err := gc_Parse(getInputData(filename))
+ checkError(err)
+ generateAndTestXMLXUnit(t, suites, filename)
+ }
+}
+
+func Test_XMLOuptutGoCheckXUnitNet(t *testing.T) {
+ for _, filename := range goCheckFiles {
+ suites, err := gc_Parse(getInputData(filename))
+ checkError(err)
+ generateAndTestXMLXUnitNet(t, suites, filename)
+ }
+}
+
+func Test_XMLOuptutGoTestXUnit(t *testing.T) {
+ for _, filename := range goTestFiles {
+ suites, err := gt_Parse(getInputData(filename))
+ checkError(err)
+ generateAndTestXMLXUnit(t, suites, filename)
+ }
+}
+
+func Test_XMLOuptutGoTestXunitNet(t *testing.T) {
+ for _, filename := range goTestFiles {
+ suites, err := gt_Parse(getInputData(filename))
+ checkError(err)
+ generateAndTestXMLXUnitNet(t, suites, filename)
+ }
+}
+
+func getInputData(filename string) io.Reader {
+ file, err := getInput("data" + string(os.PathSeparator) + filename)
+ checkError(err)
+ return file
+}
+
+func getOutputData(outType string, filename string) io.Reader {
+ file, err := getInput("xml" + string(os.PathSeparator) + outType + string(os.PathSeparator) + filename + ".xml")
+ checkError(err)
+ return file
+}
+
+func generateXML(suites []*Suite, filename string, xmlTemplate string) []byte {
+ if len(suites) == 0 {
+ return []byte("error: no tests found")
+ }
+ r, w, _ := os.Pipe()
+ writeXML(suites, w, xmlTemplate)
+ w.Close()
+ xml, err := ioutil.ReadAll(r)
+ checkError(err)
+ return xml
+}
+
+func generateAndTestXMLXUnit(t *testing.T, suites []*Suite, filename string) {
+ expected, err := ioutil.ReadAll(getOutputData("xunit", filename))
+ checkError(err)
+
+ var xmlTemplate = xunitTemplate
+ if len(suites) > 1 {
+ xmlTemplate = multiTemplate
+ }
+
+ actual := generateXML(suites, filename, xmlTemplate)
+ if !bytes.Equal(expected, actual) {
+ t.Errorf("xUnit XML output %s differs from expected", filename)
+ }
+}
+
+func generateAndTestXMLXUnitNet(t *testing.T, suites []*Suite, filename string) {
+ // run-date="2015-06-05" run-time="18:34:41"
+ runTime = time.Date(2015, time.June, 5, 18, 34, 41, 0, time.UTC)
+
+ expected, err := ioutil.ReadAll(getOutputData("xunit.net", filename))
+ checkError(err)
+ actual := generateXML(suites, filename, xunitNetTemplate)
+ if !bytes.Equal(expected, actual) {
+ t.Errorf("xUnit.net XML output %s differs from expected", filename)
+ }
+}
+
+func checkError(err error) {
+ if err != nil {
+ log.Fatal(err)
+ }
+}
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/main_test.go b/go/src/bitbucket.org/tebeka/go2xunit/main_test.go
new file mode 100644
index 0000000..3e2d977
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/main_test.go
@@ -0,0 +1,41 @@
+package main
+
+import (
+ "bytes"
+ "io/ioutil"
+ "os"
+ "testing"
+)
+
+func Test_MainXunitNet(t *testing.T) {
+ filename := "gocheck-pass.out"
+ args := []string{"-gocheck", "-input", "data/" + filename}
+ os.Args = append(os.Args, args...)
+
+ expected, err := ioutil.ReadAll(getOutputData("xunit", filename))
+ checkError(err)
+
+ // this can be done only once or test framework will panic
+ actual := []byte(captureOutput(main))
+
+ if !bytes.Equal(expected, actual) {
+ t.Errorf("xUnit.net XML output %s differs from expected", filename)
+ }
+}
+
+// captures Stdout and returns output of function f()
+func captureOutput(f func()) string {
+ // redirect output
+ old := os.Stdout
+ r, w, _ := os.Pipe()
+ os.Stdout = w
+
+ f()
+
+ // reset output again
+ w.Close()
+ os.Stdout = old
+
+ captured, _ := ioutil.ReadAll(r)
+ return string(captured)
+}
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/push-to-github.sh b/go/src/bitbucket.org/tebeka/go2xunit/push-to-github.sh
new file mode 100755
index 0000000..f579dc3
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/push-to-github.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+hg bookmark -f -r default master
+hg push git+ssh://git@github.com/tebeka/go2xunit.git
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gocheck-empty.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gocheck-empty.out.xml
new file mode 100644
index 0000000..17c3364
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gocheck-empty.out.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly name="github.com/tischda/mmath"
+ run-date="2015-06-05" run-time="18:34:41"
+ configFile="none"
+ time="0.039"
+ total="0"
+ passed="0"
+ failed="0"
+ skipped="0"
+ environment="n/a"
+ test-framework="golang">
+
+ <class time="0.039" name="github.com/tischda/mmath"
+ total="0"
+ passed="0"
+ failed="0"
+ skipped="0">
+
+ </class>
+
+</assembly>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gocheck-fail.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gocheck-fail.out.xml
new file mode 100644
index 0000000..061d59a
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gocheck-fail.out.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly name="MySuite"
+ run-date="2015-06-05" run-time="18:34:41"
+ configFile="none"
+ time="0.008"
+ total="4"
+ passed="3"
+ failed="1"
+ skipped="0"
+ environment="n/a"
+ test-framework="golang">
+
+ <class time="" name="MySuite1"
+ total="1"
+ passed="1"
+ failed="0"
+ skipped="0">
+
+ <test name="TestAdd"
+ type="test"
+ method="TestAdd"
+ result="Pass"
+ time="0.000">
+ </test>
+
+ </class>
+
+ <class time="0.008" name="MySuite"
+ total="3"
+ passed="2"
+ failed="1"
+ skipped="0">
+
+ <test name="TestDiv"
+ type="test"
+ method="TestDiv"
+ result="Fail"
+ time="">
+ <failure exception-type="go.error">
+ <message><![CDATA[mmath_test.go:38:
+ c.Assert(z, Equals, float64(x)/float64(y))
+... obtained int = 0
+... expected float64 = 0.6666666666666666
+]]></message>
+ </failure>
+ </test>
+
+ <test name="TestMul"
+ type="test"
+ method="TestMul"
+ result="Pass"
+ time="0.000">
+ </test>
+
+ <test name="TestSub"
+ type="test"
+ method="TestSub"
+ result="Pass"
+ time="0.000">
+ </test>
+
+ </class>
+
+</assembly>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gocheck-nofiles.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gocheck-nofiles.out.xml
new file mode 100644
index 0000000..3763d8b
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gocheck-nofiles.out.xml
@@ -0,0 +1 @@
+error: no tests found
\ No newline at end of file
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gocheck-panic.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gocheck-panic.out.xml
new file mode 100644
index 0000000..930c329
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gocheck-panic.out.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly name="MySuite"
+ run-date="2015-06-05" run-time="18:34:41"
+ configFile="none"
+ time="0.040"
+ total="5"
+ passed="2"
+ failed="2"
+ skipped="1"
+ environment="n/a"
+ test-framework="golang">
+
+ <class time="0.040" name="MySuite"
+ total="5"
+ passed="2"
+ failed="2"
+ skipped="1">
+
+ <test name="TestAdd"
+ type="test"
+ method="TestAdd"
+ result="Pass"
+ time="0.001">
+ </test>
+
+ <test name="TestDiv"
+ type="test"
+ method="TestDiv"
+ result="Fail"
+ time="">
+ <failure exception-type="go.error">
+ <message><![CDATA[mmath_test.go:45:
+ c.Assert(z, Equals, float64(x)/float64(y))
+... obtained int = 0
+... expected float64 = 0.6666666666666666
+]]></message>
+ </failure>
+ </test>
+
+ <test name="TestMul"
+ type="test"
+ method="TestMul"
+ result="Skip"
+ time="">
+ </test>
+
+ <test name="TestPanic"
+ type="test"
+ method="TestPanic"
+ result="Fail"
+ time="">
+ <failure exception-type="go.error">
+ <message><![CDATA[... Panic: (PC=0x42546C)
+
+c:/go/src/runtime/asm_amd64.s:401
+ in call16
+c:/go/src/runtime/panic.go:387
+ in gopanic
+c:/go/src/log/log.go:307
+ in Panic
+mmath.go:22
+ in Panic
+mmath_test.go:18
+ in MySuite.TestPanic
+c:/go/src/runtime/asm_amd64.s:401
+ in call16
+c:/go/src/reflect/value.go:419
+ in Value.call
+c:/go/src/reflect/value.go:296
+ in Value.Call
+c:/go/src/runtime/asm_amd64.s:2232
+ in goexit]]></message>
+ </failure>
+ </test>
+
+ <test name="TestSub"
+ type="test"
+ method="TestSub"
+ result="Pass"
+ time="0.000">
+ </test>
+
+ </class>
+
+</assembly>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gocheck-pass.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gocheck-pass.out.xml
new file mode 100644
index 0000000..56d67bf
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gocheck-pass.out.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly name="MySuite"
+ run-date="2015-06-05" run-time="18:34:41"
+ configFile="none"
+ time="0.008"
+ total="3"
+ passed="3"
+ failed="0"
+ skipped="0"
+ environment="n/a"
+ test-framework="golang">
+
+ <class time="0.008" name="MySuite"
+ total="3"
+ passed="3"
+ failed="0"
+ skipped="0">
+
+ <test name="TestAdd"
+ type="test"
+ method="TestAdd"
+ result="Pass"
+ time="0.000">
+ </test>
+
+ <test name="TestMul"
+ type="test"
+ method="TestMul"
+ result="Pass"
+ time="0.000">
+ </test>
+
+ <test name="TestSub"
+ type="test"
+ method="TestSub"
+ result="Pass"
+ time="0.000">
+ </test>
+
+ </class>
+
+</assembly>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gocheck-setup-miss.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gocheck-setup-miss.out.xml
new file mode 100644
index 0000000..98ebeed
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gocheck-setup-miss.out.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly name="FoobarSuite"
+ run-date="2015-06-05" run-time="18:34:41"
+ configFile="none"
+ time="2.383"
+ total="3"
+ passed="0"
+ failed="1"
+ skipped="2"
+ environment="n/a"
+ test-framework="golang">
+
+ <class time="2.383" name="FoobarSuite"
+ total="3"
+ passed="0"
+ failed="1"
+ skipped="2">
+
+ <test name="SetUpSuite"
+ type="test"
+ method="SetUpSuite"
+ result="Fail"
+ time="">
+ <failure exception-type="go.error">
+ <message><![CDATA[foobar_test.go:19:
+ c.Assert(err, gc.IsNil)
+... value *os.PathError = &os.PathError{Op:"stat", Path:"testdata/regexes.yaml", Err:0x2} ("stat testdata/regexes.yaml: no such file or directory")
+]]></message>
+ </failure>
+ </test>
+
+ <test name="TestFrob"
+ type="test"
+ method="TestFrob"
+ result="Skip"
+ time="">
+ </test>
+
+ <test name="TestThing"
+ type="test"
+ method="TestThing"
+ result="Skip"
+ time="">
+ </test>
+
+ </class>
+
+</assembly>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-0.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-0.out.xml
new file mode 100644
index 0000000..b916ede
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-0.out.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly name="package"
+ run-date="2015-06-05" run-time="18:34:41"
+ configFile="none"
+ time="0.194"
+ total="2"
+ passed="2"
+ failed="0"
+ skipped="0"
+ environment="n/a"
+ test-framework="golang">
+
+ <class time="0.194" name="package"
+ total="2"
+ passed="2"
+ failed="0"
+ skipped="0">
+
+ <test name="ExampleA"
+ type="test"
+ method="ExampleA"
+ result="Pass"
+ time="4.0003">
+ </test>
+
+ <test name="ExampleOp"
+ type="test"
+ method="ExampleOp"
+ result="Pass"
+ time="0">
+ </test>
+
+ </class>
+
+</assembly>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-1.5.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-1.5.out.xml
new file mode 100644
index 0000000..3182a72
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-1.5.out.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly name="_/home/miki/Projects/go/src/bitbucket.org/tebeka/go2xunit/demo"
+ run-date="2015-06-05" run-time="18:34:41"
+ configFile="none"
+ time="0.002"
+ total="4"
+ passed="3"
+ failed="1"
+ skipped="0"
+ environment="n/a"
+ test-framework="golang">
+
+ <class time="0.002" name="_/home/miki/Projects/go/src/bitbucket.org/tebeka/go2xunit/demo"
+ total="4"
+ passed="3"
+ failed="1"
+ skipped="0">
+
+ <test name="TestAdd"
+ type="test"
+ method="TestAdd"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ <test name="TestSub"
+ type="test"
+ method="TestSub"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ <test name="TestMul"
+ type="test"
+ method="TestMul"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ <test name="TestDiv"
+ type="test"
+ method="TestDiv"
+ result="Fail"
+ time="0.00">
+ <failure exception-type="go.error">
+ <message><![CDATA[ mmath_test.go:35: 2/3 != 0.666667]]></message>
+ </failure>
+ </test>
+
+ </class>
+
+</assembly>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-datarace.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-datarace.out.xml
new file mode 100644
index 0000000..0b10323
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-datarace.out.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly name="go2xunit/demo"
+ run-date="2015-06-05" run-time="18:34:41"
+ configFile="none"
+ time="0.006"
+ total="1"
+ passed="1"
+ failed="0"
+ skipped="0"
+ environment="n/a"
+ test-framework="golang">
+
+ <class time="0.006" name="go2xunit/demo"
+ total="1"
+ passed="1"
+ failed="0"
+ skipped="0">
+
+ <test name="TestDataRace"
+ type="test"
+ method="TestDataRace"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ </class>
+
+</assembly>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-empty.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-empty.out.xml
new file mode 100644
index 0000000..a2a98c4
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-empty.out.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly name="go2xunit/demo"
+ run-date="2015-06-05" run-time="18:34:41"
+ configFile="none"
+ time="0.021"
+ total="0"
+ passed="0"
+ failed="0"
+ skipped="0"
+ environment="n/a"
+ test-framework="golang">
+
+ <class time="0.021" name="go2xunit/demo"
+ total="0"
+ passed="0"
+ failed="0"
+ skipped="0">
+
+ </class>
+
+</assembly>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-fail.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-fail.out.xml
new file mode 100644
index 0000000..84c723c
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-fail.out.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly name="_/home/miki/Projects/goroot/src/xunit"
+ run-date="2015-06-05" run-time="18:34:41"
+ configFile="none"
+ time="0.004"
+ total="4"
+ passed="3"
+ failed="1"
+ skipped="0"
+ environment="n/a"
+ test-framework="golang">
+
+ <class time="0.004" name="_/home/miki/Projects/goroot/src/xunit"
+ total="4"
+ passed="3"
+ failed="1"
+ skipped="0">
+
+ <test name="TestAdd"
+ type="test"
+ method="TestAdd"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ <test name="TestSub"
+ type="test"
+ method="TestSub"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ <test name="TestSubFail"
+ type="test"
+ method="TestSubFail"
+ result="Fail"
+ time="0.00">
+ <failure exception-type="go.error">
+ <message><![CDATA[ xunit_test.go:22: 3-1 != 3
+ Some newline goes here]]></message>
+ </failure>
+ </test>
+
+ <test name="TestSubOK"
+ type="test"
+ method="TestSubOK"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ </class>
+
+</assembly>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-log.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-log.out.xml
new file mode 100644
index 0000000..fc94805
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-log.out.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly name="go2xunit/demo"
+ run-date="2015-06-05" run-time="18:34:41"
+ configFile="none"
+ time="0.006"
+ total="1"
+ passed="1"
+ failed="0"
+ skipped="0"
+ environment="n/a"
+ test-framework="golang">
+
+ <class time="0.006" name="go2xunit/demo"
+ total="1"
+ passed="1"
+ failed="0"
+ skipped="0">
+
+ <test name="TestLogOutput"
+ type="test"
+ method="TestLogOutput"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ </class>
+
+</assembly>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-multi.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-multi.out.xml
new file mode 100644
index 0000000..1740a87
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-multi.out.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly name="controllers"
+ run-date="2015-06-05" run-time="18:34:41"
+ configFile="none"
+ time="0.024"
+ total="4"
+ passed="4"
+ failed="0"
+ skipped="0"
+ environment="n/a"
+ test-framework="golang">
+
+ <class time="0.024" name="controllers"
+ total="4"
+ passed="4"
+ failed="0"
+ skipped="0">
+
+ <test name="TestApp_AssetPath"
+ type="test"
+ method="TestApp_AssetPath"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ <test name="TestTrimTransferCeil"
+ type="test"
+ method="TestTrimTransferCeil"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ <test name="TestStatusDescription"
+ type="test"
+ method="TestStatusDescription"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ <test name="TestCode"
+ type="test"
+ method="TestCode"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ </class>
+
+</assembly>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-multierror.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-multierror.out.xml
new file mode 100644
index 0000000..876b313
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-multierror.out.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly name="skeleton"
+ run-date="2015-06-05" run-time="18:34:41"
+ configFile="none"
+ time="0.047"
+ total="2"
+ passed="0"
+ failed="2"
+ skipped="0"
+ environment="n/a"
+ test-framework="golang">
+
+ <class time="0.047" name="skeleton"
+ total="2"
+ passed="0"
+ failed="2"
+ skipped="0">
+
+ <test name="TestError1"
+ type="test"
+ method="TestError1"
+ result="Fail"
+ time="0.00">
+ <failure exception-type="go.error">
+ <message><![CDATA[ main_test.go:10: something went wrong]]></message>
+ </failure>
+ </test>
+
+ <test name="TestError2"
+ type="test"
+ method="TestError2"
+ result="Fail"
+ time="0.00">
+ <failure exception-type="go.error">
+ <message><![CDATA[ main_test.go:14: something new went wrong]]></message>
+ </failure>
+ </test>
+
+ </class>
+
+</assembly>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-nofiles.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-nofiles.out.xml
new file mode 100644
index 0000000..1740a87
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-nofiles.out.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly name="controllers"
+ run-date="2015-06-05" run-time="18:34:41"
+ configFile="none"
+ time="0.024"
+ total="4"
+ passed="4"
+ failed="0"
+ skipped="0"
+ environment="n/a"
+ test-framework="golang">
+
+ <class time="0.024" name="controllers"
+ total="4"
+ passed="4"
+ failed="0"
+ skipped="0">
+
+ <test name="TestApp_AssetPath"
+ type="test"
+ method="TestApp_AssetPath"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ <test name="TestTrimTransferCeil"
+ type="test"
+ method="TestTrimTransferCeil"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ <test name="TestStatusDescription"
+ type="test"
+ method="TestStatusDescription"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ <test name="TestCode"
+ type="test"
+ method="TestCode"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ </class>
+
+</assembly>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-num.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-num.out.xml
new file mode 100644
index 0000000..d971bcb
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-num.out.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly name="qbox.us/largefile"
+ run-date="2015-06-05" run-time="18:34:41"
+ configFile="none"
+ time="0.012"
+ total="1"
+ passed="1"
+ failed="0"
+ skipped="0"
+ environment="n/a"
+ test-framework="golang">
+
+ <class time="0.012" name="qbox.us/largefile"
+ total="1"
+ passed="1"
+ failed="0"
+ skipped="0">
+
+ <test name="TestBasic-8"
+ type="test"
+ method="TestBasic-8"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ </class>
+
+</assembly>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-panic.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-panic.out.xml
new file mode 100644
index 0000000..949aa22
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-panic.out.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly name="go2xunit/demo"
+ run-date="2015-06-05" run-time="18:34:41"
+ configFile="none"
+ time="0.020"
+ total="1"
+ passed="0"
+ failed="1"
+ skipped="0"
+ environment="n/a"
+ test-framework="golang">
+
+ <class time="0.020" name="go2xunit/demo"
+ total="1"
+ passed="0"
+ failed="1"
+ skipped="0">
+
+ <test name="TestPanic"
+ type="test"
+ method="TestPanic"
+ result="Fail"
+ time="N/A">
+ <failure exception-type="go.error">
+ <message><![CDATA[fatal error: all goroutines are asleep - deadlock!
+...]]></message>
+ </failure>
+ </test>
+
+ </class>
+
+</assembly>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-pass.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-pass.out.xml
new file mode 100644
index 0000000..b0e94e6
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-pass.out.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly name="go2xunit/demo"
+ run-date="2015-06-05" run-time="18:34:41"
+ configFile="none"
+ time="0.006"
+ total="3"
+ passed="3"
+ failed="0"
+ skipped="0"
+ environment="n/a"
+ test-framework="golang">
+
+ <class time="0.006" name="go2xunit/demo"
+ total="3"
+ passed="3"
+ failed="0"
+ skipped="0">
+
+ <test name="TestAdd"
+ type="test"
+ method="TestAdd"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ <test name="TestSub"
+ type="test"
+ method="TestSub"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ <test name="TestMul"
+ type="test"
+ method="TestMul"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ </class>
+
+</assembly>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-testify-suite.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-testify-suite.out.xml
new file mode 100644
index 0000000..9949e5a
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest-testify-suite.out.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly name="testify-suite"
+ run-date="2015-06-05" run-time="18:34:41"
+ configFile="none"
+ time="0.071"
+ total="3"
+ passed="3"
+ failed="0"
+ skipped="0"
+ environment="n/a"
+ test-framework="golang">
+
+ <class time="" name="TestSuite"
+ total="2"
+ passed="2"
+ failed="0"
+ skipped="0">
+
+ <test name="TestA"
+ type="test"
+ method="TestA"
+ result="Pass"
+ time="0.01">
+ </test>
+
+ <test name="TestB"
+ type="test"
+ method="TestB"
+ result="Pass"
+ time="0.02">
+ </test>
+
+ </class>
+
+ <class time="0.071" name="testify-suite"
+ total="1"
+ passed="1"
+ failed="0"
+ skipped="0">
+
+ <test name="TestC"
+ type="test"
+ method="TestC"
+ result="Pass"
+ time="0.04">
+ </test>
+
+ </class>
+
+</assembly>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest.out.xml
new file mode 100644
index 0000000..6fd64ea
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit.net/gotest.out.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly name="_/home/miki/Projects/goroot/src/anotherTest"
+ run-date="2015-06-05" run-time="18:34:41"
+ configFile="none"
+ time="0.004"
+ total="6"
+ passed="4"
+ failed="1"
+ skipped="1"
+ environment="n/a"
+ test-framework="golang">
+
+ <class time="0.004" name="_/home/miki/Projects/goroot/src/xunit"
+ total="5"
+ passed="3"
+ failed="1"
+ skipped="1">
+
+ <test name="TestAdd"
+ type="test"
+ method="TestAdd"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ <test name="TestSub"
+ type="test"
+ method="TestSub"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ <test name="TestSubFail"
+ type="test"
+ method="TestSubFail"
+ result="Fail"
+ time="0.00">
+ <failure exception-type="go.error">
+ <message><![CDATA[ xunit_test.go:22: 3-1 != 3
+ Some newline goes here]]></message>
+ </failure>
+ </test>
+
+ <test name="TestSubOK"
+ type="test"
+ method="TestSubOK"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ <test name="TestSubSkip"
+ type="test"
+ method="TestSubSkip"
+ result="Skip"
+ time="0.00">
+ </test>
+
+ </class>
+
+ <class time="0.000" name="_/home/miki/Projects/goroot/src/anotherTest"
+ total="1"
+ passed="1"
+ failed="0"
+ skipped="0">
+
+ <test name="TestAdd"
+ type="test"
+ method="TestAdd"
+ result="Pass"
+ time="0.00">
+ </test>
+
+ </class>
+
+</assembly>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gocheck-empty.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gocheck-empty.out.xml
new file mode 100644
index 0000000..6a398fd
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gocheck-empty.out.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <testsuite name="github.com/tischda/mmath" tests="0" errors="0" failures="0" skip="0">
+ </testsuite>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gocheck-fail.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gocheck-fail.out.xml
new file mode 100644
index 0000000..3570888
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gocheck-fail.out.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<testsuites>
+ <testsuite name="MySuite1" tests="1" errors="0" failures="0" skip="0">
+ <testcase classname="MySuite1" name="TestAdd" time="0.000">
+
+ </testcase>
+ </testsuite>
+ <testsuite name="MySuite" tests="3" errors="0" failures="1" skip="0">
+ <testcase classname="MySuite" name="TestDiv" time="">
+
+ <failure type="go.error" message="error">
+ <![CDATA[mmath_test.go:38:
+ c.Assert(z, Equals, float64(x)/float64(y))
+... obtained int = 0
+... expected float64 = 0.6666666666666666
+]]>
+ </failure> </testcase>
+ <testcase classname="MySuite" name="TestMul" time="0.000">
+
+ </testcase>
+ <testcase classname="MySuite" name="TestSub" time="0.000">
+
+ </testcase>
+ </testsuite>
+</testsuites>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gocheck-nofiles.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gocheck-nofiles.out.xml
new file mode 100644
index 0000000..3763d8b
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gocheck-nofiles.out.xml
@@ -0,0 +1 @@
+error: no tests found
\ No newline at end of file
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gocheck-panic.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gocheck-panic.out.xml
new file mode 100644
index 0000000..df4fd26
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gocheck-panic.out.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <testsuite name="MySuite" tests="5" errors="0" failures="2" skip="1">
+ <testcase classname="MySuite" name="TestAdd" time="0.001">
+
+ </testcase>
+ <testcase classname="MySuite" name="TestDiv" time="">
+
+ <failure type="go.error" message="error">
+ <![CDATA[mmath_test.go:45:
+ c.Assert(z, Equals, float64(x)/float64(y))
+... obtained int = 0
+... expected float64 = 0.6666666666666666
+]]>
+ </failure> </testcase>
+ <testcase classname="MySuite" name="TestMul" time="">
+ <skipped/>
+ </testcase>
+ <testcase classname="MySuite" name="TestPanic" time="">
+
+ <failure type="go.error" message="error">
+ <![CDATA[... Panic: (PC=0x42546C)
+
+c:/go/src/runtime/asm_amd64.s:401
+ in call16
+c:/go/src/runtime/panic.go:387
+ in gopanic
+c:/go/src/log/log.go:307
+ in Panic
+mmath.go:22
+ in Panic
+mmath_test.go:18
+ in MySuite.TestPanic
+c:/go/src/runtime/asm_amd64.s:401
+ in call16
+c:/go/src/reflect/value.go:419
+ in Value.call
+c:/go/src/reflect/value.go:296
+ in Value.Call
+c:/go/src/runtime/asm_amd64.s:2232
+ in goexit]]>
+ </failure> </testcase>
+ <testcase classname="MySuite" name="TestSub" time="0.000">
+
+ </testcase>
+ </testsuite>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gocheck-pass.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gocheck-pass.out.xml
new file mode 100644
index 0000000..d9ac257
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gocheck-pass.out.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <testsuite name="MySuite" tests="3" errors="0" failures="0" skip="0">
+ <testcase classname="MySuite" name="TestAdd" time="0.000">
+
+ </testcase>
+ <testcase classname="MySuite" name="TestMul" time="0.000">
+
+ </testcase>
+ <testcase classname="MySuite" name="TestSub" time="0.000">
+
+ </testcase>
+ </testsuite>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gocheck-setup-miss.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gocheck-setup-miss.out.xml
new file mode 100644
index 0000000..b4e1f52
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gocheck-setup-miss.out.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <testsuite name="FoobarSuite" tests="3" errors="0" failures="1" skip="2">
+ <testcase classname="FoobarSuite" name="SetUpSuite" time="">
+
+ <failure type="go.error" message="error">
+ <![CDATA[foobar_test.go:19:
+ c.Assert(err, gc.IsNil)
+... value *os.PathError = &os.PathError{Op:"stat", Path:"testdata/regexes.yaml", Err:0x2} ("stat testdata/regexes.yaml: no such file or directory")
+]]>
+ </failure> </testcase>
+ <testcase classname="FoobarSuite" name="TestFrob" time="">
+ <skipped/>
+ </testcase>
+ <testcase classname="FoobarSuite" name="TestThing" time="">
+ <skipped/>
+ </testcase>
+ </testsuite>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-0.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-0.out.xml
new file mode 100644
index 0000000..b761761
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-0.out.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <testsuite name="package" tests="2" errors="0" failures="0" skip="0">
+ <testcase classname="package" name="ExampleA" time="4.0003">
+
+ </testcase>
+ <testcase classname="package" name="ExampleOp" time="0">
+
+ </testcase>
+ </testsuite>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-1.5.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-1.5.out.xml
new file mode 100644
index 0000000..d7ef9f3
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-1.5.out.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <testsuite name="_/home/miki/Projects/go/src/bitbucket.org/tebeka/go2xunit/demo" tests="4" errors="0" failures="1" skip="0">
+ <testcase classname="_/home/miki/Projects/go/src/bitbucket.org/tebeka/go2xunit/demo" name="TestAdd" time="0.00">
+
+ </testcase>
+ <testcase classname="_/home/miki/Projects/go/src/bitbucket.org/tebeka/go2xunit/demo" name="TestSub" time="0.00">
+
+ </testcase>
+ <testcase classname="_/home/miki/Projects/go/src/bitbucket.org/tebeka/go2xunit/demo" name="TestMul" time="0.00">
+
+ </testcase>
+ <testcase classname="_/home/miki/Projects/go/src/bitbucket.org/tebeka/go2xunit/demo" name="TestDiv" time="0.00">
+
+ <failure type="go.error" message="error">
+ <![CDATA[ mmath_test.go:35: 2/3 != 0.666667]]>
+ </failure> </testcase>
+ </testsuite>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-datarace.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-datarace.out.xml
new file mode 100644
index 0000000..72e1852
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-datarace.out.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <testsuite name="go2xunit/demo" tests="1" errors="0" failures="0" skip="0">
+ <testcase classname="go2xunit/demo" name="TestDataRace" time="0.00">
+
+ </testcase>
+ </testsuite>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-empty.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-empty.out.xml
new file mode 100644
index 0000000..3af4721
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-empty.out.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <testsuite name="go2xunit/demo" tests="0" errors="0" failures="0" skip="0">
+ </testsuite>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-fail.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-fail.out.xml
new file mode 100644
index 0000000..20d54b8
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-fail.out.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <testsuite name="_/home/miki/Projects/goroot/src/xunit" tests="4" errors="0" failures="1" skip="0">
+ <testcase classname="_/home/miki/Projects/goroot/src/xunit" name="TestAdd" time="0.00">
+
+ </testcase>
+ <testcase classname="_/home/miki/Projects/goroot/src/xunit" name="TestSub" time="0.00">
+
+ </testcase>
+ <testcase classname="_/home/miki/Projects/goroot/src/xunit" name="TestSubFail" time="0.00">
+
+ <failure type="go.error" message="error">
+ <![CDATA[ xunit_test.go:22: 3-1 != 3
+ Some newline goes here]]>
+ </failure> </testcase>
+ <testcase classname="_/home/miki/Projects/goroot/src/xunit" name="TestSubOK" time="0.00">
+
+ </testcase>
+ </testsuite>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-log.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-log.out.xml
new file mode 100644
index 0000000..7c7f339
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-log.out.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <testsuite name="go2xunit/demo" tests="1" errors="0" failures="0" skip="0">
+ <testcase classname="go2xunit/demo" name="TestLogOutput" time="0.00">
+
+ </testcase>
+ </testsuite>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-multi.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-multi.out.xml
new file mode 100644
index 0000000..8fc6bd7
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-multi.out.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <testsuite name="controllers" tests="4" errors="0" failures="0" skip="0">
+ <testcase classname="controllers" name="TestApp_AssetPath" time="0.00">
+
+ </testcase>
+ <testcase classname="controllers" name="TestTrimTransferCeil" time="0.00">
+
+ </testcase>
+ <testcase classname="controllers" name="TestStatusDescription" time="0.00">
+
+ </testcase>
+ <testcase classname="controllers" name="TestCode" time="0.00">
+
+ </testcase>
+ </testsuite>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-multierror.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-multierror.out.xml
new file mode 100644
index 0000000..76c8ef8
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-multierror.out.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <testsuite name="skeleton" tests="2" errors="0" failures="2" skip="0">
+ <testcase classname="skeleton" name="TestError1" time="0.00">
+
+ <failure type="go.error" message="error">
+ <![CDATA[ main_test.go:10: something went wrong]]>
+ </failure> </testcase>
+ <testcase classname="skeleton" name="TestError2" time="0.00">
+
+ <failure type="go.error" message="error">
+ <![CDATA[ main_test.go:14: something new went wrong]]>
+ </failure> </testcase>
+ </testsuite>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-nofiles.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-nofiles.out.xml
new file mode 100644
index 0000000..8fc6bd7
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-nofiles.out.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <testsuite name="controllers" tests="4" errors="0" failures="0" skip="0">
+ <testcase classname="controllers" name="TestApp_AssetPath" time="0.00">
+
+ </testcase>
+ <testcase classname="controllers" name="TestTrimTransferCeil" time="0.00">
+
+ </testcase>
+ <testcase classname="controllers" name="TestStatusDescription" time="0.00">
+
+ </testcase>
+ <testcase classname="controllers" name="TestCode" time="0.00">
+
+ </testcase>
+ </testsuite>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-num.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-num.out.xml
new file mode 100644
index 0000000..643bc3f
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-num.out.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <testsuite name="qbox.us/largefile" tests="1" errors="0" failures="0" skip="0">
+ <testcase classname="qbox.us/largefile" name="TestBasic-8" time="0.00">
+
+ </testcase>
+ </testsuite>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-panic.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-panic.out.xml
new file mode 100644
index 0000000..f2bed44
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-panic.out.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <testsuite name="go2xunit/demo" tests="1" errors="0" failures="1" skip="0">
+ <testcase classname="go2xunit/demo" name="TestPanic" time="N/A">
+
+ <failure type="go.error" message="error">
+ <![CDATA[fatal error: all goroutines are asleep - deadlock!
+...]]>
+ </failure> </testcase>
+ </testsuite>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-pass.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-pass.out.xml
new file mode 100644
index 0000000..67898e7
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-pass.out.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <testsuite name="go2xunit/demo" tests="3" errors="0" failures="0" skip="0">
+ <testcase classname="go2xunit/demo" name="TestAdd" time="0.00">
+
+ </testcase>
+ <testcase classname="go2xunit/demo" name="TestSub" time="0.00">
+
+ </testcase>
+ <testcase classname="go2xunit/demo" name="TestMul" time="0.00">
+
+ </testcase>
+ </testsuite>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-testify-suite.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-testify-suite.out.xml
new file mode 100644
index 0000000..ee6a8fa
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest-testify-suite.out.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<testsuites>
+ <testsuite name="TestSuite" tests="2" errors="0" failures="0" skip="0">
+ <testcase classname="TestSuite" name="TestA" time="0.01">
+
+ </testcase>
+ <testcase classname="TestSuite" name="TestB" time="0.02">
+
+ </testcase>
+ </testsuite>
+ <testsuite name="testify-suite" tests="1" errors="0" failures="0" skip="0">
+ <testcase classname="testify-suite" name="TestC" time="0.04">
+
+ </testcase>
+ </testsuite>
+</testsuites>
diff --git a/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest.out.xml b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest.out.xml
new file mode 100644
index 0000000..ef928ed
--- /dev/null
+++ b/go/src/bitbucket.org/tebeka/go2xunit/xml/xunit/gotest.out.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<testsuites>
+ <testsuite name="_/home/miki/Projects/goroot/src/xunit" tests="5" errors="0" failures="1" skip="1">
+ <testcase classname="_/home/miki/Projects/goroot/src/xunit" name="TestAdd" time="0.00">
+
+ </testcase>
+ <testcase classname="_/home/miki/Projects/goroot/src/xunit" name="TestSub" time="0.00">
+
+ </testcase>
+ <testcase classname="_/home/miki/Projects/goroot/src/xunit" name="TestSubFail" time="0.00">
+
+ <failure type="go.error" message="error">
+ <![CDATA[ xunit_test.go:22: 3-1 != 3
+ Some newline goes here]]>
+ </failure> </testcase>
+ <testcase classname="_/home/miki/Projects/goroot/src/xunit" name="TestSubOK" time="0.00">
+
+ </testcase>
+ <testcase classname="_/home/miki/Projects/goroot/src/xunit" name="TestSubSkip" time="0.00">
+ <skipped/>
+ </testcase>
+ </testsuite>
+ <testsuite name="_/home/miki/Projects/goroot/src/anotherTest" tests="1" errors="0" failures="0" skip="0">
+ <testcase classname="_/home/miki/Projects/goroot/src/anotherTest" name="TestAdd" time="0.00">
+
+ </testcase>
+ </testsuite>
+</testsuites>