| // 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 ( |
| "bytes" |
| "runtime" |
| "sync/atomic" |
| "testing" |
| "text/template" |
| ) |
| |
| 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}, |
| {5, 5}, |
| {9, 10}, |
| {999, 1000}, |
| {1000, 1000}, |
| {1400, 2000}, |
| {1700, 2000}, |
| {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) |
| } |
| } |
| } |
| |
| 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") |
| } |
| }) |
| }) |
| } |