|  | package test2json | 
|  |  | 
|  | import ( | 
|  | "bufio" | 
|  | "bytes" | 
|  | "encoding/json" | 
|  | "io" | 
|  | "time" | 
|  |  | 
|  | "go.skia.org/infra/go/skerr" | 
|  | "go.skia.org/infra/go/sklog" | 
|  | ) | 
|  |  | 
|  | /* | 
|  | Package test2json provides utilities for parsing Golang test output in | 
|  | JSON format. It mimics https://golang.org/src/cmd/internal/test2json | 
|  | which we are unable to use because it is internal. | 
|  | */ | 
|  |  | 
|  | const ( | 
|  | // Possible values for Event.Action. | 
|  | ActionBench  = "bench" | 
|  | ActionCont   = "cont" | 
|  | ActionFail   = "fail" | 
|  | ActionOutput = "output" | 
|  | ActionPass   = "pass" | 
|  | ActionPause  = "pause" | 
|  | ActionRun    = "run" | 
|  | ActionSkip   = "skip" | 
|  | ) | 
|  |  | 
|  | // Event represents a test event. | 
|  | type Event struct { | 
|  | Time    time.Time `json:",omitempty"` | 
|  | Action  string | 
|  | Package string  `json:",omitempty"` | 
|  | Test    string  `json:",omitempty"` | 
|  | Elapsed float64 `json:",omitempty"` | 
|  | Output  string  `json:",omitempty"` | 
|  | } | 
|  |  | 
|  | func ParseEvent(s string) (*Event, error) { | 
|  | var event Event | 
|  | if err := json.NewDecoder(bytes.NewReader([]byte(s))).Decode(&event); err != nil { | 
|  | return nil, skerr.Wrapf(err, "Failed to decode Event") | 
|  | } | 
|  | return &event, nil | 
|  | } | 
|  |  | 
|  | // EventStream returns a channel which emits Events as they appear on the given | 
|  | // io.Reader. | 
|  | func EventStream(r io.Reader) <-chan *Event { | 
|  | rv := make(chan *Event) | 
|  | go func() { | 
|  | defer func() { | 
|  | close(rv) | 
|  | }() | 
|  | scanner := bufio.NewScanner(r) | 
|  | for scanner.Scan() { | 
|  | line := scanner.Text() | 
|  | event, err := ParseEvent(line) | 
|  | if err != nil { | 
|  | sklog.Errorf("Failed to decode JSON from stream: %s", err) | 
|  | continue | 
|  | } | 
|  | rv <- event | 
|  | } | 
|  | }() | 
|  | return rv | 
|  | } |