Changeset 108399 in webkit


Ignore:
Timestamp:
Feb 21, 2012 2:26:41 PM (12 years ago)
Author:
rniwa@webkit.org
Message:

perf-o-matic: Extract logic to generate JSON responses as classes to unit test
https://bugs.webkit.org/show_bug.cgi?id=79018

Rubber-stamped by Adam Birth.

Extracted DashboardJSONGenerator, ManifestJSONGenerator, and RunsJSONGenerator
into json_generators.py from DashboardHandler, ManifestHandler, and RunsHandler
and added unit tests for the former three classes.

Merged the latter three classes into controler.py since they have become too trivial
to have their own files.

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

(ManifestUpdateHandler):
(ManifestUpdateHandler.get):
(ManifestUpdateHandler.post):
(DashboardUpdateHandler):
(DashboardUpdateHandler.get):
(DashboardUpdateHandler.post):
(_get_test_branch_platform_ids):
(RunsUpdateHandler):
(RunsUpdateHandler.get):
(CachedRunsHandler.get):

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

(JSONGeneratorBase):
(JSONGeneratorBase.to_json):
(DashboardJSONGenerator):
(DashboardJSONGenerator.init):
(DashboardJSONGenerator.value):
(ManifestJSONGenerator):
(ManifestJSONGenerator.init):
(ManifestJSONGenerator.value):
(RunsJSONGenerator):
(RunsJSONGenerator.init):
(RunsJSONGenerator._generate_runs):
(RunsJSONGenerator._entry_from_build_and_result):
(RunsJSONGenerator.value):

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

(_create_results):
(JSONGeneratorBaseTest):
(JSONGeneratorBaseTest.test_to_json):
(JSONGeneratorBaseTest.test_to_json.AJSONGenerator):
(JSONGeneratorBaseTest.test_to_json.AJSONGenerator.value):
(DashboardJSONGeneratorTest):
(DashboardJSONGeneratorTest.test_value_no_branch):
(DashboardJSONGeneratorTest.test_value_no_plaforms):
(DashboardJSONGeneratorTest.test_value_single_platform):
(DashboardJSONGeneratorTest.test_value_two_platforms):
(ManifestJSONGeneratorTest):
(ManifestJSONGeneratorTest.test_value_no_branch):
(ManifestJSONGeneratorTest.test_value_no_plaforms):
(ManifestJSONGeneratorTest._assert_single_test):
(ManifestJSONGeneratorTest.test_value_single_platform):
(ManifestJSONGeneratorTest.test_value_two_platforms):
(ManifestJSONGeneratorTest.test_value_two_tests):
(RunsJSONGeneratorTest):
(RunsJSONGeneratorTest._create_results):
(RunsJSONGeneratorTest.test_generate_runs):
(RunsJSONGeneratorTest.test_value_without_results):
(RunsJSONGeneratorTest.test_value_with_results):
(RunsJSONGeneratorTest._assert_entry):
(RunsJSONGeneratorTest.test_run_from_build_and_result):
(RunsJSONGeneratorTest.test_run_from_build_and_result.create_build):

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

(Test.update_or_insert.execute):
(Test):
(TestResult.get_or_insert_from_parsed_json):

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

(TestModelTests.test_update_or_insert_to_update):
(TestResultTests.test_get_or_insert_stat_value):

  • Websites/webkit-perf.appspot.com/runs_handler.py: Removed.
Location:
trunk
Files:
2 added
3 deleted
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/ChangeLog

    r108288 r108399  
     12012-02-20  Ryosuke Niwa  <rniwa@webkit.org>
     2
     3        perf-o-matic: Extract logic to generate JSON responses as classes to unit test
     4        https://bugs.webkit.org/show_bug.cgi?id=79018
     5
     6        Rubber-stamped by Adam Birth.
     7
     8        Extracted DashboardJSONGenerator, ManifestJSONGenerator, and RunsJSONGenerator
     9        into json_generators.py from DashboardHandler, ManifestHandler, and RunsHandler
     10        and added unit tests for the former three classes.
     11
     12        Merged the latter three classes into controler.py since they have become too trivial
     13        to have their own files.
     14
     15        * Websites/webkit-perf.appspot.com/controller.py:
     16        (ManifestUpdateHandler):
     17        (ManifestUpdateHandler.get):
     18        (ManifestUpdateHandler.post):
     19        (DashboardUpdateHandler):
     20        (DashboardUpdateHandler.get):
     21        (DashboardUpdateHandler.post):
     22        (_get_test_branch_platform_ids):
     23        (RunsUpdateHandler):
     24        (RunsUpdateHandler.get):
     25        (CachedRunsHandler.get):
     26        * Websites/webkit-perf.appspot.com/dashboard_handler.py: Removed.
     27        * Websites/webkit-perf.appspot.com/json_generators.py: Added.
     28        (JSONGeneratorBase):
     29        (JSONGeneratorBase.to_json):
     30        (DashboardJSONGenerator):
     31        (DashboardJSONGenerator.__init__):
     32        (DashboardJSONGenerator.value):
     33        (ManifestJSONGenerator):
     34        (ManifestJSONGenerator.__init__):
     35        (ManifestJSONGenerator.value):
     36        (RunsJSONGenerator):
     37        (RunsJSONGenerator.__init__):
     38        (RunsJSONGenerator._generate_runs):
     39        (RunsJSONGenerator._entry_from_build_and_result):
     40        (RunsJSONGenerator.value):
     41        * Websites/webkit-perf.appspot.com/json_generators_unittest.py: Added.
     42        (_create_results):
     43        (JSONGeneratorBaseTest):
     44        (JSONGeneratorBaseTest.test_to_json):
     45        (JSONGeneratorBaseTest.test_to_json.AJSONGenerator):
     46        (JSONGeneratorBaseTest.test_to_json.AJSONGenerator.value):
     47        (DashboardJSONGeneratorTest):
     48        (DashboardJSONGeneratorTest.test_value_no_branch):
     49        (DashboardJSONGeneratorTest.test_value_no_plaforms):
     50        (DashboardJSONGeneratorTest.test_value_single_platform):
     51        (DashboardJSONGeneratorTest.test_value_two_platforms):
     52        (ManifestJSONGeneratorTest):
     53        (ManifestJSONGeneratorTest.test_value_no_branch):
     54        (ManifestJSONGeneratorTest.test_value_no_plaforms):
     55        (ManifestJSONGeneratorTest._assert_single_test):
     56        (ManifestJSONGeneratorTest.test_value_single_platform):
     57        (ManifestJSONGeneratorTest.test_value_two_platforms):
     58        (ManifestJSONGeneratorTest.test_value_two_tests):
     59        (RunsJSONGeneratorTest):
     60        (RunsJSONGeneratorTest._create_results):
     61        (RunsJSONGeneratorTest.test_generate_runs):
     62        (RunsJSONGeneratorTest.test_value_without_results):
     63        (RunsJSONGeneratorTest.test_value_with_results):
     64        (RunsJSONGeneratorTest._assert_entry):
     65        (RunsJSONGeneratorTest.test_run_from_build_and_result):
     66        (RunsJSONGeneratorTest.test_run_from_build_and_result.create_build):
     67        * Websites/webkit-perf.appspot.com/main.py:
     68        * Websites/webkit-perf.appspot.com/manifest_handler.py: Removed.
     69        * Websites/webkit-perf.appspot.com/models.py:
     70        (Test.update_or_insert.execute):
     71        (Test):
     72        (TestResult.get_or_insert_from_parsed_json):
     73        * Websites/webkit-perf.appspot.com/models_unittest.py:
     74        (TestModelTests.test_update_or_insert_to_update):
     75        (TestResultTests.test_get_or_insert_stat_value):
     76        * Websites/webkit-perf.appspot.com/runs_handler.py: Removed.
     77
    1782012-02-20  Martin Robinson  <mrobinson@igalia.com>
    279
  • trunk/Websites/webkit-perf.appspot.com/controller.py

    r108094 r108399  
    3232from google.appengine.ext import db
    3333
     34from json_generators import DashboardJSONGenerator
     35from json_generators import ManifestJSONGenerator
     36from json_generators import RunsJSONGenerator
     37from models import Branch
     38from models import Platform
    3439from models import Test
    3540from models import PersistentCache
     41from models import model_from_numeric_id
    3642
    3743
     
    4248def schedule_manifest_update():
    4349    taskqueue.add(url='/api/test/update')
     50
     51
     52class ManifestUpdateHandler(webapp2.RequestHandler):
     53    def post(self):
     54        self.response.headers['Content-Type'] = 'text/plain; charset=utf-8'
     55        cache_manifest(ManifestJSONGenerator().to_json())
     56        self.response.out.write('OK')
    4457
    4558
     
    6275
    6376
     77class DashboardUpdateHandler(webapp2.RequestHandler):
     78    def post(self):
     79        self.response.headers['Content-Type'] = 'text/plain; charset=utf-8'
     80        cache_dashboard(DashboardJSONGenerator().to_json())
     81        self.response.out.write('OK')
     82
     83
    6484class CachedDashboardHandler(webapp2.RequestHandler):
    6585    def get(self):
     
    80100
    81101
     102def _get_test_branch_platform_ids(handler):
     103    try:
     104        test_id = int(handler.request.get('id', 0))
     105        branch_id = int(handler.request.get('branchid', 0))
     106        platform_id = int(handler.request.get('platformid', 0))
     107        return test_id, branch_id, platform_id
     108    except TypeError:
     109        # FIXME: Output an error here
     110        return 0, 0, 0
     111
     112
     113class RunsUpdateHandler(webapp2.RequestHandler):
     114    def get(self):
     115        self.post()
     116
     117    def get(self):
     118        self.response.headers['Content-Type'] = 'text/plain; charset=utf-8'
     119        test_id, branch_id, platform_id = _get_test_branch_platform_ids(self)
     120
     121        branch = model_from_numeric_id(branch_id, Branch)
     122        platform = model_from_numeric_id(platform_id, Platform)
     123        test = model_from_numeric_id(test_id, Test)
     124        assert branch
     125        assert platform
     126        assert test
     127
     128        cache_runs(test_id, branch_id, platform_id, RunsJSONGenerator(branch, platform, test.name).to_json())
     129        self.response.out.write('OK')
     130
     131
    82132class CachedRunsHandler(webapp2.RequestHandler):
    83133    def get(self):
    84134        self.response.headers['Content-Type'] = 'application/json'
    85135
    86         try:
    87             test_id = int(self.request.get('id', 0))
    88             branch_id = int(self.request.get('branchid', 0))
    89             platform_id = int(self.request.get('platformid', 0))
    90         except TypeError:
    91             # FIXME: Output an error here
    92             test_id = 0
    93             branch_id = 0
    94             platform_id = 0
    95 
     136        test_id, branch_id, platform_id = _get_test_branch_platform_ids(self)
    96137        runs = PersistentCache.get_cache(Test.cache_key(test_id, branch_id, platform_id))
    97138        if runs:
  • trunk/Websites/webkit-perf.appspot.com/main.py

    r107386 r108399  
    2424from controller import CachedManifestHandler
    2525from controller import CachedRunsHandler
     26from controller import DashboardUpdateHandler
     27from controller import ManifestUpdateHandler
     28from controller import RunsUpdateHandler
    2629from create_handler import CreateHandler
    27 from dashboard_handler import DashboardHandler
    28 from manifest_handler import ManifestHandler
    2930from report_handler import ReportHandler
    3031from report_handler import AdminReportHandler
    3132from report_process_handler import ReportProcessHandler
    3233from report_logs_handler import ReportLogsHandler
    33 from runs_handler import RunsHandler
    3434from merge_tests_handler import MergeTestsHandler
    3535
     
    4040    ('/admin/create/(.*)', CreateHandler),
    4141    ('/api/test/?', CachedManifestHandler),
    42     ('/api/test/update', ManifestHandler),
     42    ('/api/test/update', ManifestUpdateHandler),
    4343    ('/api/test/report/?', ReportHandler),
    4444    ('/api/test/report/process', ReportProcessHandler),
    4545    ('/api/test/runs/?', CachedRunsHandler),
    46     ('/api/test/runs/update', RunsHandler),
     46    ('/api/test/runs/update', RunsUpdateHandler),
    4747    ('/api/test/dashboard/?', CachedDashboardHandler),
    48     ('/api/test/dashboard/update', DashboardHandler),
     48    ('/api/test/dashboard/update', DashboardUpdateHandler),
    4949]
    5050
  • trunk/Websites/webkit-perf.appspot.com/models.py

    r108270 r108399  
    161161                if platform.key() not in test.platforms:
    162162                    test.platforms.append(platform.key())
     163                test.put()
    163164                existing_test[0] = test
    164165                return None
     
    200201            valueMedian=_float_or_none(result, 'median'), valueStdev=_float_or_none(result, 'stdev'),
    201202            valueMin=_float_or_none(result, 'min'), valueMax=_float_or_none(result, 'max'))
    202 
    203     @staticmethod
    204     def generate_runs(branch, platform, test_name):
    205         builds = Build.all()
    206         builds.filter('branch =', branch)
    207         builds.filter('platform =', platform)
    208 
    209         for build in builds:
    210             results = TestResult.all()
    211             results.filter('name =', test_name)
    212             results.filter('build =', build)
    213             for result in results:
    214                 yield build, result
    215         raise StopIteration
    216203
    217204
  • trunk/Websites/webkit-perf.appspot.com/models_unittest.py

    r108270 r108399  
    251251        self.assertEqualUnorderedList(test.platforms, [platform.key(), other_platform.key()])
    252252
     253        test = models.Test.get(test.key())
     254        self.assertEqualUnorderedList(test.branches, [branch.key(), other_branch.key()])
     255        self.assertEqualUnorderedList(test.platforms, [platform.key(), other_platform.key()])
     256
    253257
    254258class TestResultTests(DataStoreTestsBase):
     
    286290        self.assertEqual(result.valueMax, 45)
    287291
    288     def _create_results(self, test_name, values):
    289         branch, platform, builder = _create_some_builder()
    290         results = []
    291         for i, value in enumerate(values):
    292             build = models.Build(branch=branch, platform=platform, builder=builder,
    293                 buildNumber=i, revision=100 + i, timestamp=datetime.now())
    294             build.put()
    295             result = models.TestResult(name=test_name, build=build, value=value)
    296             result.put()
    297             results.append(result)
    298         return branch, platform, results
    299 
    300     def test_generate_runs(self):
    301         branch, platform, results = self._create_results('some-test', [50.0, 51.0, 52.0, 49.0, 48.0])
    302         last_i = 0
    303         for i, (build, result) in enumerate(models.TestResult.generate_runs(branch, platform, "some-test")):
    304             self.assertEqual(build.buildNumber, i)
    305             self.assertEqual(build.revision, 100 + i)
    306             self.assertEqual(result.name, 'some-test')
    307             self.assertEqual(result.value, results[i].value)
    308             last_i = i
    309         self.assertTrue(last_i + 1, len(results))
    310 
    311292
    312293class ReportLogTests(DataStoreTestsBase):
Note: See TracChangeset for help on using the changeset viewer.