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  }