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

Unified Diff: ipc/ipc_channel_posix_unittest.cc

Issue 2473993003: Delete IPC::ChannelPosix, IPC::ChannelWin and IPC::AttachmentBroker. (Closed)
Patch Set: Created 4 years, 1 month 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 | « ipc/ipc_channel_posix.cc ('k') | ipc/ipc_channel_reader.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ipc/ipc_channel_posix_unittest.cc
diff --git a/ipc/ipc_channel_posix_unittest.cc b/ipc/ipc_channel_posix_unittest.cc
deleted file mode 100644
index 3ea11c39c6d14429ab348373f9cdc301b37259ee..0000000000000000000000000000000000000000
--- a/ipc/ipc_channel_posix_unittest.cc
+++ /dev/null
@@ -1,506 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// These tests are POSIX only.
-
-#include "ipc/ipc_channel_posix.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <string.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <unistd.h>
-
-#include <memory>
-
-#include "base/command_line.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/location.h"
-#include "base/path_service.h"
-#include "base/posix/eintr_wrapper.h"
-#include "base/process/process.h"
-#include "base/rand_util.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/test/multiprocess_test.h"
-#include "base/test/test_timeouts.h"
-#include "build/build_config.h"
-#include "ipc/ipc_listener.h"
-#include "ipc/unix_domain_socket_util.h"
-#include "testing/multiprocess_func_list.h"
-
-namespace {
-
-const char kSocketNameSwitch[] = "connection-socket-name";
-
-static const uint32_t kQuitMessage = 47;
-
-class IPCChannelPosixTestListener : public IPC::Listener {
- public:
- enum STATUS {
- DISCONNECTED,
- MESSAGE_RECEIVED,
- CHANNEL_ERROR,
- CONNECTED,
- DENIED,
- LISTEN_ERROR
- };
-
- IPCChannelPosixTestListener(bool quit_only_on_message)
- : status_(DISCONNECTED),
- quit_only_on_message_(quit_only_on_message) {
- }
-
- ~IPCChannelPosixTestListener() override {}
-
- bool OnMessageReceived(const IPC::Message& message) override {
- EXPECT_EQ(message.type(), kQuitMessage);
- status_ = MESSAGE_RECEIVED;
- QuitRunLoop();
- return true;
- }
-
- void OnChannelConnected(int32_t peer_pid) override {
- status_ = CONNECTED;
- if (!quit_only_on_message_) {
- QuitRunLoop();
- }
- }
-
- void OnChannelError() override {
- status_ = CHANNEL_ERROR;
- QuitRunLoop();
- }
-
- void OnChannelDenied() override {
- status_ = DENIED;
- if (!quit_only_on_message_) {
- QuitRunLoop();
- }
- }
-
- void OnChannelListenError() override {
- status_ = LISTEN_ERROR;
- if (!quit_only_on_message_) {
- QuitRunLoop();
- }
- }
-
- STATUS status() { return status_; }
-
- void QuitRunLoop() {
- base::MessageLoopForIO* loop = base::MessageLoopForIO::current();
- if (loop->is_running()) {
- loop->QuitNow();
- } else {
- // Die as soon as Run is called.
- loop->task_runner()->PostTask(FROM_HERE, loop->QuitWhenIdleClosure());
- }
- }
-
- private:
- // The current status of the listener.
- STATUS status_;
- // If |quit_only_on_message_| then the listener will only break out of
- // the run loop when kQuitMessage is received.
- bool quit_only_on_message_;
-};
-
-class IPCChannelPosixTest : public base::MultiProcessTest {
- public:
- static void SetUpSocket(IPC::ChannelHandle *handle,
- IPC::Channel::Mode mode);
- static void SpinRunLoop(base::TimeDelta delay);
- static const std::string GetChannelDirName();
- static std::string GetClientConnectionSocketName();
-
- const std::string& GetConnectionSocketName();
-
- base::Process SpawnChild(const std::string& procname) {
- base::CommandLine command_line = MakeCmdLine(procname);
- command_line.AppendSwitchASCII(
- kSocketNameSwitch, GetConnectionSocketName());
- return base::SpawnMultiProcessTestChild(
- procname, command_line, base::LaunchOptions());
- }
-
- bool WaitForExit(base::Process& process, int* exit_code) {
-#if defined(OS_ANDROID)
- return AndroidWaitForChildExitWithTimeout(
- process, base::TimeDelta::Max(), exit_code);
-#else
- return process.WaitForExit(exit_code);
-#endif // defined(OS_ANDROID)
- }
-
- protected:
- void SetUp() override;
- void TearDown() override;
-
- private:
- std::unique_ptr<base::MessageLoopForIO> message_loop_;
- std::string socket_name_;
-};
-
-const std::string IPCChannelPosixTest::GetChannelDirName() {
- base::FilePath tmp_dir;
- PathService::Get(base::DIR_TEMP, &tmp_dir);
- return tmp_dir.value();
-}
-
-const std::string& IPCChannelPosixTest::GetConnectionSocketName() {
- if (socket_name_.empty()) {
- uint64_t id = base::RandUint64();
- socket_name_ = GetChannelDirName() +
- "/chrome_IPCChannelPosixTest_" +
- base::HexEncode(&id, sizeof(id));
- }
- return socket_name_;
-}
-
-std::string IPCChannelPosixTest::GetClientConnectionSocketName() {
- DCHECK(base::CommandLine::ForCurrentProcess()->HasSwitch(kSocketNameSwitch));
- return base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
- kSocketNameSwitch);
-}
-
-void IPCChannelPosixTest::SetUp() {
- MultiProcessTest::SetUp();
- // Construct a fresh IO Message loop for the duration of each test.
- message_loop_.reset(new base::MessageLoopForIO());
-}
-
-void IPCChannelPosixTest::TearDown() {
- message_loop_.reset(NULL);
- MultiProcessTest::TearDown();
-}
-
-// Create up a socket and bind and listen to it, or connect it
-// depending on the |mode|.
-void IPCChannelPosixTest::SetUpSocket(IPC::ChannelHandle *handle,
- IPC::Channel::Mode mode) {
- const std::string& name = handle->name;
-
- int socket_fd = 0;
- if (mode == IPC::Channel::MODE_NAMED_SERVER) {
- IPC::CreateServerUnixDomainSocket(base::FilePath(name), &socket_fd);
- } else if (mode == IPC::Channel::MODE_NAMED_CLIENT) {
- IPC::CreateClientUnixDomainSocket(base::FilePath(name), &socket_fd);
- } else {
- FAIL() << "Unknown mode " << mode;
- }
- handle->socket.fd = socket_fd;
-}
-
-void IPCChannelPosixTest::SpinRunLoop(base::TimeDelta delay) {
- base::MessageLoopForIO* loop = base::MessageLoopForIO::current();
- // Post a quit task so that this loop eventually ends and we don't hang
- // in the case of a bad test. Usually, the run loop will quit sooner than
- // that because all tests use a IPCChannelPosixTestListener which quits the
- // current run loop on any channel activity.
- loop->task_runner()->PostDelayedTask(FROM_HERE, loop->QuitWhenIdleClosure(),
- delay);
- base::RunLoop().Run();
-}
-
-TEST_F(IPCChannelPosixTest, BasicListen) {
- const std::string kChannelName =
- GetChannelDirName() + "/IPCChannelPosixTest_BasicListen";
-
- // Test creating a socket that is listening.
- IPC::ChannelHandle handle(kChannelName);
- SetUpSocket(&handle, IPC::Channel::MODE_NAMED_SERVER);
- unlink(handle.name.c_str());
- std::unique_ptr<IPC::ChannelPosix> channel(
- new IPC::ChannelPosix(handle, IPC::Channel::MODE_NAMED_SERVER, NULL));
- ASSERT_TRUE(channel->Connect());
- ASSERT_TRUE(channel->AcceptsConnections());
- ASSERT_FALSE(channel->HasAcceptedConnection());
- channel->ResetToAcceptingConnectionState();
- ASSERT_FALSE(channel->HasAcceptedConnection());
- unlink(handle.name.c_str());
-}
-
-TEST_F(IPCChannelPosixTest, BasicConnected) {
- // Test creating a socket that is connected.
- int pipe_fds[2];
- ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, pipe_fds));
- std::string socket_name("/var/tmp/IPCChannelPosixTest_BasicConnected");
- ASSERT_GE(fcntl(pipe_fds[0], F_SETFL, O_NONBLOCK), 0);
-
- base::FileDescriptor fd(pipe_fds[0], false);
- IPC::ChannelHandle handle(socket_name, fd);
- std::unique_ptr<IPC::ChannelPosix> channel(
- new IPC::ChannelPosix(handle, IPC::Channel::MODE_SERVER, NULL));
- ASSERT_TRUE(channel->Connect());
- ASSERT_FALSE(channel->AcceptsConnections());
- channel->Close();
- ASSERT_TRUE(IGNORE_EINTR(close(pipe_fds[1])) == 0);
-
- // Make sure that we can use the socket that is created for us by
- // a standard channel.
- std::unique_ptr<IPC::ChannelPosix> channel2(
- new IPC::ChannelPosix(socket_name, IPC::Channel::MODE_SERVER, NULL));
- ASSERT_TRUE(channel2->Connect());
- ASSERT_FALSE(channel2->AcceptsConnections());
-}
-
-// If a connection closes right before a Send() call, we may end up closing
-// the connection without notifying the listener, which can cause hangs in
-// sync_message_filter and others. Make sure the listener is notified.
-TEST_F(IPCChannelPosixTest, SendHangTest) {
- IPCChannelPosixTestListener out_listener(true);
- IPCChannelPosixTestListener in_listener(true);
- IPC::ChannelHandle in_handle("IN");
- std::unique_ptr<IPC::ChannelPosix> in_chan(new IPC::ChannelPosix(
- in_handle, IPC::Channel::MODE_SERVER, &in_listener));
- IPC::ChannelHandle out_handle(
- "OUT", base::FileDescriptor(in_chan->TakeClientFileDescriptor()));
- std::unique_ptr<IPC::ChannelPosix> out_chan(new IPC::ChannelPosix(
- out_handle, IPC::Channel::MODE_CLIENT, &out_listener));
- ASSERT_TRUE(in_chan->Connect());
- ASSERT_TRUE(out_chan->Connect());
- in_chan->Close(); // simulate remote process dying at an unfortunate time.
- // Send will fail, because it cannot write the message.
- ASSERT_FALSE(out_chan->Send(new IPC::Message(
- 0, // routing_id
- kQuitMessage, // message type
- IPC::Message::PRIORITY_NORMAL)));
- SpinRunLoop(TestTimeouts::action_max_timeout());
- ASSERT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, out_listener.status());
-}
-
-// If a connection closes right before a Connect() call, we may end up closing
-// the connection without notifying the listener, which can cause hangs in
-// sync_message_filter and others. Make sure the listener is notified.
-TEST_F(IPCChannelPosixTest, AcceptHangTest) {
- IPCChannelPosixTestListener out_listener(true);
- IPCChannelPosixTestListener in_listener(true);
- IPC::ChannelHandle in_handle("IN");
- std::unique_ptr<IPC::ChannelPosix> in_chan(new IPC::ChannelPosix(
- in_handle, IPC::Channel::MODE_SERVER, &in_listener));
- IPC::ChannelHandle out_handle(
- "OUT", base::FileDescriptor(in_chan->TakeClientFileDescriptor()));
- std::unique_ptr<IPC::ChannelPosix> out_chan(new IPC::ChannelPosix(
- out_handle, IPC::Channel::MODE_CLIENT, &out_listener));
- ASSERT_TRUE(in_chan->Connect());
- in_chan->Close(); // simulate remote process dying at an unfortunate time.
- ASSERT_FALSE(out_chan->Connect());
- SpinRunLoop(TestTimeouts::action_max_timeout());
- ASSERT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, out_listener.status());
-}
-
-TEST_F(IPCChannelPosixTest, AdvancedConnected) {
- // Test creating a connection to an external process.
- IPCChannelPosixTestListener listener(false);
- IPC::ChannelHandle chan_handle(GetConnectionSocketName());
- SetUpSocket(&chan_handle, IPC::Channel::MODE_NAMED_SERVER);
- std::unique_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix(
- chan_handle, IPC::Channel::MODE_NAMED_SERVER, &listener));
- ASSERT_TRUE(channel->Connect());
- ASSERT_TRUE(channel->AcceptsConnections());
- ASSERT_FALSE(channel->HasAcceptedConnection());
-
- base::Process process = SpawnChild("IPCChannelPosixTestConnectionProc");
- ASSERT_TRUE(process.IsValid());
- SpinRunLoop(TestTimeouts::action_max_timeout());
- ASSERT_EQ(IPCChannelPosixTestListener::CONNECTED, listener.status());
- ASSERT_TRUE(channel->HasAcceptedConnection());
- IPC::Message* message = new IPC::Message(0, // routing_id
- kQuitMessage, // message type
- IPC::Message::PRIORITY_NORMAL);
- channel->Send(message);
- SpinRunLoop(TestTimeouts::action_timeout());
- int exit_code = 0;
- EXPECT_TRUE(WaitForExit(process, &exit_code));
- EXPECT_EQ(0, exit_code);
- ASSERT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, listener.status());
- ASSERT_FALSE(channel->HasAcceptedConnection());
- unlink(chan_handle.name.c_str());
-}
-
-TEST_F(IPCChannelPosixTest, ResetState) {
- // Test creating a connection to an external process. Close the connection,
- // but continue to listen and make sure another external process can connect
- // to us.
- IPCChannelPosixTestListener listener(false);
- IPC::ChannelHandle chan_handle(GetConnectionSocketName());
- SetUpSocket(&chan_handle, IPC::Channel::MODE_NAMED_SERVER);
- std::unique_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix(
- chan_handle, IPC::Channel::MODE_NAMED_SERVER, &listener));
- ASSERT_TRUE(channel->Connect());
- ASSERT_TRUE(channel->AcceptsConnections());
- ASSERT_FALSE(channel->HasAcceptedConnection());
-
- base::Process process = SpawnChild("IPCChannelPosixTestConnectionProc");
- ASSERT_TRUE(process.IsValid());
- SpinRunLoop(TestTimeouts::action_max_timeout());
- ASSERT_EQ(IPCChannelPosixTestListener::CONNECTED, listener.status());
- ASSERT_TRUE(channel->HasAcceptedConnection());
- channel->ResetToAcceptingConnectionState();
- ASSERT_FALSE(channel->HasAcceptedConnection());
-
- base::Process process2 = SpawnChild("IPCChannelPosixTestConnectionProc");
- ASSERT_TRUE(process2.IsValid());
- SpinRunLoop(TestTimeouts::action_max_timeout());
- ASSERT_EQ(IPCChannelPosixTestListener::CONNECTED, listener.status());
- ASSERT_TRUE(channel->HasAcceptedConnection());
- IPC::Message* message = new IPC::Message(0, // routing_id
- kQuitMessage, // message type
- IPC::Message::PRIORITY_NORMAL);
- channel->Send(message);
- SpinRunLoop(TestTimeouts::action_timeout());
- EXPECT_TRUE(process.Terminate(0, false));
- int exit_code = 0;
- EXPECT_TRUE(WaitForExit(process2, &exit_code));
- EXPECT_EQ(0, exit_code);
- ASSERT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, listener.status());
- ASSERT_FALSE(channel->HasAcceptedConnection());
- unlink(chan_handle.name.c_str());
-}
-
-TEST_F(IPCChannelPosixTest, BadChannelName) {
- // Test empty name
- IPC::ChannelHandle handle("");
- std::unique_ptr<IPC::ChannelPosix> channel(
- new IPC::ChannelPosix(handle, IPC::Channel::MODE_NAMED_SERVER, NULL));
- ASSERT_FALSE(channel->Connect());
-
- // Test name that is too long.
- const char *kTooLongName = "This_is_a_very_long_name_to_proactively_implement"
- "client-centered_synergy_through_top-line"
- "platforms_Phosfluorescently_disintermediate_"
- "clicks-and-mortar_best_practices_without_"
- "future-proof_growth_strategies_Continually"
- "pontificate_proactive_potentialities_before"
- "leading-edge_processes";
- EXPECT_GE(strlen(kTooLongName), IPC::kMaxSocketNameLength);
- IPC::ChannelHandle handle2(kTooLongName);
- std::unique_ptr<IPC::ChannelPosix> channel2(
- new IPC::ChannelPosix(handle2, IPC::Channel::MODE_NAMED_SERVER, NULL));
- EXPECT_FALSE(channel2->Connect());
-}
-
-TEST_F(IPCChannelPosixTest, MultiConnection) {
- // Test setting up a connection to an external process, and then have
- // another external process attempt to connect to us.
- IPCChannelPosixTestListener listener(false);
- IPC::ChannelHandle chan_handle(GetConnectionSocketName());
- SetUpSocket(&chan_handle, IPC::Channel::MODE_NAMED_SERVER);
- std::unique_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix(
- chan_handle, IPC::Channel::MODE_NAMED_SERVER, &listener));
- ASSERT_TRUE(channel->Connect());
- ASSERT_TRUE(channel->AcceptsConnections());
- ASSERT_FALSE(channel->HasAcceptedConnection());
-
- base::Process process = SpawnChild("IPCChannelPosixTestConnectionProc");
- ASSERT_TRUE(process.IsValid());
- SpinRunLoop(TestTimeouts::action_max_timeout());
- ASSERT_EQ(IPCChannelPosixTestListener::CONNECTED, listener.status());
- ASSERT_TRUE(channel->HasAcceptedConnection());
- base::Process process2 = SpawnChild("IPCChannelPosixFailConnectionProc");
- ASSERT_TRUE(process2.IsValid());
- SpinRunLoop(TestTimeouts::action_max_timeout());
- int exit_code = 0;
- EXPECT_TRUE(WaitForExit(process2, &exit_code));
- EXPECT_EQ(exit_code, 0);
- ASSERT_EQ(IPCChannelPosixTestListener::DENIED, listener.status());
- ASSERT_TRUE(channel->HasAcceptedConnection());
- IPC::Message* message = new IPC::Message(0, // routing_id
- kQuitMessage, // message type
- IPC::Message::PRIORITY_NORMAL);
- channel->Send(message);
- SpinRunLoop(TestTimeouts::action_timeout());
- EXPECT_TRUE(WaitForExit(process, &exit_code));
- EXPECT_EQ(exit_code, 0);
- ASSERT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, listener.status());
- ASSERT_FALSE(channel->HasAcceptedConnection());
- unlink(chan_handle.name.c_str());
-}
-
-TEST_F(IPCChannelPosixTest, DoubleServer) {
- // Test setting up two servers with the same name.
- IPCChannelPosixTestListener listener(false);
- IPCChannelPosixTestListener listener2(false);
- IPC::ChannelHandle chan_handle(GetConnectionSocketName());
- std::unique_ptr<IPC::ChannelPosix> channel(
- new IPC::ChannelPosix(chan_handle, IPC::Channel::MODE_SERVER, &listener));
- std::unique_ptr<IPC::ChannelPosix> channel2(new IPC::ChannelPosix(
- chan_handle, IPC::Channel::MODE_SERVER, &listener2));
- ASSERT_TRUE(channel->Connect());
- ASSERT_FALSE(channel2->Connect());
-}
-
-TEST_F(IPCChannelPosixTest, BadMode) {
- // Test setting up two servers with a bad mode.
- IPCChannelPosixTestListener listener(false);
- IPC::ChannelHandle chan_handle(GetConnectionSocketName());
- std::unique_ptr<IPC::ChannelPosix> channel(
- new IPC::ChannelPosix(chan_handle, IPC::Channel::MODE_NONE, &listener));
- ASSERT_FALSE(channel->Connect());
-}
-
-TEST_F(IPCChannelPosixTest, IsNamedServerInitialized) {
- const std::string& connection_socket_name = GetConnectionSocketName();
- IPCChannelPosixTestListener listener(false);
- IPC::ChannelHandle chan_handle(connection_socket_name);
- ASSERT_TRUE(base::DeleteFile(base::FilePath(connection_socket_name), false));
- ASSERT_FALSE(IPC::Channel::IsNamedServerInitialized(
- connection_socket_name));
- std::unique_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix(
- chan_handle, IPC::Channel::MODE_NAMED_SERVER, &listener));
- ASSERT_TRUE(IPC::Channel::IsNamedServerInitialized(
- connection_socket_name));
- channel->Close();
- ASSERT_FALSE(IPC::Channel::IsNamedServerInitialized(
- connection_socket_name));
- unlink(chan_handle.name.c_str());
-}
-
-// A long running process that connects to us
-MULTIPROCESS_TEST_MAIN(IPCChannelPosixTestConnectionProc) {
- base::MessageLoopForIO message_loop;
- IPCChannelPosixTestListener listener(true);
- IPC::ChannelHandle handle(
- IPCChannelPosixTest::GetClientConnectionSocketName());
- IPCChannelPosixTest::SetUpSocket(&handle, IPC::Channel::MODE_NAMED_CLIENT);
- std::unique_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix(
- handle, IPC::Channel::MODE_NAMED_CLIENT, &listener));
- EXPECT_TRUE(channel->Connect());
- IPCChannelPosixTest::SpinRunLoop(TestTimeouts::action_max_timeout());
- EXPECT_EQ(IPCChannelPosixTestListener::MESSAGE_RECEIVED, listener.status());
- return 0;
-}
-
-// Simple external process that shouldn't be able to connect to us.
-MULTIPROCESS_TEST_MAIN(IPCChannelPosixFailConnectionProc) {
- base::MessageLoopForIO message_loop;
- IPCChannelPosixTestListener listener(false);
- IPC::ChannelHandle handle(
- IPCChannelPosixTest::GetClientConnectionSocketName());
- IPCChannelPosixTest::SetUpSocket(&handle, IPC::Channel::MODE_NAMED_CLIENT);
- std::unique_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix(
- handle, IPC::Channel::MODE_NAMED_CLIENT, &listener));
-
- // In this case connect may succeed or fail depending on if the packet
- // actually gets sent at sendmsg. Since we never delay on send, we may not
- // see the error. However even if connect succeeds, eventually we will get an
- // error back since the channel will be closed when we attempt to read from
- // it.
- bool connected = channel->Connect();
- if (connected) {
- IPCChannelPosixTest::SpinRunLoop(TestTimeouts::action_max_timeout());
- EXPECT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, listener.status());
- } else {
- EXPECT_EQ(IPCChannelPosixTestListener::DISCONNECTED, listener.status());
- }
- return 0;
-}
-
-} // namespace
« no previous file with comments | « ipc/ipc_channel_posix.cc ('k') | ipc/ipc_channel_reader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698