OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
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 """Contains test runners for launching tests on simulators and devices.""" | 6 """Contains test runners for launching tests on simulators and devices.""" |
7 | 7 |
8 # pylint: disable=relative-import | 8 # pylint: disable=relative-import |
9 import environment_setup | 9 import environment_setup |
10 | 10 |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 'Unexpected app path: %s. %s' % (app_path, valid_extensions)) | 84 'Unexpected app path: %s. %s' % (app_path, valid_extensions)) |
85 | 85 |
86 | 86 |
87 class SimulatorNotFoundError(TestRunnerError): | 87 class SimulatorNotFoundError(TestRunnerError): |
88 """The iossim path was not found.""" | 88 """The iossim path was not found.""" |
89 def __init__(self, iossim_path): | 89 def __init__(self, iossim_path): |
90 super(SimulatorNotFoundError, self).__init__( | 90 super(SimulatorNotFoundError, self).__init__( |
91 'Simulator does not exist: %s.' % iossim_path) | 91 'Simulator does not exist: %s.' % iossim_path) |
92 | 92 |
93 | 93 |
| 94 class XctestNotFoundError(TestRunnerError): |
| 95 """The xctest intended to be run was not found.""" |
| 96 def __init__(self, xctest_path): |
| 97 super(XctestNotFoundError, self).__init__( |
| 98 'Xctest does not exist: %s.' % xctest_path) |
| 99 |
| 100 |
94 class AppLaunchError(TestRunnerError): | 101 class AppLaunchError(TestRunnerError): |
95 """There was an error launching the app.""" | 102 """There was an error launching the app.""" |
96 pass | 103 pass |
97 | 104 |
98 | 105 |
99 class TestRunner(object): | 106 class TestRunner(object): |
100 """Base class containing common TestRunner functionality.""" | 107 """Base class containing common TestRunner functionality.""" |
101 def __init__( | 108 def __init__( |
102 self, | 109 self, |
103 app_path, | 110 app_path, |
(...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
779 result = self._Run(self.GetLaunchCommand(), *args, **kwargs) | 786 result = self._Run(self.GetLaunchCommand(), *args, **kwargs) |
780 | 787 |
781 return self.RunAllTests(result, *args, **kwargs) | 788 return self.RunAllTests(result, *args, **kwargs) |
782 | 789 |
783 | 790 |
784 class XCTestRunner(TestRunner): | 791 class XCTestRunner(TestRunner): |
785 """Base class containing common functionalities to run xctests.""" | 792 """Base class containing common functionalities to run xctests.""" |
786 def __init__( | 793 def __init__( |
787 self, | 794 self, |
788 app_path, | 795 app_path, |
789 test_host, | |
790 test_project_dir, | |
791 xcode_version=None, | 796 xcode_version=None, |
792 gs_bucket=None, | 797 gs_bucket=None, |
793 perf_bot_name=None, | 798 perf_bot_name=None, |
794 perf_build_number=None, | 799 perf_build_number=None, |
795 perf_builder_name=None, | 800 perf_builder_name=None, |
796 perf_master_name=None, | 801 perf_master_name=None, |
797 perf_revision=None, | 802 perf_revision=None, |
798 perf_x_value=None, | 803 perf_x_value=None, |
799 test_args=None, | 804 test_args=None, |
800 env_vars=None, | 805 env_vars=None, |
801 ): | 806 ): |
802 """Initializes an instance of the SimulatorXCTestRunner class. | 807 """Initializes an instance of the SimulatorXCTestRunner class. |
803 | 808 |
804 Args: | 809 Args: |
805 app_path: Full path to the compiled app to run. | 810 app_path: Full path to the compiled app to run. |
806 test_host: Name of the compiled test host app to run tests. | |
807 test_project_dir: Directory of the dummy test project. | |
808 xcode_version: Version of Xcode to use. | 811 xcode_version: Version of Xcode to use. |
809 gs_bucket: Google Storage bucket to upload test data to, or None if the | 812 gs_bucket: Google Storage bucket to upload test data to, or None if the |
810 test data should not be uploaded. | 813 test data should not be uploaded. |
811 perf_bot_name: Name of this bot as indicated to the perf dashboard. | 814 perf_bot_name: Name of this bot as indicated to the perf dashboard. |
812 perf_build_number: Build number to indicate to the perf dashboard. | 815 perf_build_number: Build number to indicate to the perf dashboard. |
813 perf_builder_name: Name of this builder as indicated to the perf | 816 perf_builder_name: Name of this builder as indicated to the perf |
814 dashboard. | 817 dashboard. |
815 perf_master_name: Name of the master as indicated to the perf dashboard. | 818 perf_master_name: Name of the master as indicated to the perf dashboard. |
816 perf_revision: Revision to indicate to the perf dashboard. | 819 perf_revision: Revision to indicate to the perf dashboard. |
817 perf_x_value: Value to use on the x axis for all data uploaded to the | 820 perf_x_value: Value to use on the x axis for all data uploaded to the |
(...skipping 12 matching lines...) Expand all Loading... |
830 perf_bot_name=perf_bot_name, | 833 perf_bot_name=perf_bot_name, |
831 perf_build_number=perf_build_number, | 834 perf_build_number=perf_build_number, |
832 perf_builder_name=perf_builder_name, | 835 perf_builder_name=perf_builder_name, |
833 perf_master_name=perf_master_name, | 836 perf_master_name=perf_master_name, |
834 perf_revision=perf_revision, | 837 perf_revision=perf_revision, |
835 perf_x_value=perf_x_value, | 838 perf_x_value=perf_x_value, |
836 test_args=test_args, | 839 test_args=test_args, |
837 xcode_version=xcode_version, | 840 xcode_version=xcode_version, |
838 ) | 841 ) |
839 self.app_path = os.path.abspath(app_path) | 842 self.app_path = os.path.abspath(app_path) |
840 self.test_host_name = test_host | |
841 # Test target name is its host name without '_host' suffix. | |
842 self.test_target_name = test_host.rsplit('_', 1)[0] | |
843 self.test_project_dir = test_project_dir | |
844 self.timeout = '120' | 843 self.timeout = '120' |
845 self.homedir = '' | 844 self.homedir = '' |
846 self.start_time = None | 845 self.start_time = None |
847 | 846 |
848 def TearDown(self): | 847 def TearDown(self): |
849 """Performs post-test tear down.""" | 848 """Performs post-test tear down.""" |
850 raise NotImplementedError | 849 raise NotImplementedError |
851 | 850 |
852 def HandleJsonFileWithPath(self, summary): | 851 def HandleJsonFileWithPath(self, summary): |
853 """Parse data in summarydir and send to perf dashboard.""" | 852 """Parse data in summarydir and send to perf dashboard.""" |
854 with open(summary) as jsonFile: | 853 with open(summary) as jsonFile: |
855 return json.load(jsonFile) | 854 return json.load(jsonFile) |
856 | 855 |
857 def GetLaunchEnvironment(self): | 856 def GetLaunchEnvironment(self): |
858 """Returns the environment which is used to run the xctest. | 857 """Returns the environment which is used to run the xctest. |
859 """ | 858 """ |
860 env = dict(os.environ, APP_TARGET_NAME=self.test_host_name, | 859 env = dict(os.environ, |
861 TEST_TARGET_NAME=self.test_target_name, | |
862 NSUnbufferedIO='YES') | 860 NSUnbufferedIO='YES') |
863 return env | 861 return env |
864 | 862 |
865 def GetLaunchCommand(self, test_filter=None, blacklist=False): | 863 def GetLaunchCommand(self, test_filter=None, blacklist=False): |
866 """Returns the command which is used to launch the test. | 864 """Returns the command which is used to launch the test. |
867 | 865 |
868 Args: | 866 Args: |
869 test_filter: A list of tests to filter by, or None to mean all. | 867 test_filter: A list of tests to filter by, or None to mean all. |
870 blacklist: Whether to blacklist the elements of test_filter or not. Only | 868 blacklist: Whether to blacklist the elements of test_filter or not. Only |
871 works when test_filter is not None. | 869 works when test_filter is not None. |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1013 # At this point, all the tests have run, so used failed_tests to determine | 1011 # At this point, all the tests have run, so used failed_tests to determine |
1014 # the success/failure. | 1012 # the success/failure. |
1015 return not failed_tests | 1013 return not failed_tests |
1016 | 1014 |
1017 | 1015 |
1018 class SimulatorXCTestRunner(XCTestRunner): | 1016 class SimulatorXCTestRunner(XCTestRunner): |
1019 """Class for running xctests on an iOS simulator.""" | 1017 """Class for running xctests on an iOS simulator.""" |
1020 def __init__( | 1018 def __init__( |
1021 self, | 1019 self, |
1022 app_path, | 1020 app_path, |
1023 test_host, | 1021 xctest_path, |
1024 test_project_dir, | 1022 iossim_path, |
1025 platform, | 1023 platform, |
1026 version, | 1024 version, |
1027 xcode_version=None, | 1025 xcode_version=None, |
1028 gs_bucket=None, | 1026 gs_bucket=None, |
1029 perf_bot_name=None, | 1027 perf_bot_name=None, |
1030 perf_build_number=None, | 1028 perf_build_number=None, |
1031 perf_builder_name=None, | 1029 perf_builder_name=None, |
1032 perf_master_name=None, | 1030 perf_master_name=None, |
1033 perf_revision=None, | 1031 perf_revision=None, |
1034 perf_x_value=None, | 1032 perf_x_value=None, |
1035 test_args=None, | 1033 test_args=None, |
1036 env_vars=None, | 1034 env_vars=None, |
1037 ): | 1035 ): |
1038 """Initializes an instance of the SimulatorXCTestRunner class. | 1036 """Initializes an instance of the SimulatorXCTestRunner class. |
1039 | 1037 |
1040 Args: | 1038 Args: |
1041 app_path: Full path to the compiled app to run. | 1039 app_path: Full path to the compiled app to run. |
1042 test_host: Name of the compiled test host app to run tests. | 1040 iossim_path: Full path to the iossim executable to launch. |
1043 test_project_dir: Directory of the dummy test project. | 1041 xctest_path: Full path to the compiled test bundle. |
1044 platform: The platform to simulate. Supported values can be found by | 1042 platform: The platform to simulate. Supported values can be found by |
1045 running 'xcodebuild -list'. e.g. 'iPhone 5', 'iPhone 5s'. | 1043 running 'xcodebuild -list'. e.g. 'iPhone 5', 'iPhone 5s'. |
1046 version: The iOS version the simulator should be running. Supported values | 1044 version: The iOS version the simulator should be running. Supported values |
1047 can be found by running 'xcodebuild -list'. e.g. '8.0', '7.1'. | 1045 can be found by running 'xcodebuild -list'. e.g. '8.0', '7.1'. |
1048 xcode_version: Version of Xcode to use. | 1046 xcode_version: Version of Xcode to use. |
1049 gs_bucket: Google Storage bucket to upload test data to, or None if the | 1047 gs_bucket: Google Storage bucket to upload test data to, or None if the |
1050 test data should not be uploaded. | 1048 test data should not be uploaded. |
1051 perf_bot_name: Name of this bot as indicated to the perf dashboard. | 1049 perf_bot_name: Name of this bot as indicated to the perf dashboard. |
1052 perf_build_number: Build number to indicate to the perf dashboard. | 1050 perf_build_number: Build number to indicate to the perf dashboard. |
1053 perf_builder_name: Name of this builder as indicated to the perf | 1051 perf_builder_name: Name of this builder as indicated to the perf |
1054 dashboard. | 1052 dashboard. |
1055 perf_master_name: Name of the master as indicated to the perf dashboard. | 1053 perf_master_name: Name of the master as indicated to the perf dashboard. |
1056 perf_revision: Revision to indicate to the perf dashboard. | 1054 perf_revision: Revision to indicate to the perf dashboard. |
1057 perf_x_value: Value to use on the x axis for all data uploaded to the | 1055 perf_x_value: Value to use on the x axis for all data uploaded to the |
1058 perf dashboard. | 1056 perf dashboard. |
1059 test_args: Arguments to pass when launching the test. | 1057 test_args: Arguments to pass when launching the test. |
1060 env_vars: Environment variables to set when launching the test. | 1058 env_vars: Environment variables to set when launching the test. |
1061 | 1059 |
1062 Raises: | 1060 Raises: |
1063 SimulatorNotFoundError: If the given iossim path cannot be found. | 1061 SimulatorNotFoundError: If the given iossim path cannot be found. |
1064 """ | 1062 """ |
1065 super(SimulatorXCTestRunner, self).__init__( | 1063 super(SimulatorXCTestRunner, self).__init__( |
1066 app_path, | 1064 app_path, |
1067 test_host, | |
1068 test_project_dir, | |
1069 env_vars=env_vars, | 1065 env_vars=env_vars, |
1070 gs_bucket=gs_bucket, | 1066 gs_bucket=gs_bucket, |
1071 perf_bot_name=perf_bot_name, | 1067 perf_bot_name=perf_bot_name, |
1072 perf_build_number=perf_build_number, | 1068 perf_build_number=perf_build_number, |
1073 perf_builder_name=perf_builder_name, | 1069 perf_builder_name=perf_builder_name, |
1074 perf_master_name=perf_master_name, | 1070 perf_master_name=perf_master_name, |
1075 perf_revision=perf_revision, | 1071 perf_revision=perf_revision, |
1076 perf_x_value=perf_x_value, | 1072 perf_x_value=perf_x_value, |
1077 test_args=test_args, | 1073 test_args=test_args, |
1078 xcode_version=xcode_version, | 1074 xcode_version=xcode_version, |
1079 ) | 1075 ) |
| 1076 |
| 1077 if not os.path.exists(iossim_path): |
| 1078 raise SimulatorNotFoundError(iossim_path) |
| 1079 |
| 1080 if not os.path.exists(xctest_path): |
| 1081 raise XctestNotFoundError(xctest_path) |
| 1082 |
| 1083 self.iossim_path = iossim_path |
| 1084 self.xctest_path = xctest_path |
1080 self.platform = platform | 1085 self.platform = platform |
1081 self.version = version | 1086 self.version = version |
1082 | 1087 |
1083 def UploadTestData(self): | 1088 def UploadTestData(self): |
1084 """Uploads the contents of the test's Documents directory. | 1089 """Uploads the contents of the test's Documents directory. |
1085 | 1090 |
1086 Returns: | 1091 Returns: |
1087 True if test data was uploaded, False otherwise. | 1092 True if test data was uploaded, False otherwise. |
1088 """ | 1093 """ |
1089 if not self.gs_bucket: | 1094 if not self.gs_bucket: |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1261 test_filter: A list of tests to filter by, or None to mean all. | 1266 test_filter: A list of tests to filter by, or None to mean all. |
1262 blacklist: Whether to blacklist the elements of test_filter or not. Only | 1267 blacklist: Whether to blacklist the elements of test_filter or not. Only |
1263 works when test_filter is not None. | 1268 works when test_filter is not None. |
1264 | 1269 |
1265 Returns: | 1270 Returns: |
1266 A list whose elements are the args representing the command. | 1271 A list whose elements are the args representing the command. |
1267 """ | 1272 """ |
1268 built_dir = os.path.split(self.app_path)[0] | 1273 built_dir = os.path.split(self.app_path)[0] |
1269 | 1274 |
1270 cmd = [ | 1275 cmd = [ |
1271 'xcodebuild', 'test-without-building', | 1276 self.iossim_path, |
1272 'BUILT_PRODUCTS_DIR=%s' % built_dir, | 1277 '-d', self.platform, |
1273 '-project', self.test_project_dir, | 1278 '-s', self.version, |
1274 '-scheme','TestProject', | 1279 self.app_path, |
1275 '-destination','platform=iOS Simulator,name=%s,OS=%s' | 1280 self.xctest_path |
1276 % (self.platform, self.version), | |
1277 '-archivePath', self.homedir, | |
1278 'APP_TARGET_NAME=%s' % self.test_host_name, | |
1279 'TEST_TARGET_NAME=%s' % self.test_target_name, | |
1280 'NSUnbufferedIO=YES' | |
1281 ] | 1281 ] |
1282 return cmd | 1282 return cmd |
1283 | 1283 |
1284 @TestRunner.RequireTearDown | 1284 @TestRunner.RequireTearDown |
1285 def Launch(self, *args, **kwargs): | 1285 def Launch(self, *args, **kwargs): |
1286 """Launches the test.""" | 1286 """Launches the test.""" |
1287 self.SetUp() | 1287 self.SetUp() |
1288 | 1288 |
1289 result = self._Run( | 1289 result = self._Run( |
1290 self.GetLaunchCommand(), self.GetLaunchEnvironment(), *args, **kwargs) | 1290 self.GetLaunchCommand(), self.GetLaunchEnvironment(), *args, **kwargs) |
(...skipping 15 matching lines...) Expand all Loading... |
1306 self.GetLaunchCommand(), self.GetLaunchEnvironment(), *args, **kwargs) | 1306 self.GetLaunchCommand(), self.GetLaunchEnvironment(), *args, **kwargs) |
1307 | 1307 |
1308 return self.RunAllTests(result, *args, **kwargs) | 1308 return self.RunAllTests(result, *args, **kwargs) |
1309 | 1309 |
1310 | 1310 |
1311 class DeviceXCTestRunner(XCTestRunner): | 1311 class DeviceXCTestRunner(XCTestRunner): |
1312 """Class for running xctests on an iOS device.""" | 1312 """Class for running xctests on an iOS device.""" |
1313 def __init__( | 1313 def __init__( |
1314 self, | 1314 self, |
1315 app_path, | 1315 app_path, |
1316 test_host, | 1316 xctest_path, |
1317 test_project_dir, | 1317 xcodeproj_path, |
1318 xcode_version=None, | 1318 xcode_version=None, |
1319 gs_bucket=None, | 1319 gs_bucket=None, |
1320 perf_bot_name=None, | 1320 perf_bot_name=None, |
1321 perf_build_number=None, | 1321 perf_build_number=None, |
1322 perf_builder_name=None, | 1322 perf_builder_name=None, |
1323 perf_master_name=None, | 1323 perf_master_name=None, |
1324 perf_revision=None, | 1324 perf_revision=None, |
1325 perf_x_value=None, | 1325 perf_x_value=None, |
1326 test_args=None, | 1326 test_args=None, |
1327 env_vars=None, | 1327 env_vars=None, |
(...skipping 19 matching lines...) Expand all Loading... |
1347 env_vars: Environment variables to set when launching the test. | 1347 env_vars: Environment variables to set when launching the test. |
1348 | 1348 |
1349 Raises: | 1349 Raises: |
1350 DeviceDetectionError: If this machine does not have exactly one device | 1350 DeviceDetectionError: If this machine does not have exactly one device |
1351 connected. Having more than one device connected causes problems when | 1351 connected. Having more than one device connected causes problems when |
1352 trying to issue commands to any one device, which interfere with | 1352 trying to issue commands to any one device, which interfere with |
1353 installing and running the test app. | 1353 installing and running the test app. |
1354 """ | 1354 """ |
1355 super(DeviceXCTestRunner, self).__init__( | 1355 super(DeviceXCTestRunner, self).__init__( |
1356 app_path, | 1356 app_path, |
1357 test_host, | |
1358 test_project_dir, | |
1359 env_vars=env_vars, | 1357 env_vars=env_vars, |
1360 gs_bucket=gs_bucket, | 1358 gs_bucket=gs_bucket, |
1361 perf_bot_name=perf_bot_name, | 1359 perf_bot_name=perf_bot_name, |
1362 perf_build_number=perf_build_number, | 1360 perf_build_number=perf_build_number, |
1363 perf_builder_name=perf_builder_name, | 1361 perf_builder_name=perf_builder_name, |
1364 perf_master_name=perf_master_name, | 1362 perf_master_name=perf_master_name, |
1365 perf_revision=perf_revision, | 1363 perf_revision=perf_revision, |
1366 perf_x_value=perf_x_value, | 1364 perf_x_value=perf_x_value, |
1367 test_args=test_args, | 1365 test_args=test_args, |
1368 xcode_version=xcode_version, | 1366 xcode_version=xcode_version, |
1369 ) | 1367 ) |
| 1368 # The scheme name is the app name without the '.app' suffix. |
| 1369 app_name = os.path.split(self.app_path)[1] |
| 1370 self.scheme_name = app_name.split('.', 1)[0] |
| 1371 self.xcodeproj_path = xcodeproj_path |
1370 self.cfbundleid = utils.call( | 1372 self.cfbundleid = utils.call( |
1371 utils.PLIST_BUDDY, | 1373 utils.PLIST_BUDDY, |
1372 '-c', 'Print:CFBundleIdentifier', | 1374 '-c', 'Print:CFBundleIdentifier', |
1373 os.path.join(self.app_path, 'Info.plist'), | 1375 os.path.join(self.app_path, 'Info.plist'), |
1374 ).stdout[0] | 1376 ).stdout[0] |
1375 | 1377 |
1376 call_result = utils.call('idevice_id', '--list') | 1378 call_result = utils.call('idevice_id', '--list') |
1377 self.device_id = call_result.stdout[0] | 1379 self.device_id = call_result.stdout[0] |
1378 | 1380 |
1379 if len(call_result.stdout) != 1: | 1381 if len(call_result.stdout) != 1: |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1420 """Returns the invocation command which is used to run the test. | 1422 """Returns the invocation command which is used to run the test. |
1421 | 1423 |
1422 Args: | 1424 Args: |
1423 test_filter: A list of tests to filter by, or None to mean all. | 1425 test_filter: A list of tests to filter by, or None to mean all. |
1424 blacklist: Whether to blacklist the elements of test_filter or not. Only | 1426 blacklist: Whether to blacklist the elements of test_filter or not. Only |
1425 works when test_filter is not None. | 1427 works when test_filter is not None. |
1426 | 1428 |
1427 Returns: | 1429 Returns: |
1428 A list whose elements are the args representing the command. | 1430 A list whose elements are the args representing the command. |
1429 """ | 1431 """ |
1430 built_dir = os.path.split(self.app_path)[0] | |
1431 | |
1432 cmd = [ | 1432 cmd = [ |
1433 'xcodebuild', 'test-without-building', | 1433 'xcodebuild', 'test-without-building', |
1434 'BUILT_PRODUCTS_DIR=%s' % built_dir, | 1434 '-project', self.xcodeproj_path, |
1435 'CONFIGURATION_BUILD_DIR=%s' % built_dir, | 1435 '-scheme', self.scheme_name, |
1436 '-project', self.test_project_dir, | 1436 '-destination', 'id=%s' % self.device_id |
1437 '-configuration', 'iphoneos', | |
1438 '-scheme', 'TestProject', | |
1439 '-destination','id=%s' % self.device_id, | |
1440 'APP_TARGET_NAME=%s' % self.test_host_name, | |
1441 'TEST_TARGET_NAME=%s' % self.test_target_name, | |
1442 'NSUnbufferedIO=YES' | |
1443 ] | 1437 ] |
1444 return cmd | 1438 return cmd |
1445 | 1439 |
1446 @TestRunner.RequireTearDown | 1440 @TestRunner.RequireTearDown |
1447 def Launch(self, *args, **kwargs): | 1441 def Launch(self, *args, **kwargs): |
1448 """Launches the test.""" | 1442 """Launches the test.""" |
1449 self.InstallApp() | 1443 self.InstallApp() |
1450 | 1444 |
1451 result = self._Run( | 1445 result = self._Run( |
1452 self.GetLaunchCommand(), self.GetLaunchEnvironment(), *args, **kwargs) | 1446 self.GetLaunchCommand(), self.GetLaunchEnvironment(), *args, **kwargs) |
1453 | 1447 |
1454 if result.crashed and not result.crashed_test: | 1448 if result.crashed and not result.crashed_test: |
1455 # If the app crashed, but there is no specific test which crashed, | 1449 # If the app crashed, but there is no specific test which crashed, |
1456 # then the app must have failed to even start. Try one more time. | 1450 # then the app must have failed to even start. Try one more time. |
1457 self.Print( | 1451 self.Print( |
1458 '%s appears to have crashed on startup. Retrying...' % self.app_name, | 1452 '%s appears to have crashed on startup. Retrying...' % self.app_name, |
1459 blank_lines=2, | 1453 blank_lines=2, |
1460 time_to_sleep=5, | 1454 time_to_sleep=5, |
1461 ) | 1455 ) |
1462 | 1456 |
1463 # Uninstall and re-install the app. | 1457 # Uninstall and re-install the app. |
1464 self.UninstallApp() | 1458 self.UninstallApp() |
1465 self.InstallApp() | 1459 self.InstallApp() |
1466 | 1460 |
1467 result = self._Run( | 1461 result = self._Run( |
1468 self.GetLaunchCommand(), self.GetLaunchEnvironment(), *args, **kwargs) | 1462 self.GetLaunchCommand(), self.GetLaunchEnvironment(), *args, **kwargs) |
1469 | 1463 |
1470 return self.RunAllTests(result, *args, **kwargs) | 1464 return self.RunAllTests(result, *args, **kwargs) |
OLD | NEW |