Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Side by Side Diff: tools/rebaseline.py

Issue 15660014: rebaseline.py : add self-tests (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: incorporate_comments Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 '''
11 Rebaselines the given GM tests, on all bots and all configurations. 11 Rebaselines the given GM tests, on all bots and all configurations.
12 Must be run from the gm-expected directory. If run from a git or SVN 12 Must be run from the gm-expected directory. If run from a git or SVN
13 checkout, the files will be added to the staging area for commit. 13 checkout, the files will be added to the staging area for commit.
14 ''' 14 '''
15 15
16 import argparse 16 import argparse
17 import os 17 import os
18 import subprocess 18 import subprocess
19 import sys 19 import sys
20 import tempfile
21 20
22 # Mapping of gm-expectations subdir (under 21 # Mapping of gm-expectations subdir (under
23 # https://skia.googlecode.com/svn/gm-expected/ ) 22 # https://skia.googlecode.com/svn/gm-expected/ )
24 # to builder name (see list at http://108.170.217.252:10117/builders ) 23 # to builder name (see list at http://108.170.217.252:10117/builders )
25 SUBDIR_MAPPING = { 24 SUBDIR_MAPPING = {
26 'base-shuttle-win7-intel-float': 25 'base-shuttle-win7-intel-float':
27 'Test-Win7-ShuttleA-HD2000-x86-Release', 26 'Test-Win7-ShuttleA-HD2000-x86-Release',
28 'base-shuttle-win7-intel-angle': 27 'base-shuttle-win7-intel-angle':
29 'Test-Win7-ShuttleA-HD2000-x86-Release-ANGLE', 28 'Test-Win7-ShuttleA-HD2000-x86-Release-ANGLE',
30 'base-shuttle-win7-intel-directwrite': 29 'base-shuttle-win7-intel-directwrite':
(...skipping 10 matching lines...) Expand all
41 'Test-Android-Nexus7-Tegra3-Arm7-Release', 40 'Test-Android-Nexus7-Tegra3-Arm7-Release',
42 'base-android-nexus-s': 41 'base-android-nexus-s':
43 'Test-Android-NexusS-SGX540-Arm7-Release', 42 'Test-Android-NexusS-SGX540-Arm7-Release',
44 'base-android-xoom': 43 'base-android-xoom':
45 'Test-Android-Xoom-Tegra2-Arm7-Release', 44 'Test-Android-Xoom-Tegra2-Arm7-Release',
46 'base-android-nexus-10': 45 'base-android-nexus-10':
47 'Test-Android-Nexus10-MaliT604-Arm7-Release', 46 'Test-Android-Nexus10-MaliT604-Arm7-Release',
48 } 47 }
49 48
50 49
50 class CommandFailedException(Exception):
51 pass
52
51 class Rebaseliner(object): 53 class Rebaseliner(object):
52 54
53 # params: 55 # params:
54 # tests: list of tests to rebaseline 56 # tests: list of tests to rebaseline
55 # configs: which configs to run for each test 57 # configs: which configs to run for each test
56 # subdirs: which platform subdirectories to rebaseline; if an empty list, 58 # subdirs: which platform subdirectories to rebaseline; if an empty list,
57 # rebaseline all platform subdirectories 59 # rebaseline all platform subdirectories
58 # dry_run: if True, instead of actually downloading files or adding 60 # dry_run: if True, instead of actually downloading files or adding
59 # files to checkout, display a list of operations that 61 # files to checkout, display a list of operations that
60 # we would normally perform 62 # we would normally perform
61 def __init__(self, tests, configs=[], subdirs=[], dry_run=False): 63 def __init__(self, tests, configs=[], subdirs=[], dry_run=False):
62 if not tests: 64 if not tests:
63 raise Exception('at least one test must be specified') 65 raise Exception('at least one test must be specified')
64 self._tests = tests 66 self._tests = tests
65 self._configs = configs 67 self._configs = configs
66 if not subdirs: 68 if not subdirs:
67 self._subdirs = sorted(SUBDIR_MAPPING.keys()) 69 self._subdirs = sorted(SUBDIR_MAPPING.keys())
68 else: 70 else:
69 self._subdirs = subdirs 71 self._subdirs = subdirs
70 self._dry_run = dry_run 72 self._dry_run = dry_run
71 self._is_svn_checkout = ( 73 self._is_svn_checkout = (
72 os.path.exists('.svn') or 74 os.path.exists('.svn') or
73 os.path.exists(os.path.join(os.pardir, '.svn'))) 75 os.path.exists(os.path.join(os.pardir, '.svn')))
74 self._is_git_checkout = ( 76 self._is_git_checkout = (
75 os.path.exists('.git') or 77 os.path.exists('.git') or
76 os.path.exists(os.path.join(os.pardir, '.git'))) 78 os.path.exists(os.path.join(os.pardir, '.git')))
77 79
78 # Execute subprocess.call(), unless dry_run is True 80 # If dry_run is False, execute subprocess.call(cmd).
79 def _Call(self, cmd, stdout=None): 81 # If dry_run is True, print the command we would have otherwise run.
82 # Raises a CommandFailedException if the command fails.
83 def _Call(self, cmd):
80 if self._dry_run: 84 if self._dry_run:
81 print '%s' % ' '.join(cmd) 85 print '%s' % ' '.join(cmd)
82 return 0 86 return
83 if stdout: 87 if subprocess.call(cmd) != 0:
84 return subprocess.call(cmd, stdout=stdout) 88 raise CommandFailedException('error running command: ' +
epoger 2013/05/31 03:54:06 It seems to me that the common case ought to be: i
85 else: 89 ' '.join(cmd))
86 return subprocess.call(cmd) 90
91 # Download a single file, raising a CommandFailedException if it fails.
92 def _DownloadFile(self, source_url, dest_filename):
epoger 2013/05/31 03:54:06 Extracted the "curl" call into a new _DownloadFile
93 # Download into a temporary file and then rename it afterwards,
94 # so that we don't corrupt the existing file if it fails midway thru.
95 temp_filename = os.path.join(os.path.dirname(dest_filename),
96 '.temp-' + os.path.basename(dest_filename))
97
98 # TODO(epoger): Replace calls to "curl"/"mv" (which will only work on
99 # Unix) with a Python HTTP library (which should work cross-platform)
100 self._Call([ 'curl', '--fail', '--silent', source_url,
101 '--output', temp_filename ])
102 self._Call([ 'mv', temp_filename, dest_filename ])
87 103
88 # Rebaseline a single file. 104 # Rebaseline a single file.
89 def _RebaselineOneFile(self, expectations_subdir, builder_name, 105 def _RebaselineOneFile(self, expectations_subdir, builder_name,
90 infilename, outfilename): 106 infilename, outfilename):
91 url = ('http://skia-autogen.googlecode.com/svn/gm-actual/' + 107 url = ('http://skia-autogen.googlecode.com/svn/gm-actual/' +
92 expectations_subdir + '/' + builder_name + '/' + 108 expectations_subdir + '/' + builder_name + '/' +
93 expectations_subdir + '/' + infilename) 109 expectations_subdir + '/' + infilename)
94 cmd = [ 'curl', '--fail', '--silent', url ] 110
95 temp = tempfile.NamedTemporaryFile() 111 # Try to download this file, but if that fails, keep going...
96 ret = self._Call(cmd, stdout=temp) 112 #
97 if ret != 0: 113 # TODO(senorblanco): Why is this not treated as a serious failure?
epoger 2013/05/31 03:54:06 Stephen, any thoughts on this question?
Stephen White 2013/06/03 14:09:30 I think it's because not all platforms generate al
114 # Even though we may not have *expectations* checked in for
115 # some tests, we should always have *actual* results for every
116 # test, right?
117 try:
118 self._DownloadFile(source_url=url, dest_filename=outfilename)
119 except CommandFailedException:
98 print '# Couldn\'t fetch ' + url 120 print '# Couldn\'t fetch ' + url
99 return 121 return
100 cmd = [ 'cp', temp.name, outfilename ] 122
101 self._Call(cmd); 123 # Add this file to version control (if it isn't already).
102 if self._is_svn_checkout: 124 if self._is_svn_checkout:
103 cmd = [ 'svn', 'add', '--quiet', outfilename ] 125 cmd = [ 'svn', 'add', '--quiet', outfilename ]
104 self._Call(cmd) 126 self._Call(cmd)
105 cmd = [ 'svn', 'propset', '--quiet', 'svn:mime-type', 'image/png', 127 cmd = [ 'svn', 'propset', '--quiet', 'svn:mime-type', 'image/png',
106 outfilename ]; 128 outfilename ];
107 self._Call(cmd) 129 self._Call(cmd)
108 elif self._is_git_checkout: 130 elif self._is_git_checkout:
109 cmd = [ 'git', 'add', outfilename ] 131 cmd = [ 'git', 'add', outfilename ]
110 self._Call(cmd) 132 self._Call(cmd)
111 133
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 help='which platform subdirectories to rebaseline; ' + 185 help='which platform subdirectories to rebaseline; ' +
164 'if unspecified, rebaseline all subdirs, same as ' + 186 'if unspecified, rebaseline all subdirs, same as ' +
165 '"--subdirs %s"' % ' '.join(sorted(SUBDIR_MAPPING.keys()))) 187 '"--subdirs %s"' % ' '.join(sorted(SUBDIR_MAPPING.keys())))
166 parser.add_argument('--tests', metavar='TEST', nargs='+', required=True, 188 parser.add_argument('--tests', metavar='TEST', nargs='+', required=True,
167 help='which tests to rebaseline, e.g. ' + 189 help='which tests to rebaseline, e.g. ' +
168 '"--tests aaclip bigmatrix"') 190 '"--tests aaclip bigmatrix"')
169 args = parser.parse_args() 191 args = parser.parse_args()
170 rebaseliner = Rebaseliner(tests=args.tests, configs=args.configs, 192 rebaseliner = Rebaseliner(tests=args.tests, configs=args.configs,
171 subdirs=args.subdirs, dry_run=args.dry_run) 193 subdirs=args.subdirs, dry_run=args.dry_run)
172 rebaseliner.RebaselineAll() 194 rebaseliner.RebaselineAll()
OLDNEW
« no previous file with comments | « no previous file | tools/tests/rebaseline.sh » ('j') | tools/tests/rebaseline/all/output-expected/stdout » ('J')

Powered by Google App Engine
This is Rietveld 408576698