89 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
package check
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"io"
 | 
						|
	"sync"
 | 
						|
)
 | 
						|
 | 
						|
// -----------------------------------------------------------------------
 | 
						|
// Output writer manages atomic output writing according to settings.
 | 
						|
 | 
						|
type outputWriter struct {
 | 
						|
	m                    sync.Mutex
 | 
						|
	writer               io.Writer
 | 
						|
	wroteCallProblemLast bool
 | 
						|
	Stream               bool
 | 
						|
	Verbose              bool
 | 
						|
}
 | 
						|
 | 
						|
func newOutputWriter(writer io.Writer, stream, verbose bool) *outputWriter {
 | 
						|
	return &outputWriter{writer: writer, Stream: stream, Verbose: verbose}
 | 
						|
}
 | 
						|
 | 
						|
func (ow *outputWriter) Write(content []byte) (n int, err error) {
 | 
						|
	ow.m.Lock()
 | 
						|
	n, err = ow.writer.Write(content)
 | 
						|
	ow.m.Unlock()
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
func (ow *outputWriter) WriteCallStarted(label string, c *C) {
 | 
						|
	if ow.Stream {
 | 
						|
		header := renderCallHeader(label, c, "", "\n")
 | 
						|
		ow.m.Lock()
 | 
						|
		ow.writer.Write([]byte(header))
 | 
						|
		ow.m.Unlock()
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (ow *outputWriter) WriteCallProblem(label string, c *C) {
 | 
						|
	var prefix string
 | 
						|
	if !ow.Stream {
 | 
						|
		prefix = "\n-----------------------------------" +
 | 
						|
			"-----------------------------------\n"
 | 
						|
	}
 | 
						|
	header := renderCallHeader(label, c, prefix, "\n\n")
 | 
						|
	ow.m.Lock()
 | 
						|
	ow.wroteCallProblemLast = true
 | 
						|
	ow.writer.Write([]byte(header))
 | 
						|
	if !ow.Stream {
 | 
						|
		c.logb.WriteTo(ow.writer)
 | 
						|
	}
 | 
						|
	ow.m.Unlock()
 | 
						|
}
 | 
						|
 | 
						|
func (ow *outputWriter) WriteCallSuccess(label string, c *C) {
 | 
						|
	if ow.Stream || (ow.Verbose && c.kind == testKd) {
 | 
						|
		// TODO Use a buffer here.
 | 
						|
		var suffix string
 | 
						|
		if c.reason != "" {
 | 
						|
			suffix = " (" + c.reason + ")"
 | 
						|
		}
 | 
						|
		if c.status() == succeededSt {
 | 
						|
			suffix += "\t" + c.timerString()
 | 
						|
		}
 | 
						|
		suffix += "\n"
 | 
						|
		if ow.Stream {
 | 
						|
			suffix += "\n"
 | 
						|
		}
 | 
						|
		header := renderCallHeader(label, c, "", suffix)
 | 
						|
		ow.m.Lock()
 | 
						|
		// Resist temptation of using line as prefix above due to race.
 | 
						|
		if !ow.Stream && ow.wroteCallProblemLast {
 | 
						|
			header = "\n-----------------------------------" +
 | 
						|
				"-----------------------------------\n" +
 | 
						|
				header
 | 
						|
		}
 | 
						|
		ow.wroteCallProblemLast = false
 | 
						|
		ow.writer.Write([]byte(header))
 | 
						|
		ow.m.Unlock()
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func renderCallHeader(label string, c *C, prefix, suffix string) string {
 | 
						|
	pc := c.method.PC()
 | 
						|
	return fmt.Sprintf("%s%s: %s: %s%s", prefix, label, niceFuncPath(pc),
 | 
						|
		niceFuncName(pc), suffix)
 | 
						|
}
 |