| OLD | NEW |
| (Empty) |
| 1 # Copyright 2013 The Chromium Authors. All rights reserved. | |
| 2 # Use of this source code is governed by a BSD-style license that can be | |
| 3 # found in the LICENSE file. | |
| 4 | |
| 5 """Request handler to serve the main_view page.""" | |
| 6 | |
| 7 import jinja2 | |
| 8 import json | |
| 9 import os | |
| 10 import re | |
| 11 import sys | |
| 12 import webapp2 | |
| 13 | |
| 14 import ispy_api | |
| 15 from common import constants | |
| 16 from common import ispy_utils | |
| 17 | |
| 18 import gs_bucket | |
| 19 import views | |
| 20 | |
| 21 JINJA = jinja2.Environment( | |
| 22 loader=jinja2.FileSystemLoader(os.path.dirname(views.__file__)), | |
| 23 extensions=['jinja2.ext.autoescape']) | |
| 24 | |
| 25 | |
| 26 class MainViewHandler(webapp2.RequestHandler): | |
| 27 """Request handler to serve the main_view page.""" | |
| 28 | |
| 29 def get(self): | |
| 30 """Handles a get request to the main_view page. | |
| 31 | |
| 32 If the test_run parameter is specified, then a page displaying all of | |
| 33 the failed runs in the test_run will be shown. Otherwise a view listing | |
| 34 all of the test_runs available for viewing will be displayed. | |
| 35 """ | |
| 36 test_run = self.request.get('test_run') | |
| 37 bucket = gs_bucket.GoogleCloudStorageBucket(constants.BUCKET) | |
| 38 ispy = ispy_utils.ISpyUtils(bucket) | |
| 39 # Load the view. | |
| 40 if test_run: | |
| 41 self._GetForTestRun(test_run, ispy) | |
| 42 return | |
| 43 self._GetAllTestRuns(ispy) | |
| 44 | |
| 45 def _GetAllTestRuns(self, ispy): | |
| 46 """Renders a list view of all of the test_runs available in GS. | |
| 47 | |
| 48 Args: | |
| 49 ispy: An instance of ispy_api.ISpyApi. | |
| 50 """ | |
| 51 template = JINJA.get_template('list_view.html') | |
| 52 data = {} | |
| 53 test_runs = set([path.lstrip('/').split('/')[1] for path in | |
| 54 ispy.GetAllPaths('failures/')]) | |
| 55 base_url = '/?test_run=%s' | |
| 56 data['links'] = [(test_run, base_url % test_run) for test_run in test_runs] | |
| 57 self.response.write(template.render(data)) | |
| 58 | |
| 59 def _GetForTestRun(self, test_run, ispy): | |
| 60 """Renders a sorted list of failure-rows for a given test_run. | |
| 61 | |
| 62 This method will produce a list of failure-rows that are sorted | |
| 63 in descending order by number of different pixels. | |
| 64 | |
| 65 Args: | |
| 66 test_run: The name of the test_run to render failure rows from. | |
| 67 ispy: An instance of ispy_api.ISpyApi. | |
| 68 """ | |
| 69 paths = set([path for path in ispy.GetAllPaths('failures/' + test_run) | |
| 70 if path.endswith('actual.png')]) | |
| 71 can_rebaseline = ispy_api.ISpyApi( | |
| 72 ispy.cloud_bucket).CanRebaselineToTestRun(test_run) | |
| 73 rows = [self._CreateRow(test_run, path, ispy) for path in paths] | |
| 74 | |
| 75 # Function that sorts by the different_pixels field in the failure-info. | |
| 76 def _Sorter(a, b): | |
| 77 return cmp(b['percent_different'], | |
| 78 a['percent_different']) | |
| 79 template = JINJA.get_template('main_view.html') | |
| 80 self.response.write( | |
| 81 template.render({'comparisons': sorted(rows, _Sorter), | |
| 82 'test_run': test_run, | |
| 83 'can_rebaseline': can_rebaseline})) | |
| 84 | |
| 85 def _CreateRow(self, test_run, path, ispy): | |
| 86 """Creates one failure-row. | |
| 87 | |
| 88 This method builds a dictionary with the data necessary to display a | |
| 89 failure in the main_view html template. | |
| 90 | |
| 91 Args: | |
| 92 test_run: The name of the test_run the failure is in. | |
| 93 path: A path to the failure's actual.png file. | |
| 94 ispy: An instance of ispy_api.ISpyApi. | |
| 95 | |
| 96 Returns: | |
| 97 A dictionary with fields necessary to render a failure-row | |
| 98 in the main_view html template. | |
| 99 """ | |
| 100 res = {} | |
| 101 res['expectation'] = path.lstrip('/').split('/')[2] | |
| 102 res['test_run'] = test_run | |
| 103 res['info'] = json.loads(ispy.cloud_bucket.DownloadFile( | |
| 104 ispy_utils.GetFailurePath(res['test_run'], res['expectation'], | |
| 105 'info.txt'))) | |
| 106 expected = ispy_utils.GetExpectationPath( | |
| 107 res['expectation'], 'expected.png') | |
| 108 diff = ispy_utils.GetFailurePath(test_run, res['expectation'], 'diff.png') | |
| 109 res['percent_different'] = res['info']['fraction_different'] * 100 | |
| 110 res['expected_path'] = expected | |
| 111 res['diff_path'] = diff | |
| 112 res['actual_path'] = path | |
| 113 res['expected'] = ispy.cloud_bucket.GetImageURL(expected) | |
| 114 res['diff'] = ispy.cloud_bucket.GetImageURL(diff) | |
| 115 res['actual'] = ispy.cloud_bucket.GetImageURL(path) | |
| 116 return res | |
| OLD | NEW |