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