From 127be136080c158ea069f08887c2ec3c30543fde Mon Sep 17 00:00:00 2001 From: Terri Yu Date: Thu, 12 Sep 2013 07:13:43 +0000 Subject: [PATCH] Add timestamp filtering cases in storage tests Fixes bug #1224305 The group by statistics storage tests don't have any test cases for timestamp filtering. The group by statistics API tests already have test cases for timestamp filtering with the same test database, so these test cases are simply copied over to the storage tests. The added test cases are group by a) single field with start timestamp after all samples b) single field with end timestamp before all samples c) single field with start timestamp d) single field with end timestamp e) single field with start and end timestamps f) single field with start and end timestamps and query filter g) single field with start and end timestamps and period h) single field with start and end timestamps, query filter, and period Change-Id: I2896e6bcdca5a87b9ce4262599e77832274943b4 --- tests/storage/test_storage_scenarios.py | 310 ++++++++++++++++++++++++ 1 file changed, 310 insertions(+) diff --git a/tests/storage/test_storage_scenarios.py b/tests/storage/test_storage_scenarios.py index 236dd6db8..df3d52b86 100644 --- a/tests/storage/test_storage_scenarios.py +++ b/tests/storage/test_storage_scenarios.py @@ -1460,6 +1460,316 @@ class StatisticsGroupByTest(DBTestBase, # with a query filter and period grouping. pass + def test_group_by_start_timestamp_after(self): + f = storage.SampleFilter( + meter='instance', + start=datetime.datetime(2013, 8, 1, 17, 28, 1), + ) + results = list(self.conn.get_meter_statistics(f, + groupby=['project_id'])) + + self.assertEqual(results, []) + + def test_group_by_end_timestamp_before(self): + f = storage.SampleFilter( + meter='instance', + end=datetime.datetime(2013, 8, 1, 10, 10, 59), + ) + results = list(self.conn.get_meter_statistics(f, + groupby=['project_id'])) + + self.assertEqual(results, []) + + def test_group_by_start_timestamp(self): + f = storage.SampleFilter( + meter='instance', + start=datetime.datetime(2013, 8, 1, 14, 58), + ) + results = list(self.conn.get_meter_statistics(f, + groupby=['project_id'])) + self.assertEqual(len(results), 2) + groupby_list = [r.groupby for r in results] + groupby_keys_set = set(x for sub_dict in groupby_list + for x in sub_dict.keys()) + groupby_vals_set = set(x for sub_dict in groupby_list + for x in sub_dict.values()) + self.assertEqual(groupby_keys_set, set(['project_id'])) + self.assertEqual(groupby_vals_set, set(['project-1', 'project-2'])) + + for r in results: + if r.groupby == {'project_id': 'project-1'}: + self.assertEqual(r.count, 2) + self.assertEqual(r.unit, 's') + self.assertEqual(r.min, 2) + self.assertEqual(r.max, 2) + self.assertEqual(r.sum, 4) + self.assertEqual(r.avg, 2) + elif r.groupby == {'project_id': 'project-2'}: + self.assertEqual(r.count, 2) + self.assertEqual(r.unit, 's') + self.assertEqual(r.min, 2) + self.assertEqual(r.max, 4) + self.assertEqual(r.sum, 6) + self.assertEqual(r.avg, 3) + + def test_group_by_end_timestamp(self): + f = storage.SampleFilter( + meter='instance', + end=datetime.datetime(2013, 8, 1, 11, 45), + ) + results = list(self.conn.get_meter_statistics(f, + groupby=['project_id'])) + self.assertEqual(len(results), 1) + groupby_list = [r.groupby for r in results] + groupby_keys_set = set(x for sub_dict in groupby_list + for x in sub_dict.keys()) + groupby_vals_set = set(x for sub_dict in groupby_list + for x in sub_dict.values()) + self.assertEqual(groupby_keys_set, set(['project_id'])) + self.assertEqual(groupby_vals_set, set(['project-1'])) + + for r in results: + if r.groupby == {'project_id': 'project-1'}: + self.assertEqual(r.count, 3) + self.assertEqual(r.unit, 's') + self.assertEqual(r.min, 1) + self.assertEqual(r.max, 4) + self.assertEqual(r.sum, 6) + self.assertEqual(r.avg, 2) + + def test_group_by_start_end_timestamp(self): + f = storage.SampleFilter( + meter='instance', + start=datetime.datetime(2013, 8, 1, 8, 17, 3), + end=datetime.datetime(2013, 8, 1, 23, 59, 59), + ) + results = list(self.conn.get_meter_statistics(f, + groupby=['project_id'])) + self.assertEqual(len(results), 2) + groupby_list = [r.groupby for r in results] + groupby_keys_set = set(x for sub_dict in groupby_list + for x in sub_dict.keys()) + groupby_vals_set = set(x for sub_dict in groupby_list + for x in sub_dict.values()) + self.assertEqual(groupby_keys_set, set(['project_id'])) + self.assertEqual(groupby_vals_set, set(['project-1', 'project-2'])) + + for r in results: + if r.groupby == {'project_id': 'project-1'}: + self.assertEqual(r.count, 5) + self.assertEqual(r.unit, 's') + self.assertEqual(r.min, 1) + self.assertEqual(r.max, 4) + self.assertEqual(r.sum, 10) + self.assertEqual(r.avg, 2) + elif r.groupby == {'project_id': 'project-2'}: + self.assertEqual(r.count, 2) + self.assertEqual(r.unit, 's') + self.assertEqual(r.min, 2) + self.assertEqual(r.max, 4) + self.assertEqual(r.sum, 6) + self.assertEqual(r.avg, 3) + + def test_group_by_start_end_timestamp_with_query_filter(self): + f = storage.SampleFilter( + meter='instance', + project='project-1', + start=datetime.datetime(2013, 8, 1, 11, 1), + end=datetime.datetime(2013, 8, 1, 20, 0), + ) + results = list(self.conn.get_meter_statistics(f, + groupby=['resource_id'])) + groupby_list = [r.groupby for r in results] + groupby_keys_set = set(x for sub_dict in groupby_list + for x in sub_dict.keys()) + groupby_vals_set = set(x for sub_dict in groupby_list + for x in sub_dict.values()) + self.assertEqual(groupby_keys_set, set(['resource_id'])) + self.assertEqual(groupby_vals_set, set(['resource-1', 'resource-3'])) + + for r in results: + if r.groupby == {'resource_id': 'resource-1'}: + self.assertEqual(r.count, 2) + self.assertEqual(r.unit, 's') + self.assertEqual(r.min, 2) + self.assertEqual(r.max, 2) + self.assertEqual(r.sum, 4) + self.assertEqual(r.avg, 2) + elif r.groupby == {'resource_id': 'resource-3'}: + self.assertEqual(r.count, 1) + self.assertEqual(r.unit, 's') + self.assertEqual(r.min, 4) + self.assertEqual(r.max, 4) + self.assertEqual(r.sum, 4) + self.assertEqual(r.avg, 4) + + def test_group_by_start_end_timestamp_with_period(self): + f = storage.SampleFilter( + meter='instance', + start=datetime.datetime(2013, 8, 1, 14, 0), + end=datetime.datetime(2013, 8, 1, 17, 0), + ) + results = list(self.conn.get_meter_statistics(f, + period=3600, + groupby=['project_id'])) + self.assertEqual(len(results), 3) + groupby_list = [r.groupby for r in results] + groupby_keys_set = set(x for sub_dict in groupby_list + for x in sub_dict.keys()) + groupby_vals_set = set(x for sub_dict in groupby_list + for x in sub_dict.values()) + self.assertEqual(groupby_keys_set, set(['project_id'])) + self.assertEqual(groupby_vals_set, set(['project-1', 'project-2'])) + period_start_set = set([r.period_start for r in results]) + period_start_valid = set([datetime.datetime(2013, 8, 1, 14, 0), + datetime.datetime(2013, 8, 1, 15, 0), + datetime.datetime(2013, 8, 1, 16, 0)]) + self.assertEqual(period_start_set, period_start_valid) + + for r in results: + if (r.groupby == {'project_id': 'project-1'} and + r.period_start == datetime.datetime(2013, 8, 1, 14, 0)): + self.assertEqual(r.count, 1) + self.assertEqual(r.unit, 's') + self.assertEqual(r.min, 2) + self.assertEqual(r.max, 2) + self.assertEqual(r.sum, 2) + self.assertEqual(r.avg, 2) + self.assertEqual(r.duration, 0) + self.assertEqual(r.duration_start, + datetime.datetime(2013, 8, 1, 14, 59)) + self.assertEqual(r.duration_end, + datetime.datetime(2013, 8, 1, 14, 59)) + self.assertEqual(r.period, 3600) + self.assertEqual(r.period_end, + datetime.datetime(2013, 8, 1, 15, 0)) + elif (r.groupby == {'project_id': 'project-1'} and + r.period_start == datetime.datetime(2013, 8, 1, 16, 0)): + self.assertEqual(r.count, 1) + self.assertEqual(r.unit, 's') + self.assertEqual(r.min, 2) + self.assertEqual(r.max, 2) + self.assertEqual(r.sum, 2) + self.assertEqual(r.avg, 2) + self.assertEqual(r.duration, 0) + self.assertEqual(r.duration_start, + datetime.datetime(2013, 8, 1, 16, 10)) + self.assertEqual(r.duration_end, + datetime.datetime(2013, 8, 1, 16, 10)) + self.assertEqual(r.period, 3600) + self.assertEqual(r.period_end, + datetime.datetime(2013, 8, 1, 17, 0)) + elif (r.groupby == {'project_id': 'project-2'} and + r.period_start == datetime.datetime(2013, 8, 1, 15, 0)): + self.assertEqual(r.count, 1) + self.assertEqual(r.unit, 's') + self.assertEqual(r.min, 2) + self.assertEqual(r.max, 2) + self.assertEqual(r.sum, 2) + self.assertEqual(r.avg, 2) + self.assertEqual(r.duration, 0) + self.assertEqual(r.duration_start, + datetime.datetime(2013, 8, 1, 15, 37)) + self.assertEqual(r.duration_end, + datetime.datetime(2013, 8, 1, 15, 37)) + self.assertEqual(r.period, 3600) + self.assertEqual(r.period_end, + datetime.datetime(2013, 8, 1, 16, 0)) + else: + self.assertNotEqual([r.groupby, r.period_start], + [{'project_id': 'project-1'}, + datetime.datetime(2013, 8, 1, 15, 0)]) + self.assertNotEqual([r.groupby, r.period_start], + [{'project_id': 'project-2'}, + datetime.datetime(2013, 8, 1, 14, 0)]) + self.assertNotEqual([r.groupby, r.period_start], + [{'project_id': 'project-2'}, + datetime.datetime(2013, 8, 1, 16, 0)]) + + def test_group_by_start_end_timestamp_with_query_filter_and_period(self): + f = storage.SampleFilter( + meter='instance', + source='source-1', + start=datetime.datetime(2013, 8, 1, 10, 0), + end=datetime.datetime(2013, 8, 1, 18, 0), + ) + results = list(self.conn.get_meter_statistics(f, + period=7200, + groupby=['project_id'])) + self.assertEqual(len(results), 3) + groupby_list = [r.groupby for r in results] + groupby_keys_set = set(x for sub_dict in groupby_list + for x in sub_dict.keys()) + groupby_vals_set = set(x for sub_dict in groupby_list + for x in sub_dict.values()) + self.assertEqual(groupby_keys_set, set(['project_id'])) + self.assertEqual(groupby_vals_set, set(['project-1', 'project-2'])) + period_start_set = set([r.period_start for r in results]) + period_start_valid = set([datetime.datetime(2013, 8, 1, 10, 0), + datetime.datetime(2013, 8, 1, 14, 0), + datetime.datetime(2013, 8, 1, 16, 0)]) + self.assertEqual(period_start_set, period_start_valid) + + for r in results: + if (r.groupby == {'project_id': 'project-1'} and + r.period_start == datetime.datetime(2013, 8, 1, 10, 0)): + self.assertEqual(r.count, 2) + self.assertEqual(r.unit, 's') + self.assertEqual(r.min, 1) + self.assertEqual(r.max, 1) + self.assertEqual(r.sum, 2) + self.assertEqual(r.avg, 1) + self.assertEqual(r.duration, 1740) + self.assertEqual(r.duration_start, + datetime.datetime(2013, 8, 1, 10, 11)) + self.assertEqual(r.duration_end, + datetime.datetime(2013, 8, 1, 10, 40)) + self.assertEqual(r.period, 7200) + self.assertEqual(r.period_end, + datetime.datetime(2013, 8, 1, 12, 0)) + elif (r.groupby == {'project_id': 'project-1'} and + r.period_start == datetime.datetime(2013, 8, 1, 14, 0)): + self.assertEqual(r.count, 1) + self.assertEqual(r.unit, 's') + self.assertEqual(r.min, 2) + self.assertEqual(r.max, 2) + self.assertEqual(r.sum, 2) + self.assertEqual(r.avg, 2) + self.assertEqual(r.duration, 0) + self.assertEqual(r.duration_start, + datetime.datetime(2013, 8, 1, 14, 59)) + self.assertEqual(r.duration_end, + datetime.datetime(2013, 8, 1, 14, 59)) + self.assertEqual(r.period, 7200) + self.assertEqual(r.period_end, + datetime.datetime(2013, 8, 1, 16, 0)) + elif (r.groupby == {'project_id': 'project-2'} and + r.period_start == datetime.datetime(2013, 8, 1, 16, 0)): + self.assertEqual(r.count, 1) + self.assertEqual(r.unit, 's') + self.assertEqual(r.min, 4) + self.assertEqual(r.max, 4) + self.assertEqual(r.sum, 4) + self.assertEqual(r.avg, 4) + self.assertEqual(r.duration, 0) + self.assertEqual(r.duration_start, + datetime.datetime(2013, 8, 1, 17, 28)) + self.assertEqual(r.duration_end, + datetime.datetime(2013, 8, 1, 17, 28)) + self.assertEqual(r.period, 7200) + self.assertEqual(r.period_end, + datetime.datetime(2013, 8, 1, 18, 0)) + else: + self.assertNotEqual([r.groupby, r.period_start], + [{'project_id': 'project-1'}, + datetime.datetime(2013, 8, 1, 16, 0)]) + self.assertNotEqual([r.groupby, r.period_start], + [{'project_id': 'project-2'}, + datetime.datetime(2013, 8, 1, 10, 0)]) + self.assertNotEqual([r.groupby, r.period_start], + [{'project_id': 'project-2'}, + datetime.datetime(2013, 8, 1, 14, 0)]) + class CounterDataTypeTest(DBTestBase, tests_db.MixinTestsWithBackendScenarios):