package trust import ( "context" "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestTrustMetricScores(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() tm := NewMetric() err := tm.Start(ctx) require.NoError(t, err) // 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) err = tm.Stop() require.NoError(t, err) } func TestTrustMetricConfig(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() // 7 days window := time.Minute * 60 * 24 * 7 config := MetricConfig{ TrackingWindow: window, IntervalLength: 2 * time.Minute, } tm := NewMetricWithConfig(config) err := tm.Start(ctx) require.NoError(t, err) // 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) err = tm.Stop() require.NoError(t, err) tm.Wait() config.ProportionalWeight = 0.3 config.IntegralWeight = 0.7 tm = NewMetricWithConfig(config) err = tm.Start(ctx) require.NoError(t, err) // These weights should be equal to our custom values assert.Equal(t, config.ProportionalWeight, tm.proportionalWeight) assert.Equal(t, config.IntegralWeight, tm.integralWeight) err = tm.Stop() require.NoError(t, err) tm.Wait() } func TestTrustMetricCopyNilPointer(t *testing.T) { var tm *Metric ctm := tm.Copy() assert.Nil(t, ctm) } // XXX: This test fails non-deterministically //nolint:unused,deadcode func _TestTrustMetricStopPause(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() // The TestTicker will provide manual control over // the passing of time within the metric tt := NewTestTicker() tm := NewMetric() tm.SetTicker(tt) err := tm.Start(ctx) require.NoError(t, err) // 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() err = tm.Stop() require.NoError(t, err) 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") } }