--- /dev/null
+package trust
+
+import (
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestTrustMetricScores(t *testing.T) {
+ tm := NewMetric()
+ tm.Start()
+
+ // Perfect score
+ tm.GoodEvents(1)
+ score := tm.TrustScore()
+ assert.Equal(t, 100, score)
+
+ // Less than perfect score
+ tm.BadEvents(10)
+ score = tm.TrustScore()
+ assert.NotEqual(t, 100, score)
+ tm.Stop()
+}
+
+func TestTrustMetricConfig(t *testing.T) {
+ // 7 days
+ window := time.Minute * 60 * 24 * 7
+ config := TrustMetricConfig{
+ TrackingWindow: window,
+ IntervalLength: 2 * time.Minute,
+ }
+
+ tm := NewMetricWithConfig(config)
+ tm.Start()
+
+ // The max time intervals should be the TrackingWindow / IntervalLen
+ assert.Equal(t, int(config.TrackingWindow/config.IntervalLength), tm.maxIntervals)
+
+ dc := DefaultConfig()
+ // These weights should still be the default values
+ assert.Equal(t, dc.ProportionalWeight, tm.proportionalWeight)
+ assert.Equal(t, dc.IntegralWeight, tm.integralWeight)
+ tm.Stop()
+ tm.Wait()
+
+ config.ProportionalWeight = 0.3
+ config.IntegralWeight = 0.7
+ tm = NewMetricWithConfig(config)
+ tm.Start()
+
+ // These weights should be equal to our custom values
+ assert.Equal(t, config.ProportionalWeight, tm.proportionalWeight)
+ assert.Equal(t, config.IntegralWeight, tm.integralWeight)
+ tm.Stop()
+ tm.Wait()
+}
+
+// XXX: This test fails non-deterministically
+func _TestTrustMetricStopPause(t *testing.T) {
+ // The TestTicker will provide manual control over
+ // the passing of time within the metric
+ tt := NewTestTicker()
+ tm := NewMetric()
+ tm.SetTicker(tt)
+ tm.Start()
+ // Allow some time intervals to pass and pause
+ tt.NextTick()
+ tt.NextTick()
+ tm.Pause()
+
+ // could be 1 or 2 because Pause and NextTick race
+ first := tm.Copy().numIntervals
+
+ // Allow more time to pass and check the intervals are unchanged
+ tt.NextTick()
+ tt.NextTick()
+ assert.Equal(t, first, tm.Copy().numIntervals)
+
+ // Get the trust metric activated again
+ tm.GoodEvents(5)
+ // Allow some time intervals to pass and stop
+ tt.NextTick()
+ tt.NextTick()
+ tm.Stop()
+ tm.Wait()
+
+ second := tm.Copy().numIntervals
+ // Allow more intervals to pass while the metric is stopped
+ // and check that the number of intervals match
+ tm.NextTimeInterval()
+ tm.NextTimeInterval()
+ // XXX: fails non-deterministically:
+ // expected 5, got 6
+ assert.Equal(t, second+2, tm.Copy().numIntervals)
+
+ if first > second {
+ t.Fatalf("numIntervals should always increase or stay the same over time")
+ }
+}