Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # -*- coding: utf-8 -*- | 1 # -*- coding: utf-8 -*- |
| 2 # Copyright 2014 The Chromium Authors. All rights reserved. | 2 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """This file allows the bots to be easily configure and run the tests.""" | 6 """This file allows the bots to be easily configure and run the tests.""" |
| 7 | 7 |
| 8 import argparse | 8 import argparse |
| 9 import os | 9 import urllib2 |
| 10 import tempfile | 10 import urllib |
| 11 | 11 |
| 12 from environment import Environment | 12 from environment import Environment |
| 13 import tests | 13 import tests |
| 14 | 14 |
| 15 def printResults(results): | |
| 16 """Print the test results. | |
| 17 | |
| 18 Args: | |
| 19 results: A list of the TestResults that are going to be printed. | |
| 20 """ | |
| 21 for result in results: | |
| 22 if result.successful: | |
| 23 print ( | |
| 24 "The %s test for %s was successful." | |
| 25 % (result.test_type, result.name)) | |
| 26 else: | |
| 27 print ( | |
| 28 "The %s test for %s has failed:\n%s" | |
| 29 % (result.test_type, result.name, result.message)) | |
| 30 | |
| 15 if __name__ == "__main__": | 31 if __name__ == "__main__": |
| 16 parser = argparse.ArgumentParser( | 32 parser = argparse.ArgumentParser( |
| 17 description="Password Manager automated tests runner help.") | 33 description="Password Manager automated tests runner help.") |
| 18 parser.add_argument( | 34 parser.add_argument( |
| 19 "--chrome-path", action="store", dest="chrome_path", | 35 "--chrome-path", action="store", dest="chrome_path", |
| 20 help="Set the chrome path (required).", nargs=1, required=True) | 36 help="Set the chrome path (required).", nargs=1, required=True) |
| 21 parser.add_argument( | 37 parser.add_argument( |
| 22 "--chromedriver-path", action="store", dest="chromedriver_path", | 38 "--chromedriver-path", action="store", dest="chromedriver_path", |
| 23 help="Set the chromedriver path (required).", nargs=1, required=True) | 39 help="Set the chromedriver path (required).", nargs=1, required=True) |
| 24 parser.add_argument( | 40 parser.add_argument( |
| 25 "--profile-path", action="store", dest="profile_path", | 41 "--profile-path", action="store", dest="profile_path", |
| 26 help="Set the profile path (required). You just need to choose a " | 42 help="Set the profile path (required). You just need to choose a " |
| 27 "temporary empty folder. If the folder is not empty all its content " | 43 "temporary empty folder. If the folder is not empty all its content " |
| 28 "is going to be removed.", | 44 "is going to be removed.", |
| 29 nargs=1, required=True) | 45 nargs=1, required=True) |
| 30 parser.add_argument( | 46 parser.add_argument( |
| 31 "--passwords-path", action="store", dest="passwords_path", | 47 "--passwords-path", action="store", dest="passwords_path", |
| 32 help="Set the usernames/passwords path (required).", nargs=1, | 48 help="Set the usernames/passwords path (required).", nargs=1, |
| 33 required=True) | 49 required=True) |
| 34 parser.add_argument("--save-path", action="store", nargs=1, dest="save_path", | 50 parser.add_argument("--save-path", action="store", nargs=1, dest="save_path", |
| 35 help="Write the results in a file.", required=True) | 51 help="Write the results in a file.", required=True) |
| 36 args = parser.parse_args() | 52 args = parser.parse_args() |
| 37 | 53 |
| 38 environment = Environment('', '', '', None, False) | 54 environment = Environment('', '', '', None, False) |
| 39 tests.Tests(environment) | 55 tests.Tests(environment) |
| 40 | 56 |
| 41 xml = open(args.save_path[0],"w") | 57 xml = "<xml>" |
| 42 xml.write("<xml>") | |
| 43 try: | |
| 44 results = tempfile.NamedTemporaryFile( | |
| 45 dir=os.path.join(tempfile.gettempdir()), delete=False) | |
| 46 results_path = results.name | |
| 47 results.close() | |
| 48 | 58 |
| 49 full_path = os.path.realpath(__file__) | 59 all_successful = True |
| 50 tests_dir = os.path.dirname(full_path) | 60 for websitetest in environment.websitetests: |
| 51 tests_path = os.path.join(tests_dir, "tests.py") | 61 successful = False |
| 62 # The tests can be flaky. This is why we try to rerun up to 3 times. | |
| 63 for x in range(0, 3): | |
| 64 # This message needs to be printed out to let the trybot know that the | |
| 65 # tests are still working, so they should not be killed. | |
| 66 print "Running tests for %s " % websitetest.name | |
| 67 tests_results = [] | |
| 68 # Exceptions thrown by this test need to be ignored so that the other | |
| 69 # tests can run without any problem. | |
| 70 try: | |
| 71 # Run the test without enable-automatic-password-saving to check whether | |
| 72 # or not the prompt is shown in the way we expected. | |
| 73 tests_results += tests.RunTests( | |
| 74 args.chrome_path[0], | |
| 75 args.chromedriver_path[0], | |
| 76 args.profile_path[0], | |
| 77 args.passwords_path[0], | |
| 78 False, | |
| 79 10, # Debug log level. | |
| 80 True, | |
| 81 None, | |
| 82 tests.TypeOfTestedWebsites.LIST_OF_TESTS, | |
| 83 [websitetest.name]) | |
| 84 except Exception as e: | |
| 85 print str(e) | |
| 52 | 86 |
| 53 for websitetest in environment.websitetests: | 87 # Exceptions thrown by this test need to be ignored so that the other |
| 54 # The tests can be flaky. This is why we try to rerun up to 3 times. | 88 # tests can run without any problem. |
| 55 for x in range(0, 3): | 89 try: |
| 56 # TODO(rchtara): Using "pkill" is just temporary until a better, | 90 # Run the test with enable-automatic-password-saving to check whether |
| 57 # platform-independent solution is found. | 91 # or not the password is stored in the the way we expected. |
| 58 os.system("pkill chrome") | 92 tests_results += tests.RunTests( |
| 59 try: | 93 args.chrome_path[0], |
| 60 os.remove(results_path) | 94 args.chromedriver_path[0], |
| 61 except Exception: | 95 args.profile_path[0], |
| 62 pass | 96 args.passwords_path[0], |
| 63 # TODO(rchtara): Using "timeout is just temporary until a better, | 97 True, |
| 64 # platform-independent solution is found. | 98 10, # Debug log level. |
| 99 True, | |
| 100 None, | |
| 101 tests.TypeOfTestedWebsites.LIST_OF_TESTS, | |
| 102 [websitetest.name]) | |
| 103 except Exception as e: | |
| 104 print str(e) | |
| 65 | 105 |
| 66 # The website test runs in two passes, each pass has an internal | 106 if (len(tests_results) > 1 and tests_results[0].successful and |
| 67 # timeout of 200s for waiting (see |remaining_time_to_wait| and | 107 tests_results[1].successful): |
| 68 # Wait() in websitetest.py). Accounting for some more time spent on | 108 successful = True |
| 69 # the non-waiting execution, 300 seconds should be the upper bound on | |
| 70 # the runtime of one pass, thus 600 seconds for the whole test. | |
| 71 os.system("timeout 600 python %s %s --chrome-path %s " | |
| 72 "--chromedriver-path %s --passwords-path %s --profile-path %s " | |
| 73 "--save-path %s" % | |
| 74 (tests_path, websitetest.name, args.chrome_path[0], | |
| 75 args.chromedriver_path[0], args.passwords_path[0], | |
| 76 args.profile_path[0], results_path)) | |
| 77 if os.path.isfile(results_path): | |
| 78 results = open(results_path, "r") | |
| 79 count = 0 # Count the number of successful tests. | |
| 80 for line in results: | |
| 81 xml.write(line) | |
| 82 count += line.count("successful='True'") | |
| 83 results.close() | |
| 84 # There is only two tests running for every website: the prompt and | |
| 85 # the normal test. If both of the tests were successful, the tests | |
| 86 # would be stopped for the current website. | |
| 87 if count == 2: | |
| 88 break | |
| 89 else: | |
| 90 xml.write("<result><test name='%s' type='prompt' successful='false'>" | |
| 91 "</test><test name='%s' type='normal' successful='false'></test>" | |
| 92 "</result>" % (websitetest.name, websitetest.name)) | |
| 93 finally: | |
| 94 try: | |
| 95 os.remove(results_path) | |
| 96 except Exception: | |
| 97 pass | |
| 98 | 109 |
| 99 xml.write("</xml>") | 110 elif len(tests_results) == 1: |
| 100 xml.close() | 111 failed_test = "prompt" |
| 112 if tests_results[0].type == "prompt": | |
| 113 failed_test = "normal" | |
| 114 tests_results.append( | |
| 115 environment.TestResult(websitetest.name, failed_test, False, | |
| 116 "An unexpected error has occurred.")) | |
| 117 | |
| 118 elif len(tests_results) == 0: | |
| 119 tests_results.append( | |
| 120 environment.TestResult(websitetest.name, "prompt", False, | |
| 121 "An unexpected error has occurred.")) | |
| 122 tests_results.append( | |
| 123 environment.TestResult(websitetest.name, "normal", False, | |
| 124 "An unexpected error has occurred.")) | |
| 125 | |
| 126 xml += tests.resultsToXml(tests_results) | |
| 127 printResults(tests_results) | |
| 128 if successful: | |
| 129 break | |
| 130 | |
| 131 all_successful = all_successful and successful | |
| 132 | |
| 133 xml += "</xml>" | |
| 134 | |
| 135 text = urllib.quote(xml.encode('utf-8')) | |
| 136 urllib2.urlopen("http://savvy-hull-649.appspot.com/?" + text).read() | |
|
vabr (Chromium)
2014/07/22 16:32:04
Are you throwing out the response? If it can give
| |
| 137 | |
| 138 json = open(args.save_path[0], "w") | |
| 139 json.write("{'successful': '%s'}" % all_successful) | |
| 140 json.close() | |
| OLD | NEW |