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  }