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