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 }