| OLD | NEW | 
|---|
| 1 #!/usr/bin/python | 1 #!/usr/bin/python | 
| 2 | 2 | 
| 3 ''' | 3 ''' | 
| 4 Copyright 2012 Google Inc. | 4 Copyright 2012 Google Inc. | 
| 5 | 5 | 
| 6 Use of this source code is governed by a BSD-style license that can be | 6 Use of this source code is governed by a BSD-style license that can be | 
| 7 found in the LICENSE file. | 7 found in the LICENSE file. | 
| 8 ''' | 8 ''' | 
| 9 | 9 | 
| 10 ''' | 10 ''' | 
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 64     'Test-Android-NexusS-SGX540-Arm7-Release', | 64     'Test-Android-NexusS-SGX540-Arm7-Release', | 
| 65    'base-android-xoom': | 65    'base-android-xoom': | 
| 66     'Test-Android-Xoom-Tegra2-Arm7-Release', | 66     'Test-Android-Xoom-Tegra2-Arm7-Release', | 
| 67    'base-android-nexus-10': | 67    'base-android-nexus-10': | 
| 68     'Test-Android-Nexus10-MaliT604-Arm7-Release', | 68     'Test-Android-Nexus10-MaliT604-Arm7-Release', | 
| 69    'base-android-nexus-4': | 69    'base-android-nexus-4': | 
| 70     'Test-Android-Nexus4-Adreno320-Arm7-Release', | 70     'Test-Android-Nexus4-Adreno320-Arm7-Release', | 
| 71 } | 71 } | 
| 72 | 72 | 
| 73 | 73 | 
| 74 class CommandFailedException(Exception): | 74 class _InternalException(Exception): | 
| 75     pass | 75     pass | 
| 76 | 76 | 
| 77 # Object that rebaselines a JSON expectations file (not individual image files). | 77 # Object that rebaselines a JSON expectations file (not individual image files). | 
| 78 class JsonRebaseliner(object): | 78 class JsonRebaseliner(object): | 
| 79 | 79 | 
| 80     # params: | 80     # params: | 
| 81     #  expectations_root: root directory of all expectations JSON files | 81     #  expectations_root: root directory of all expectations JSON files | 
| 82     #  expectations_filename: filename (under expectations_root) of JSON | 82     #  expectations_filename: filename (under expectations_root) of JSON | 
| 83     #                         expectations file; typically | 83     #                         expectations file; typically | 
| 84     #                         "expected-results.json" | 84     #                         "expected-results.json" | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 99         self._tests = tests | 99         self._tests = tests | 
| 100         self._configs = configs | 100         self._configs = configs | 
| 101         self._actuals_base_url = actuals_base_url | 101         self._actuals_base_url = actuals_base_url | 
| 102         self._actuals_filename = actuals_filename | 102         self._actuals_filename = actuals_filename | 
| 103         self._add_new = add_new | 103         self._add_new = add_new | 
| 104         self._testname_pattern = re.compile('(\S+)_(\S+).png') | 104         self._testname_pattern = re.compile('(\S+)_(\S+).png') | 
| 105 | 105 | 
| 106     # Returns the full contents of filepath, as a single string. | 106     # Returns the full contents of filepath, as a single string. | 
| 107     # If filepath looks like a URL, try to read it that way instead of as | 107     # If filepath looks like a URL, try to read it that way instead of as | 
| 108     # a path on local storage. | 108     # a path on local storage. | 
|  | 109     # | 
|  | 110     # Raises _InternalException if there is a problem. | 
| 109     def _GetFileContents(self, filepath): | 111     def _GetFileContents(self, filepath): | 
| 110         if filepath.startswith('http:') or filepath.startswith('https:'): | 112         if filepath.startswith('http:') or filepath.startswith('https:'): | 
| 111             return urllib2.urlopen(filepath).read() | 113             try: | 
|  | 114                 return urllib2.urlopen(filepath).read() | 
|  | 115             except urllib2.HTTPError as e: | 
|  | 116                 raise _InternalException('unable to read URL %s: %s' % ( | 
|  | 117                     filepath, e)) | 
| 112         else: | 118         else: | 
| 113             return open(filepath, 'r').read() | 119             return open(filepath, 'r').read() | 
| 114 | 120 | 
| 115     # Returns a dictionary of actual results from actual-results.json file. | 121     # Returns a dictionary of actual results from actual-results.json file. | 
| 116     # | 122     # | 
| 117     # The dictionary returned has this format: | 123     # The dictionary returned has this format: | 
| 118     # { | 124     # { | 
| 119     #  u'imageblur_565.png': [u'bitmap-64bitMD5', 3359963596899141322], | 125     #  u'imageblur_565.png': [u'bitmap-64bitMD5', 3359963596899141322], | 
| 120     #  u'imageblur_8888.png': [u'bitmap-64bitMD5', 4217923806027861152], | 126     #  u'imageblur_8888.png': [u'bitmap-64bitMD5', 4217923806027861152], | 
| 121     #  u'shadertext3_8888.png': [u'bitmap-64bitMD5', 3713708307125704716] | 127     #  u'shadertext3_8888.png': [u'bitmap-64bitMD5', 3713708307125704716] | 
| 122     # } | 128     # } | 
| 123     # | 129     # | 
| 124     # If the JSON actual result summary file cannot be loaded, raise an | 130     # If the JSON actual result summary file cannot be loaded, logs a warning | 
| 125     # exception. | 131     # message and returns None. | 
|  | 132     # If the JSON actual result summary file can be loaded, but we have | 
|  | 133     # trouble parsing it, raises an Exception. | 
| 126     # | 134     # | 
| 127     # params: | 135     # params: | 
| 128     #  json_url: URL pointing to a JSON actual result summary file | 136     #  json_url: URL pointing to a JSON actual result summary file | 
| 129     #  sections: a list of section names to include in the results, e.g. | 137     #  sections: a list of section names to include in the results, e.g. | 
| 130     #            [gm_json.JSONKEY_ACTUALRESULTS_FAILED, | 138     #            [gm_json.JSONKEY_ACTUALRESULTS_FAILED, | 
| 131     #             gm_json.JSONKEY_ACTUALRESULTS_NOCOMPARISON] ; | 139     #             gm_json.JSONKEY_ACTUALRESULTS_NOCOMPARISON] ; | 
| 132     #            if None, then include ALL sections. | 140     #            if None, then include ALL sections. | 
| 133     def _GetActualResults(self, json_url, sections=None): | 141     def _GetActualResults(self, json_url, sections=None): | 
| 134         json_contents = self._GetFileContents(json_url) | 142         try: | 
|  | 143             json_contents = self._GetFileContents(json_url) | 
|  | 144         except _InternalException: | 
|  | 145             print >> sys.stderr, ( | 
|  | 146                 'could not read json_url %s ; skipping this platform.' % | 
|  | 147                 json_url) | 
|  | 148             return None | 
| 135         json_dict = gm_json.LoadFromString(json_contents) | 149         json_dict = gm_json.LoadFromString(json_contents) | 
| 136         results_to_return = {} | 150         results_to_return = {} | 
| 137         actual_results = json_dict[gm_json.JSONKEY_ACTUALRESULTS] | 151         actual_results = json_dict[gm_json.JSONKEY_ACTUALRESULTS] | 
| 138         if not sections: | 152         if not sections: | 
| 139             sections = actual_results.keys() | 153             sections = actual_results.keys() | 
| 140         for section in sections: | 154         for section in sections: | 
| 141             section_results = actual_results[section] | 155             section_results = actual_results[section] | 
| 142             if section_results: | 156             if section_results: | 
| 143                 results_to_return.update(section_results) | 157                 results_to_return.update(section_results) | 
| 144         return results_to_return | 158         return results_to_return | 
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 283             dry_run=args.dry_run, | 297             dry_run=args.dry_run, | 
| 284             json_base_url=args.actuals_base_url, | 298             json_base_url=args.actuals_base_url, | 
| 285             json_filename=args.actuals_filename, | 299             json_filename=args.actuals_filename, | 
| 286             add_new=args.add_new, | 300             add_new=args.add_new, | 
| 287             missing_json_is_fatal=missing_json_is_fatal) | 301             missing_json_is_fatal=missing_json_is_fatal) | 
| 288     try: | 302     try: | 
| 289         rebaseliner.RebaselineSubdir(subdir=subdir, builder=builder) | 303         rebaseliner.RebaselineSubdir(subdir=subdir, builder=builder) | 
| 290     except BaseException as e: | 304     except BaseException as e: | 
| 291         print >> sys.stderr, e | 305         print >> sys.stderr, e | 
| 292         sys.exit(1) | 306         sys.exit(1) | 
| OLD | NEW | 
|---|