From c0ae41550d057797f934e8c2d265af250e71cedc Mon Sep 17 00:00:00 2001 From: Christopher Bowman Date: Wed, 1 Jun 2016 18:15:46 +0000 Subject: [PATCH] Add test coverage * Remove extraneous whitespace on a blank line in graphite/render/functions.py * Add tests for movingMedian() * Add tests for movingAverage() * First cut at test coverage of holtWinters* functions. --- webapp/graphite/render/functions.py | 2 +- webapp/tests/test_functions.py | 438 ++++++++++++++++++++++++++++ 2 files changed, 439 insertions(+), 1 deletion(-) diff --git a/webapp/graphite/render/functions.py b/webapp/graphite/render/functions.py index 848b293759..59d00bb543 100644 --- a/webapp/graphite/render/functions.py +++ b/webapp/graphite/render/functions.py @@ -2328,7 +2328,7 @@ def holtWintersConfidenceBands(requestContext, seriesList, delta=3): windowPoints = previewSeconds / data.step deviation = TimeSeries(data.name, data.start + previewSeconds, data.end, data.step, data[windowPoints:]) deviation.pathExpression = data.pathExpression - + seriesLength = len(forecast) i = 0 upperBand = list() diff --git a/webapp/tests/test_functions.py b/webapp/tests/test_functions.py index a32b10b2fe..6a8ed2dccf 100644 --- a/webapp/tests/test_functions.py +++ b/webapp/tests/test_functions.py @@ -587,3 +587,441 @@ def mock_data_fetcher(reqCtx, path_expression): '%.disk.pct_used' ) self.assertEqual(result, expectedResults) + + def test_movingMedian_emptySeriesList(self): + self.assertListEqual(functions.movingMedian({},[],""), []) + + def test_movingMedian_evaluateTokens_returns_none(self): + def gen_seriesList(start=0): + seriesList = [ + TimeSeries('collectd.test-db0.load.value', start+10, start+15, 1, range(start, start+15)), + ] + for series in seriesList: + series.pathExpression = series.name + return seriesList + + seriesList = gen_seriesList(10) + + def mock_evaluateTokens(reqCtx, tokens, replacements=None): + seriesList = [ + TimeSeries('collectd.test-db0.load.value', 10, 25, 1, [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]) + ] + for series in seriesList: + series.pathExpression = series.name + return seriesList + + expectedResults = [ + TimeSeries('movingMedian(collectd.test-db0.load.value,60)', 20, 25, 1, [None, None, None, None, None]) + ] + + with patch('graphite.render.functions.evaluateTokens', mock_evaluateTokens): + result = functions.movingMedian( + { + 'template': {}, + 'args': ({},{}), + 'startTime': datetime(1970, 1, 1, 0, 0, 0, 0, pytz.timezone(settings.TIME_ZONE)), + 'endTime': datetime(1970, 1, 1, 0, 9, 0, 0, pytz.timezone(settings.TIME_ZONE)), + 'localOnly': False, + 'data': [] + }, + seriesList, 10 + ) + self.assertListEqual(result, expectedResults) + + def test_movingMedian_evaluateTokens_returns_empty_list(self): + def gen_seriesList(start=0): + seriesList = [ + TimeSeries('collectd.test-db0.load.value', start+600, start+700, 1, range(start, start+100)), + ] + for series in seriesList: + series.pathExpression = series.name + return seriesList + + seriesList = gen_seriesList(10) + + def mock_evaluateTokens(reqCtx, tokens, replacements=None): + return [] + + expectedResults = [] + + with patch('graphite.render.functions.evaluateTokens', mock_evaluateTokens): + result = functions.movingMedian( + { + 'template': {}, + 'args': ({},{}), + 'startTime': datetime(1970, 1, 1, 0, 0, 0, 0, pytz.timezone(settings.TIME_ZONE)), + 'endTime': datetime(1970, 1, 1, 0, 9, 0, 0, pytz.timezone(settings.TIME_ZONE)), + 'localOnly': False, + 'data': [] + }, + seriesList, 60 + ) + self.assertListEqual(result, expectedResults) + + def test_movingMedian_integerWindowSize(self): + def gen_seriesList(start=0): + seriesList = [ + TimeSeries('collectd.test-db0.load.value', start+600, start+700, 1, range(start, start+100)), + ] + for series in seriesList: + series.pathExpression = series.name + return seriesList + + seriesList = gen_seriesList(10) + + def mock_evaluateTokens(reqCtx, tokens, replacements=None): + return gen_seriesList() + + expectedResults = [ + TimeSeries('movingMedian(collectd.test-db0.load.value,60)', 660, 700, 1, range(30, 70)), + ] + + with patch('graphite.render.functions.evaluateTokens', mock_evaluateTokens): + result = functions.movingMedian( + { + 'template': {}, + 'args': ({},{}), + 'startTime': datetime(1970, 1, 1, 0, 0, 0, 0, pytz.timezone(settings.TIME_ZONE)), + 'endTime': datetime(1970, 1, 1, 0, 9, 0, 0, pytz.timezone(settings.TIME_ZONE)), + 'localOnly': False, + 'data': [] + }, + seriesList, 60 + ) + self.assertListEqual(result, expectedResults) + + def test_movingMedian_stringWindowSize(self): + def gen_seriesList(start=0): + seriesList = [ + TimeSeries('collectd.test-db0.load.value', start+600, start+700, 1, range(start, start+100)), + ] + for series in seriesList: + series.pathExpression = series.name + return seriesList + + seriesList = gen_seriesList(10) + + def mock_evaluateTokens(reqCtx, tokens, replacements=None): + return gen_seriesList() + + expectedResults = [ + TimeSeries('movingMedian(collectd.test-db0.load.value,"-1min")', 660, 700, 1, range(30, 70)), + ] + + with patch('graphite.render.functions.evaluateTokens', mock_evaluateTokens): + result = functions.movingMedian( + { + 'template': {}, + 'args': ({},{}), + 'startTime': datetime(1970, 1, 1, 0, 0, 0, 0, pytz.timezone(settings.TIME_ZONE)), + 'endTime': datetime(1970, 1, 1, 0, 9, 0, 0, pytz.timezone(settings.TIME_ZONE)), + 'localOnly': False, + 'data': [] + }, + seriesList, "-1min" + ) + self.assertListEqual(result, expectedResults) + + def test_movingAverage_emptySeriesList(self): + self.assertListEqual(functions.movingAverage({},[],""), []) + + def test_movingAverage_evaluateTokens_returns_none(self): + def gen_seriesList(start=0): + seriesList = [ + TimeSeries('collectd.test-db0.load.value', start+10, start+15, 1, range(start, start+15)), + ] + for series in seriesList: + series.pathExpression = series.name + return seriesList + + seriesList = gen_seriesList(10) + + def mock_evaluateTokens(reqCtx, tokens, replacements=None): + seriesList = [ + TimeSeries('collectd.test-db0.load.value', 10, 25, 1, [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]) + ] + for series in seriesList: + series.pathExpression = series.name + return seriesList + + expectedResults = [ + TimeSeries('movingAverage(collectd.test-db0.load.value,60)', 20, 25, 1, [None, None, None, None, None]) + ] + + with patch('graphite.render.functions.evaluateTokens', mock_evaluateTokens): + result = functions.movingAverage( + { + 'template': {}, + 'args': ({},{}), + 'startTime': datetime(1970, 1, 1, 0, 0, 0, 0, pytz.timezone(settings.TIME_ZONE)), + 'endTime': datetime(1970, 1, 1, 0, 9, 0, 0, pytz.timezone(settings.TIME_ZONE)), + 'localOnly': False, + 'data': [] + }, + seriesList, 10 + ) + self.assertListEqual(result, expectedResults) + + def test_movingAverage_evaluateTokens_returns_empty_list(self): + def gen_seriesList(start=0): + seriesList = [ + TimeSeries('collectd.test-db0.load.value', start+600, start+700, 1, range(start, start+100)), + ] + for series in seriesList: + series.pathExpression = series.name + return seriesList + + seriesList = gen_seriesList(10) + + def mock_evaluateTokens(reqCtx, tokens, replacements=None): + return [] + + expectedResults = [] + + with patch('graphite.render.functions.evaluateTokens', mock_evaluateTokens): + result = functions.movingAverage( + { + 'template': {}, + 'args': ({},{}), + 'startTime': datetime(1970, 1, 1, 0, 0, 0, 0, pytz.timezone(settings.TIME_ZONE)), + 'endTime': datetime(1970, 1, 1, 0, 9, 0, 0, pytz.timezone(settings.TIME_ZONE)), + 'localOnly': False, + 'data': [] + }, + seriesList, 60 + ) + self.assertListEqual(result, expectedResults) + + def test_movingAverage_integerWindowSize(self): + def gen_seriesList(start=0): + seriesList = [ + TimeSeries('collectd.test-db0.load.value', start+600, start+700, 1, range(start, start+100)), + ] + for series in seriesList: + series.pathExpression = series.name + return seriesList + + seriesList = gen_seriesList(10) + + def mock_evaluateTokens(reqCtx, tokens, replacements=None): + return gen_seriesList() + + def frange(x,y,jump): + while x