// Copyright 2017 Tendermint. All rights reserved.
|
|
// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
|
|
|
|
package trust
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
// MetricTicker provides a single ticker interface for the trust metric
|
|
type MetricTicker interface {
|
|
// GetChannel returns the receive only channel that fires at each time interval
|
|
GetChannel() <-chan time.Time
|
|
|
|
// Stop will halt further activity on the ticker channel
|
|
Stop()
|
|
}
|
|
|
|
// The ticker used during testing that provides manual control over time intervals
|
|
type TestTicker struct {
|
|
C chan time.Time
|
|
stopped bool
|
|
}
|
|
|
|
// NewTestTicker returns our ticker used within test routines
|
|
func NewTestTicker() *TestTicker {
|
|
c := make(chan time.Time, 1)
|
|
return &TestTicker{
|
|
C: c,
|
|
}
|
|
}
|
|
|
|
func (t *TestTicker) GetChannel() <-chan time.Time {
|
|
return t.C
|
|
}
|
|
|
|
func (t *TestTicker) Stop() {
|
|
t.stopped = true
|
|
}
|
|
|
|
// NextInterval manually sends Time on the ticker channel
|
|
func (t *TestTicker) NextTick() {
|
|
if t.stopped {
|
|
return
|
|
}
|
|
t.C <- time.Now()
|
|
}
|
|
|
|
// Ticker is just a wrap around time.Ticker that allows it
|
|
// to meet the requirements of our interface
|
|
type Ticker struct {
|
|
*time.Ticker
|
|
}
|
|
|
|
// NewTicker returns a normal time.Ticker wrapped to meet our interface
|
|
func NewTicker(d time.Duration) *Ticker {
|
|
return &Ticker{time.NewTicker(d)}
|
|
}
|
|
|
|
func (t *Ticker) GetChannel() <-chan time.Time {
|
|
return t.C
|
|
}
|