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

Unified Diff: mojo/edk/test/multiprocess_test_helper.cc

Issue 2282413004: Support creating mojo peer connections from named pipes. (Closed)
Patch Set: Created 4 years, 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojo/edk/test/multiprocess_test_helper.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/edk/test/multiprocess_test_helper.cc
diff --git a/mojo/edk/test/multiprocess_test_helper.cc b/mojo/edk/test/multiprocess_test_helper.cc
index 60a34fe3b6a0fdf8d35130f0b8c47f235d655d64..d6390cc79b401525c814e14e8d5e93330bf01158 100644
--- a/mojo/edk/test/multiprocess_test_helper.cc
+++ b/mojo/edk/test/multiprocess_test_helper.cc
@@ -8,12 +8,14 @@
#include <set>
#include <utility>
+#include "base/base_paths.h"
#include "base/base_switches.h"
#include "base/bind.h"
#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/logging.h"
#include "base/memory/ref_counted.h"
+#include "base/path_service.h"
#include "base/process/kill.h"
#include "base/process/process_handle.h"
#include "base/run_loop.h"
@@ -22,6 +24,8 @@
#include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h"
#include "mojo/edk/embedder/embedder.h"
+#include "mojo/edk/embedder/named_platform_handle.h"
+#include "mojo/edk/embedder/named_platform_handle_utils.h"
#include "mojo/edk/embedder/platform_channel_pair.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -38,6 +42,7 @@ namespace test {
namespace {
const char kMojoPrimordialPipeToken[] = "mojo-primordial-pipe-token";
+const char kMojoNamedPipeName[] = "mojo-named-pipe-name";
template <typename Func>
int RunClientFunction(Func handler) {
@@ -91,12 +96,27 @@ ScopedMessagePipeHandle MultiprocessTestHelper::StartChildWithExtraSwitch(
}
PlatformChannelPair channel;
+ NamedPlatformHandle named_pipe;
HandlePassingInformation handle_passing_info;
- channel.PrepareToPassClientHandleToChildProcess(&command_line,
- &handle_passing_info);
+ if (launch_type == LaunchType::CHILD || launch_type == LaunchType::PEER) {
+ channel.PrepareToPassClientHandleToChildProcess(&command_line,
+ &handle_passing_info);
+ } else if (launch_type == LaunchType::NAMED_CHILD ||
+ launch_type == LaunchType::NAMED_PEER) {
+#if defined(OS_POSIX)
+ base::FilePath temp_dir;
+ CHECK(base::PathService::Get(base::DIR_TEMP, &temp_dir));
+ named_pipe = NamedPlatformHandle(
+ temp_dir.AppendASCII(GenerateRandomToken()).value());
+#else
+ named_pipe = NamedPlatformHandle(GenerateRandomToken());
+#endif
+ command_line.AppendSwitchNative(kMojoNamedPipeName, named_pipe.name);
+ }
std::string pipe_token = mojo::edk::GenerateRandomToken();
- if (launch_type == LaunchType::CHILD)
+ if (launch_type == LaunchType::CHILD ||
+ launch_type == LaunchType::NAMED_CHILD)
command_line.AppendSwitchASCII(kMojoPrimordialPipeToken, pipe_token);
if (!switch_string.empty()) {
@@ -122,18 +142,27 @@ ScopedMessagePipeHandle MultiprocessTestHelper::StartChildWithExtraSwitch(
ScopedMessagePipeHandle pipe;
std::string child_token = mojo::edk::GenerateRandomToken();
- if (launch_type == LaunchType::CHILD)
+ if (launch_type == LaunchType::CHILD ||
+ launch_type == LaunchType::NAMED_CHILD) {
pipe = CreateParentMessagePipe(pipe_token, child_token);
- else if (launch_type == LaunchType::PEER)
+ } else if (launch_type == LaunchType::PEER) {
pipe = ConnectToPeerProcess(channel.PassServerHandle());
+ } else if (launch_type == LaunchType::NAMED_PEER) {
+ pipe = ConnectToPeerProcess(CreateServerHandle(named_pipe, false));
+ }
test_child_ =
base::SpawnMultiProcessTestChild(test_child_main, command_line, options);
- channel.ChildProcessLaunched();
+ if (launch_type == LaunchType::CHILD || launch_type == LaunchType::PEER)
+ channel.ChildProcessLaunched();
if (launch_type == LaunchType::CHILD) {
ChildProcessLaunched(test_child_.Handle(), channel.PassServerHandle(),
child_token, process_error_callback_);
+ } else if (launch_type == LaunchType::NAMED_CHILD) {
+ ChildProcessLaunched(test_child_.Handle(),
+ CreateServerHandle(named_pipe, false), child_token,
+ process_error_callback_);
}
CHECK(test_child_.IsValid());
@@ -167,17 +196,29 @@ void MultiprocessTestHelper::ChildSetup() {
std::string primordial_pipe_token =
base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
kMojoPrimordialPipeToken);
+ NamedPlatformHandle named_pipe(
+ base::CommandLine::ForCurrentProcess()->GetSwitchValueNative(
+ kMojoNamedPipeName));
if (!primordial_pipe_token.empty()) {
primordial_pipe = CreateChildMessagePipe(primordial_pipe_token);
#if defined(OS_MACOSX) && !defined(OS_IOS)
CHECK(base::MachPortBroker::ChildSendTaskPortToParent("mojo_test"));
#endif
- SetParentPipeHandle(PlatformChannelPair::PassClientHandleFromParentProcess(
- *base::CommandLine::ForCurrentProcess()));
+ if (named_pipe.is_valid()) {
+ SetParentPipeHandle(CreateClientHandle(named_pipe));
+ } else {
+ SetParentPipeHandle(
+ PlatformChannelPair::PassClientHandleFromParentProcess(
+ *base::CommandLine::ForCurrentProcess()));
+ }
} else {
- primordial_pipe = ConnectToPeerProcess(
- PlatformChannelPair::PassClientHandleFromParentProcess(
- *base::CommandLine::ForCurrentProcess()));
+ if (named_pipe.is_valid()) {
+ primordial_pipe = ConnectToPeerProcess(CreateClientHandle(named_pipe));
+ } else {
+ primordial_pipe = ConnectToPeerProcess(
+ PlatformChannelPair::PassClientHandleFromParentProcess(
+ *base::CommandLine::ForCurrentProcess()));
+ }
}
}
« no previous file with comments | « mojo/edk/test/multiprocess_test_helper.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698