github.com/zorawar87/trillian@v1.2.1/monitoring/testonly/metrics.go (about)

     1  // Copyright 2017 Google Inc. All Rights Reserved.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package testonly
    16  
    17  import (
    18  	"testing"
    19  
    20  	"github.com/google/trillian/monitoring"
    21  )
    22  
    23  // TestCounter runs a test on a Counter produced from the provided MetricFactory.
    24  func TestCounter(t *testing.T, factory monitoring.MetricFactory) {
    25  	var tests = []struct {
    26  		name       string
    27  		labelNames []string
    28  		labelVals  []string
    29  	}{
    30  		{
    31  			name:       "counter0",
    32  			labelNames: nil,
    33  			labelVals:  nil,
    34  		},
    35  		{
    36  			name:       "counter1",
    37  			labelNames: []string{"key1"},
    38  			labelVals:  []string{"val1"},
    39  		},
    40  		{
    41  			name:       "counter2",
    42  			labelNames: []string{"key1", "key2"},
    43  			labelVals:  []string{"val1", "val2"},
    44  		},
    45  	}
    46  	for _, test := range tests {
    47  		t.Run(test.name, func(t *testing.T) {
    48  			counter := factory.NewCounter(test.name, "Test only", test.labelNames...)
    49  			if got, want := counter.Value(test.labelVals...), 0.0; got != want {
    50  				t.Errorf("Counter[%v].Value()=%v; want %v", test.labelVals, got, want)
    51  			}
    52  			counter.Inc(test.labelVals...)
    53  			if got, want := counter.Value(test.labelVals...), 1.0; got != want {
    54  				t.Errorf("Counter[%v].Value()=%v; want %v", test.labelVals, got, want)
    55  			}
    56  			counter.Add(2.5, test.labelVals...)
    57  			if got, want := counter.Value(test.labelVals...), 3.5; got != want {
    58  				t.Errorf("Counter[%v].Value()=%v; want %v", test.labelVals, got, want)
    59  			}
    60  			// Use an invalid number of labels.
    61  			libels := append(test.labelVals, "bogus")
    62  			counter.Add(10.0, libels...)
    63  			counter.Inc(libels...)
    64  			if got, want := counter.Value(libels...), 0.0; got != want {
    65  				t.Errorf("Counter[%v].Value()=%v; want %v", libels, got, want)
    66  			}
    67  			// Check that the value hasn't changed.
    68  			if got, want := counter.Value(test.labelVals...), 3.5; got != want {
    69  				t.Errorf("Counter[%v].Value()=%v; want %v", test.labelVals, got, want)
    70  			}
    71  		})
    72  	}
    73  }
    74  
    75  // TestGauge runs a test on a Gauge produced from the provided MetricFactory.
    76  func TestGauge(t *testing.T, factory monitoring.MetricFactory) {
    77  	var tests = []struct {
    78  		name       string
    79  		labelNames []string
    80  		labelVals  []string
    81  	}{
    82  		{
    83  			name:       "gauge0",
    84  			labelNames: nil,
    85  			labelVals:  nil,
    86  		},
    87  		{
    88  			name:       "gauge1",
    89  			labelNames: []string{"key1"},
    90  			labelVals:  []string{"val1"},
    91  		},
    92  		{
    93  			name:       "gauge2",
    94  			labelNames: []string{"key1", "key2"},
    95  			labelVals:  []string{"val1", "val2"},
    96  		},
    97  	}
    98  	for _, test := range tests {
    99  		t.Run(test.name, func(t *testing.T) {
   100  			gauge := factory.NewGauge(test.name, "Test only", test.labelNames...)
   101  			if got, want := gauge.Value(test.labelVals...), 0.0; got != want {
   102  				t.Errorf("Gauge[%v].Value()=%v; want %v", test.labelVals, got, want)
   103  			}
   104  			gauge.Inc(test.labelVals...)
   105  			if got, want := gauge.Value(test.labelVals...), 1.0; got != want {
   106  				t.Errorf("Gauge[%v].Value()=%v; want %v", test.labelVals, got, want)
   107  			}
   108  			gauge.Dec(test.labelVals...)
   109  			if got, want := gauge.Value(test.labelVals...), 0.0; got != want {
   110  				t.Errorf("Gauge[%v].Value()=%v; want %v", test.labelVals, got, want)
   111  			}
   112  			gauge.Add(2.5, test.labelVals...)
   113  			if got, want := gauge.Value(test.labelVals...), 2.5; got != want {
   114  				t.Errorf("Gauge[%v].Value()=%v; want %v", test.labelVals, got, want)
   115  			}
   116  			gauge.Set(42.0, test.labelVals...)
   117  			if got, want := gauge.Value(test.labelVals...), 42.0; got != want {
   118  				t.Errorf("Gauge[%v].Value()=%v; want %v", test.labelVals, got, want)
   119  			}
   120  			// Use an invalid number of labels.
   121  			libels := append(test.labelVals, "bogus")
   122  			gauge.Add(10.0, libels...)
   123  			gauge.Inc(libels...)
   124  			gauge.Dec(libels...)
   125  			gauge.Set(120.0, libels...)
   126  			// Ask for an invalid number of labels.
   127  			if got, want := gauge.Value(libels...), 0.0; got != want {
   128  				t.Errorf("Gauge[%v].Value()=%v; want %v", libels, got, want)
   129  			}
   130  			// Check that the value hasn't changed.
   131  			if got, want := gauge.Value(test.labelVals...), 42.0; got != want {
   132  				t.Errorf("Gauge[%v].Value()=%v; want %v", test.labelVals, got, want)
   133  			}
   134  		})
   135  	}
   136  }
   137  
   138  // TestHistogram runs a test on a Histogram produced from the provided MetricFactory.
   139  func TestHistogram(t *testing.T, factory monitoring.MetricFactory) {
   140  	var tests = []struct {
   141  		name       string
   142  		labelNames []string
   143  		labelVals  []string
   144  	}{
   145  		{
   146  			name:       "histogram0",
   147  			labelNames: nil,
   148  			labelVals:  nil,
   149  		},
   150  		{
   151  			name:       "histogram1",
   152  			labelNames: []string{"key1"},
   153  			labelVals:  []string{"val1"},
   154  		},
   155  		{
   156  			name:       "histogram2",
   157  			labelNames: []string{"key1", "key2"},
   158  			labelVals:  []string{"val1", "val2"},
   159  		},
   160  	}
   161  	for _, test := range tests {
   162  		t.Run(test.name, func(t *testing.T) {
   163  			histogram := factory.NewHistogram(test.name, "Test only", test.labelNames...)
   164  			gotCount, gotSum := histogram.Info(test.labelVals...)
   165  			if wantCount, wantSum := uint64(0), 0.0; gotCount != wantCount || gotSum != wantSum {
   166  				t.Errorf("Histogram[%v].Info()=%v,%v; want %v,%v", test.labelVals, gotCount, gotSum, wantCount, wantSum)
   167  			}
   168  			histogram.Observe(1.0, test.labelVals...)
   169  			histogram.Observe(2.0, test.labelVals...)
   170  			histogram.Observe(3.0, test.labelVals...)
   171  			gotCount, gotSum = histogram.Info(test.labelVals...)
   172  			if wantCount, wantSum := uint64(3), 6.0; gotCount != wantCount || gotSum != wantSum {
   173  				t.Errorf("Histogram[%v].Info()=%v,%v; want %v,%v", test.labelVals, gotCount, gotSum, wantCount, wantSum)
   174  			}
   175  
   176  			// Use an invalid number of labels.
   177  			libels := append(test.labelVals, "bogus")
   178  			histogram.Observe(100.0, libels...)
   179  			histogram.Observe(200.0, libels...)
   180  			gotCount, gotSum = histogram.Info(libels...)
   181  			if wantCount, wantSum := uint64(0), 0.0; gotCount != wantCount || gotSum != wantSum {
   182  				t.Errorf("Histogram[%v].Info()=%v,%v; want %v,%v", libels, gotCount, gotSum, wantCount, wantSum)
   183  			}
   184  			// Check that the histogram hasn't changed.
   185  			gotCount, gotSum = histogram.Info(test.labelVals...)
   186  			if wantCount, wantSum := uint64(3), 6.0; gotCount != wantCount || gotSum != wantSum {
   187  				t.Errorf("Histogram[%v].Info()=%v,%v; want %v,%v", test.labelVals, gotCount, gotSum, wantCount, wantSum)
   188  			}
   189  		})
   190  	}
   191  }