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

Side by Side Diff: tools/testing/perf_testing/run_perf_tests.py

Issue 10008038: Fix typo and build v8. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 8 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 2
3 # Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 3 # Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
4 # for details. All rights reserved. Use of this source code is governed by a 4 # for details. All rights reserved. Use of this source code is governed by a
5 # BSD-style license that can be found in the LICENSE file. 5 # BSD-style license that can be found in the LICENSE file.
6 6
7 import datetime 7 import datetime
8 import getpass 8 import getpass
9 import math 9 import math
10 from matplotlib.font_manager import FontProperties 10 from matplotlib.font_manager import FontProperties
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 # google.com/storage/?arg=dart-dump-render-tree#dart-dump-render-tree%2Fsdk 128 # google.com/storage/?arg=dart-dump-render-tree#dart-dump-render-tree%2Fsdk
129 # eventually. 129 # eventually.
130 # TODO(efortuna): Currently always building ia32 architecture because we don't 130 # TODO(efortuna): Currently always building ia32 architecture because we don't
131 # have test statistics for what's passing on x64. Eliminate arch specification 131 # have test statistics for what's passing on x64. Eliminate arch specification
132 # when we have tests running on x64, too. 132 # when we have tests running on x64, too.
133 shutil.rmtree(os.path.join(os.getcwd(), 133 shutil.rmtree(os.path.join(os.getcwd(),
134 utils.GetBuildRoot(utils.GuessOS(), 'release', 'ia32')), 134 utils.GetBuildRoot(utils.GuessOS(), 'release', 'ia32')),
135 onerror=on_rm_error) 135 onerror=on_rm_error)
136 lines = run_cmd([os.path.join('.', 'tools', 'build.py'), '-m', 'release', 136 lines = run_cmd([os.path.join('.', 'tools', 'build.py'), '-m', 'release',
137 '--arch=ia32', 'create_sdk']) 137 '--arch=ia32', 'create_sdk'])
138 lines = run_cmd([os.path.join('.', 'tools', 'build.py'), '-m', 'release',
139 '--arch=ia32', 'dart2js']) #Built only for the v8 target for CL tests.
138 140
139 for line in lines: 141 for line in lines:
140 if 'BUILD FAILED' in lines: 142 if 'BUILD FAILED' in lines:
141 # Someone checked in a broken build! Just stop trying to make it work 143 # Someone checked in a broken build! Just stop trying to make it work
142 # and wait to try again. 144 # and wait to try again.
143 print 'Broken Build' 145 print 'Broken Build'
144 return 1 146 return 1
145 return 0 147 return 0
146 148
147 def ensure_output_directory(dir_name): 149 def ensure_output_directory(dir_name):
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 def get_os_directory(): 186 def get_os_directory():
185 """Specifies the name of the directory for the testing build of dart, which 187 """Specifies the name of the directory for the testing build of dart, which
186 has yet a different naming convention from utils.getBuildRoot(...).""" 188 has yet a different naming convention from utils.getBuildRoot(...)."""
187 if platform.system() == 'Windows': 189 if platform.system() == 'Windows':
188 return 'windows' 190 return 'windows'
189 elif platform.system() == 'Darwin': 191 elif platform.system() == 'Darwin':
190 return 'macos' 192 return 'macos'
191 else: 193 else:
192 return 'linux' 194 return 'linux'
193 195
194 def upload_to_app_engine(username, password, suite_names): 196 def upload_to_app_engine(suite_names):
195 """Upload our results to our appengine server. 197 """Upload our results to our appengine server.
196 Arguments: 198 Arguments:
197 username: App Engine username for uploading data to dartperf.googleplex.com
198 password: App Engine password
199 suite_names: Directories to upload data from (should match suite names) 199 suite_names: Directories to upload data from (should match suite names)
200 """ 200 """
201 # TODO(efortuna): This is the most basic way to get the data up 201 # TODO(efortuna): This is the most basic way to get the data up
202 # for others to view. Revisit this once we're serving nicer graphs (Google 202 # for others to view. Revisit this once we're serving nicer graphs (Google
203 # Chart Tools) and from multiple perfbots and once we're in a position to 203 # Chart Tools) and from multiple perfbots and once we're in a position to
204 # organize the data in a useful manner(!!). 204 # organize the data in a useful manner(!!).
205 os.chdir(os.path.join(DART_INSTALL_LOCATION, 'tools', 'testing', 205 os.chdir(os.path.join(DART_INSTALL_LOCATION, 'tools', 'testing',
206 'perf_testing')) 206 'perf_testing'))
207 for data in suite_names: 207 for data in suite_names:
208 path = os.path.join('appengine', 'static', 'data', data, utils.GuessOS()) 208 path = os.path.join('appengine', 'static', 'data', data, utils.GuessOS())
(...skipping 24 matching lines...) Expand all
233 shutil.rmtree(os.path.join('appengine', 'static', 'graphs'), 233 shutil.rmtree(os.path.join('appengine', 'static', 'graphs'),
234 ignore_errors=True) 234 ignore_errors=True)
235 shutil.copytree('graphs', os.path.join('appengine', 'static', 'graphs')) 235 shutil.copytree('graphs', os.path.join('appengine', 'static', 'graphs'))
236 shutil.copyfile('index.html', os.path.join('appengine', 'static', 236 shutil.copyfile('index.html', os.path.join('appengine', 'static',
237 'index.html')) 237 'index.html'))
238 shutil.copyfile('dromaeo.html', os.path.join('appengine', 'static', 238 shutil.copyfile('dromaeo.html', os.path.join('appengine', 'static',
239 'dromaeo.html')) 239 'dromaeo.html'))
240 shutil.copyfile('data.html', os.path.join('appengine', 'static', 240 shutil.copyfile('data.html', os.path.join('appengine', 'static',
241 'data.html')) 241 'data.html'))
242 p = subprocess.Popen([os.path.join('..', '..', '..', 'third_party', 242 p = subprocess.Popen([os.path.join('..', '..', '..', 'third_party',
243 'appengine-python', 'appcfg.py'), 'update', 243 'appengine-python', 'appcfg.py'), '--oauth2', 'update',
244 'appengine/'], shell=HAS_SHELL, stdin=subprocess.PIPE) 244 'appengine/'], shell=HAS_SHELL, stdin=subprocess.PIPE)
245 p.stdin.write(username + '\n')
246 p.stdin.write(password + '\n')
247 p.communicate() 245 p.communicate()
248 246
249 247
250 class TestRunner(object): 248 class TestRunner(object):
251 """The base class to provide shared code for different tests we will run and 249 """The base class to provide shared code for different tests we will run and
252 graph.""" 250 graph."""
253 251
254 def __init__(self, result_folder_name, platform_list, variants, 252 def __init__(self, result_folder_name, platform_list, variants,
255 values_list): 253 values_list):
256 """Args: 254 """Args:
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
542 else: 540 else:
543 bench_dict = self.values_dict[browser][FROG] 541 bench_dict = self.values_dict[browser][FROG]
544 bench_dict[name] += [float(score)] 542 bench_dict[name] += [float(score)]
545 self.revision_dict[browser][version][name] += [revision_num] 543 self.revision_dict[browser][version][name] += [revision_num]
546 544
547 f.close() 545 f.close()
548 self.calculate_geometric_mean(browser, version, revision_num) 546 self.calculate_geometric_mean(browser, version, revision_num)
549 547
550 548
551 # TODO(vsm): This should not be hardcoded here if possible. 549 # TODO(vsm): This should not be hardcoded here if possible.
550 DROMAEO_BENCHMARKS = {
551 'attr': ('attributes', [
552 'getAttribute',
553 'element.property',
554 'setAttribute',
555 'element.property = value']),
556 'modify': ('modify', [
557 'createElement',
558 'createTextNode',
559 'innerHTML',
560 'cloneNode',
561 'appendChild',
562 'insertBefore']),
563 'query': ('query', [
564 'getElementById',
565 'getElementById (not in document)',
566 'getElementsByTagName(div)',
567 'getElementsByTagName(p)',
568 'getElementsByTagName(a)',
569 'getElementsByTagName(*)',
570 'getElementsByTagName (not in document)',
571 'getElementsByName',
572 'getElementsByName (not in document)']),
573 'traverse': ('traverse', [
574 'firstChild',
575 'lastChild',
576 'nextSibling',
577 'previousSibling',
578 'childNodes'])
579 }
580
581 # TODO(vsm): This is a hack to skip breaking tests. Triage this
582 # failure properly. The modify suite fails on 32-bit chrome on
583 # the mac.
584 def get_valid_dromaeo_tags():
585 tags = [tag for (tag, _) in DROMAEO_BENCHMARKS.values()]
586 if platform.system() == 'Darwin':
587 tags.remove('modify')
588 return tags
589
552 def get_dromaeo_benchmarks(): 590 def get_dromaeo_benchmarks():
553 return map(lambda str: str.replace(' ', '_'), 591 valid = get_valid_dromaeo_tags()
554 ['getAttribute', 'element.property', 'setAttribute', 592 benchmarks = reduce(lambda l1,l2: l1+l2,
555 'element.property = value', 'createElement', 'createTextNode', 593 [tests for (tag, tests) in
556 'innerHTML', 'cloneNode', 'appendChild', 'insertBefore', 594 DROMAEO_BENCHMARKS.values() if tag in valid])
557 'getElementById', 'getElementById (not in document)', 595 return map(lambda str: str.replace(' ', '_'), benchmarks)
558 'getElementsByTagName(div)', 'getElementsByTagName(p)',
559 'getElementsByTagName(a)', 'getElementsByTagName(*)',
560 'getElementsByTagName (not in document)', 'getElementsByName',
561 'getElementsByName (not in document)', 'firstChild', 'lastChild',
562 'nextSibling', 'previousSibling', 'childNodes'])
563
564 596
565 def get_dromaeo_versions(): 597 def get_dromaeo_versions():
566 return ['js', 'frog_dom', 'frog_html'] 598 return ['js', 'frog_dom', 'frog_html']
567 599
600 def get_dromaeo_url_query(version):
601 version = version.replace('_','&')
602 tags = get_valid_dromaeo_tags()
603 return '|'.join([ '%s&%s' % (version, tag) for tag in tags])
604
568 class DromaeoTest(PerformanceTest): 605 class DromaeoTest(PerformanceTest):
569 """Runs Dromaeo tests, in the browser.""" 606 """Runs Dromaeo tests, in the browser."""
570 def __init__(self): 607 def __init__(self):
571 super(DromaeoTest, self).__init__( 608 super(DromaeoTest, self).__init__(
572 DROMAEO, get_browsers(), 'browser', 609 DROMAEO, get_browsers(), 'browser',
573 get_dromaeo_versions(), get_dromaeo_benchmarks()) 610 get_dromaeo_versions(), get_dromaeo_benchmarks())
574 611
575 def run_tests(self): 612 def run_tests(self):
576 """Run dromaeo in the browser.""" 613 """Run dromaeo in the browser."""
577 614
578 # Build tests. 615 # Build tests.
579 dromaeo_path = os.path.join('samples', 'third_party', 'dromaeo') 616 dromaeo_path = os.path.join('samples', 'third_party', 'dromaeo')
580 current_path = os.getcwd() 617 current_path = os.getcwd()
581 os.chdir(dromaeo_path) 618 os.chdir(dromaeo_path)
582 run_cmd(['python', 'generate_frog_tests.py']) 619 run_cmd(['python', 'generate_frog_tests.py'])
583 os.chdir(current_path) 620 os.chdir(current_path)
584 621
585 versions = get_dromaeo_versions() 622 versions = get_dromaeo_versions()
586 623
587 for browser in get_browsers(): 624 for browser in get_browsers():
588 for version_name in versions: 625 for version_name in versions:
589 version = version_name.replace('_','&') 626 version = get_dromaeo_url_query(version_name)
590 self.trace_file = os.path.join('tools', 'testing', 'perf_testing', 627 self.trace_file = os.path.join('tools', 'testing', 'perf_testing',
591 self.result_folder_name, 628 self.result_folder_name,
592 'dromaeo-%s-%s-%s' % (self.cur_time, browser, version_name)) 629 'dromaeo-%s-%s-%s' % (self.cur_time, browser, version_name))
593 self.add_svn_revision_to_trace(self.trace_file) 630 self.add_svn_revision_to_trace(self.trace_file)
594 file_path = os.path.join(os.getcwd(), dromaeo_path, 631 file_path = os.path.join(os.getcwd(), dromaeo_path,
595 'index-js.html?%s' % version) 632 'index-js.html?%s' % version)
596 run_cmd(['python', os.path.join('tools', 'testing', 'run_selenium.py'), 633 run_cmd(['python', os.path.join('tools', 'testing', 'run_selenium.py'),
597 '--out', file_path, '--browser', browser, 634 '--out', file_path, '--browser', browser,
598 '--timeout', '200', '--mode', 'dromaeo'], self.trace_file, 635 '--timeout', '200', '--mode', 'dromaeo'], self.trace_file,
599 append=True) 636 append=True)
(...skipping 27 matching lines...) Expand all
627 if results: 664 if results:
628 for result in results: 665 for result in results:
629 r = re.match(result_pattern, result) 666 r = re.match(result_pattern, result)
630 name = r.group(1).strip(':').replace(' ', '_') 667 name = r.group(1).strip(':').replace(' ', '_')
631 score = float(r.group(2)) 668 score = float(r.group(2))
632 bench_dict[name] += [float(score)] 669 bench_dict[name] += [float(score)]
633 self.revision_dict[browser][version][name] += [revision_num] 670 self.revision_dict[browser][version][name] += [revision_num]
634 671
635 f.close() 672 f.close()
636 self.calculate_geometric_mean(browser, version, revision_num) 673 self.calculate_geometric_mean(browser, version, revision_num)
637 674
vsm 2012/04/06 03:53:42 Extraneous whitespace?
638 675
639 class DromaeoSizeTest(TestRunner): 676 class DromaeoSizeTest(TestRunner):
640 """Run tests to determine the compiled file output size of Dromaeo.""" 677 """Run tests to determine the compiled file output size of Dromaeo."""
641 def __init__(self): 678 def __init__(self):
642 super(DromaeoSizeTest, self).__init__( 679 super(DromaeoSizeTest, self).__init__(
643 DROMAEO_SIZE, 680 DROMAEO_SIZE,
644 ['browser'], ['dart', 'frog_dom', 'frog_html', 'frog_htmlidiomatic'], 681 ['browser'], ['dart', 'frog_dom', 'frog_html', 'frog_htmlidiomatic'],
645 ['attr', 'modify', 'query', 'traverse']) 682 DROMAEO_BENCHMARKS.keys())
646 683
647 def run_tests(self): 684 def run_tests(self):
648 # Build tests. 685 # Build tests.
649 dromaeo_path = os.path.join('samples', 'third_party', 'dromaeo') 686 dromaeo_path = os.path.join('samples', 'third_party', 'dromaeo')
650 current_path = os.getcwd() 687 current_path = os.getcwd()
651 os.chdir(dromaeo_path) 688 os.chdir(dromaeo_path)
652 run_cmd(['python', os.path.join('generate_frog_tests.py')]) 689 run_cmd(['python', os.path.join('generate_frog_tests.py')])
653 os.chdir(current_path) 690 os.chdir(current_path)
654 691
655 self.trace_file = os.path.join('tools', 'testing', 'perf_testing', 692 self.trace_file = os.path.join('tools', 'testing', 'perf_testing',
656 self.result_folder_name, self.result_folder_name + self.cur_time) 693 self.result_folder_name, self.result_folder_name + self.cur_time)
657 self.add_svn_revision_to_trace(self.trace_file) 694 self.add_svn_revision_to_trace(self.trace_file)
658 695
659 variants = [ 696 variants = [
660 ('frog_dom', ''), 697 ('frog_dom', ''),
661 ('frog_html', '-html'), 698 ('frog_html', '-html'),
662 ('frog_htmlidiomatic', '-htmlidiomatic')] 699 ('frog_htmlidiomatic', '-htmlidiomatic')]
663 700
664 test_path = os.path.join(dromaeo_path, 'tests') 701 test_path = os.path.join(dromaeo_path, 'tests')
665 frog_path = os.path.join(test_path, 'frog') 702 frog_path = os.path.join(test_path, 'frog')
666 total_size = {} 703 total_size = {}
667 for (variant, _) in variants: 704 for (variant, _) in variants:
668 total_size[variant] = 0 705 total_size[variant] = 0
669 total_dart_size = 0 706 total_dart_size = 0
670 for suite in ['attr', 'modify', 'query', 'traverse']: 707 for suite in DROMAEO_BENCHMARKS.keys():
671 dart_size = 0 708 dart_size = 0
672 try: 709 try:
673 dart_size = os.path.getsize(os.path.join(test_path, 710 dart_size = os.path.getsize(os.path.join(test_path,
674 'dom-%s.dart' % suite)) 711 'dom-%s.dart' % suite))
675 except OSError: 712 except OSError:
676 pass #If compilation failed, continue on running other tests. 713 pass #If compilation failed, continue on running other tests.
677 714
678 total_dart_size += dart_size 715 total_dart_size += dart_size
679 run_cmd(['echo', 'Size (dart, %s): %s' % (suite, str(dart_size))], 716 run_cmd(['echo', 'Size (dart, %s): %s' % (suite, str(dart_size))],
680 self.trace_file, append=True) 717 self.trace_file, append=True)
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
734 self.values_dict['browser'][variant][metric] += [num] 771 self.values_dict['browser'][variant][metric] += [num]
735 self.revision_dict['browser'][variant][metric] += [revision_num] 772 self.revision_dict['browser'][variant][metric] += [revision_num]
736 773
737 f.close() 774 f.close()
738 775
739 def plot_results(self, png_filename): 776 def plot_results(self, png_filename):
740 self.style_and_save_perf_plot( 777 self.style_and_save_perf_plot(
741 'Compiled Dromaeo Sizes', 778 'Compiled Dromaeo Sizes',
742 'Size (in bytes)', 10, 10, 'lower left', png_filename, 779 'Size (in bytes)', 10, 10, 'lower left', png_filename,
743 ['browser'], ['dart', 'frog_dom', 'frog_html', 'frog_htmlidiomatic'], 780 ['browser'], ['dart', 'frog_dom', 'frog_html', 'frog_htmlidiomatic'],
744 ['attr', 'modify', 'query', 'traverse']) 781 DROMAEO_BENCHMARKS.keys())
745 782
746 self.style_and_save_perf_plot( 783 self.style_and_save_perf_plot(
747 'Compiled Dromaeo Sizes', 784 'Compiled Dromaeo Sizes',
748 'Size (in bytes)', 10, 10, 'lower left', '2' + png_filename, 785 'Size (in bytes)', 10, 10, 'lower left', '2' + png_filename,
749 ['browser'], ['dart', 'frog_dom', 'frog_html', 'frog_htmlidiomatic'], 786 ['browser'], ['dart', 'frog_dom', 'frog_html', 'frog_htmlidiomatic'],
750 [GEO_MEAN]) 787 [GEO_MEAN])
751 788
752 789
753 790
754 class CompileTimeAndSizeTest(TestRunner): 791 class CompileTimeAndSizeTest(TestRunner):
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
868 def parse_args(): 905 def parse_args():
869 parser = optparse.OptionParser() 906 parser = optparse.OptionParser()
870 # TODO(vsm): Change to a list to scale. 907 # TODO(vsm): Change to a list to scale.
871 parser.add_option('--suites', '-s', dest='suites', 908 parser.add_option('--suites', '-s', dest='suites',
872 help='Run the specified comma-separated test suites from set: %s' % \ 909 help='Run the specified comma-separated test suites from set: %s' % \
873 ','.join(SUITES.keys()), 910 ','.join(SUITES.keys()),
874 action='store', default=None) 911 action='store', default=None)
875 parser.add_option('--forever', '-f', dest='continuous', 912 parser.add_option('--forever', '-f', dest='continuous',
876 help='Run this script forever, always checking for the next svn ' 913 help='Run this script forever, always checking for the next svn '
877 'checkin', action='store_true', default=False) 914 'checkin', action='store_true', default=False)
915 parser.add_option('--graph-only', '-g', dest='graph_only', default=False,
916 help='Do not run tests, only regenerate graphs', action='store_true')
917 parser.add_option('--nobuild', '-n', dest='no_build', action='store_true',
918 help='Do not sync with the repository and do not rebuild.', default=False)
919 parser.add_option('--upload', '-u', dest='upload',
920 help='Upload data to app engine (will require authentication).',
921 action='store_true', default=False)
878 parser.add_option('--verbose', '-v', dest='verbose', 922 parser.add_option('--verbose', '-v', dest='verbose',
879 help='Print extra debug output', action='store_true', default=False) 923 help='Print extra debug output', action='store_true', default=False)
880 parser.add_option('--nobuild', '-n', dest='no_build', action='store_true',
881 help='Do not sync with the repository and do not rebuild.', default=False)
882 parser.add_option('--graph-only', '-g', dest='graph_only', default=False,
883 help='Do not run tests, only regenerate graphs', action='store_true')
884 parser.add_option('--user', '-u', dest='username',
885 help='Username for submitting new data to App Engine', default='')
886 924
887 args, ignored = parser.parse_args() 925 args, ignored = parser.parse_args()
888 password = ''
889 if args.username != '':
890 password = getpass.getpass("App Engine Password: ")
891 else:
892 print 'Warning: performance data will not be uploaded to App Engine' + \
893 ' if you do not provide a username.'
894 926
895 if not args.suites: 927 if not args.suites:
896 suites = SUITES.values() 928 suites = SUITES.values()
897 else: 929 else:
898 suites = [] 930 suites = []
899 suitelist = args.suites.split(',') 931 suitelist = args.suites.split(',')
900 for name in suitelist: 932 for name in suitelist:
901 if name in SUITES: 933 if name in SUITES:
902 suites.append(SUITES[name]) 934 suites.append(SUITES[name])
903 else: 935 else:
904 print 'Error: Invalid suite %s not in %s' % (name, 936 print 'Error: Invalid suite %s not in %s' % (name,
905 ','.join(SUITES.keys())) 937 ','.join(SUITES.keys()))
906 sys.exit(1) 938 sys.exit(1)
907 return (suites, args.continuous, args.verbose, args.no_build, 939 return (suites, args.continuous, args.verbose, args.no_build,
908 args.graph_only, args.username, password) 940 args.graph_only, args.upload)
909 941
910 def run_test_sequence(suites, no_build, graph_only, 942 def run_test_sequence(suites, no_build, graph_only, upload):
911 username, password):
912 # The buildbot already builds and syncs to a specific revision. Don't fight 943 # The buildbot already builds and syncs to a specific revision. Don't fight
913 # with it or replicate work. 944 # with it or replicate work.
914 if (not no_build or not graph_only) and sync_and_build() == 1: 945 if (not no_build or not graph_only) and sync_and_build() == 1:
915 return # The build is broken. 946 return # The build is broken.
916 947
917 for test in suites: 948 for test in suites:
918 test().run(graph_only) 949 test().run(graph_only)
919 950
920 if username != '': 951 if upload:
921 upload_to_app_engine(username, password, SUITES.keys()) 952 upload_to_app_engine(SUITES.keys())
922 953
923 def main(): 954 def main():
924 global VERBOSE 955 global VERBOSE
925 (suites, continuous, verbose, no_build, graph_only, 956 (suites, continuous, verbose, no_build, graph_only, upload) = parse_args()
926 username, password) = parse_args()
927 VERBOSE = verbose 957 VERBOSE = verbose
928 if continuous: 958 if continuous:
929 while True: 959 while True:
930 if has_new_code(): 960 if has_new_code():
931 run_test_sequence(suites, no_build, graph_only, 961 run_test_sequence(suites, no_build, graph_only, upload)
932 username, password)
933 else: 962 else:
934 time.sleep(SLEEP_TIME) 963 time.sleep(SLEEP_TIME)
935 else: 964 else:
936 run_test_sequence(suites, no_build, graph_only, 965 run_test_sequence(suites, no_build, graph_only, upload)
937 username, password)
938 966
939 if __name__ == '__main__': 967 if __name__ == '__main__':
940 main() 968 main()
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698