| // 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) | |
| } | |
| }) | |
| } | |
| } |