1
0
mirror of https://github.com/DNSCrypt/dnscrypt-proxy.git synced 2025-01-05 01:27:40 +01:00
dnscrypt-proxy/vendor/github.com/powerman/check/stats.go
William Elwood af0629856c Add unit tests for sources.go
Tests cover most of the cache and download related code paths and specify the expected result of various starting states and external failure modes.
Where the current code's behaviour doesn't match a test's expectations, the test is disabled and annotated with a TODO until it can be fixed.
Added dependency on `github.com/powerman/check` and ran `go mod vendor`.
2019-11-08 10:17:12 +01:00

104 lines
2.3 KiB
Go

package check
import (
"fmt"
"os"
"sort"
"strings"
"sync"
"testing"
)
type counter struct {
name string
value int
force bool
color string
size int
}
func (c counter) String() (s string) {
if c.value != 0 || c.force {
color := c.color
if c.value == 0 {
color = ansiReset
}
s = fmt.Sprintf("%s%*d %s%s", color, c.size, c.value, c.name, ansiReset)
} else {
s = strings.Repeat(" ", c.size+1+len(c.name))
}
return s
}
type testStat struct {
name string
passed counter
forged counter
failed counter
}
func newTestStat(desc string, force bool) *testStat {
return &testStat{
name: desc,
passed: counter{force: force, name: "passed", color: ansiGreen},
forged: counter{force: force, name: "todo", color: ansiYellow},
failed: counter{force: force, name: "failed", color: ansiRed},
}
}
func (c testStat) String() string {
return fmt.Sprintf("checks: %s %s %s\t%s", c.passed, c.forged, c.failed, c.name)
}
var statsMu sync.Mutex
var stats = map[*testing.T]*testStat{}
// Report output statistics about passed/failed checks.
// It should be called from TestMain after m.Run(), for ex.:
//
// func TestMain(m *testing.M) {
// code := m.Run()
// check.Report()
// os.Exit(code)
// }
//
// If this is all you need - just use TestMain instead.
func Report() {
statsMu.Lock()
defer statsMu.Unlock()
total := newTestStat("(total)", true)
ts := make([]*testing.T, 0, len(stats))
for t := range stats {
ts = append(ts, t)
total.passed.value += stats[t].passed.value
total.forged.value += stats[t].forged.value
total.failed.value += stats[t].failed.value
}
total.passed.size = digits(total.passed.value)
total.forged.size = digits(total.forged.value)
total.failed.size = digits(total.failed.value)
if testing.Verbose() {
sort.Slice(ts, func(a, b int) bool { return ts[a].Name() < ts[b].Name() })
for _, t := range ts {
stats[t].passed.size = total.passed.size
stats[t].forged.size = total.forged.size
stats[t].failed.size = total.failed.size
fmt.Printf(" %s\n", stats[t])
}
}
fmt.Printf(" %s\n", total)
}
// TestMain provides same default implementation as used by testing
// package with extra Report call to output statistics. Usage:
//
// func TestMain(m *testing.M) { check.TestMain(m) }
func TestMain(m *testing.M) {
code := m.Run()
Report()
os.Exit(code)
}