github.com/kisexp/xdchain@v0.0.0-20211206025815-490d6b732aa7/metrics/resetting_timer_test.go (about)

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