Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(470)

Side by Side Diff: base/test/launcher/unit_test_launcher.cc

Issue 886463003: iOS gtest launcher: retry tests in one big batch (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: C++11 Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « base/test/launcher/unit_test_launcher.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/test/launcher/unit_test_launcher.h" 5 #include "base/test/launcher/unit_test_launcher.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback_helpers.h" 8 #include "base/callback_helpers.h"
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 JoinString(test_names, ":")); 114 JoinString(test_names, ":"));
115 new_cmd_line.AppendSwitch(kSingleProcessTestsFlag); 115 new_cmd_line.AppendSwitch(kSingleProcessTestsFlag);
116 116
117 return new_cmd_line; 117 return new_cmd_line;
118 } 118 }
119 119
120 std::string GetWrapperForChildGTestProcess() override { 120 std::string GetWrapperForChildGTestProcess() override {
121 return std::string(); 121 return std::string();
122 } 122 }
123 123
124 void RelaunchTests(TestLauncher* test_launcher,
125 const std::vector<std::string>& test_names,
126 int launch_flags) override {
127 // Relaunch requested tests in parallel, but only use single
128 // test per batch for more precise results (crashes, etc).
129 for (const std::string& test_name : test_names) {
130 std::vector<std::string> batch;
131 batch.push_back(test_name);
132 RunUnitTestsBatch(test_launcher, this, batch, launch_flags);
133 }
134 }
135
124 DISALLOW_COPY_AND_ASSIGN(DefaultUnitTestPlatformDelegate); 136 DISALLOW_COPY_AND_ASSIGN(DefaultUnitTestPlatformDelegate);
125 }; 137 };
126 138
127 bool GetSwitchValueAsInt(const std::string& switch_name, int* result) { 139 bool GetSwitchValueAsInt(const std::string& switch_name, int* result) {
128 if (!CommandLine::ForCurrentProcess()->HasSwitch(switch_name)) 140 if (!CommandLine::ForCurrentProcess()->HasSwitch(switch_name))
129 return true; 141 return true;
130 142
131 std::string switch_value = 143 std::string switch_value =
132 CommandLine::ForCurrentProcess()->GetSwitchValueASCII(switch_name); 144 CommandLine::ForCurrentProcess()->GetSwitchValueASCII(switch_name);
133 if (!StringToInt(switch_value, result) || *result < 1) { 145 if (!StringToInt(switch_value, result) || *result < 1) {
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 for (size_t i = 0; i < final_results.size(); i++) { 307 for (size_t i = 0; i < final_results.size(); i++) {
296 if (final_results[i].status != TestResult::TEST_SUCCESS) { 308 if (final_results[i].status != TestResult::TEST_SUCCESS) {
297 has_non_success_test = true; 309 has_non_success_test = true;
298 break; 310 break;
299 } 311 }
300 } 312 }
301 313
302 if (!has_non_success_test && exit_code != 0) { 314 if (!has_non_success_test && exit_code != 0) {
303 // This is a bit surprising case: all tests are marked as successful, 315 // This is a bit surprising case: all tests are marked as successful,
304 // but the exit code was not zero. This can happen e.g. under memory 316 // but the exit code was not zero. This can happen e.g. under memory
305 // tools that report leaks this way. 317 // tools that report leaks this way. Mark all tests as a failure on exit,
306 318 // and for more precise info they'd need to be retried serially.
307 if (final_results.size() == 1) { 319 for (size_t i = 0; i < final_results.size(); i++)
308 // Easy case. One test only so we know the non-zero exit code 320 final_results[i].status = TestResult::TEST_FAILURE_ON_EXIT;
309 // was caused by that one test.
310 final_results[0].status = TestResult::TEST_FAILURE_ON_EXIT;
311 } else {
312 // Harder case. Discard the results and request relaunching all
313 // tests without batching. This will trigger above branch on
314 // relaunch leading to more precise results.
315 LOG(WARNING) << "Not sure which test caused non-zero exit code, "
316 << "relaunching all of them without batching.";
317
318 for (size_t i = 0; i < final_results.size(); i++)
319 tests_to_relaunch->push_back(final_results[i].full_name);
320
321 return false;
322 }
323 } 321 }
324 322
325 for (size_t i = 0; i < final_results.size(); i++) { 323 for (size_t i = 0; i < final_results.size(); i++) {
326 // Fix the output snippet after possible changes to the test result. 324 // Fix the output snippet after possible changes to the test result.
327 final_results[i].output_snippet = 325 final_results[i].output_snippet =
328 GetTestOutputSnippet(final_results[i], output); 326 GetTestOutputSnippet(final_results[i], output);
329 test_launcher->OnTestFinished(final_results[i]); 327 test_launcher->OnTestFinished(final_results[i]);
330 called_any_callback = true; 328 called_any_callback = true;
331 } 329 }
332 } else { 330 } else {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
366 const GTestCallbackState& callback_state, 364 const GTestCallbackState& callback_state,
367 int exit_code, 365 int exit_code,
368 const TimeDelta& elapsed_time, 366 const TimeDelta& elapsed_time,
369 bool was_timeout, 367 bool was_timeout,
370 const std::string& output) { 368 const std::string& output) {
371 std::vector<std::string> tests_to_relaunch; 369 std::vector<std::string> tests_to_relaunch;
372 ProcessTestResults(callback_state.test_launcher, callback_state.test_names, 370 ProcessTestResults(callback_state.test_launcher, callback_state.test_names,
373 callback_state.output_file, output, exit_code, was_timeout, 371 callback_state.output_file, output, exit_code, was_timeout,
374 &tests_to_relaunch); 372 &tests_to_relaunch);
375 373
376 // Relaunch requested tests in parallel, but only use single 374 if (!tests_to_relaunch.empty()) {
377 // test per batch for more precise results (crashes, test passes 375 callback_state.platform_delegate->RelaunchTests(
378 // but non-zero exit codes etc). 376 callback_state.test_launcher,
379 for (size_t i = 0; i < tests_to_relaunch.size(); i++) { 377 tests_to_relaunch,
380 std::vector<std::string> batch; 378 callback_state.launch_flags);
381 batch.push_back(tests_to_relaunch[i]);
382 RunUnitTestsBatch(callback_state.test_launcher,
383 callback_state.platform_delegate,
384 batch,
385 callback_state.launch_flags);
386 } 379 }
387 380
388 // The temporary file's directory is also temporary. 381 // The temporary file's directory is also temporary.
389 DeleteFile(callback_state.output_file.DirName(), true); 382 DeleteFile(callback_state.output_file.DirName(), true);
390 } 383 }
391 384
392 void SerialGTestCallback( 385 void SerialGTestCallback(
393 const GTestCallbackState& callback_state, 386 const GTestCallbackState& callback_state,
394 const std::vector<std::string>& test_names, 387 const std::vector<std::string>& test_names,
395 int exit_code, 388 int exit_code,
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
587 FROM_HERE, 580 FROM_HERE,
588 Bind(&RunUnitTestsSerially, 581 Bind(&RunUnitTestsSerially,
589 test_launcher, 582 test_launcher,
590 platform_delegate_, 583 platform_delegate_,
591 test_names, 584 test_names,
592 use_job_objects_ ? TestLauncher::USE_JOB_OBJECTS : 0)); 585 use_job_objects_ ? TestLauncher::USE_JOB_OBJECTS : 0));
593 return test_names.size(); 586 return test_names.size();
594 } 587 }
595 588
596 } // namespace base 589 } // namespace base
OLDNEW
« no previous file with comments | « base/test/launcher/unit_test_launcher.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698