type Mode … const Timestamp … type event … type textBytes … func (b textBytes) MarshalText() ([]byte, error) { … } type Converter … var inBuffer … var outBuffer … // NewConverter returns a "test to json" converter. // Writes on the returned writer are written as JSON to w, // with minimal delay. // // The writes to w are whole JSON events ending in \n, // so that it is safe to run multiple tests writing to multiple converters // writing to a single underlying output stream w. // As long as the underlying output w can handle concurrent writes // from multiple goroutines, the result will be a JSON stream // describing the relative ordering of execution in all the concurrent tests. // // The mode flag adjusts the behavior of the converter. // Passing ModeTime includes event timestamps and elapsed times. // // The pkg string, if present, specifies the import path to // report in the JSON stream. func NewConverter(w io.Writer, pkg string, mode Mode) *Converter { … } // Write writes the test input to the converter. func (c *Converter) Write(b []byte) (int, error) { … } // Exited marks the test process as having exited with the given error. func (c *Converter) Exited(err error) { … } const marker … var bigPass … var bigFail … var bigFailErrorPrefix … var emptyName … var emptyNameLine … var updates … var reports … var fourSpace … var skipLinePrefix … var skipLineSuffix … // handleInputLine handles a single whole test output line. // It must write the line to c.output but may choose to do so // before or after emitting other events. func (c *Converter) handleInputLine(line []byte) { … } // flushReport flushes all pending PASS/FAIL reports at levels >= depth. func (c *Converter) flushReport(depth int) { … } // Close marks the end of the go test output. // It flushes any pending input and then output (only partial lines at this point) // and then emits the final overall package-level pass/fail event. func (c *Converter) Close() error { … } // writeOutputEvent writes a single output event with the given bytes. func (c *Converter) writeOutputEvent(out []byte) { … } // writeEvent writes a single event. // It adds the package, time (if requested), and test name (if needed). func (c *Converter) writeEvent(e *event) { … } type lineBuffer … // write writes b to the buffer. func (l *lineBuffer) write(b []byte) { … } // indexEOL finds the index of a line ending, // returning its position and output width. // A line ending is either a \n or the empty string just before a ^V not beginning a line. // The output width for \n is 1 (meaning it should be printed) // but the output width for ^V is 0 (meaning it should be left to begin the next line). func indexEOL(b []byte) (pos, wid int) { … } // flush flushes the line buffer. func (l *lineBuffer) flush() { … } var benchmark … // isBenchmarkName reports whether b is a valid benchmark name // that might appear as the first field in a benchmark result line. func isBenchmarkName(b []byte) bool { … } // trimUTF8 returns a length t as close to len(b) as possible such that b[:t] // does not end in the middle of a possibly-valid UTF-8 sequence. // // If a large text buffer must be split before position i at the latest, // splitting at position trimUTF(b[:i]) avoids splitting a UTF-8 sequence. func trimUTF8(b []byte) int { … }