зеркало из https://github.com/golang/tools.git
209 строки
5.1 KiB
Go
209 строки
5.1 KiB
Go
// Copyright 2014 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 parse
|
|
|
|
import (
|
|
"reflect"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestParseLine(t *testing.T) {
|
|
cases := []struct {
|
|
line string
|
|
want *Benchmark
|
|
err bool // expect an error
|
|
}{
|
|
{
|
|
line: "BenchmarkEncrypt 100000000 19.6 ns/op",
|
|
want: &Benchmark{
|
|
Name: "BenchmarkEncrypt",
|
|
N: 100000000, NsPerOp: 19.6,
|
|
Measured: NsPerOp,
|
|
},
|
|
},
|
|
{
|
|
line: "BenchmarkEncrypt 100000000 19.6 ns/op 817.77 MB/s",
|
|
want: &Benchmark{
|
|
Name: "BenchmarkEncrypt",
|
|
N: 100000000, NsPerOp: 19.6, MBPerS: 817.77,
|
|
Measured: NsPerOp | MBPerS,
|
|
},
|
|
},
|
|
{
|
|
line: "BenchmarkEncrypt 100000000 19.6 ns/op 817.77",
|
|
want: &Benchmark{
|
|
Name: "BenchmarkEncrypt",
|
|
N: 100000000, NsPerOp: 19.6,
|
|
Measured: NsPerOp,
|
|
},
|
|
},
|
|
{
|
|
line: "BenchmarkEncrypt 100000000 19.6 ns/op 817.77 MB/s 5 allocs/op",
|
|
want: &Benchmark{
|
|
Name: "BenchmarkEncrypt",
|
|
N: 100000000, NsPerOp: 19.6, MBPerS: 817.77, AllocsPerOp: 5,
|
|
Measured: NsPerOp | MBPerS | AllocsPerOp,
|
|
},
|
|
},
|
|
{
|
|
line: "BenchmarkEncrypt 100000000 19.6 ns/op 817.77 MB/s 3 B/op 5 allocs/op",
|
|
want: &Benchmark{
|
|
Name: "BenchmarkEncrypt",
|
|
N: 100000000, NsPerOp: 19.6, MBPerS: 817.77, AllocedBytesPerOp: 3, AllocsPerOp: 5,
|
|
Measured: NsPerOp | MBPerS | AllocedBytesPerOp | AllocsPerOp,
|
|
},
|
|
},
|
|
// error handling cases
|
|
{
|
|
line: "BenchPress 100 19.6 ns/op", // non-benchmark
|
|
err: true,
|
|
},
|
|
{
|
|
line: "BenchmarkEncrypt lots 19.6 ns/op", // non-int iterations
|
|
err: true,
|
|
},
|
|
{
|
|
line: "BenchmarkBridge 100000000 19.6 smoots", // unknown unit
|
|
want: &Benchmark{
|
|
Name: "BenchmarkBridge",
|
|
N: 100000000,
|
|
},
|
|
},
|
|
{
|
|
line: "PASS",
|
|
err: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range cases {
|
|
have, err := ParseLine(tt.line)
|
|
if tt.err && err == nil {
|
|
t.Errorf("parsing line %q should have failed", tt.line)
|
|
continue
|
|
}
|
|
if !reflect.DeepEqual(have, tt.want) {
|
|
t.Errorf("parsed line %q incorrectly, want %v have %v", tt.line, tt.want, have)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestParseSet(t *testing.T) {
|
|
// Test two things:
|
|
// 1. The noise that can accompany testing.B output gets ignored.
|
|
// 2. Benchmarks with the same name have their order preserved.
|
|
in := `
|
|
? crypto [no test files]
|
|
PASS
|
|
pem_decrypt_test.go:17: test 4. %!s(x509.PEMCipher=5)
|
|
... [output truncated]
|
|
|
|
BenchmarkEncrypt 100000000 19.6 ns/op
|
|
BenchmarkEncrypt 5000000 517 ns/op
|
|
=== RUN TestChunk
|
|
--- PASS: TestChunk (0.00 seconds)
|
|
--- SKIP: TestLinuxSendfile (0.00 seconds)
|
|
fs_test.go:716: skipping; linux-only test
|
|
BenchmarkReadRequestApachebench 1000000 2960 ns/op 27.70 MB/s 839 B/op 9 allocs/op
|
|
BenchmarkClientServerParallel64 50000 59192 ns/op 7028 B/op 60 allocs/op
|
|
ok net/http 95.783s
|
|
`
|
|
|
|
want := Set{
|
|
"BenchmarkReadRequestApachebench": []*Benchmark{
|
|
{
|
|
Name: "BenchmarkReadRequestApachebench",
|
|
N: 1000000, NsPerOp: 2960, MBPerS: 27.70, AllocedBytesPerOp: 839, AllocsPerOp: 9,
|
|
Measured: NsPerOp | MBPerS | AllocedBytesPerOp | AllocsPerOp,
|
|
Ord: 2,
|
|
},
|
|
},
|
|
"BenchmarkClientServerParallel64": []*Benchmark{
|
|
{
|
|
Name: "BenchmarkClientServerParallel64",
|
|
N: 50000, NsPerOp: 59192, AllocedBytesPerOp: 7028, AllocsPerOp: 60,
|
|
Measured: NsPerOp | AllocedBytesPerOp | AllocsPerOp,
|
|
Ord: 3,
|
|
},
|
|
},
|
|
"BenchmarkEncrypt": []*Benchmark{
|
|
{
|
|
Name: "BenchmarkEncrypt",
|
|
N: 100000000, NsPerOp: 19.6,
|
|
Measured: NsPerOp,
|
|
Ord: 0,
|
|
},
|
|
{
|
|
Name: "BenchmarkEncrypt",
|
|
N: 5000000, NsPerOp: 517,
|
|
Measured: NsPerOp,
|
|
Ord: 1,
|
|
},
|
|
},
|
|
}
|
|
|
|
have, err := ParseSet(strings.NewReader(in))
|
|
if err != nil {
|
|
t.Fatalf("unexpected err during ParseSet: %v", err)
|
|
}
|
|
if !reflect.DeepEqual(want, have) {
|
|
t.Errorf("parsed bench set incorrectly, want %v have %v", want, have)
|
|
}
|
|
}
|
|
|
|
func TestString(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
input *Benchmark
|
|
wanted string
|
|
}{
|
|
{
|
|
name: "nsTest",
|
|
input: &Benchmark{
|
|
Name: "BenchmarkTest",
|
|
N: 100000000, NsPerOp: 19.6,
|
|
Measured: NsPerOp,
|
|
},
|
|
wanted: "BenchmarkTest 100000000 19.60 ns/op",
|
|
},
|
|
{
|
|
name: "mbTest",
|
|
input: &Benchmark{
|
|
Name: "BenchmarkTest",
|
|
N: 100000000, MBPerS: 19.6,
|
|
Measured: MBPerS,
|
|
},
|
|
wanted: "BenchmarkTest 100000000 19.60 MB/s",
|
|
},
|
|
{
|
|
name: "allocatedBytesTest",
|
|
input: &Benchmark{
|
|
Name: "BenchmarkTest",
|
|
N: 100000000, AllocedBytesPerOp: 5,
|
|
Measured: AllocedBytesPerOp,
|
|
},
|
|
wanted: "BenchmarkTest 100000000 5 B/op",
|
|
},
|
|
{
|
|
name: "allocsTest",
|
|
input: &Benchmark{
|
|
Name: "BenchmarkTest",
|
|
N: 100000000, AllocsPerOp: 5,
|
|
Measured: AllocsPerOp,
|
|
},
|
|
wanted: "BenchmarkTest 100000000 5 allocs/op",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
result := tt.input.String()
|
|
if result != tt.wanted {
|
|
t.Errorf("String() is called, want %q, have %q", tt.wanted, result)
|
|
}
|
|
})
|
|
}
|
|
}
|