github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/benchmark/parse/parse_test.go (about)

     1  // Copyright 2014 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package parse
     6  
     7  import (
     8  	"reflect"
     9  	"strings"
    10  	"testing"
    11  )
    12  
    13  func TestParseLine(t *testing.T) {
    14  	cases := []struct {
    15  		line string
    16  		want *Benchmark
    17  		err  bool // expect an error
    18  	}{
    19  		{
    20  			line: "BenchmarkEncrypt	100000000	        19.6 ns/op",
    21  			want: &Benchmark{
    22  				Name: "BenchmarkEncrypt",
    23  				N:    100000000, NsPerOp: 19.6,
    24  				Measured: NsPerOp,
    25  			},
    26  		},
    27  		{
    28  			line: "BenchmarkEncrypt	100000000	        19.6 ns/op	 817.77 MB/s",
    29  			want: &Benchmark{
    30  				Name: "BenchmarkEncrypt",
    31  				N:    100000000, NsPerOp: 19.6, MBPerS: 817.77,
    32  				Measured: NsPerOp | MBPerS,
    33  			},
    34  		},
    35  		{
    36  			line: "BenchmarkEncrypt	100000000	        19.6 ns/op	 817.77",
    37  			want: &Benchmark{
    38  				Name: "BenchmarkEncrypt",
    39  				N:    100000000, NsPerOp: 19.6,
    40  				Measured: NsPerOp,
    41  			},
    42  		},
    43  		{
    44  			line: "BenchmarkEncrypt	100000000	        19.6 ns/op	 817.77 MB/s	       5 allocs/op",
    45  			want: &Benchmark{
    46  				Name: "BenchmarkEncrypt",
    47  				N:    100000000, NsPerOp: 19.6, MBPerS: 817.77, AllocsPerOp: 5,
    48  				Measured: NsPerOp | MBPerS | AllocsPerOp,
    49  			},
    50  		},
    51  		{
    52  			line: "BenchmarkEncrypt	100000000	        19.6 ns/op	 817.77 MB/s	       3 B/op	       5 allocs/op",
    53  			want: &Benchmark{
    54  				Name: "BenchmarkEncrypt",
    55  				N:    100000000, NsPerOp: 19.6, MBPerS: 817.77, AllocedBytesPerOp: 3, AllocsPerOp: 5,
    56  				Measured: NsPerOp | MBPerS | AllocedBytesPerOp | AllocsPerOp,
    57  			},
    58  		},
    59  		// error handling cases
    60  		{
    61  			line: "BenchPress	100	        19.6 ns/op", // non-benchmark
    62  			err: true,
    63  		},
    64  		{
    65  			line: "BenchmarkEncrypt	lots	        19.6 ns/op", // non-int iterations
    66  			err: true,
    67  		},
    68  		{
    69  			line: "BenchmarkBridge	100000000	        19.6 smoots", // unknown unit
    70  			want: &Benchmark{
    71  				Name: "BenchmarkBridge",
    72  				N:    100000000,
    73  			},
    74  		},
    75  		{
    76  			line: "PASS",
    77  			err:  true,
    78  		},
    79  	}
    80  
    81  	for _, tt := range cases {
    82  		have, err := ParseLine(tt.line)
    83  		if tt.err && err == nil {
    84  			t.Errorf("parsing line %q should have failed", tt.line)
    85  			continue
    86  		}
    87  		if !reflect.DeepEqual(have, tt.want) {
    88  			t.Errorf("parsed line %q incorrectly, want %v have %v", tt.line, tt.want, have)
    89  		}
    90  	}
    91  }
    92  
    93  func TestParseSet(t *testing.T) {
    94  	// Test two things:
    95  	// 1. The noise that can accompany testing.B output gets ignored.
    96  	// 2. Benchmarks with the same name have their order preserved.
    97  	in := `
    98  		?   	crypto	[no test files]
    99  		PASS
   100  				pem_decrypt_test.go:17: test 4. %!s(x509.PEMCipher=5)
   101  			... [output truncated]
   102  
   103  		BenchmarkEncrypt	100000000	        19.6 ns/op
   104  		BenchmarkEncrypt	 5000000	       517 ns/op
   105  		=== RUN TestChunk
   106  		--- PASS: TestChunk (0.00 seconds)
   107  		--- SKIP: TestLinuxSendfile (0.00 seconds)
   108  			fs_test.go:716: skipping; linux-only test
   109  		BenchmarkReadRequestApachebench	 1000000	      2960 ns/op	  27.70 MB/s	     839 B/op	       9 allocs/op
   110  		BenchmarkClientServerParallel64	   50000	     59192 ns/op	    7028 B/op	      60 allocs/op
   111  		ok  	net/http	95.783s
   112  	`
   113  
   114  	want := Set{
   115  		"BenchmarkReadRequestApachebench": []*Benchmark{
   116  			{
   117  				Name: "BenchmarkReadRequestApachebench",
   118  				N:    1000000, NsPerOp: 2960, MBPerS: 27.70, AllocedBytesPerOp: 839, AllocsPerOp: 9,
   119  				Measured: NsPerOp | MBPerS | AllocedBytesPerOp | AllocsPerOp,
   120  				Ord:      2,
   121  			},
   122  		},
   123  		"BenchmarkClientServerParallel64": []*Benchmark{
   124  			{
   125  				Name: "BenchmarkClientServerParallel64",
   126  				N:    50000, NsPerOp: 59192, AllocedBytesPerOp: 7028, AllocsPerOp: 60,
   127  				Measured: NsPerOp | AllocedBytesPerOp | AllocsPerOp,
   128  				Ord:      3,
   129  			},
   130  		},
   131  		"BenchmarkEncrypt": []*Benchmark{
   132  			{
   133  				Name: "BenchmarkEncrypt",
   134  				N:    100000000, NsPerOp: 19.6,
   135  				Measured: NsPerOp,
   136  				Ord:      0,
   137  			},
   138  			{
   139  				Name: "BenchmarkEncrypt",
   140  				N:    5000000, NsPerOp: 517,
   141  				Measured: NsPerOp,
   142  				Ord:      1,
   143  			},
   144  		},
   145  	}
   146  
   147  	have, err := ParseSet(strings.NewReader(in))
   148  	if err != nil {
   149  		t.Fatalf("unexpected err during ParseSet: %v", err)
   150  	}
   151  	if !reflect.DeepEqual(want, have) {
   152  		t.Errorf("parsed bench set incorrectly, want %v have %v", want, have)
   153  	}
   154  }
   155  
   156  func TestString(t *testing.T) {
   157  	tests := []struct {
   158  		name   string
   159  		input  *Benchmark
   160  		wanted string
   161  	}{
   162  		{
   163  			name: "nsTest",
   164  			input: &Benchmark{
   165  				Name: "BenchmarkTest",
   166  				N:    100000000, NsPerOp: 19.6,
   167  				Measured: NsPerOp,
   168  			},
   169  			wanted: "BenchmarkTest 100000000 19.60 ns/op",
   170  		},
   171  		{
   172  			name: "mbTest",
   173  			input: &Benchmark{
   174  				Name: "BenchmarkTest",
   175  				N:    100000000, MBPerS: 19.6,
   176  				Measured: MBPerS,
   177  			},
   178  			wanted: "BenchmarkTest 100000000 19.60 MB/s",
   179  		},
   180  		{
   181  			name: "allocatedBytesTest",
   182  			input: &Benchmark{
   183  				Name: "BenchmarkTest",
   184  				N:    100000000, AllocedBytesPerOp: 5,
   185  				Measured: AllocedBytesPerOp,
   186  			},
   187  			wanted: "BenchmarkTest 100000000 5 B/op",
   188  		},
   189  		{
   190  			name: "allocsTest",
   191  			input: &Benchmark{
   192  				Name: "BenchmarkTest",
   193  				N:    100000000, AllocsPerOp: 5,
   194  				Measured: AllocsPerOp,
   195  			},
   196  			wanted: "BenchmarkTest 100000000 5 allocs/op",
   197  		},
   198  	}
   199  
   200  	for _, tt := range tests {
   201  		t.Run(tt.name, func(t *testing.T) {
   202  			result := tt.input.String()
   203  			if result != tt.wanted {
   204  				t.Errorf("String() is called, want %q, have %q", tt.wanted, result)
   205  			}
   206  		})
   207  	}
   208  }