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