github.com/billybanfield/evergreen@v0.0.0-20170525200750-eeee692790f7/plugin/builtin/attach/xunit/parser_test.go (about) 1 package xunit 2 3 import ( 4 "os" 5 "path/filepath" 6 "testing" 7 8 "github.com/evergreen-ci/evergreen" 9 "github.com/evergreen-ci/evergreen/model" 10 "github.com/evergreen-ci/evergreen/model/task" 11 "github.com/evergreen-ci/evergreen/testutil" 12 . "github.com/smartystreets/goconvey/convey" 13 ) 14 15 func TestXMLParsing(t *testing.T) { 16 cwd := testutil.GetDirectoryOfFile() 17 18 Convey("With some test xml files", t, func() { 19 Convey("with a basic test junit file", func() { 20 file, err := os.Open(filepath.Join(cwd, "testdata", "junit_1.xml")) 21 testutil.HandleTestingErr(err, t, "Error reading file") 22 defer file.Close() 23 24 Convey("the file should parse without error", func() { 25 res, err := ParseXMLResults(file) 26 So(err, ShouldBeNil) 27 So(len(res), ShouldBeGreaterThan, 0) 28 29 Convey("and have proper values decoded", func() { 30 So(res[0].Errors, ShouldEqual, 1) 31 So(res[0].Failures, ShouldEqual, 5) 32 So(res[0].Name, ShouldEqual, "nose2-junit") 33 So(res[0].TestCases[11].Name, ShouldEqual, "test_params_func:2") 34 So(res[0].TestCases[11].Time, ShouldEqual, 0.000098) 35 So(res[0].TestCases[11].Failure, ShouldNotBeNil) 36 So(res[0].TestCases[11].Failure.Message, ShouldEqual, "test failure") 37 }) 38 }) 39 }) 40 41 Convey("with a more complex test junit file", func() { 42 file, err := os.Open(filepath.Join(cwd, "testdata", "junit_2.xml")) 43 testutil.HandleTestingErr(err, t, "Error reading file") 44 defer file.Close() 45 46 Convey("the file should parse without error", func() { 47 res, err := ParseXMLResults(file) 48 So(err, ShouldBeNil) 49 So(len(res), ShouldBeGreaterThan, 0) 50 51 Convey("and have proper values decoded", func() { 52 So(res[0].Errors, ShouldEqual, 1) 53 So(res[0].Failures, ShouldEqual, 1) 54 So(res[0].Name, ShouldEqual, "tests.ATest") 55 So(res[0].SysOut, ShouldContainSubstring, "here") 56 So(res[0].TestCases[0].Name, ShouldEqual, "error") 57 So(res[0].TestCases[0].ClassName, ShouldEqual, "tests.ATest") 58 So(res[0].TestCases[0].Time, ShouldEqual, 0.0060) 59 So(res[0].TestCases[0].Failure, ShouldBeNil) 60 So(res[0].TestCases[0].Error, ShouldNotBeNil) 61 So(res[0].TestCases[0].Error.Type, ShouldEqual, "java.lang.RuntimeException") 62 63 }) 64 }) 65 }) 66 67 Convey(`with a "real" pymongo xunit file`, func() { 68 file, err := os.Open(filepath.Join(cwd, "testdata", "junit_3.xml")) 69 testutil.HandleTestingErr(err, t, "Error reading file") 70 defer file.Close() 71 72 Convey("the file should parse without error", func() { 73 res, err := ParseXMLResults(file) 74 So(err, ShouldBeNil) 75 So(len(res), ShouldBeGreaterThan, 0) 76 77 Convey("and have proper values decoded", func() { 78 So(res[0].Errors, ShouldEqual, 0) 79 So(res[0].Failures, ShouldEqual, 1) 80 So(res[0].Skip, ShouldEqual, 188) 81 So(res[0].Name, ShouldEqual, "nosetests") 82 So(res[0].TestCases[0].Name, ShouldEqual, "test_uri_options") 83 So(res[0].TestCases[0].ClassName, ShouldEqual, "test.test_auth.TestAuthURIOptions") 84 So(res[0].TestCases[0].Time, ShouldEqual, 0.002) 85 So(res[0].TestCases[0].Failure, ShouldBeNil) 86 So(res[0].TestCases[0].Error, ShouldBeNil) 87 So(res[0].TestCases[0].Skipped, ShouldNotBeNil) 88 So(res[0].TestCases[0].Skipped.Type, ShouldEqual, "unittest.case.SkipTest") 89 So(res[0].TestCases[0].Skipped.Content, ShouldContainSubstring, 90 "SkipTest: Authentication is not enabled on server") 91 }) 92 }) 93 }) 94 Convey(`with a "real" java driver xunit file`, func() { 95 file, err := os.Open(filepath.Join(cwd, "testdata", "junit_4.xml")) 96 testutil.HandleTestingErr(err, t, "Error reading file") 97 defer file.Close() 98 99 Convey("the file should parse without error", func() { 100 res, err := ParseXMLResults(file) 101 So(err, ShouldBeNil) 102 So(len(res), ShouldBeGreaterThan, 0) 103 104 Convey("and have proper values decoded", func() { 105 So(res[0].Errors, ShouldEqual, 0) 106 So(res[0].Failures, ShouldEqual, 0) 107 So(res[0].Name, ShouldEqual, "com.mongodb.operation.InsertOperationSpecification") 108 So(res[0].TestCases[0].Name, ShouldEqual, "should return correct result") 109 So(res[0].SysOut, ShouldEqual, "out message") 110 So(res[0].SysErr, ShouldEqual, "error message") 111 }) 112 }) 113 }) 114 }) 115 } 116 117 func TestXMLToModelConversion(t *testing.T) { 118 Convey("With a parsed XML file and a task", t, func() { 119 file, err := os.Open(filepath.Join(testutil.GetDirectoryOfFile(), "testdata", "junit_3.xml")) 120 testutil.HandleTestingErr(err, t, "Error reading file") 121 defer file.Close() 122 res, err := ParseXMLResults(file) 123 So(err, ShouldBeNil) 124 So(len(res), ShouldBeGreaterThan, 0) 125 testTask := &task.Task{Id: "TEST", Execution: 5} 126 127 Convey("when converting the results to model struct", func() { 128 tests := []task.TestResult{} 129 logs := []*model.TestLog{} 130 for _, testCase := range res[0].TestCases { 131 test, log := testCase.ToModelTestResultAndLog(testTask) 132 if log != nil { 133 logs = append(logs, log) 134 } 135 tests = append(tests, test) 136 } 137 138 Convey("the proper amount of each failure should be correct", func() { 139 skipCount := 0 140 failCount := 0 141 passCount := 0 142 for _, t := range tests { 143 switch t.Status { 144 case evergreen.TestFailedStatus: 145 failCount++ 146 case evergreen.TestSkippedStatus: 147 skipCount++ 148 case evergreen.TestSucceededStatus: 149 passCount++ 150 } 151 } 152 153 So(failCount, ShouldEqual, res[0].Failures+res[0].Errors) 154 So(skipCount, ShouldEqual, res[0].Skip) 155 //make sure we didn't miss anything 156 So(passCount+skipCount+failCount, ShouldEqual, len(tests)) 157 158 Convey("and logs should be of the proper form", func() { 159 So(logs[0].Name, ShouldNotEqual, "") 160 So(len(logs[0].Lines), ShouldNotEqual, 0) 161 So(logs[0].URL(), ShouldContainSubstring, 162 "TEST/5/test.test_auth.TestAuthURIOptions.test_uri_options") 163 }) 164 }) 165 }) 166 }) 167 }