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