1# -*- coding: utf-8 -*- 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 4# found in the LICENSE file. 5 6"""This file allows the bots to be easily configure and run the tests.""" 7 8import argparse 9import os 10import tempfile 11 12from environment import Environment 13import tests 14 15if __name__ == "__main__": 16 parser = argparse.ArgumentParser( 17 description="Password Manager automated tests runner help.") 18 parser.add_argument( 19 "--chrome-path", action="store", dest="chrome_path", 20 help="Set the chrome path (required).", nargs=1, required=True) 21 parser.add_argument( 22 "--chromedriver-path", action="store", dest="chromedriver_path", 23 help="Set the chromedriver path (required).", nargs=1, required=True) 24 parser.add_argument( 25 "--profile-path", action="store", dest="profile_path", 26 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 " 28 "is going to be removed.", 29 nargs=1, required=True) 30 parser.add_argument( 31 "--passwords-path", action="store", dest="passwords_path", 32 help="Set the usernames/passwords path (required).", nargs=1, 33 required=True) 34 parser.add_argument("--save-path", action="store", nargs=1, dest="save_path", 35 help="Write the results in a file.", required=True) 36 args = parser.parse_args() 37 38 environment = Environment('', '', '', None, False) 39 tests.Tests(environment) 40 41 xml = open(args.save_path[0],"w") 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 49 full_path = os.path.realpath(__file__) 50 tests_dir = os.path.dirname(full_path) 51 tests_path = os.path.join(tests_dir, "tests.py") 52 53 for websitetest in environment.websitetests: 54 # The tests can be flaky. This is why we try to rerun up to 3 times. 55 for x in range(0, 3): 56 # TODO(rchtara): Using "pkill" is just temporary until a better, 57 # platform-independent solution is found. 58 os.system("pkill chrome") 59 try: 60 os.remove(results_path) 61 except Exception: 62 pass 63 # TODO(rchtara): Using "timeout is just temporary until a better, 64 # platform-independent solution is found. 65 66 # The website test runs in two passes, each pass has an internal 67 # timeout of 200s for waiting (see |remaining_time_to_wait| and 68 # Wait() in websitetest.py). Accounting for some more time spent on 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 99 xml.write("</xml>") 100 xml.close() 101