Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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() |
| OLD | NEW |