// Copyright 2018 Google LLC. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package testonly
import "github.com/google/trillian/monitoring"
// CounterSnapshot records the latest value from a time series in a counter.
// This value can then be compared with future values. Note that a counter can
// contain many time series, but a CounterSnapshot will track only one.
// A CounterSnapshot is useful in tests because counters do not reset between
// test cases, and so their absolute value is not amenable to testing. Instead,
// the delta between the value at the start and end of the test should be used.
// This assumes that multiple tests that all affect the counter are not run in
// parallel.
type CounterSnapshot struct {
c monitoring.Counter
labels []string
value float64
}
// NewCounterSnapshot records the latest value of a time series in c identified
// by the given labels. This value can be compared to future values to determine
// how it has changed over time.
func NewCounterSnapshot(c monitoring.Counter, labels ...string) CounterSnapshot {
if c == nil {
panic("can't take snapshot of nil counter")
}
return CounterSnapshot{
c: c,
labels: labels,
value: c.Value(labels...),
}
}
// Delta returns the difference between the latest value of the time series
// and the value when the CounterSnapshot was created.
func (s CounterSnapshot) Delta() float64 {
return s.c.Value(s.labels...) - s.value
}