blob: 0da0c3f1d4e6878c633468cad246d56861714b12 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package benchmark
import (
"bytes"
"fmt"
"io"
"os"
"regexp"
"runtime"
"strings"
"testing"
"time"
)
func BenchmarkTest(b *testing.B) {
stats := AddStats(b, 0)
for i := 1; i <= b.N; i++ {
time.Sleep(1 * time.Microsecond)
stats.Add(time.Duration(i) * time.Microsecond)
}
}
func BenchmarkTestMulti(b *testing.B) {
stats1 := AddStatsWithName(b, "S1", 0)
stats2 := AddStatsWithName(b, "S2", 0)
for i := 1; i <= b.N; i++ {
time.Sleep(1 * time.Microsecond)
stats1.Add(time.Duration(i) * time.Microsecond)
stats2.Add(time.Duration(i) * time.Millisecond)
}
}
func benchmarkName(name string) string {
procs := runtime.GOMAXPROCS(-1)
if procs != 1 {
return fmt.Sprintf("%s-%d", name, procs)
}
return name
}
func TestStatsInjection(t *testing.T) {
stdout := os.Stdout
r, w, _ := os.Pipe()
os.Stdout = w
outC := make(chan string)
go func() {
b := new(bytes.Buffer)
io.Copy(b, r)
r.Close()
outC <- b.String()
}()
startStatsInjector()
fmt.Printf("%s\t", benchmarkName("BenchmarkTest"))
result := testing.Benchmark(BenchmarkTest)
fmt.Println(result.String())
fmt.Printf("%s\t", benchmarkName("BenchmarkTestMulti"))
result = testing.Benchmark(BenchmarkTestMulti)
fmt.Println(result.String())
stopStatsInjector()
w.Close()
os.Stdout = stdout
out := <-outC
if strings.Count(out, "Histogram") != 3 {
t.Errorf("unexpected stats output:\n%s", out)
}
if matched, _ := regexp.MatchString("Histogram.*\\)\n", out); !matched {
t.Errorf("unnamed stats not found:\n%s", out)
}
if matched, _ := regexp.MatchString("Histogram.*\\): S1\n", out); !matched {
t.Errorf("stats S1 not found:\n%s", out)
}
if matched, _ := regexp.MatchString("Histogram.*\\): S2\n", out); !matched {
t.Errorf("stats S2 not found:\n%s", out)
}
}