github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/metrics/resetting_timer_test.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  package metrics
    10  
    11  import (
    12  	"testing"
    13  	"time"
    14  )
    15  
    16  func TestResettingTimer(t *testing.T) {
    17  	tests := []struct {
    18  		values   []int64
    19  		start    int
    20  		end      int
    21  		wantP50  int64
    22  		wantP95  int64
    23  		wantP99  int64
    24  		wantMean float64
    25  		wantMin  int64
    26  		wantMax  int64
    27  	}{
    28  		{
    29  			values:  []int64{},
    30  			start:   1,
    31  			end:     11,
    32  			wantP50: 5, wantP95: 10, wantP99: 10,
    33  			wantMin: 1, wantMax: 10, wantMean: 5.5,
    34  		},
    35  		{
    36  			values:  []int64{},
    37  			start:   1,
    38  			end:     101,
    39  			wantP50: 50, wantP95: 95, wantP99: 99,
    40  			wantMin: 1, wantMax: 100, wantMean: 50.5,
    41  		},
    42  		{
    43  			values:  []int64{1},
    44  			start:   0,
    45  			end:     0,
    46  			wantP50: 1, wantP95: 1, wantP99: 1,
    47  			wantMin: 1, wantMax: 1, wantMean: 1,
    48  		},
    49  		{
    50  			values:  []int64{0},
    51  			start:   0,
    52  			end:     0,
    53  			wantP50: 0, wantP95: 0, wantP99: 0,
    54  			wantMin: 0, wantMax: 0, wantMean: 0,
    55  		},
    56  		{
    57  			values:  []int64{},
    58  			start:   0,
    59  			end:     0,
    60  			wantP50: 0, wantP95: 0, wantP99: 0,
    61  			wantMin: 0, wantMax: 0, wantMean: 0,
    62  		},
    63  		{
    64  			values:  []int64{1, 10},
    65  			start:   0,
    66  			end:     0,
    67  			wantP50: 1, wantP95: 10, wantP99: 10,
    68  			wantMin: 1, wantMax: 10, wantMean: 5.5,
    69  		},
    70  	}
    71  	for ind, tt := range tests {
    72  		timer := NewResettingTimer()
    73  
    74  		for i := tt.start; i < tt.end; i++ {
    75  			tt.values = append(tt.values, int64(i))
    76  		}
    77  
    78  		for _, v := range tt.values {
    79  			timer.Update(time.Duration(v))
    80  		}
    81  
    82  		snap := timer.Snapshot()
    83  
    84  		ps := snap.Percentiles([]float64{50, 95, 99})
    85  
    86  		val := snap.Values()
    87  
    88  		if len(val) > 0 {
    89  			if tt.wantMin != val[0] {
    90  				t.Fatalf("%d: min: got %d, want %d", ind, val[0], tt.wantMin)
    91  			}
    92  
    93  			if tt.wantMax != val[len(val)-1] {
    94  				t.Fatalf("%d: max: got %d, want %d", ind, val[len(val)-1], tt.wantMax)
    95  			}
    96  		}
    97  
    98  		if tt.wantMean != snap.Mean() {
    99  			t.Fatalf("%d: mean: got %.2f, want %.2f", ind, snap.Mean(), tt.wantMean)
   100  		}
   101  
   102  		if tt.wantP50 != ps[0] {
   103  			t.Fatalf("%d: p50: got %d, want %d", ind, ps[0], tt.wantP50)
   104  		}
   105  
   106  		if tt.wantP95 != ps[1] {
   107  			t.Fatalf("%d: p95: got %d, want %d", ind, ps[1], tt.wantP95)
   108  		}
   109  
   110  		if tt.wantP99 != ps[2] {
   111  			t.Fatalf("%d: p99: got %d, want %d", ind, ps[2], tt.wantP99)
   112  		}
   113  	}
   114  }
   115  
   116  func TestResettingTimerWithFivePercentiles(t *testing.T) {
   117  	tests := []struct {
   118  		values   []int64
   119  		start    int
   120  		end      int
   121  		wantP05  int64
   122  		wantP20  int64
   123  		wantP50  int64
   124  		wantP95  int64
   125  		wantP99  int64
   126  		wantMean float64
   127  		wantMin  int64
   128  		wantMax  int64
   129  	}{
   130  		{
   131  			values:  []int64{},
   132  			start:   1,
   133  			end:     11,
   134  			wantP05: 1, wantP20: 2, wantP50: 5, wantP95: 10, wantP99: 10,
   135  			wantMin: 1, wantMax: 10, wantMean: 5.5,
   136  		},
   137  		{
   138  			values:  []int64{},
   139  			start:   1,
   140  			end:     101,
   141  			wantP05: 5, wantP20: 20, wantP50: 50, wantP95: 95, wantP99: 99,
   142  			wantMin: 1, wantMax: 100, wantMean: 50.5,
   143  		},
   144  		{
   145  			values:  []int64{1},
   146  			start:   0,
   147  			end:     0,
   148  			wantP05: 1, wantP20: 1, wantP50: 1, wantP95: 1, wantP99: 1,
   149  			wantMin: 1, wantMax: 1, wantMean: 1,
   150  		},
   151  		{
   152  			values:  []int64{0},
   153  			start:   0,
   154  			end:     0,
   155  			wantP05: 0, wantP20: 0, wantP50: 0, wantP95: 0, wantP99: 0,
   156  			wantMin: 0, wantMax: 0, wantMean: 0,
   157  		},
   158  		{
   159  			values:  []int64{},
   160  			start:   0,
   161  			end:     0,
   162  			wantP05: 0, wantP20: 0, wantP50: 0, wantP95: 0, wantP99: 0,
   163  			wantMin: 0, wantMax: 0, wantMean: 0,
   164  		},
   165  		{
   166  			values:  []int64{1, 10},
   167  			start:   0,
   168  			end:     0,
   169  			wantP05: 1, wantP20: 1, wantP50: 1, wantP95: 10, wantP99: 10,
   170  			wantMin: 1, wantMax: 10, wantMean: 5.5,
   171  		},
   172  	}
   173  	for ind, tt := range tests {
   174  		timer := NewResettingTimer()
   175  
   176  		for i := tt.start; i < tt.end; i++ {
   177  			tt.values = append(tt.values, int64(i))
   178  		}
   179  
   180  		for _, v := range tt.values {
   181  			timer.Update(time.Duration(v))
   182  		}
   183  
   184  		snap := timer.Snapshot()
   185  
   186  		ps := snap.Percentiles([]float64{5, 20, 50, 95, 99})
   187  
   188  		val := snap.Values()
   189  
   190  		if len(val) > 0 {
   191  			if tt.wantMin != val[0] {
   192  				t.Fatalf("%d: min: got %d, want %d", ind, val[0], tt.wantMin)
   193  			}
   194  
   195  			if tt.wantMax != val[len(val)-1] {
   196  				t.Fatalf("%d: max: got %d, want %d", ind, val[len(val)-1], tt.wantMax)
   197  			}
   198  		}
   199  
   200  		if tt.wantMean != snap.Mean() {
   201  			t.Fatalf("%d: mean: got %.2f, want %.2f", ind, snap.Mean(), tt.wantMean)
   202  		}
   203  
   204  		if tt.wantP05 != ps[0] {
   205  			t.Fatalf("%d: p05: got %d, want %d", ind, ps[0], tt.wantP05)
   206  		}
   207  
   208  		if tt.wantP20 != ps[1] {
   209  			t.Fatalf("%d: p20: got %d, want %d", ind, ps[1], tt.wantP20)
   210  		}
   211  
   212  		if tt.wantP50 != ps[2] {
   213  			t.Fatalf("%d: p50: got %d, want %d", ind, ps[2], tt.wantP50)
   214  		}
   215  
   216  		if tt.wantP95 != ps[3] {
   217  			t.Fatalf("%d: p95: got %d, want %d", ind, ps[3], tt.wantP95)
   218  		}
   219  
   220  		if tt.wantP99 != ps[4] {
   221  			t.Fatalf("%d: p99: got %d, want %d", ind, ps[4], tt.wantP99)
   222  		}
   223  	}
   224  }