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