aboutsummaryrefslogtreecommitdiffstats
path: root/Godeps/_workspace/src/gopkg.in/check.v1/reporter.go
blob: fb04f76f64d800661f0fc5e302d1a6b602dc3b46 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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)
}