graph_revisions_test.py revision edfe2194ee8a857cc1e78b4e4020f9b5e7210029
1edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair# Copyright 2015 The Chromium Authors. All rights reserved. 2edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair# Use of this source code is governed by a BSD-style license that can be 3edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair# found in the LICENSE file. 4edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 5edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair"""Unit tests for graph_revisions module.""" 6edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 7edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclairimport datetime 8edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclairimport json 9edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclairimport unittest 10edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 11edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclairimport webapp2 12edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclairimport webtest 13edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 14edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclairfrom dashboard import graph_revisions 15edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclairfrom dashboard import stored_object 16edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclairfrom dashboard import testing_common 17edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclairfrom dashboard import utils 18edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclairfrom dashboard.models import graph_data 19edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 20edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 21edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclairclass GraphRevisionsTest(testing_common.TestCase): 22edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 23edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair def setUp(self): 24edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair super(GraphRevisionsTest, self).setUp() 25edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair app = webapp2.WSGIApplication( 26edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair [('/graph_revisions', graph_revisions.GraphRevisionsHandler)]) 27edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair self.testapp = webtest.TestApp(app) 28edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 29edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair def _AddMockData(self): 30edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair """Adds mock data to the datastore, not updating stored_object.""" 31edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair master_key = graph_data.Master(id='ChromiumPerf').put() 32edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair for bot_name in ['win7', 'mac']: 33edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair bot_key = graph_data.Bot(id=bot_name, parent=master_key).put() 34edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair test_key = graph_data.Test(id='dromaeo', parent=bot_key).put() 35edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair subtest_key = graph_data.Test( 36edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair id='dom', parent=test_key, has_rows=True).put() 37edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair test_container_key = utils.GetTestContainerKey(subtest_key) 38edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair for rev in range(15000, 16000, 5): 39edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair row = graph_data.Row(parent=test_container_key, 40edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair id=rev, value=float(rev * 2.5)) 41edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair row.timestamp = datetime.datetime(2013, 8, 1) 42edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair row.put() 43edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 44edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair def testPost_ReturnsAndCachesCorrectRevisions(self): 45edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair self._AddMockData() 46edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair response = self.testapp.post( 47edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair '/graph_revisions', {'test_path': 'ChromiumPerf/win7/dromaeo/dom'}) 48edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 49edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair cached_rows = stored_object.Get( 50edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 'externally_visible__num_revisions_ChromiumPerf/win7/dromaeo/dom') 51edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair for index, row in enumerate(json.loads(response.body)): 52edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair expected_rev = 15000 + (index * 5) 53edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair expected_value = int(expected_rev) * 2.5 54edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair expected_timestamp = utils.TimestampMilliseconds( 55edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair datetime.datetime(2013, 8, 1)) 56edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair self.assertEqual([expected_rev, expected_value, expected_timestamp], row) 57edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair self.assertEqual([expected_rev, expected_value, expected_timestamp], 58edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair cached_rows[index]) 59edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 60edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair def testPost_CacheSet_ReturnsCachedRevisions(self): 61edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair stored_object.Set( 62edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 'externally_visible__num_revisions_ChromiumPerf/win7/dromaeo/dom', 63edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair [[1, 2, 3]]) 64edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair response = self.testapp.post( 65edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair '/graph_revisions', {'test_path': 'ChromiumPerf/win7/dromaeo/dom'}) 66edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair self.assertEqual([[1, 2, 3]], json.loads(response.body)) 67edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 68edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair def testAddRowsToCache(self): 69edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair self._AddMockData() 70edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair rows = [] 71edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 72edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair stored_object.Set( 73edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 'externally_visible__num_revisions_ChromiumPerf/win7/dromaeo/dom', 74edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair [[10, 2, 3], [15, 4, 5], [100, 6, 7]]) 75edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 76edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair test_key = utils.TestKey('ChromiumPerf/win7/dromaeo/dom') 77edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair test_container_key = utils.GetTestContainerKey(test_key) 78edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair ts1 = datetime.datetime(2013, 1, 1) 79edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair row1 = graph_data.Row(parent=test_container_key, 80edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair id=1, value=9, timestamp=ts1) 81edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair rows.append(row1) 82edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair ts2 = datetime.datetime(2013, 1, 2) 83edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair row2 = graph_data.Row(parent=test_container_key, 84edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair id=12, value=90, timestamp=ts2) 85edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair rows.append(row2) 86edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair ts3 = datetime.datetime(2013, 1, 3) 87edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair row3 = graph_data.Row(parent=test_container_key, 88edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair id=102, value=99, timestamp=ts3) 89edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair rows.append(row3) 90edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair graph_revisions.AddRowsToCache(rows) 91edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 92edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair self.assertEqual( 93edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair [[1, 9, utils.TimestampMilliseconds(ts1)], 94edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair [10, 2, 3], 95edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair [12, 90, utils.TimestampMilliseconds(ts2)], 96edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair [15, 4, 5], [100, 6, 7], 97edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair [102, 99, utils.TimestampMilliseconds(ts3)]], 98edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair stored_object.Get('externally_visible__num_revisions_' 99edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 'ChromiumPerf/win7/dromaeo/dom')) 100edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 101edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 102edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclairif __name__ == '__main__': 103edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair unittest.main() 104