oss.indeed.com/go/go-opine@v1.3.0/internal/gotest/result_test.go (about) 1 package gotest 2 3 import ( 4 "errors" 5 "testing" 6 "time" 7 8 "github.com/stretchr/testify/require" 9 ) 10 11 func Test_resultAccepter_Accept(t *testing.T) { 12 var ( 13 firstCalled bool 14 secondCalled bool 15 ) 16 expectedResult := result{Outcome: "BLAH"} 17 tested := newMultiResultAccepter( 18 resultAccepterFunc(func(res result) error { require.Equal(t, expectedResult, res); firstCalled = true; return nil }), 19 resultAccepterFunc(func(res result) error { require.Equal(t, expectedResult, res); secondCalled = true; return nil }), 20 ) 21 require.NoError(t, tested.Accept(expectedResult)) 22 require.True(t, firstCalled) 23 require.True(t, secondCalled) 24 } 25 26 func Test_resultAccepter_Accept_error(t *testing.T) { 27 expectedErr := errors.New("fail boat") 28 tested := newMultiResultAccepter( 29 resultAccepterFunc(func(res result) error { return expectedErr }), 30 resultAccepterFunc(func(res result) error { require.Fail(t, "should not be called"); return nil }), 31 ) 32 require.Equal(t, expectedErr, tested.Accept(result{})) 33 } 34 35 func Test_resultAccepter_Accept_nil(t *testing.T) { 36 tested := newMultiResultAccepter() 37 require.NoError(t, tested.Accept(result{})) 38 } 39 40 func Test_resultAggregator_Accept(t *testing.T) { 41 var results []result 42 tested := newResultAggregator( 43 resultAccepterFunc(func(res result) error { results = append(results, res); return nil }), 44 ) 45 46 // First test starts running. 47 require.NoError( 48 t, 49 tested.Accept( 50 event{ 51 Action: "run", 52 Package: "indeed.com/some/pkg", 53 Test: "Test_Some", 54 Output: "=== RUN Test_Some\n", 55 }, 56 ), 57 ) 58 require.Empty(t, results) 59 60 // NOTE This test is running in parallel. The previous Test_Some is 61 // still running. 62 require.NoError( 63 t, 64 tested.Accept( 65 event{ 66 Action: "run", 67 Package: "indeed.com/some/other/pkg", 68 Test: "Test_Other", 69 Output: "=== RUN Test_Other\n", 70 }, 71 ), 72 ) 73 require.Empty(t, results) 74 75 // Some output from the first test. 76 require.NoError( 77 t, 78 tested.Accept( 79 event{ 80 Action: "output", 81 Package: "indeed.com/some/pkg", 82 Test: "Test_Some", 83 Output: "Some output\nMultiple lines\nNo trailing newline", 84 }, 85 ), 86 ) 87 require.Empty(t, results) 88 89 // More output from the first test. 90 require.NoError( 91 t, 92 tested.Accept( 93 event{ 94 Action: "run", 95 Package: "indeed.com/some/pkg", 96 Test: "Test_Some", 97 Output: "\nThe End\n", 98 }, 99 ), 100 ) 101 require.Empty(t, results) 102 103 // Second test completes. The result is passed on. 104 require.NoError( 105 t, 106 tested.Accept( 107 event{ 108 Action: "pass", 109 Package: "indeed.com/some/other/pkg", 110 Test: "Test_Other", 111 Output: "--- PASS: Test_Other (0.42s)\n", 112 Elapsed: 0.42, 113 }, 114 ), 115 ) 116 require.Equal( 117 t, 118 []result{ 119 { 120 Key: resultKey{ 121 Package: "indeed.com/some/other/pkg", 122 Test: "Test_Other", 123 }, 124 Outcome: "pass", 125 Output: "=== RUN Test_Other\n--- PASS: Test_Other (0.42s)\n", 126 Elapsed: 420 * time.Millisecond, 127 }, 128 }, 129 results, 130 ) 131 results = nil 132 133 // Second package completes. The result is passed on. 134 require.NoError( 135 t, 136 tested.Accept( 137 event{ 138 Action: "pass", 139 Package: "indeed.com/some/other/pkg", 140 Output: "ok indeed.com/some/other/pkg 0.091s\n", 141 Elapsed: 0.43, 142 }, 143 ), 144 ) 145 require.Equal( 146 t, 147 []result{ 148 { 149 Key: resultKey{ 150 Package: "indeed.com/some/other/pkg", 151 }, 152 Outcome: "pass", 153 Output: "ok indeed.com/some/other/pkg 0.091s\n", 154 Elapsed: 430 * time.Millisecond, 155 }, 156 }, 157 results, 158 ) 159 results = nil 160 161 // Some other package is skipped. The result is passed on. 162 require.NoError( 163 t, 164 tested.Accept( 165 event{ 166 Action: "skip", 167 Package: "indeed.com/some/skipped/pkg", 168 Output: "? oss.indeed.com/go/go-opine [no test files]\n", 169 Elapsed: 0, 170 }, 171 ), 172 ) 173 require.Equal( 174 t, 175 []result{ 176 { 177 Key: resultKey{ 178 Package: "indeed.com/some/skipped/pkg", 179 }, 180 Outcome: "skip", 181 Output: "? oss.indeed.com/go/go-opine [no test files]\n", 182 }, 183 }, 184 results, 185 ) 186 results = nil 187 188 // The first test fails. The result is passed on. 189 require.NoError( 190 t, 191 tested.Accept( 192 event{ 193 Action: "fail", 194 Package: "indeed.com/some/pkg", 195 Test: "Test_Some", 196 Output: "--- PASS: Test_Some (0.02s)\n", 197 Elapsed: 0.02, 198 }, 199 ), 200 ) 201 require.Equal( 202 t, 203 []result{ 204 { 205 Key: resultKey{ 206 Package: "indeed.com/some/pkg", 207 Test: "Test_Some", 208 }, 209 Outcome: "fail", 210 Output: "=== RUN Test_Some\nSome output\nMultiple lines\nNo trailing newline\nThe End\n--- PASS: Test_Some (0.02s)\n", 211 Elapsed: 20 * time.Millisecond, 212 }, 213 }, 214 results, 215 ) 216 results = nil 217 218 // The first package fails. The result is passed on. 219 require.NoError( 220 t, 221 tested.Accept( 222 event{ 223 Action: "fail", 224 Package: "indeed.com/some/pkg", 225 Output: "FAIL indeed.com/some/pkg 4.321s\n", 226 Elapsed: 4.321, 227 }, 228 ), 229 ) 230 require.Equal( 231 t, 232 []result{ 233 { 234 Key: resultKey{ 235 Package: "indeed.com/some/pkg", 236 }, 237 Outcome: "fail", 238 Output: "FAIL indeed.com/some/pkg 4.321s\n", 239 Elapsed: 4321 * time.Millisecond, 240 }, 241 }, 242 results, 243 ) 244 results = nil 245 246 require.NoError(t, tested.CheckAllEventsConsumed()) 247 } 248 249 func Test_resultAggregator_Accept_error(t *testing.T) { 250 expectedErr := errors.New("fail boat") 251 called := false 252 tested := newResultAggregator( 253 resultAccepterFunc(func(res result) error { require.False(t, called); called = true; return expectedErr }), 254 ) 255 require.Equal(t, expectedErr, tested.Accept(event{Action: "pass"})) 256 require.Equal(t, expectedErr, errors.Unwrap(tested.Accept(event{Action: "pass"}))) 257 require.Equal(t, expectedErr, tested.CheckAllEventsConsumed()) 258 } 259 260 func Test_resultAggregator_CheckAllEventsConsumed_unconsumedEvents(t *testing.T) { 261 tested := newResultAggregator(resultAccepterFunc(func(res result) error { return nil })) 262 require.NoError(t, tested.Accept(event{Package: "BLAH"})) 263 require.Error(t, tested.CheckAllEventsConsumed()) 264 } 265 266 func Test_resultPackageGrouper_Accept_onePackageNoTests(t *testing.T) { 267 var results []result 268 tested := newResultPackageGrouper( 269 resultAccepterFunc(func(res result) error { results = append(results, res); return nil }), 270 ) 271 272 packageRes := result{ 273 Key: resultKey{ 274 Package: "MyPackage", 275 }, 276 } 277 require.NoError(t, tested.Accept(packageRes)) 278 require.Equal(t, []result{packageRes}, results) 279 results = nil 280 281 require.NoError(t, tested.CheckAllResultsConsumed()) 282 } 283 284 func Test_resultPackageGrouper_Accept_OnePackageOneTest(t *testing.T) { 285 var results []result 286 tested := newResultPackageGrouper( 287 resultAccepterFunc(func(res result) error { results = append(results, res); return nil }), 288 ) 289 290 testRes := result{ 291 Key: resultKey{ 292 Package: "MyPackage", 293 Test: "MyTest", 294 }, 295 } 296 require.NoError(t, tested.Accept(testRes)) 297 require.Empty(t, results) 298 299 packageRes := result{ 300 Key: resultKey{ 301 Package: "MyPackage", 302 }, 303 } 304 require.NoError(t, tested.Accept(packageRes)) 305 require.Equal(t, []result{testRes, packageRes}, results) 306 results = nil 307 308 require.NoError(t, tested.CheckAllResultsConsumed()) 309 } 310 311 func Test_resultPackageGrouper_Accept_overlappingPackages(t *testing.T) { 312 var results []result 313 tested := newResultPackageGrouper( 314 resultAccepterFunc(func(res result) error { results = append(results, res); return nil }), 315 ) 316 317 pkg1Test1Res := result{ 318 Key: resultKey{ 319 Package: "Package1", 320 Test: "Test1", 321 }, 322 } 323 require.NoError(t, tested.Accept(pkg1Test1Res)) 324 require.Empty(t, results) 325 326 pkg2Test1Res := result{ 327 Key: resultKey{ 328 Package: "Package2", 329 Test: "Test1", 330 }, 331 } 332 require.NoError(t, tested.Accept(pkg2Test1Res)) 333 require.Empty(t, results) 334 335 pkg3Test1Res := result{ 336 Key: resultKey{ 337 Package: "Package3", 338 Test: "Test1", 339 }, 340 } 341 require.NoError(t, tested.Accept(pkg3Test1Res)) 342 require.Empty(t, results) 343 344 pkg1Res := result{ 345 Key: resultKey{ 346 Package: "Package1", 347 }, 348 } 349 require.NoError(t, tested.Accept(pkg1Res)) 350 require.Equal(t, []result{pkg1Test1Res, pkg1Res}, results) 351 results = nil 352 353 pkg2Res := result{ 354 Key: resultKey{ 355 Package: "Package2", 356 }, 357 } 358 require.NoError(t, tested.Accept(pkg2Res)) 359 require.Equal(t, []result{pkg2Test1Res, pkg2Res}, results) 360 results = nil 361 362 pkg3Res := result{ 363 Key: resultKey{ 364 Package: "Package3", 365 }, 366 } 367 require.NoError(t, tested.Accept(pkg3Res)) 368 require.Equal(t, []result{pkg3Test1Res, pkg3Res}, results) 369 results = nil 370 371 require.NoError(t, tested.CheckAllResultsConsumed()) 372 } 373 374 func Test_resultPackageGrouper_Accept_firstPackageCompletesLast(t *testing.T) { 375 var results []result 376 tested := newResultPackageGrouper( 377 resultAccepterFunc(func(res result) error { results = append(results, res); return nil }), 378 ) 379 380 pkg1Test1Res := result{ 381 Key: resultKey{ 382 Package: "Package1", 383 Test: "Test1", 384 }, 385 } 386 require.NoError(t, tested.Accept(pkg1Test1Res)) 387 require.Empty(t, results) 388 389 pkg2Test1Res := result{ 390 Key: resultKey{ 391 Package: "Package2", 392 Test: "Test1", 393 }, 394 } 395 require.NoError(t, tested.Accept(pkg2Test1Res)) 396 require.Empty(t, results) 397 398 pkg3Res := result{ 399 Key: resultKey{ 400 Package: "Package3", 401 }, 402 } 403 require.NoError(t, tested.Accept(pkg3Res)) 404 require.Equal(t, []result{pkg3Res}, results) 405 results = nil 406 407 pkg2Res := result{ 408 Key: resultKey{ 409 Package: "Package2", 410 }, 411 } 412 require.NoError(t, tested.Accept(pkg2Res)) 413 require.Equal(t, []result{pkg2Test1Res, pkg2Res}, results) 414 results = nil 415 416 pkg1Res := result{ 417 Key: resultKey{ 418 Package: "Package1", 419 }, 420 } 421 require.NoError(t, tested.Accept(pkg1Res)) 422 require.Equal(t, []result{pkg1Test1Res, pkg1Res}, results) 423 results = nil 424 425 require.NoError(t, tested.CheckAllResultsConsumed()) 426 } 427 428 func Test_resultPackageGrouper_Accept_error(t *testing.T) { 429 expectedErr := errors.New("fail boat") 430 called := false 431 tested := newResultPackageGrouper( 432 resultAccepterFunc(func(res result) error { require.False(t, called); called = true; return expectedErr }), 433 ) 434 require.Equal(t, expectedErr, tested.Accept(result{})) 435 require.Equal(t, expectedErr, errors.Unwrap(tested.Accept(result{}))) 436 require.Equal(t, expectedErr, tested.CheckAllResultsConsumed()) 437 } 438 439 func Test_resultPackageGrouper_CheckAllResultsConsumed_incompletePackages(t *testing.T) { 440 tested := newResultPackageGrouper(resultAccepterFunc(func(res result) error { return nil })) 441 require.NoError(t, tested.Accept(result{Key: resultKey{Package: "MyPackage", Test: "MyTest"}})) 442 require.Error(t, tested.CheckAllResultsConsumed()) 443 } 444 445 type resultAccepterFunc func(res result) error 446 447 func (f resultAccepterFunc) Accept(res result) error { 448 return f(res) 449 }