Changeset 109418 in webkit


Ignore:
Timestamp:
Mar 1, 2012 1:55:49 PM (12 years ago)
Author:
rniwa@webkit.org
Message:

Perf-o-matic: generate dashboard images for 30, 90, and 365 days
https://bugs.webkit.org/show_bug.cgi?id=80016

Reviewed by Eric Seidel.

Add the ability to generate graphs for 30, 90, and 365 day graphs but only occasionally
according to the heuristics in DashboardImage.needs_update.

Also fix a bug in Runs.chart_params that y-axis grid was set to an incorrect value.

  • Websites/webkit-perf.appspot.com/controller.py:

(schedule_runs_update):
(RunsChartHandler.post):

  • Websites/webkit-perf.appspot.com/json_generators.py:

(Runs.chart_params):

  • Websites/webkit-perf.appspot.com/json_generators_unittest.py:

(RunsTest.test_chart_params_with_value):

  • Websites/webkit-perf.appspot.com/models.py:

(DashboardImage):
(DashboardImage.needs_update):

  • Websites/webkit-perf.appspot.com/models_unittest.py:

(HelperTests._assert_there_is_exactly_one_id_holder_and_matches):
(HelperTests.test_create_in_transaction_with_numeric_id_holder.execute):
(HelperTests.test_create_in_transaction_with_numeric_id_holder):
(HelperTests.test_failing_in_create_in_transaction_with_numeric_id_holder):
(HelperTests.test_raising_in_create_in_transaction_with_numeric_id_holder):
(HelperTests.test_delete_model_with_numeric_id_holder.execute):
(HelperTests.test_delete_model_with_numeric_id_holder):
(HelperTests.test_model_from_numeric_id.execute):
(HelperTests):
(HelperTests.test_model_from_numeric_id):
(BranchTests.test_create_if_possible):
(PlatformTests.test_create_if_possible):
(BuilderTests.test_create):
(BuilderTests.test_update_password):
(BuilderTests.test_hashed_password):
(BuilderTests.test_authenticate):
(_create_some_builder):
(_create_build):
(BuildTests.test_get_or_insert_from_log):
(TestModelTests.test_update_or_insert):
(TestModelTests.test_update_or_insert_to_update):
(TestModelTests.test_merge):
(TestResultTests.test_get_or_insert_value):
(TestResultTests.test_get_or_insert_stat_value):
(TestResultTests.test_replace_to_change_test_name):
(TestResultTests.test_replace_to_change_test_name_with_stat_value):
(TestResultTests.test_replace_to_change_test_name_overrides_conflicting_result):
(ReportLogTests._create_log_with_payload):
(ReportLogTests.test_builder):
(ReportLogTests.test_branch):
(ReportLogTests.test_platform):
(PersistentCacheTests._assert_persistent_cache):
(PersistentCacheTests.test_set):
(PersistentCacheTests.test_get):
(DashboardImageTests):
(DashboardImageTests.test_needs_update):

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/ChangeLog

    r109402 r109418  
     12012-03-01  Ryosuke Niwa  <rniwa@webkit.org>
     2
     3        Perf-o-matic: generate dashboard images for 30, 90, and 365 days
     4        https://bugs.webkit.org/show_bug.cgi?id=80016
     5
     6        Reviewed by Eric Seidel.
     7
     8        Add the ability to generate graphs for 30, 90, and 365 day graphs but only occasionally
     9        according to the heuristics in DashboardImage.needs_update.
     10
     11        Also fix a bug in Runs.chart_params that y-axis grid was set to an incorrect value.
     12 
     13        * Websites/webkit-perf.appspot.com/controller.py:
     14        (schedule_runs_update):
     15        (RunsChartHandler.post):
     16        * Websites/webkit-perf.appspot.com/json_generators.py:
     17        (Runs.chart_params):
     18        * Websites/webkit-perf.appspot.com/json_generators_unittest.py:
     19        (RunsTest.test_chart_params_with_value):
     20        * Websites/webkit-perf.appspot.com/models.py:
     21        (DashboardImage):
     22        (DashboardImage.needs_update):
     23        * Websites/webkit-perf.appspot.com/models_unittest.py:
     24        (HelperTests._assert_there_is_exactly_one_id_holder_and_matches):
     25        (HelperTests.test_create_in_transaction_with_numeric_id_holder.execute):
     26        (HelperTests.test_create_in_transaction_with_numeric_id_holder):
     27        (HelperTests.test_failing_in_create_in_transaction_with_numeric_id_holder):
     28        (HelperTests.test_raising_in_create_in_transaction_with_numeric_id_holder):
     29        (HelperTests.test_delete_model_with_numeric_id_holder.execute):
     30        (HelperTests.test_delete_model_with_numeric_id_holder):
     31        (HelperTests.test_model_from_numeric_id.execute):
     32        (HelperTests):
     33        (HelperTests.test_model_from_numeric_id):
     34        (BranchTests.test_create_if_possible):
     35        (PlatformTests.test_create_if_possible):
     36        (BuilderTests.test_create):
     37        (BuilderTests.test_update_password):
     38        (BuilderTests.test_hashed_password):
     39        (BuilderTests.test_authenticate):
     40        (_create_some_builder):
     41        (_create_build):
     42        (BuildTests.test_get_or_insert_from_log):
     43        (TestModelTests.test_update_or_insert):
     44        (TestModelTests.test_update_or_insert_to_update):
     45        (TestModelTests.test_merge):
     46        (TestResultTests.test_get_or_insert_value):
     47        (TestResultTests.test_get_or_insert_stat_value):
     48        (TestResultTests.test_replace_to_change_test_name):
     49        (TestResultTests.test_replace_to_change_test_name_with_stat_value):
     50        (TestResultTests.test_replace_to_change_test_name_overrides_conflicting_result):
     51        (ReportLogTests._create_log_with_payload):
     52        (ReportLogTests.test_builder):
     53        (ReportLogTests.test_branch):
     54        (ReportLogTests.test_platform):
     55        (PersistentCacheTests._assert_persistent_cache):
     56        (PersistentCacheTests.test_set):
     57        (PersistentCacheTests.test_get):
     58        (DashboardImageTests):
     59        (DashboardImageTests.test_needs_update):
     60
    1612012-03-01  Kangil Han  <kangil.han@samsung.com>
    262
  • trunk/Websites/webkit-perf.appspot.com/controller.py

    r109320 r109418  
    100100def schedule_runs_update(test_id, branch_id, platform_id):
    101101    taskqueue.add(url='/api/test/runs/update', params={'id': test_id, 'branchid': branch_id, 'platformid': platform_id})
    102     taskqueue.add(url='/api/test/runs/chart', params={'id': test_id, 'branchid': branch_id, 'platformid': platform_id,
    103         'displayDays': 7})
     102    for display_days in [7, 30, 90, 365]:
     103        if DashboardImage.needs_update(branch_id, test_id, platform_id, display_days):
     104            taskqueue.add(url='/api/test/runs/chart', params={'id': test_id, 'branchid': branch_id, 'platformid': platform_id,
     105                'displayDays': display_days})
    104106
    105107
     
    168170            image=dashboard_chart_file.read()).put()
    169171
    170         self.response.out.write('Fetched http://chart.googleapis.com/chart?%s' % urllib.urlencode(params))
    171 
    172172
    173173class DashboardImageHandler(webapp2.RequestHandler):
  • trunk/Websites/webkit-perf.appspot.com/json_generators.py

    r109190 r109418  
    183183            'stat': 'ok'}
    184184
    185     def chart_params(self, display_days, now=datetime.now()):
     185    def chart_params(self, display_days, now=datetime.now().replace(hour=12, minute=0, second=0, microsecond=0)):
    186186        chart_data_x = []
    187187        chart_data_y = []
     
    197197            chart_data_y.append(result.value)
    198198
    199         dates = [end_time + timedelta(day - display_days) for day in range(0, display_days + 1)]
     199        dates = [end_time - timedelta(display_days / 7.0 * (7 - i)) for i in range(0, 8)]
    200200
    201201        y_max = max(chart_data_y) * 1.1
    202         y_grid_step = y_max / 5
    203         y_axis_label_step = int(y_grid_step + 0.5)  # This won't work for decimal numbers
     202        y_axis_label_step = int(y_max / 5 + 0.5)  # This won't work for decimal numbers
    204203
    205204        return {
     
    212211            'chs': '360x240',  # Image size: 360px by 240px
    213212            'chco': 'ff0000',  # Plot line color
    214             'chg': '%f,%f,0,0' % (100 / (len(dates) - 1), y_grid_step),  # X, Y grid line step sizes - max for X is 100.
     213            'chg': '%f,20,0,0' % (100 / (len(dates) - 1)),  # X, Y grid line step sizes - max is 100.
    215214            'chls': '3',  # Line thickness
    216215            'chf': 'bg,s,eff6fd',  # Transparent background
  • trunk/Websites/webkit-perf.appspot.com/json_generators_unittest.py

    r109190 r109418  
    331331        self.assertEqual(y_min, 0)
    332332        self.assertEqual(y_max, int(52 * 1.1))
    333         self.assertEqual(split_as_int(params['chg']), [int(100 / 7), int(52 * 1.1 / 5), 0, 0])
    334 
     333        self.assertEqual(split_as_int(params['chg']), [int(100 / 7), 20, 0, 0])
     334
     335        params = Runs(some_branch, some_platform, 'some-test').chart_params(14, end_time)
     336        self.assertEqual(params['chxl'], '0:|Feb 14|Feb 16|Feb 18|Feb 20|Feb 22|Feb 24|Feb 26|Feb 28')
     337        self.assertEqual(split_as_int(params['chxr']), [1, 0, 57, int(52 * 1.1 / 5 + 0.5)])
     338        x_min, x_max, y_min, y_max = split_as_int(params['chds'])
     339        self.assertEqual(datetime.fromtimestamp(x_min), datetime(2011, 2, 14, 12, 0, 0))
     340        self.assertEqual(datetime.fromtimestamp(x_max), end_time)
     341        self.assertEqual(y_min, 0)
     342        self.assertEqual(y_max, int(52 * 1.1))
     343        self.assertEqual(split_as_int(params['chg']), [int(100 / 7), 20, 0, 0])
    335344
    336345
  • trunk/Websites/webkit-perf.appspot.com/models.py

    r109190 r109418  
    3030import hashlib
    3131import json
     32import math
    3233import re
    3334
    3435from datetime import datetime
     36from datetime import timedelta
    3537from google.appengine.ext import db
    3638from google.appengine.api import memcache
     
    327329class DashboardImage(db.Model):
    328330    image = db.BlobProperty(required=True)
     331    createdAt = db.DateTimeProperty(required=True, auto_now=True)
     332
     333    @classmethod
     334    def needs_update(cls, branch_id, platform_id, test_id, display_days, now=datetime.now()):
     335        if display_days < 10:
     336            return True
     337        image = DashboardImage.get_by_key_name(cls.key_name(branch_id, platform_id, test_id, display_days))
     338        duration = math.sqrt(display_days) / 10
     339        # e.g. 13 hours for 30 days, 23 hours for 90 days, and 46 hours for 365 days
     340        return not image or image.createdAt < now - timedelta(duration)
    329341
    330342    @staticmethod
  • trunk/Websites/webkit-perf.appspot.com/models_unittest.py

    r109057 r109418  
    3232
    3333from datetime import datetime
     34from datetime import timedelta
    3435from google.appengine.api import memcache
    3536from google.appengine.ext import testbed
    3637from time import mktime
     38
     39from models import NumericIdHolder
     40from models import Branch
     41from models import Platform
     42from models import Builder
     43from models import Build
     44from models import Test
     45from models import TestResult
     46from models import ReportLog
     47from models import PersistentCache
     48from models import DashboardImage
     49from models import create_in_transaction_with_numeric_id_holder
     50from models import delete_model_with_numeric_id_holder
     51from models import model_from_numeric_id
    3752
    3853
     
    6681class HelperTests(DataStoreTestsBase):
    6782    def _assert_there_is_exactly_one_id_holder_and_matches(self, id):
    68         id_holders = models.NumericIdHolder.all().fetch(5)
     83        id_holders = NumericIdHolder.all().fetch(5)
    6984        self.assertEqual(len(id_holders), 1)
    7085        self.assertTrue(id_holders[0])
     
    7489
    7590        def execute(id):
    76             return models.Branch(id=id, name='some branch', key_name='some-branch').put()
    77 
    78         self.assertThereIsNoInstanceOf(models.Branch)
    79         self.assertThereIsNoInstanceOf(models.NumericIdHolder)
    80 
    81         self.assertTrue(models.create_in_transaction_with_numeric_id_holder(execute))
    82 
    83         branches = models.Branch.all().fetch(5)
     91            return Branch(id=id, name='some branch', key_name='some-branch').put()
     92
     93        self.assertThereIsNoInstanceOf(Branch)
     94        self.assertThereIsNoInstanceOf(NumericIdHolder)
     95
     96        self.assertTrue(create_in_transaction_with_numeric_id_holder(execute))
     97
     98        branches = Branch.all().fetch(5)
    8499        self.assertEqual(len(branches), 1)
    85100        self.assertEqual(branches[0].name, 'some branch')
     
    93108            return None
    94109
    95         self.assertThereIsNoInstanceOf(models.Branch)
    96         self.assertThereIsNoInstanceOf(models.NumericIdHolder)
    97 
    98         self.assertFalse(models.create_in_transaction_with_numeric_id_holder(execute))
    99 
    100         self.assertThereIsNoInstanceOf(models.Branch)
    101         self.assertThereIsNoInstanceOf(models.NumericIdHolder)
     110        self.assertThereIsNoInstanceOf(Branch)
     111        self.assertThereIsNoInstanceOf(NumericIdHolder)
     112
     113        self.assertFalse(create_in_transaction_with_numeric_id_holder(execute))
     114
     115        self.assertThereIsNoInstanceOf(Branch)
     116        self.assertThereIsNoInstanceOf(NumericIdHolder)
    102117
    103118    def test_raising_in_create_in_transaction_with_numeric_id_holder(self):
     
    107122            return None
    108123
    109         self.assertThereIsNoInstanceOf(models.Branch)
    110         self.assertThereIsNoInstanceOf(models.NumericIdHolder)
    111 
    112         self.assertRaises(TypeError, models.create_in_transaction_with_numeric_id_holder, (execute))
    113 
    114         self.assertThereIsNoInstanceOf(models.Branch)
    115         self.assertThereIsNoInstanceOf(models.NumericIdHolder)
     124        self.assertThereIsNoInstanceOf(Branch)
     125        self.assertThereIsNoInstanceOf(NumericIdHolder)
     126
     127        self.assertRaises(TypeError, create_in_transaction_with_numeric_id_holder, (execute))
     128
     129        self.assertThereIsNoInstanceOf(Branch)
     130        self.assertThereIsNoInstanceOf(NumericIdHolder)
    116131
    117132    def test_delete_model_with_numeric_id_holder(self):
    118133
    119134        def execute(id):
    120             return models.Branch(id=id, name='some branch', key_name='some-branch').put()
    121 
    122         branch = models.Branch.get(models.create_in_transaction_with_numeric_id_holder(execute))
     135            return Branch(id=id, name='some branch', key_name='some-branch').put()
     136
     137        branch = Branch.get(create_in_transaction_with_numeric_id_holder(execute))
    123138        self.assertOnlyInstance(branch)
    124139
    125         models.delete_model_with_numeric_id_holder(branch)
    126 
    127         self.assertThereIsNoInstanceOf(models.Branch)
    128         self.assertThereIsNoInstanceOf(models.NumericIdHolder)
     140        delete_model_with_numeric_id_holder(branch)
     141
     142        self.assertThereIsNoInstanceOf(Branch)
     143        self.assertThereIsNoInstanceOf(NumericIdHolder)
    129144
    130145    def test_model_from_numeric_id(self):
    131146
    132147        def execute(id):
    133             return models.Branch(id=id, name='some branch', key_name='some-branch').put()
    134 
    135         branch = models.Branch.get(models.create_in_transaction_with_numeric_id_holder(execute))
    136 
    137         self.assertEqual(models.model_from_numeric_id(branch.id, models.Branch).key(), branch.key())
    138         self.assertEqual(models.model_from_numeric_id(branch.id + 1, models.Branch), None)
    139         models.delete_model_with_numeric_id_holder(branch)
    140         self.assertEqual(models.model_from_numeric_id(branch.id, models.Branch), None)
     148            return Branch(id=id, name='some branch', key_name='some-branch').put()
     149
     150        branch = Branch.get(create_in_transaction_with_numeric_id_holder(execute))
     151
     152        self.assertEqual(model_from_numeric_id(branch.id, Branch).key(), branch.key())
     153        self.assertEqual(model_from_numeric_id(branch.id + 1, Branch), None)
     154        delete_model_with_numeric_id_holder(branch)
     155        self.assertEqual(model_from_numeric_id(branch.id, Branch), None)
    141156
    142157
    143158class BranchTests(DataStoreTestsBase):
    144159    def test_create_if_possible(self):
    145         self.assertThereIsNoInstanceOf(models.Branch)
    146 
    147         branch = models.Branch.create_if_possible('some-branch', 'some branch')
     160        self.assertThereIsNoInstanceOf(Branch)
     161
     162        branch = Branch.create_if_possible('some-branch', 'some branch')
    148163        self.assertTrue(branch)
    149164        self.assertTrue(branch.key().name(), 'some-branch')
     
    151166        self.assertOnlyInstance(branch)
    152167
    153         self.assertFalse(models.Branch.create_if_possible('some-branch', 'some other branch'))
     168        self.assertFalse(Branch.create_if_possible('some-branch', 'some other branch'))
    154169        self.assertTrue(branch.name, 'some branch')
    155170        self.assertOnlyInstance(branch)
     
    158173class PlatformTests(DataStoreTestsBase):
    159174    def test_create_if_possible(self):
    160         self.assertThereIsNoInstanceOf(models.Platform)
    161 
    162         platform = models.Platform.create_if_possible('some-platform', 'some platform')
     175        self.assertThereIsNoInstanceOf(Platform)
     176
     177        platform = Platform.create_if_possible('some-platform', 'some platform')
    163178        self.assertTrue(platform)
    164179        self.assertTrue(platform.key().name(), 'some-platform')
     
    166181        self.assertOnlyInstance(platform)
    167182
    168         self.assertFalse(models.Platform.create_if_possible('some-platform', 'some other platform'))
     183        self.assertFalse(Platform.create_if_possible('some-platform', 'some other platform'))
    169184        self.assertTrue(platform.name, 'some platform')
    170185        self.assertOnlyInstance(platform)
     
    173188class BuilderTests(DataStoreTestsBase):
    174189    def test_create(self):
    175         builder_key = models.Builder.create('some builder', 'some password')
     190        builder_key = Builder.create('some builder', 'some password')
    176191        self.assertTrue(builder_key)
    177         builder = models.Builder.get(builder_key)
     192        builder = Builder.get(builder_key)
    178193        self.assertEqual(builder.key().name(), 'some builder')
    179194        self.assertEqual(builder.name, 'some builder')
    180         self.assertEqual(builder.password, models.Builder._hashed_password('some password'))
     195        self.assertEqual(builder.password, Builder._hashed_password('some password'))
    181196
    182197    def test_update_password(self):
    183         builder = models.Builder.get(models.Builder.create('some builder', 'some password'))
    184         self.assertEqual(builder.password, models.Builder._hashed_password('some password'))
     198        builder = Builder.get(Builder.create('some builder', 'some password'))
     199        self.assertEqual(builder.password, Builder._hashed_password('some password'))
    185200        builder.update_password('other password')
    186         self.assertEqual(builder.password, models.Builder._hashed_password('other password'))
     201        self.assertEqual(builder.password, Builder._hashed_password('other password'))
    187202
    188203        # Make sure it's saved
    189         builder = models.Builder.get(builder.key())
    190         self.assertEqual(builder.password, models.Builder._hashed_password('other password'))
     204        builder = Builder.get(builder.key())
     205        self.assertEqual(builder.password, Builder._hashed_password('other password'))
    191206
    192207    def test_hashed_password(self):
    193         self.assertNotEqual(models.Builder._hashed_password('some password'), 'some password')
    194         self.assertFalse('some password' in models.Builder._hashed_password('some password'))
    195         self.assertEqual(len(models.Builder._hashed_password('some password')), 64)
     208        self.assertNotEqual(Builder._hashed_password('some password'), 'some password')
     209        self.assertFalse('some password' in Builder._hashed_password('some password'))
     210        self.assertEqual(len(Builder._hashed_password('some password')), 64)
    196211
    197212    def test_authenticate(self):
    198         builder = models.Builder.get(models.Builder.create('some builder', 'some password'))
     213        builder = Builder.get(Builder.create('some builder', 'some password'))
    199214        self.assertTrue(builder.authenticate('some password'))
    200215        self.assertFalse(builder.authenticate('bad password'))
     
    202217
    203218def _create_some_builder():
    204     branch = models.Branch.create_if_possible('some-branch', 'Some Branch')
    205     platform = models.Platform.create_if_possible('some-platform', 'Some Platform')
    206     builder_key = models.Builder.create('some-builder', 'Some Builder')
    207     return branch, platform, models.Builder.get(builder_key)
     219    branch = Branch.create_if_possible('some-branch', 'Some Branch')
     220    platform = Platform.create_if_possible('some-platform', 'Some Platform')
     221    builder_key = Builder.create('some-builder', 'Some Builder')
     222    return branch, platform, Builder.get(builder_key)
    208223
    209224
    210225def _create_build(branch, platform, builder, key_name='some-build'):
    211     build_key = models.Build(key_name=key_name, branch=branch, platform=platform, builder=builder,
     226    build_key = Build(key_name=key_name, branch=branch, platform=platform, builder=builder,
    212227        buildNumber=1, revision=100, timestamp=datetime.now()).put()
    213     return models.Build.get(build_key)
     228    return Build.get(build_key)
    214229
    215230
     
    219234
    220235        timestamp = datetime.now().replace(microsecond=0)
    221         log = models.ReportLog(timestamp=timestamp, headers='some headers',
     236        log = ReportLog(timestamp=timestamp, headers='some headers',
    222237            payload='{"branch": "some-branch", "platform": "some-platform", "builder-name": "some-builder",' +
    223238                '"build-number": 123, "webkit-revision": 456, "timestamp": %d}' % int(mktime(timestamp.timetuple())))
    224239
    225         self.assertThereIsNoInstanceOf(models.Build)
    226 
    227         build = models.Build.get_or_insert_from_log(log)
     240        self.assertThereIsNoInstanceOf(Build)
     241
     242        build = Build.get_or_insert_from_log(log)
    228243        self.assertTrue(build)
    229244        self.assertEqual(build.branch.key(), branch.key())
     
    240255class TestModelTests(DataStoreTestsBase):
    241256    def test_update_or_insert(self):
    242         branch = models.Branch.create_if_possible('some-branch', 'Some Branch')
    243         platform = models.Platform.create_if_possible('some-platform', 'Some Platform')
    244 
    245         self.assertThereIsNoInstanceOf(models.Test)
    246 
    247         test = models.Test.update_or_insert('some-test', branch, platform)
     257        branch = Branch.create_if_possible('some-branch', 'Some Branch')
     258        platform = Platform.create_if_possible('some-platform', 'Some Platform')
     259
     260        self.assertThereIsNoInstanceOf(Test)
     261
     262        test = Test.update_or_insert('some-test', branch, platform)
    248263        self.assertTrue(test)
    249264        self.assertEqual(test.branches, [branch.key()])
     
    252267
    253268    def test_update_or_insert_to_update(self):
    254         branch = models.Branch.create_if_possible('some-branch', 'Some Branch')
    255         platform = models.Platform.create_if_possible('some-platform', 'Some Platform')
    256         test = models.Test.update_or_insert('some-test', branch, platform)
     269        branch = Branch.create_if_possible('some-branch', 'Some Branch')
     270        platform = Platform.create_if_possible('some-platform', 'Some Platform')
     271        test = Test.update_or_insert('some-test', branch, platform)
    257272        self.assertOnlyInstance(test)
    258273
    259         other_branch = models.Branch.create_if_possible('other-branch', 'Other Branch')
    260         other_platform = models.Platform.create_if_possible('other-platform', 'Other Platform')
    261         test = models.Test.update_or_insert('some-test', other_branch, other_platform)
     274        other_branch = Branch.create_if_possible('other-branch', 'Other Branch')
     275        other_platform = Platform.create_if_possible('other-platform', 'Other Platform')
     276        test = Test.update_or_insert('some-test', other_branch, other_platform)
    262277        self.assertOnlyInstance(test)
    263278        self.assertEqualUnorderedList(test.branches, [branch.key(), other_branch.key()])
    264279        self.assertEqualUnorderedList(test.platforms, [platform.key(), other_platform.key()])
    265280
    266         test = models.Test.get(test.key())
     281        test = Test.get(test.key())
    267282        self.assertEqualUnorderedList(test.branches, [branch.key(), other_branch.key()])
    268283        self.assertEqualUnorderedList(test.platforms, [platform.key(), other_platform.key()])
     
    271286        branch, platform, builder = _create_some_builder()
    272287        some_build = _create_build(branch, platform, builder)
    273         some_result = models.TestResult.get_or_insert_from_parsed_json('some-test', some_build, 50)
    274         some_test = models.Test.update_or_insert('some-test', branch, platform)
     288        some_result = TestResult.get_or_insert_from_parsed_json('some-test', some_build, 50)
     289        some_test = Test.update_or_insert('some-test', branch, platform)
    275290
    276291        other_build = _create_build(branch, platform, builder, 'other-build')
    277         other_result = models.TestResult.get_or_insert_from_parsed_json('other-test', other_build, 30)
    278         other_test = models.Test.update_or_insert('other-test', branch, platform)
     292        other_result = TestResult.get_or_insert_from_parsed_json('other-test', other_build, 30)
     293        other_test = Test.update_or_insert('other-test', branch, platform)
    279294
    280295        self.assertOnlyInstances([some_result, other_result])
     
    286301
    287302        some_test.merge(other_test)
    288         results_for_some_test = models.TestResult.all()
     303        results_for_some_test = TestResult.all()
    289304        results_for_some_test.filter('name =', 'some-test')
    290305        results_for_some_test = results_for_some_test.fetch(5)
     
    304319        branch, platform, builder = _create_some_builder()
    305320        build = _create_build(branch, platform, builder)
    306         self.assertThereIsNoInstanceOf(models.TestResult)
    307         result = models.TestResult.get_or_insert_from_parsed_json('some-test', build, 50)
     321        self.assertThereIsNoInstanceOf(TestResult)
     322        result = TestResult.get_or_insert_from_parsed_json('some-test', build, 50)
    308323        self.assertOnlyInstance(result)
    309324        self.assertEqual(result.name, 'some-test')
     
    318333        branch, platform, builder = _create_some_builder()
    319334        build = _create_build(branch, platform, builder)
    320         self.assertThereIsNoInstanceOf(models.TestResult)
    321         result = models.TestResult.get_or_insert_from_parsed_json('some-test', build,
     335        self.assertThereIsNoInstanceOf(TestResult)
     336        result = TestResult.get_or_insert_from_parsed_json('some-test', build,
    322337            {"avg": 40, "median": "40.1", "stdev": 3.25, "min": 30.5, "max": 45})
    323338        self.assertOnlyInstance(result)
     
    333348        branch, platform, builder = _create_some_builder()
    334349        build = _create_build(branch, platform, builder)
    335         self.assertThereIsNoInstanceOf(models.TestResult)
    336         result = models.TestResult.get_or_insert_from_parsed_json('some-test', build, 50)
     350        self.assertThereIsNoInstanceOf(TestResult)
     351        result = TestResult.get_or_insert_from_parsed_json('some-test', build, 50)
    337352        self.assertOnlyInstance(result)
    338353        self.assertEqual(result.name, 'some-test')
     
    353368        branch, platform, builder = _create_some_builder()
    354369        build = _create_build(branch, platform, builder)
    355         self.assertThereIsNoInstanceOf(models.TestResult)
    356         result = models.TestResult.get_or_insert_from_parsed_json('some-test', build,
     370        self.assertThereIsNoInstanceOf(TestResult)
     371        result = TestResult.get_or_insert_from_parsed_json('some-test', build,
    357372            {"avg": 40, "median": "40.1", "stdev": 3.25, "min": 30.5, "max": 45})
    358373        self.assertOnlyInstance(result)
     
    375390        branch, platform, builder = _create_some_builder()
    376391        build = _create_build(branch, platform, builder)
    377         self.assertThereIsNoInstanceOf(models.TestResult)
    378         result = models.TestResult.get_or_insert_from_parsed_json('some-test', build, 20)
     392        self.assertThereIsNoInstanceOf(TestResult)
     393        result = TestResult.get_or_insert_from_parsed_json('some-test', build, 20)
    379394        self.assertOnlyInstance(result)
    380395
    381         conflicting_result = models.TestResult.get_or_insert_from_parsed_json('other-test', build, 10)
     396        conflicting_result = TestResult.get_or_insert_from_parsed_json('other-test', build, 10)
    382397
    383398        new_result = result.replace_to_change_test_name('other-test')
     
    386401
    387402        self.assertEqual(new_result.name, 'other-test')
    388         self.assertEqual(models.TestResult.get(conflicting_result.key()).value, 20)
     403        self.assertEqual(TestResult.get(conflicting_result.key()).value, 20)
    389404
    390405
    391406class ReportLogTests(DataStoreTestsBase):
    392407    def _create_log_with_payload(self, payload):
    393         return models.ReportLog(timestamp=datetime.now(), headers='some headers', payload=payload)
     408        return ReportLog(timestamp=datetime.now(), headers='some headers', payload=payload)
    394409
    395410    def test_parsed_payload(self):
     
    425440        self.assertEqual(log.builder(), None)
    426441
    427         builder_key = models.Builder.create(builder_name, 'some password')
     442        builder_key = Builder.create(builder_name, 'some password')
    428443        log = self._create_log_with_payload('{"builder-name": "%s"}' % builder_name)
    429444        self.assertEqual(log.builder().key(), builder_key)
     
    436451        self.assertEqual(log.branch(), None)
    437452
    438         branch = models.Branch.create_if_possible("some-branch", "Some Branch")
     453        branch = Branch.create_if_possible("some-branch", "Some Branch")
    439454        log = self._create_log_with_payload('{"branch": "some-branch"}')
    440455        self.assertEqual(log.branch().key(), branch.key())
     
    447462        self.assertEqual(log.platform(), None)
    448463
    449         platform = models.Platform.create_if_possible("some-platform", "Some Platform")
     464        platform = Platform.create_if_possible("some-platform", "Some Platform")
    450465        log = self._create_log_with_payload('{"platform": "some-platform"}')
    451466        self.assertEqual(log.platform().key(), platform.key())
     
    481496
    482497    def _assert_persistent_cache(self, name, value):
    483         self.assertEqual(models.PersistentCache.get_by_key_name(name).value, value)
     498        self.assertEqual(PersistentCache.get_by_key_name(name).value, value)
    484499        self.assertEqual(memcache.get(name), value)
    485500
    486501    def test_set(self):
    487         self.assertThereIsNoInstanceOf(models.PersistentCache)
    488 
    489         models.PersistentCache.set_cache('some-cache', 'some data')
     502        self.assertThereIsNoInstanceOf(PersistentCache)
     503
     504        PersistentCache.set_cache('some-cache', 'some data')
    490505        self._assert_persistent_cache('some-cache', 'some data')
    491506
    492         models.PersistentCache.set_cache('some-cache', 'some other data')
     507        PersistentCache.set_cache('some-cache', 'some other data')
    493508
    494509        self._assert_persistent_cache('some-cache', 'some other data')
     
    496511    def test_get(self):
    497512        self.assertEqual(memcache.get('some-cache'), None)
    498         self.assertEqual(models.PersistentCache.get_cache('some-cache'), None)
    499 
    500         models.PersistentCache.set_cache('some-cache', 'some data')
     513        self.assertEqual(PersistentCache.get_cache('some-cache'), None)
     514
     515        PersistentCache.set_cache('some-cache', 'some data')
    501516
    502517        self.assertEqual(memcache.get('some-cache'), 'some data')
    503         self.assertEqual(models.PersistentCache.get_cache('some-cache'), 'some data')
     518        self.assertEqual(PersistentCache.get_cache('some-cache'), 'some data')
    504519
    505520        memcache.delete('some-cache')
    506521        self.assertEqual(memcache.get('some-cache'), None)
    507         self.assertEqual(models.PersistentCache.get_cache('some-cache'), 'some data')
     522        self.assertEqual(PersistentCache.get_cache('some-cache'), 'some data')
     523
     524
     525class DashboardImageTests(DataStoreTestsBase):
     526    def test_needs_update(self):
     527        self.assertTrue(DashboardImage.needs_update(1, 2, 3, 7))
     528        self.assertTrue(DashboardImage.needs_update(1, 2, 3, 30))
     529        self.assertTrue(DashboardImage.needs_update(1, 2, 3, 60))
     530        self.assertTrue(DashboardImage.needs_update(1, 2, 3, 365))
     531
     532        image = DashboardImage(key_name=DashboardImage.key_name(1, 2, 3, 7), image='blah')
     533        image.put()
     534        self.assertOnlyInstance(image)
     535        self.assertTrue(DashboardImage.needs_update(1, 2, 3, 7))
     536
     537        DashboardImage(key_name=DashboardImage.key_name(1, 2, 3, 30), image='blah').put()
     538        self.assertFalse(DashboardImage.needs_update(1, 2, 3, 30, datetime.now() + timedelta(0, 10)))
     539
     540        DashboardImage(key_name=DashboardImage.key_name(1, 2, 4, 30), image='blah').put()
     541        self.assertTrue(DashboardImage.needs_update(1, 2, 4, 30, datetime.now() + timedelta(1)))
     542
     543        DashboardImage(key_name=DashboardImage.key_name(1, 2, 3, 90), image='blah').put()
     544        self.assertFalse(DashboardImage.needs_update(1, 2, 3, 90, datetime.now() + timedelta(0, 20)))
     545
     546        DashboardImage(key_name=DashboardImage.key_name(1, 2, 4, 90), image='blah').put()
     547        self.assertTrue(DashboardImage.needs_update(1, 2, 4, 90, datetime.now() + timedelta(1)))
     548
     549        DashboardImage(key_name=DashboardImage.key_name(1, 2, 3, 365), image='blah').put()
     550        self.assertFalse(DashboardImage.needs_update(1, 2, 3, 365, datetime.now() + timedelta(1)))
     551
     552        DashboardImage(key_name=DashboardImage.key_name(1, 2, 4, 365), image='blah').put()
     553        self.assertTrue(DashboardImage.needs_update(1, 2, 4, 365, datetime.now() + timedelta(10)))
    508554
    509555
Note: See TracChangeset for help on using the changeset viewer.