oss.indeed.com/go/go-opine@v1.3.0/internal/gotest/event_test.go (about)

     1  package gotest
     2  
     3  import (
     4  	"errors"
     5  	"strings"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  type eventAccepterFunc func(e event) error
    13  
    14  func (f eventAccepterFunc) Accept(e event) error {
    15  	return f(e)
    16  }
    17  
    18  func Test_eventStreamParser_Parse(t *testing.T) {
    19  	// Taken from "go test -v -json" output.
    20  	const event1JSON = `{"Time":"2019-09-26T13:27:17.563229183Z","Action":"output","Package":"oss.indeed.com/go/go-opine/internal/cmd","Test":"Test_testCmd_impl","Output":"--- PASS: Test_testCmd_impl (1.93s)\n"}`
    21  	const event2JSON = `{"Time":"2019-09-26T13:27:17.56324465Z","Action":"pass","Package":"oss.indeed.com/go/go-opine/internal/cmd","Test":"Test_testCmd_impl","Elapsed":1.93}`
    22  
    23  	var events []event
    24  	tested := newEventStreamParser(eventAccepterFunc(func(e event) error { events = append(events, e); return nil }))
    25  	err := tested.Parse(strings.NewReader(event1JSON + "\n" + event2JSON + "\n"))
    26  	require.NoError(t, err)
    27  	require.Equal(
    28  		t,
    29  		[]event{
    30  			{
    31  				Time:    time.Date(2019, 9, 26, 13, 27, 17, 563229183, time.UTC),
    32  				Action:  "output",
    33  				Package: "oss.indeed.com/go/go-opine/internal/cmd",
    34  				Test:    "Test_testCmd_impl",
    35  				Output:  "--- PASS: Test_testCmd_impl (1.93s)\n",
    36  			},
    37  			{
    38  				Time:    time.Date(2019, 9, 26, 13, 27, 17, 563244650, time.UTC),
    39  				Action:  "pass",
    40  				Package: "oss.indeed.com/go/go-opine/internal/cmd",
    41  				Test:    "Test_testCmd_impl",
    42  				Elapsed: 1.93,
    43  			},
    44  		},
    45  		events,
    46  	)
    47  }
    48  
    49  func Test_eventStreamParser_Parse_noTrailingNewline(t *testing.T) {
    50  	// Taken from "go test -v -json" output.
    51  	const eventJSON = `{"Time":"2019-09-26T13:27:17.563229183Z","Action":"output","Package":"oss.indeed.com/go/go-opine/internal/cmd","Test":"Test_testCmd_impl","Output":"--- PASS: Test_testCmd_impl (1.93s)\n"}`
    52  
    53  	var events []event
    54  	tested := newEventStreamParser(eventAccepterFunc(func(e event) error { events = append(events, e); return nil }))
    55  	err := tested.Parse(strings.NewReader(eventJSON))
    56  	require.NoError(t, err)
    57  	require.Equal(
    58  		t,
    59  		[]event{
    60  			{
    61  				Time:    time.Date(2019, 9, 26, 13, 27, 17, 563229183, time.UTC),
    62  				Action:  "output",
    63  				Package: "oss.indeed.com/go/go-opine/internal/cmd",
    64  				Test:    "Test_testCmd_impl",
    65  				Output:  "--- PASS: Test_testCmd_impl (1.93s)\n",
    66  			},
    67  		},
    68  		events,
    69  	)
    70  }
    71  
    72  func Test_eventStreamParser_Parse_emptyEvent(t *testing.T) {
    73  	var events []event
    74  	tested := newEventStreamParser(eventAccepterFunc(func(e event) error { events = append(events, e); return nil }))
    75  	err := tested.Parse(strings.NewReader("{}\n"))
    76  	require.NoError(t, err)
    77  	require.Equal(t, []event{{}}, events)
    78  }
    79  
    80  func Test_eventStreamParser_Parse_unmarshalError(t *testing.T) {
    81  	const notJSON = "=== RUN   Test_eventStreamParser_Parse"
    82  	var events []event
    83  	tested := newEventStreamParser(eventAccepterFunc(func(e event) error { events = append(events, e); return nil }))
    84  	err := tested.Parse(strings.NewReader(notJSON + "\n"))
    85  	require.Error(t, err)
    86  	require.Empty(t, events)
    87  }
    88  
    89  func Test_eventStreamParser_Parse_acceptError(t *testing.T) {
    90  	expectedErr := errors.New("failed to parse")
    91  	tested := newEventStreamParser(eventAccepterFunc(func(e event) error { return expectedErr }))
    92  	err := tested.Parse(strings.NewReader("{}\n"))
    93  	require.Equal(t, expectedErr, err)
    94  }
    95  
    96  func Test_eventStreamParser_Parse_workaroundGoIssue35169(t *testing.T) {
    97  	// Taken from "go test -v -json" output.
    98  	const eventNotJSON = `FAIL	example.com [build failed]`
    99  
   100  	var events []event
   101  	tested := newEventStreamParser(
   102  		eventAccepterFunc(func(e event) error {
   103  			require.NotZero(t, e.Time)
   104  			e.Time = time.Time{}
   105  			events = append(events, e)
   106  			return nil
   107  		}),
   108  	)
   109  	err := tested.Parse(strings.NewReader(eventNotJSON))
   110  	require.NoError(t, err)
   111  	require.Len(t, events, 2)
   112  	require.Equal(
   113  		t,
   114  		[]event{
   115  			{
   116  				Action:  "output",
   117  				Package: "example.com",
   118  				Output:  eventNotJSON + "\n",
   119  			},
   120  			{
   121  				Action:  "fail",
   122  				Package: "example.com",
   123  			},
   124  		},
   125  		events,
   126  	)
   127  }