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 }