2013-11-06 20:49:01 +01:00
|
|
|
// Copyright 2013 The Go 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 testing_test
|
|
|
|
|
|
|
|
import (
|
2014-06-07 00:37:27 +02:00
|
|
|
"bytes"
|
|
|
|
"runtime"
|
|
|
|
"sync/atomic"
|
2013-11-06 20:49:01 +01:00
|
|
|
"testing"
|
2014-06-07 00:37:27 +02:00
|
|
|
"text/template"
|
2013-11-06 20:49:01 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
var roundDownTests = []struct {
|
|
|
|
v, expected int
|
|
|
|
}{
|
|
|
|
{1, 1},
|
|
|
|
{9, 1},
|
|
|
|
{10, 10},
|
|
|
|
{11, 10},
|
|
|
|
{100, 100},
|
|
|
|
{101, 100},
|
|
|
|
{999, 100},
|
|
|
|
{1000, 1000},
|
|
|
|
{1001, 1000},
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestRoundDown10(t *testing.T) {
|
|
|
|
for _, tt := range roundDownTests {
|
|
|
|
actual := testing.RoundDown10(tt.v)
|
|
|
|
if tt.expected != actual {
|
|
|
|
t.Errorf("roundDown10(%d): expected %d, actual %d", tt.v, tt.expected, actual)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var roundUpTests = []struct {
|
|
|
|
v, expected int
|
|
|
|
}{
|
|
|
|
{0, 1},
|
|
|
|
{1, 1},
|
|
|
|
{2, 2},
|
2015-01-15 01:27:56 +01:00
|
|
|
{3, 3},
|
2013-11-06 20:49:01 +01:00
|
|
|
{5, 5},
|
|
|
|
{9, 10},
|
|
|
|
{999, 1000},
|
|
|
|
{1000, 1000},
|
|
|
|
{1400, 2000},
|
|
|
|
{1700, 2000},
|
2015-01-15 01:27:56 +01:00
|
|
|
{2700, 3000},
|
2013-11-06 20:49:01 +01:00
|
|
|
{4999, 5000},
|
|
|
|
{5000, 5000},
|
|
|
|
{5001, 10000},
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestRoundUp(t *testing.T) {
|
|
|
|
for _, tt := range roundUpTests {
|
|
|
|
actual := testing.RoundUp(tt.v)
|
|
|
|
if tt.expected != actual {
|
|
|
|
t.Errorf("roundUp(%d): expected %d, actual %d", tt.v, tt.expected, actual)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2014-06-07 00:37:27 +02:00
|
|
|
|
|
|
|
func TestRunParallel(t *testing.T) {
|
|
|
|
testing.Benchmark(func(b *testing.B) {
|
|
|
|
procs := uint32(0)
|
|
|
|
iters := uint64(0)
|
|
|
|
b.SetParallelism(3)
|
|
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
|
|
atomic.AddUint32(&procs, 1)
|
|
|
|
for pb.Next() {
|
|
|
|
atomic.AddUint64(&iters, 1)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
if want := uint32(3 * runtime.GOMAXPROCS(0)); procs != want {
|
|
|
|
t.Errorf("got %v procs, want %v", procs, want)
|
|
|
|
}
|
|
|
|
if iters != uint64(b.N) {
|
|
|
|
t.Errorf("got %v iters, want %v", iters, b.N)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestRunParallelFail(t *testing.T) {
|
|
|
|
testing.Benchmark(func(b *testing.B) {
|
|
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
|
|
// The function must be able to log/abort
|
|
|
|
// w/o crashing/deadlocking the whole benchmark.
|
|
|
|
b.Log("log")
|
|
|
|
b.Error("error")
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func ExampleB_RunParallel() {
|
|
|
|
// Parallel benchmark for text/template.Template.Execute on a single object.
|
|
|
|
testing.Benchmark(func(b *testing.B) {
|
|
|
|
templ := template.Must(template.New("test").Parse("Hello, {{.}}!"))
|
|
|
|
// RunParallel will create GOMAXPROCS goroutines
|
|
|
|
// and distribute work among them.
|
|
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
|
|
// Each goroutine has its own bytes.Buffer.
|
|
|
|
var buf bytes.Buffer
|
|
|
|
for pb.Next() {
|
|
|
|
// The loop body is executed b.N times total across all goroutines.
|
|
|
|
buf.Reset()
|
|
|
|
templ.Execute(&buf, "World")
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|