github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/metrics/resetting_timer_test.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 19:16:40</date>
    10  //</624450099799396352>
    11  
    12  package metrics
    13  
    14  import (
    15  	"testing"
    16  	"time"
    17  )
    18  
    19  func TestResettingTimer(t *testing.T) {
    20  	tests := []struct {
    21  		values   []int64
    22  		start    int
    23  		end      int
    24  		wantP50  int64
    25  		wantP95  int64
    26  		wantP99  int64
    27  		wantMean float64
    28  		wantMin  int64
    29  		wantMax  int64
    30  	}{
    31  		{
    32  			values:  []int64{},
    33  			start:   1,
    34  			end:     11,
    35  			wantP50: 5, wantP95: 10, wantP99: 10,
    36  			wantMin: 1, wantMax: 10, wantMean: 5.5,
    37  		},
    38  		{
    39  			values:  []int64{},
    40  			start:   1,
    41  			end:     101,
    42  			wantP50: 50, wantP95: 95, wantP99: 99,
    43  			wantMin: 1, wantMax: 100, wantMean: 50.5,
    44  		},
    45  		{
    46  			values:  []int64{1},
    47  			start:   0,
    48  			end:     0,
    49  			wantP50: 1, wantP95: 1, wantP99: 1,
    50  			wantMin: 1, wantMax: 1, wantMean: 1,
    51  		},
    52  		{
    53  			values:  []int64{0},
    54  			start:   0,
    55  			end:     0,
    56  			wantP50: 0, wantP95: 0, wantP99: 0,
    57  			wantMin: 0, wantMax: 0, wantMean: 0,
    58  		},
    59  		{
    60  			values:  []int64{},
    61  			start:   0,
    62  			end:     0,
    63  			wantP50: 0, wantP95: 0, wantP99: 0,
    64  			wantMin: 0, wantMax: 0, wantMean: 0,
    65  		},
    66  		{
    67  			values:  []int64{1, 10},
    68  			start:   0,
    69  			end:     0,
    70  			wantP50: 1, wantP95: 10, wantP99: 10,
    71  			wantMin: 1, wantMax: 10, wantMean: 5.5,
    72  		},
    73  	}
    74  	for ind, tt := range tests {
    75  		timer := NewResettingTimer()
    76  
    77  		for i := tt.start; i < tt.end; i++ {
    78  			tt.values = append(tt.values, int64(i))
    79  		}
    80  
    81  		for _, v := range tt.values {
    82  			timer.Update(time.Duration(v))
    83  		}
    84  
    85  		snap := timer.Snapshot()
    86  
    87  		ps := snap.Percentiles([]float64{50, 95, 99})
    88  
    89  		val := snap.Values()
    90  
    91  		if len(val) > 0 {
    92  			if tt.wantMin != val[0] {
    93  				t.Fatalf("%d: min: got %d, want %d", ind, val[0], tt.wantMin)
    94  			}
    95  
    96  			if tt.wantMax != val[len(val)-1] {
    97  				t.Fatalf("%d: max: got %d, want %d", ind, val[len(val)-1], tt.wantMax)
    98  			}
    99  		}
   100  
   101  		if tt.wantMean != snap.Mean() {
   102  			t.Fatalf("%d: mean: got %.2f, want %.2f", ind, snap.Mean(), tt.wantMean)
   103  		}
   104  
   105  		if tt.wantP50 != ps[0] {
   106  			t.Fatalf("%d: p50: got %d, want %d", ind, ps[0], tt.wantP50)
   107  		}
   108  
   109  		if tt.wantP95 != ps[1] {
   110  			t.Fatalf("%d: p95: got %d, want %d", ind, ps[1], tt.wantP95)
   111  		}
   112  
   113  		if tt.wantP99 != ps[2] {
   114  			t.Fatalf("%d: p99: got %d, want %d", ind, ps[2], tt.wantP99)
   115  		}
   116  	}
   117  }
   118  
   119  func TestResettingTimerWithFivePercentiles(t *testing.T) {
   120  	tests := []struct {
   121  		values   []int64
   122  		start    int
   123  		end      int
   124  		wantP05  int64
   125  		wantP20  int64
   126  		wantP50  int64
   127  		wantP95  int64
   128  		wantP99  int64
   129  		wantMean float64
   130  		wantMin  int64
   131  		wantMax  int64
   132  	}{
   133  		{
   134  			values:  []int64{},
   135  			start:   1,
   136  			end:     11,
   137  			wantP05: 1, wantP20: 2, wantP50: 5, wantP95: 10, wantP99: 10,
   138  			wantMin: 1, wantMax: 10, wantMean: 5.5,
   139  		},
   140  		{
   141  			values:  []int64{},
   142  			start:   1,
   143  			end:     101,
   144  			wantP05: 5, wantP20: 20, wantP50: 50, wantP95: 95, wantP99: 99,
   145  			wantMin: 1, wantMax: 100, wantMean: 50.5,
   146  		},
   147  		{
   148  			values:  []int64{1},
   149  			start:   0,
   150  			end:     0,
   151  			wantP05: 1, wantP20: 1, wantP50: 1, wantP95: 1, wantP99: 1,
   152  			wantMin: 1, wantMax: 1, wantMean: 1,
   153  		},
   154  		{
   155  			values:  []int64{0},
   156  			start:   0,
   157  			end:     0,
   158  			wantP05: 0, wantP20: 0, wantP50: 0, wantP95: 0, wantP99: 0,
   159  			wantMin: 0, wantMax: 0, wantMean: 0,
   160  		},
   161  		{
   162  			values:  []int64{},
   163  			start:   0,
   164  			end:     0,
   165  			wantP05: 0, wantP20: 0, wantP50: 0, wantP95: 0, wantP99: 0,
   166  			wantMin: 0, wantMax: 0, wantMean: 0,
   167  		},
   168  		{
   169  			values:  []int64{1, 10},
   170  			start:   0,
   171  			end:     0,
   172  			wantP05: 1, wantP20: 1, wantP50: 1, wantP95: 10, wantP99: 10,
   173  			wantMin: 1, wantMax: 10, wantMean: 5.5,
   174  		},
   175  	}
   176  	for ind, tt := range tests {
   177  		timer := NewResettingTimer()
   178  
   179  		for i := tt.start; i < tt.end; i++ {
   180  			tt.values = append(tt.values, int64(i))
   181  		}
   182  
   183  		for _, v := range tt.values {
   184  			timer.Update(time.Duration(v))
   185  		}
   186  
   187  		snap := timer.Snapshot()
   188  
   189  		ps := snap.Percentiles([]float64{5, 20, 50, 95, 99})
   190  
   191  		val := snap.Values()
   192  
   193  		if len(val) > 0 {
   194  			if tt.wantMin != val[0] {
   195  				t.Fatalf("%d: min: got %d, want %d", ind, val[0], tt.wantMin)
   196  			}
   197  
   198  			if tt.wantMax != val[len(val)-1] {
   199  				t.Fatalf("%d: max: got %d, want %d", ind, val[len(val)-1], tt.wantMax)
   200  			}
   201  		}
   202  
   203  		if tt.wantMean != snap.Mean() {
   204  			t.Fatalf("%d: mean: got %.2f, want %.2f", ind, snap.Mean(), tt.wantMean)
   205  		}
   206  
   207  		if tt.wantP05 != ps[0] {
   208  			t.Fatalf("%d: p05: got %d, want %d", ind, ps[0], tt.wantP05)
   209  		}
   210  
   211  		if tt.wantP20 != ps[1] {
   212  			t.Fatalf("%d: p20: got %d, want %d", ind, ps[1], tt.wantP20)
   213  		}
   214  
   215  		if tt.wantP50 != ps[2] {
   216  			t.Fatalf("%d: p50: got %d, want %d", ind, ps[2], tt.wantP50)
   217  		}
   218  
   219  		if tt.wantP95 != ps[3] {
   220  			t.Fatalf("%d: p95: got %d, want %d", ind, ps[3], tt.wantP95)
   221  		}
   222  
   223  		if tt.wantP99 != ps[4] {
   224  			t.Fatalf("%d: p99: got %d, want %d", ind, ps[4], tt.wantP99)
   225  		}
   226  	}
   227  }
   228