From 726fc1effcc6b66dc2550112b51bd14e76389adf Mon Sep 17 00:00:00 2001 From: Tony Compton Date: Thu, 19 Jul 2018 11:31:48 -0400 Subject: [PATCH] Tests for periodicMetricLister. --- pkg/custom-provider/periodic_metric_lister.go | 4 +- .../periodic_metric_lister_test.go | 69 +++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 pkg/custom-provider/periodic_metric_lister_test.go diff --git a/pkg/custom-provider/periodic_metric_lister.go b/pkg/custom-provider/periodic_metric_lister.go index ce87f5a3..75297982 100644 --- a/pkg/custom-provider/periodic_metric_lister.go +++ b/pkg/custom-provider/periodic_metric_lister.go @@ -71,7 +71,9 @@ func (l *periodicMetricLister) updateMetrics() error { //Cache the result. l.mostRecentResult = result //Let our listener know we've got new data ready for them. - l.callback(result) + if l.callback != nil { + l.callback(result) + } return nil } diff --git a/pkg/custom-provider/periodic_metric_lister_test.go b/pkg/custom-provider/periodic_metric_lister_test.go new file mode 100644 index 00000000..d9548b10 --- /dev/null +++ b/pkg/custom-provider/periodic_metric_lister_test.go @@ -0,0 +1,69 @@ +package provider + +import ( + "testing" + "time" + + prom "github.com/directxman12/k8s-prometheus-adapter/pkg/client" + "github.com/stretchr/testify/require" +) + +type fakeLister struct { + callCount int +} + +func (f *fakeLister) ListAllMetrics() (metricUpdateResult, error) { + f.callCount++ + + return metricUpdateResult{ + series: [][]prom.Series{ + []prom.Series{ + prom.Series{ + Name: "a_series", + }, + }, + }, + }, nil +} + +func TestWhenNewMetricsAvailableCallbackIsInvoked(t *testing.T) { + fakeLister := &fakeLister{} + targetLister, _ := NewPeriodicMetricLister(fakeLister, time.Duration(1000)) + periodicLister := targetLister.(*periodicMetricLister) + + callbackInvoked := false + callback := func(r metricUpdateResult) { + callbackInvoked = true + } + + periodicLister.SetNotificationReceiver(callback) + err := periodicLister.updateMetrics() + require.NoError(t, err) + require.True(t, callbackInvoked) +} + +func TestWhenListingMetricsReturnsCachedValues(t *testing.T) { + fakeLister := &fakeLister{} + targetLister, _ := NewPeriodicMetricLister(fakeLister, time.Duration(1000)) + periodicLister := targetLister.(*periodicMetricLister) + + //We haven't invoked the inner lister yet, so we should have no results. + resultBeforeUpdate, err := periodicLister.ListAllMetrics() + require.NoError(t, err) + require.Equal(t, 0, len(resultBeforeUpdate.series)) + require.Equal(t, 0, fakeLister.callCount) + + //We can simulate waiting for the udpate interval to pass... + //which should result in calling the inner lister to get the metrics. + err = periodicLister.updateMetrics() + require.NoError(t, err) + require.Equal(t, 1, fakeLister.callCount) + + //If we list now, we should return the cached values. + //Make sure we got some results this time + //as well as that we didn't unnecessarily invoke the inner lister. + resultAfterUpdate, err := periodicLister.ListAllMetrics() + require.NoError(t, err) + require.NotEqual(t, 0, len(resultAfterUpdate.series)) + require.Equal(t, 1, fakeLister.callCount) +}