| OLD | NEW |
| 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/test_launcher.h" | 5 #include "base/test/launcher/test_launcher.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "base/at_exit.h" | 9 #include "base/at_exit.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 const TestLauncher::GTestProcessCompletedCallback& completed_callback, | 383 const TestLauncher::GTestProcessCompletedCallback& completed_callback, |
| 384 const TestLauncher::GTestProcessLaunchedCallback& launched_callback) { | 384 const TestLauncher::GTestProcessLaunchedCallback& launched_callback) { |
| 385 TimeTicks start_time = TimeTicks::Now(); | 385 TimeTicks start_time = TimeTicks::Now(); |
| 386 | 386 |
| 387 // Redirect child process output to a file. | 387 // Redirect child process output to a file. |
| 388 FilePath output_file; | 388 FilePath output_file; |
| 389 CHECK(CreateTemporaryFile(&output_file)); | 389 CHECK(CreateTemporaryFile(&output_file)); |
| 390 | 390 |
| 391 LaunchOptions options; | 391 LaunchOptions options; |
| 392 #if defined(OS_WIN) | 392 #if defined(OS_WIN) |
| 393 options.inherit_mode = test_launch_options.inherit_mode; |
| 394 options.handles_to_inherit = test_launch_options.handles_to_inherit; |
| 395 |
| 393 win::ScopedHandle handle; | 396 win::ScopedHandle handle; |
| 394 | 397 |
| 395 if (redirect_stdio) { | 398 if (redirect_stdio) { |
| 396 handle.Set(CreateFile(output_file.value().c_str(), GENERIC_WRITE, | 399 handle.Set(CreateFile(output_file.value().c_str(), GENERIC_WRITE, |
| 397 FILE_SHARE_READ | FILE_SHARE_DELETE, nullptr, | 400 FILE_SHARE_READ | FILE_SHARE_DELETE, nullptr, |
| 398 OPEN_EXISTING, FILE_ATTRIBUTE_TEMPORARY, NULL)); | 401 OPEN_EXISTING, FILE_ATTRIBUTE_TEMPORARY, NULL)); |
| 399 CHECK(handle.IsValid()); | 402 CHECK(handle.IsValid()); |
| 400 options.inherit_handles = true; | |
| 401 options.stdin_handle = INVALID_HANDLE_VALUE; | 403 options.stdin_handle = INVALID_HANDLE_VALUE; |
| 402 options.stdout_handle = handle.Get(); | 404 options.stdout_handle = handle.Get(); |
| 403 options.stderr_handle = handle.Get(); | 405 options.stderr_handle = handle.Get(); |
| 404 } | 406 // See LaunchOptions.stdout_handle comments for why this compares against |
| 405 | 407 // FILE_TYPE_CHAR. |
| 406 if (test_launch_options.inherit_handles) { | 408 if (options.inherit_mode == base::LaunchOptions::Inherit::kSpecific && |
| 407 if (!options.inherit_handles) { | 409 GetFileType(handle.Get()) != FILE_TYPE_CHAR) |
| 408 options.inherit_handles = true; | 410 options.handles_to_inherit.push_back(handle.Get()); |
| 409 options.stdin_handle = nullptr; | |
| 410 options.stdout_handle = nullptr; | |
| 411 options.stderr_handle = nullptr; | |
| 412 } | |
| 413 DCHECK(!options.handles_to_inherit); | |
| 414 options.handles_to_inherit = test_launch_options.handles_to_inherit; | |
| 415 } | 411 } |
| 416 | 412 |
| 417 #elif defined(OS_POSIX) | 413 #elif defined(OS_POSIX) |
| 418 options.new_process_group = true; | 414 options.new_process_group = true; |
| 419 #if defined(OS_LINUX) | 415 #if defined(OS_LINUX) |
| 420 options.kill_on_parent_death = true; | 416 options.kill_on_parent_death = true; |
| 421 #endif // defined(OS_LINUX) | 417 #endif // defined(OS_LINUX) |
| 422 | 418 |
| 423 FileHandleMappingVector fds_mapping; | |
| 424 ScopedFD output_file_fd; | 419 ScopedFD output_file_fd; |
| 425 | 420 |
| 421 options.fds_to_remap = test_launch_options.fds_to_remap; |
| 426 if (redirect_stdio) { | 422 if (redirect_stdio) { |
| 427 output_file_fd.reset(open(output_file.value().c_str(), O_RDWR)); | 423 output_file_fd.reset(open(output_file.value().c_str(), O_RDWR)); |
| 428 CHECK(output_file_fd.is_valid()); | 424 CHECK(output_file_fd.is_valid()); |
| 429 | 425 |
| 430 fds_mapping.push_back(std::make_pair(output_file_fd.get(), STDOUT_FILENO)); | 426 options.fds_to_remap.push_back( |
| 431 fds_mapping.push_back(std::make_pair(output_file_fd.get(), STDERR_FILENO)); | 427 std::make_pair(output_file_fd.get(), STDOUT_FILENO)); |
| 432 options.fds_to_remap = &fds_mapping; | 428 options.fds_to_remap.push_back( |
| 433 } | 429 std::make_pair(output_file_fd.get(), STDERR_FILENO)); |
| 434 if (test_launch_options.fds_to_remap) { | |
| 435 fds_mapping.insert(fds_mapping.end(), | |
| 436 test_launch_options.fds_to_remap->begin(), | |
| 437 test_launch_options.fds_to_remap->end()); | |
| 438 options.fds_to_remap = &fds_mapping; | |
| 439 } | 430 } |
| 440 #endif | 431 #endif |
| 441 | 432 |
| 442 bool was_timeout = false; | 433 bool was_timeout = false; |
| 443 int exit_code = LaunchChildTestProcessWithOptions( | 434 int exit_code = LaunchChildTestProcessWithOptions( |
| 444 command_line, options, test_launch_options.flags, timeout, | 435 command_line, options, test_launch_options.flags, timeout, |
| 445 launched_callback, &was_timeout); | 436 launched_callback, &was_timeout); |
| 446 | 437 |
| 447 if (redirect_stdio) { | 438 if (redirect_stdio) { |
| 448 #if defined(OS_WIN) | 439 #if defined(OS_WIN) |
| (...skipping 26 matching lines...) Expand all Loading... |
| 475 const char kGTestFilterFlag[] = "gtest_filter"; | 466 const char kGTestFilterFlag[] = "gtest_filter"; |
| 476 const char kGTestFlagfileFlag[] = "gtest_flagfile"; | 467 const char kGTestFlagfileFlag[] = "gtest_flagfile"; |
| 477 const char kGTestHelpFlag[] = "gtest_help"; | 468 const char kGTestHelpFlag[] = "gtest_help"; |
| 478 const char kGTestListTestsFlag[] = "gtest_list_tests"; | 469 const char kGTestListTestsFlag[] = "gtest_list_tests"; |
| 479 const char kGTestRepeatFlag[] = "gtest_repeat"; | 470 const char kGTestRepeatFlag[] = "gtest_repeat"; |
| 480 const char kGTestRunDisabledTestsFlag[] = "gtest_also_run_disabled_tests"; | 471 const char kGTestRunDisabledTestsFlag[] = "gtest_also_run_disabled_tests"; |
| 481 const char kGTestOutputFlag[] = "gtest_output"; | 472 const char kGTestOutputFlag[] = "gtest_output"; |
| 482 | 473 |
| 483 TestLauncherDelegate::~TestLauncherDelegate() {} | 474 TestLauncherDelegate::~TestLauncherDelegate() {} |
| 484 | 475 |
| 476 TestLauncher::LaunchOptions::LaunchOptions() = default; |
| 477 TestLauncher::LaunchOptions::LaunchOptions(const LaunchOptions& other) = |
| 478 default; |
| 479 TestLauncher::LaunchOptions::~LaunchOptions() = default; |
| 480 |
| 485 TestLauncher::TestLauncher(TestLauncherDelegate* launcher_delegate, | 481 TestLauncher::TestLauncher(TestLauncherDelegate* launcher_delegate, |
| 486 size_t parallel_jobs) | 482 size_t parallel_jobs) |
| 487 : launcher_delegate_(launcher_delegate), | 483 : launcher_delegate_(launcher_delegate), |
| 488 total_shards_(1), | 484 total_shards_(1), |
| 489 shard_index_(0), | 485 shard_index_(0), |
| 490 cycles_(1), | 486 cycles_(1), |
| 491 test_found_count_(0), | 487 test_found_count_(0), |
| 492 test_started_count_(0), | 488 test_started_count_(0), |
| 493 test_finished_count_(0), | 489 test_finished_count_(0), |
| 494 test_success_count_(0), | 490 test_success_count_(0), |
| (...skipping 729 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1224 } | 1220 } |
| 1225 | 1221 |
| 1226 std::string snippet(full_output.substr(run_pos)); | 1222 std::string snippet(full_output.substr(run_pos)); |
| 1227 if (end_pos != std::string::npos) | 1223 if (end_pos != std::string::npos) |
| 1228 snippet = full_output.substr(run_pos, end_pos - run_pos); | 1224 snippet = full_output.substr(run_pos, end_pos - run_pos); |
| 1229 | 1225 |
| 1230 return snippet; | 1226 return snippet; |
| 1231 } | 1227 } |
| 1232 | 1228 |
| 1233 } // namespace base | 1229 } // namespace base |
| OLD | NEW |