Index: content/test/test_launcher.cc |
diff --git a/content/test/test_launcher.cc b/content/test/test_launcher.cc |
index 7d7df69146777c2667a356bc5cdc19ea32569694..e62caf3e8485eaf52916a1c8430c007963cac8af 100644 |
--- a/content/test/test_launcher.cc |
+++ b/content/test/test_launcher.cc |
@@ -38,20 +38,22 @@ |
namespace test_launcher { |
-namespace { |
- |
// The environment variable name for the total number of test shards. |
-static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS"; |
+const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS"; |
// The environment variable name for the test shard index. |
-static const char kTestShardIndex[] = "GTEST_SHARD_INDEX"; |
+const char kTestShardIndex[] = "GTEST_SHARD_INDEX"; |
// The default output file for XML output. |
-static const FilePath::CharType kDefaultOutputFile[] = FILE_PATH_LITERAL( |
+const FilePath::CharType kDefaultOutputFile[] = FILE_PATH_LITERAL( |
"test_detail.xml"); |
// Name of the empty test below. |
-static const char kEmptyTestName[] = "InProcessBrowserTest.Empty"; |
+const char kEmptyTestName[] = "InProcessBrowserTest.Empty"; |
+ |
+// Quit test execution after this number of tests has timed out. |
+const int kMaxTimeouts = 5; // 45s timeout * 10 = 450s max run time. |
+namespace { |
Avi (use Gerrit)
2011/12/06 23:01:00
\n after this line
|
// An empty test (it starts up and shuts down the browser as part of its |
// setup and teardown) used to prefetch all of the browser code into memory. |
IN_PROC_BROWSER_TEST_F(InProcessBrowserTest, Empty) { |
@@ -302,7 +304,11 @@ int GetTestTerminationTimeout(const std::string& test_name, |
// and returns the exit code. |
int RunTest(TestLauncherDelegate* launcher_delegate, |
const std::string& test_name, |
- int default_timeout_ms) { |
+ int default_timeout_ms, |
+ bool* was_timeout) { |
+ if (was_timeout) |
+ *was_timeout = false; |
+ |
#if defined(OS_MACOSX) |
// Some of the below method calls will leak objects if there is no |
// autorelease pool in place. |
@@ -375,6 +381,8 @@ int RunTest(TestLauncherDelegate* launcher_delegate, |
LOG(ERROR) << "Test timeout (" << timeout_ms |
<< " ms) exceeded for " << test_name; |
+ if (was_timeout) |
+ *was_timeout = true; |
exit_code = -1; // Set a non-zero exit code to signal a failure. |
// Ensure that the process terminates. |
@@ -421,6 +429,7 @@ bool RunTests(TestLauncherDelegate* launcher_delegate, |
int num_runnable_tests = 0; |
int test_run_count = 0; |
int ignored_failure_count = 0; |
+ int timeout_count = 0; |
std::vector<std::string> failed_tests; |
ResultsPrinter printer(*command_line); |
@@ -470,9 +479,11 @@ bool RunTests(TestLauncherDelegate* launcher_delegate, |
base::Time start_time = base::Time::Now(); |
++test_run_count; |
+ bool was_timeout = false; |
int exit_code = RunTest(launcher_delegate, |
test_name, |
- TestTimeouts::action_max_timeout_ms()); |
+ TestTimeouts::action_max_timeout_ms(), |
+ &was_timeout); |
if (exit_code == 0) { |
// Test passed. |
printer.OnTestEnd(test_info->name(), test_case->name(), true, false, |
@@ -493,8 +504,20 @@ bool RunTests(TestLauncherDelegate* launcher_delegate, |
(base::Time::Now() - start_time).InMillisecondsF()); |
if (ignore_failure) |
++ignored_failure_count; |
+ |
+ if (was_timeout) |
+ ++timeout_count; |
+ } |
+ |
+ if (timeout_count > kMaxTimeouts) { |
+ printf("More than %d timeouts, aborting test case\n", kMaxTimeouts); |
+ break; |
} |
} |
+ if (timeout_count > kMaxTimeouts) { |
+ printf("More than %d timeouts, aborting test\n", kMaxTimeouts); |
+ break; |
+ } |
} |
printf("%d test%s run\n", test_run_count, test_run_count > 1 ? "s" : ""); |
@@ -615,7 +638,8 @@ int LaunchTests(TestLauncherDelegate* launcher_delegate, |
// and closes a browser with a long timeout to avoid those problems. |
int exit_code = RunTest(launcher_delegate, |
kEmptyTestName, |
- TestTimeouts::large_test_timeout_ms()); |
+ TestTimeouts::large_test_timeout_ms(), |
+ NULL); |
if (exit_code != 0) |
return exit_code; |