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

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

Issue 2950153002: Improve process launch handle sharing API. (Closed)
Patch Set: Fix Created 3 years, 5 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
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/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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698