| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 // These tests are POSIX only. | 5 // These tests are POSIX only. |
| 6 | 6 |
| 7 #include "ipc/ipc_channel_posix.h" | 7 #include "ipc/ipc_channel_posix.h" |
| 8 | 8 |
| 9 #include <fcntl.h> | 9 #include <fcntl.h> |
| 10 #include <stdint.h> | 10 #include <stdint.h> |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 | 196 |
| 197 TEST_F(IPCChannelPosixTest, BasicListen) { | 197 TEST_F(IPCChannelPosixTest, BasicListen) { |
| 198 const std::string kChannelName = | 198 const std::string kChannelName = |
| 199 GetChannelDirName() + "/IPCChannelPosixTest_BasicListen"; | 199 GetChannelDirName() + "/IPCChannelPosixTest_BasicListen"; |
| 200 | 200 |
| 201 // Test creating a socket that is listening. | 201 // Test creating a socket that is listening. |
| 202 IPC::ChannelHandle handle(kChannelName); | 202 IPC::ChannelHandle handle(kChannelName); |
| 203 SetUpSocket(&handle, IPC::Channel::MODE_NAMED_SERVER); | 203 SetUpSocket(&handle, IPC::Channel::MODE_NAMED_SERVER); |
| 204 unlink(handle.name.c_str()); | 204 unlink(handle.name.c_str()); |
| 205 scoped_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix( | 205 scoped_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix( |
| 206 handle, IPC::Channel::MODE_NAMED_SERVER, NULL, nullptr)); | 206 handle, IPC::Channel::MODE_NAMED_SERVER, NULL)); |
| 207 ASSERT_TRUE(channel->Connect()); | 207 ASSERT_TRUE(channel->Connect()); |
| 208 ASSERT_TRUE(channel->AcceptsConnections()); | 208 ASSERT_TRUE(channel->AcceptsConnections()); |
| 209 ASSERT_FALSE(channel->HasAcceptedConnection()); | 209 ASSERT_FALSE(channel->HasAcceptedConnection()); |
| 210 channel->ResetToAcceptingConnectionState(); | 210 channel->ResetToAcceptingConnectionState(); |
| 211 ASSERT_FALSE(channel->HasAcceptedConnection()); | 211 ASSERT_FALSE(channel->HasAcceptedConnection()); |
| 212 unlink(handle.name.c_str()); | 212 unlink(handle.name.c_str()); |
| 213 } | 213 } |
| 214 | 214 |
| 215 TEST_F(IPCChannelPosixTest, BasicConnected) { | 215 TEST_F(IPCChannelPosixTest, BasicConnected) { |
| 216 // Test creating a socket that is connected. | 216 // Test creating a socket that is connected. |
| 217 int pipe_fds[2]; | 217 int pipe_fds[2]; |
| 218 ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, pipe_fds)); | 218 ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, pipe_fds)); |
| 219 std::string socket_name("/var/tmp/IPCChannelPosixTest_BasicConnected"); | 219 std::string socket_name("/var/tmp/IPCChannelPosixTest_BasicConnected"); |
| 220 ASSERT_GE(fcntl(pipe_fds[0], F_SETFL, O_NONBLOCK), 0); | 220 ASSERT_GE(fcntl(pipe_fds[0], F_SETFL, O_NONBLOCK), 0); |
| 221 | 221 |
| 222 base::FileDescriptor fd(pipe_fds[0], false); | 222 base::FileDescriptor fd(pipe_fds[0], false); |
| 223 IPC::ChannelHandle handle(socket_name, fd); | 223 IPC::ChannelHandle handle(socket_name, fd); |
| 224 scoped_ptr<IPC::ChannelPosix> channel( | 224 scoped_ptr<IPC::ChannelPosix> channel( |
| 225 new IPC::ChannelPosix(handle, IPC::Channel::MODE_SERVER, NULL, nullptr)); | 225 new IPC::ChannelPosix(handle, IPC::Channel::MODE_SERVER, NULL)); |
| 226 ASSERT_TRUE(channel->Connect()); | 226 ASSERT_TRUE(channel->Connect()); |
| 227 ASSERT_FALSE(channel->AcceptsConnections()); | 227 ASSERT_FALSE(channel->AcceptsConnections()); |
| 228 channel->Close(); | 228 channel->Close(); |
| 229 ASSERT_TRUE(IGNORE_EINTR(close(pipe_fds[1])) == 0); | 229 ASSERT_TRUE(IGNORE_EINTR(close(pipe_fds[1])) == 0); |
| 230 | 230 |
| 231 // Make sure that we can use the socket that is created for us by | 231 // Make sure that we can use the socket that is created for us by |
| 232 // a standard channel. | 232 // a standard channel. |
| 233 scoped_ptr<IPC::ChannelPosix> channel2(new IPC::ChannelPosix( | 233 scoped_ptr<IPC::ChannelPosix> channel2(new IPC::ChannelPosix( |
| 234 socket_name, IPC::Channel::MODE_SERVER, NULL, nullptr)); | 234 socket_name, IPC::Channel::MODE_SERVER, NULL)); |
| 235 ASSERT_TRUE(channel2->Connect()); | 235 ASSERT_TRUE(channel2->Connect()); |
| 236 ASSERT_FALSE(channel2->AcceptsConnections()); | 236 ASSERT_FALSE(channel2->AcceptsConnections()); |
| 237 } | 237 } |
| 238 | 238 |
| 239 // If a connection closes right before a Send() call, we may end up closing | 239 // If a connection closes right before a Send() call, we may end up closing |
| 240 // the connection without notifying the listener, which can cause hangs in | 240 // the connection without notifying the listener, which can cause hangs in |
| 241 // sync_message_filter and others. Make sure the listener is notified. | 241 // sync_message_filter and others. Make sure the listener is notified. |
| 242 TEST_F(IPCChannelPosixTest, SendHangTest) { | 242 TEST_F(IPCChannelPosixTest, SendHangTest) { |
| 243 IPCChannelPosixTestListener out_listener(true); | 243 IPCChannelPosixTestListener out_listener(true); |
| 244 IPCChannelPosixTestListener in_listener(true); | 244 IPCChannelPosixTestListener in_listener(true); |
| 245 IPC::ChannelHandle in_handle("IN"); | 245 IPC::ChannelHandle in_handle("IN"); |
| 246 scoped_ptr<IPC::ChannelPosix> in_chan(new IPC::ChannelPosix( | 246 scoped_ptr<IPC::ChannelPosix> in_chan(new IPC::ChannelPosix( |
| 247 in_handle, IPC::Channel::MODE_SERVER, &in_listener, nullptr)); | 247 in_handle, IPC::Channel::MODE_SERVER, &in_listener)); |
| 248 IPC::ChannelHandle out_handle( | 248 IPC::ChannelHandle out_handle( |
| 249 "OUT", base::FileDescriptor(in_chan->TakeClientFileDescriptor())); | 249 "OUT", base::FileDescriptor(in_chan->TakeClientFileDescriptor())); |
| 250 scoped_ptr<IPC::ChannelPosix> out_chan(new IPC::ChannelPosix( | 250 scoped_ptr<IPC::ChannelPosix> out_chan(new IPC::ChannelPosix( |
| 251 out_handle, IPC::Channel::MODE_CLIENT, &out_listener, nullptr)); | 251 out_handle, IPC::Channel::MODE_CLIENT, &out_listener)); |
| 252 ASSERT_TRUE(in_chan->Connect()); | 252 ASSERT_TRUE(in_chan->Connect()); |
| 253 ASSERT_TRUE(out_chan->Connect()); | 253 ASSERT_TRUE(out_chan->Connect()); |
| 254 in_chan->Close(); // simulate remote process dying at an unfortunate time. | 254 in_chan->Close(); // simulate remote process dying at an unfortunate time. |
| 255 // Send will fail, because it cannot write the message. | 255 // Send will fail, because it cannot write the message. |
| 256 ASSERT_FALSE(out_chan->Send(new IPC::Message( | 256 ASSERT_FALSE(out_chan->Send(new IPC::Message( |
| 257 0, // routing_id | 257 0, // routing_id |
| 258 kQuitMessage, // message type | 258 kQuitMessage, // message type |
| 259 IPC::Message::PRIORITY_NORMAL))); | 259 IPC::Message::PRIORITY_NORMAL))); |
| 260 SpinRunLoop(TestTimeouts::action_max_timeout()); | 260 SpinRunLoop(TestTimeouts::action_max_timeout()); |
| 261 ASSERT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, out_listener.status()); | 261 ASSERT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, out_listener.status()); |
| 262 } | 262 } |
| 263 | 263 |
| 264 // If a connection closes right before a Connect() call, we may end up closing | 264 // If a connection closes right before a Connect() call, we may end up closing |
| 265 // the connection without notifying the listener, which can cause hangs in | 265 // the connection without notifying the listener, which can cause hangs in |
| 266 // sync_message_filter and others. Make sure the listener is notified. | 266 // sync_message_filter and others. Make sure the listener is notified. |
| 267 TEST_F(IPCChannelPosixTest, AcceptHangTest) { | 267 TEST_F(IPCChannelPosixTest, AcceptHangTest) { |
| 268 IPCChannelPosixTestListener out_listener(true); | 268 IPCChannelPosixTestListener out_listener(true); |
| 269 IPCChannelPosixTestListener in_listener(true); | 269 IPCChannelPosixTestListener in_listener(true); |
| 270 IPC::ChannelHandle in_handle("IN"); | 270 IPC::ChannelHandle in_handle("IN"); |
| 271 scoped_ptr<IPC::ChannelPosix> in_chan(new IPC::ChannelPosix( | 271 scoped_ptr<IPC::ChannelPosix> in_chan(new IPC::ChannelPosix( |
| 272 in_handle, IPC::Channel::MODE_SERVER, &in_listener, nullptr)); | 272 in_handle, IPC::Channel::MODE_SERVER, &in_listener)); |
| 273 IPC::ChannelHandle out_handle( | 273 IPC::ChannelHandle out_handle( |
| 274 "OUT", base::FileDescriptor(in_chan->TakeClientFileDescriptor())); | 274 "OUT", base::FileDescriptor(in_chan->TakeClientFileDescriptor())); |
| 275 scoped_ptr<IPC::ChannelPosix> out_chan(new IPC::ChannelPosix( | 275 scoped_ptr<IPC::ChannelPosix> out_chan(new IPC::ChannelPosix( |
| 276 out_handle, IPC::Channel::MODE_CLIENT, &out_listener, nullptr)); | 276 out_handle, IPC::Channel::MODE_CLIENT, &out_listener)); |
| 277 ASSERT_TRUE(in_chan->Connect()); | 277 ASSERT_TRUE(in_chan->Connect()); |
| 278 in_chan->Close(); // simulate remote process dying at an unfortunate time. | 278 in_chan->Close(); // simulate remote process dying at an unfortunate time. |
| 279 ASSERT_FALSE(out_chan->Connect()); | 279 ASSERT_FALSE(out_chan->Connect()); |
| 280 SpinRunLoop(TestTimeouts::action_max_timeout()); | 280 SpinRunLoop(TestTimeouts::action_max_timeout()); |
| 281 ASSERT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, out_listener.status()); | 281 ASSERT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, out_listener.status()); |
| 282 } | 282 } |
| 283 | 283 |
| 284 #if defined(OS_ANDROID) | 284 #if defined(OS_ANDROID) |
| 285 #define MAYBE_AdvancedConnected DISABLED_AdvancedConnected | 285 #define MAYBE_AdvancedConnected DISABLED_AdvancedConnected |
| 286 #else | 286 #else |
| 287 #define MAYBE_AdvancedConnected AdvancedConnected | 287 #define MAYBE_AdvancedConnected AdvancedConnected |
| 288 #endif | 288 #endif |
| 289 TEST_F(IPCChannelPosixTest, MAYBE_AdvancedConnected) { | 289 TEST_F(IPCChannelPosixTest, MAYBE_AdvancedConnected) { |
| 290 // Test creating a connection to an external process. | 290 // Test creating a connection to an external process. |
| 291 IPCChannelPosixTestListener listener(false); | 291 IPCChannelPosixTestListener listener(false); |
| 292 IPC::ChannelHandle chan_handle(GetConnectionSocketName()); | 292 IPC::ChannelHandle chan_handle(GetConnectionSocketName()); |
| 293 SetUpSocket(&chan_handle, IPC::Channel::MODE_NAMED_SERVER); | 293 SetUpSocket(&chan_handle, IPC::Channel::MODE_NAMED_SERVER); |
| 294 scoped_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix( | 294 scoped_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix( |
| 295 chan_handle, IPC::Channel::MODE_NAMED_SERVER, &listener, nullptr)); | 295 chan_handle, IPC::Channel::MODE_NAMED_SERVER, &listener)); |
| 296 ASSERT_TRUE(channel->Connect()); | 296 ASSERT_TRUE(channel->Connect()); |
| 297 ASSERT_TRUE(channel->AcceptsConnections()); | 297 ASSERT_TRUE(channel->AcceptsConnections()); |
| 298 ASSERT_FALSE(channel->HasAcceptedConnection()); | 298 ASSERT_FALSE(channel->HasAcceptedConnection()); |
| 299 | 299 |
| 300 base::Process process = SpawnChild("IPCChannelPosixTestConnectionProc"); | 300 base::Process process = SpawnChild("IPCChannelPosixTestConnectionProc"); |
| 301 ASSERT_TRUE(process.IsValid()); | 301 ASSERT_TRUE(process.IsValid()); |
| 302 SpinRunLoop(TestTimeouts::action_max_timeout()); | 302 SpinRunLoop(TestTimeouts::action_max_timeout()); |
| 303 ASSERT_EQ(IPCChannelPosixTestListener::CONNECTED, listener.status()); | 303 ASSERT_EQ(IPCChannelPosixTestListener::CONNECTED, listener.status()); |
| 304 ASSERT_TRUE(channel->HasAcceptedConnection()); | 304 ASSERT_TRUE(channel->HasAcceptedConnection()); |
| 305 IPC::Message* message = new IPC::Message(0, // routing_id | 305 IPC::Message* message = new IPC::Message(0, // routing_id |
| (...skipping 15 matching lines...) Expand all Loading... |
| 321 #define MAYBE_ResetState ResetState | 321 #define MAYBE_ResetState ResetState |
| 322 #endif | 322 #endif |
| 323 TEST_F(IPCChannelPosixTest, MAYBE_ResetState) { | 323 TEST_F(IPCChannelPosixTest, MAYBE_ResetState) { |
| 324 // Test creating a connection to an external process. Close the connection, | 324 // Test creating a connection to an external process. Close the connection, |
| 325 // but continue to listen and make sure another external process can connect | 325 // but continue to listen and make sure another external process can connect |
| 326 // to us. | 326 // to us. |
| 327 IPCChannelPosixTestListener listener(false); | 327 IPCChannelPosixTestListener listener(false); |
| 328 IPC::ChannelHandle chan_handle(GetConnectionSocketName()); | 328 IPC::ChannelHandle chan_handle(GetConnectionSocketName()); |
| 329 SetUpSocket(&chan_handle, IPC::Channel::MODE_NAMED_SERVER); | 329 SetUpSocket(&chan_handle, IPC::Channel::MODE_NAMED_SERVER); |
| 330 scoped_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix( | 330 scoped_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix( |
| 331 chan_handle, IPC::Channel::MODE_NAMED_SERVER, &listener, nullptr)); | 331 chan_handle, IPC::Channel::MODE_NAMED_SERVER, &listener)); |
| 332 ASSERT_TRUE(channel->Connect()); | 332 ASSERT_TRUE(channel->Connect()); |
| 333 ASSERT_TRUE(channel->AcceptsConnections()); | 333 ASSERT_TRUE(channel->AcceptsConnections()); |
| 334 ASSERT_FALSE(channel->HasAcceptedConnection()); | 334 ASSERT_FALSE(channel->HasAcceptedConnection()); |
| 335 | 335 |
| 336 base::Process process = SpawnChild("IPCChannelPosixTestConnectionProc"); | 336 base::Process process = SpawnChild("IPCChannelPosixTestConnectionProc"); |
| 337 ASSERT_TRUE(process.IsValid()); | 337 ASSERT_TRUE(process.IsValid()); |
| 338 SpinRunLoop(TestTimeouts::action_max_timeout()); | 338 SpinRunLoop(TestTimeouts::action_max_timeout()); |
| 339 ASSERT_EQ(IPCChannelPosixTestListener::CONNECTED, listener.status()); | 339 ASSERT_EQ(IPCChannelPosixTestListener::CONNECTED, listener.status()); |
| 340 ASSERT_TRUE(channel->HasAcceptedConnection()); | 340 ASSERT_TRUE(channel->HasAcceptedConnection()); |
| 341 channel->ResetToAcceptingConnectionState(); | 341 channel->ResetToAcceptingConnectionState(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 357 EXPECT_EQ(0, exit_code); | 357 EXPECT_EQ(0, exit_code); |
| 358 ASSERT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, listener.status()); | 358 ASSERT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, listener.status()); |
| 359 ASSERT_FALSE(channel->HasAcceptedConnection()); | 359 ASSERT_FALSE(channel->HasAcceptedConnection()); |
| 360 unlink(chan_handle.name.c_str()); | 360 unlink(chan_handle.name.c_str()); |
| 361 } | 361 } |
| 362 | 362 |
| 363 TEST_F(IPCChannelPosixTest, BadChannelName) { | 363 TEST_F(IPCChannelPosixTest, BadChannelName) { |
| 364 // Test empty name | 364 // Test empty name |
| 365 IPC::ChannelHandle handle(""); | 365 IPC::ChannelHandle handle(""); |
| 366 scoped_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix( | 366 scoped_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix( |
| 367 handle, IPC::Channel::MODE_NAMED_SERVER, NULL, nullptr)); | 367 handle, IPC::Channel::MODE_NAMED_SERVER, NULL)); |
| 368 ASSERT_FALSE(channel->Connect()); | 368 ASSERT_FALSE(channel->Connect()); |
| 369 | 369 |
| 370 // Test name that is too long. | 370 // Test name that is too long. |
| 371 const char *kTooLongName = "This_is_a_very_long_name_to_proactively_implement" | 371 const char *kTooLongName = "This_is_a_very_long_name_to_proactively_implement" |
| 372 "client-centered_synergy_through_top-line" | 372 "client-centered_synergy_through_top-line" |
| 373 "platforms_Phosfluorescently_disintermediate_" | 373 "platforms_Phosfluorescently_disintermediate_" |
| 374 "clicks-and-mortar_best_practices_without_" | 374 "clicks-and-mortar_best_practices_without_" |
| 375 "future-proof_growth_strategies_Continually" | 375 "future-proof_growth_strategies_Continually" |
| 376 "pontificate_proactive_potentialities_before" | 376 "pontificate_proactive_potentialities_before" |
| 377 "leading-edge_processes"; | 377 "leading-edge_processes"; |
| 378 EXPECT_GE(strlen(kTooLongName), IPC::kMaxSocketNameLength); | 378 EXPECT_GE(strlen(kTooLongName), IPC::kMaxSocketNameLength); |
| 379 IPC::ChannelHandle handle2(kTooLongName); | 379 IPC::ChannelHandle handle2(kTooLongName); |
| 380 scoped_ptr<IPC::ChannelPosix> channel2(new IPC::ChannelPosix( | 380 scoped_ptr<IPC::ChannelPosix> channel2(new IPC::ChannelPosix( |
| 381 handle2, IPC::Channel::MODE_NAMED_SERVER, NULL, nullptr)); | 381 handle2, IPC::Channel::MODE_NAMED_SERVER, NULL)); |
| 382 EXPECT_FALSE(channel2->Connect()); | 382 EXPECT_FALSE(channel2->Connect()); |
| 383 } | 383 } |
| 384 | 384 |
| 385 #if defined(OS_ANDROID) | 385 #if defined(OS_ANDROID) |
| 386 #define MAYBE_MultiConnection DISABLED_MultiConnection | 386 #define MAYBE_MultiConnection DISABLED_MultiConnection |
| 387 #else | 387 #else |
| 388 #define MAYBE_MultiConnection MultiConnection | 388 #define MAYBE_MultiConnection MultiConnection |
| 389 #endif | 389 #endif |
| 390 TEST_F(IPCChannelPosixTest, MAYBE_MultiConnection) { | 390 TEST_F(IPCChannelPosixTest, MAYBE_MultiConnection) { |
| 391 // Test setting up a connection to an external process, and then have | 391 // Test setting up a connection to an external process, and then have |
| 392 // another external process attempt to connect to us. | 392 // another external process attempt to connect to us. |
| 393 IPCChannelPosixTestListener listener(false); | 393 IPCChannelPosixTestListener listener(false); |
| 394 IPC::ChannelHandle chan_handle(GetConnectionSocketName()); | 394 IPC::ChannelHandle chan_handle(GetConnectionSocketName()); |
| 395 SetUpSocket(&chan_handle, IPC::Channel::MODE_NAMED_SERVER); | 395 SetUpSocket(&chan_handle, IPC::Channel::MODE_NAMED_SERVER); |
| 396 scoped_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix( | 396 scoped_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix( |
| 397 chan_handle, IPC::Channel::MODE_NAMED_SERVER, &listener, nullptr)); | 397 chan_handle, IPC::Channel::MODE_NAMED_SERVER, &listener)); |
| 398 ASSERT_TRUE(channel->Connect()); | 398 ASSERT_TRUE(channel->Connect()); |
| 399 ASSERT_TRUE(channel->AcceptsConnections()); | 399 ASSERT_TRUE(channel->AcceptsConnections()); |
| 400 ASSERT_FALSE(channel->HasAcceptedConnection()); | 400 ASSERT_FALSE(channel->HasAcceptedConnection()); |
| 401 | 401 |
| 402 base::Process process = SpawnChild("IPCChannelPosixTestConnectionProc"); | 402 base::Process process = SpawnChild("IPCChannelPosixTestConnectionProc"); |
| 403 ASSERT_TRUE(process.IsValid()); | 403 ASSERT_TRUE(process.IsValid()); |
| 404 SpinRunLoop(TestTimeouts::action_max_timeout()); | 404 SpinRunLoop(TestTimeouts::action_max_timeout()); |
| 405 ASSERT_EQ(IPCChannelPosixTestListener::CONNECTED, listener.status()); | 405 ASSERT_EQ(IPCChannelPosixTestListener::CONNECTED, listener.status()); |
| 406 ASSERT_TRUE(channel->HasAcceptedConnection()); | 406 ASSERT_TRUE(channel->HasAcceptedConnection()); |
| 407 base::Process process2 = SpawnChild("IPCChannelPosixFailConnectionProc"); | 407 base::Process process2 = SpawnChild("IPCChannelPosixFailConnectionProc"); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 423 ASSERT_FALSE(channel->HasAcceptedConnection()); | 423 ASSERT_FALSE(channel->HasAcceptedConnection()); |
| 424 unlink(chan_handle.name.c_str()); | 424 unlink(chan_handle.name.c_str()); |
| 425 } | 425 } |
| 426 | 426 |
| 427 TEST_F(IPCChannelPosixTest, DoubleServer) { | 427 TEST_F(IPCChannelPosixTest, DoubleServer) { |
| 428 // Test setting up two servers with the same name. | 428 // Test setting up two servers with the same name. |
| 429 IPCChannelPosixTestListener listener(false); | 429 IPCChannelPosixTestListener listener(false); |
| 430 IPCChannelPosixTestListener listener2(false); | 430 IPCChannelPosixTestListener listener2(false); |
| 431 IPC::ChannelHandle chan_handle(GetConnectionSocketName()); | 431 IPC::ChannelHandle chan_handle(GetConnectionSocketName()); |
| 432 scoped_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix( | 432 scoped_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix( |
| 433 chan_handle, IPC::Channel::MODE_SERVER, &listener, nullptr)); | 433 chan_handle, IPC::Channel::MODE_SERVER, &listener)); |
| 434 scoped_ptr<IPC::ChannelPosix> channel2(new IPC::ChannelPosix( | 434 scoped_ptr<IPC::ChannelPosix> channel2(new IPC::ChannelPosix( |
| 435 chan_handle, IPC::Channel::MODE_SERVER, &listener2, nullptr)); | 435 chan_handle, IPC::Channel::MODE_SERVER, &listener2)); |
| 436 ASSERT_TRUE(channel->Connect()); | 436 ASSERT_TRUE(channel->Connect()); |
| 437 ASSERT_FALSE(channel2->Connect()); | 437 ASSERT_FALSE(channel2->Connect()); |
| 438 } | 438 } |
| 439 | 439 |
| 440 TEST_F(IPCChannelPosixTest, BadMode) { | 440 TEST_F(IPCChannelPosixTest, BadMode) { |
| 441 // Test setting up two servers with a bad mode. | 441 // Test setting up two servers with a bad mode. |
| 442 IPCChannelPosixTestListener listener(false); | 442 IPCChannelPosixTestListener listener(false); |
| 443 IPC::ChannelHandle chan_handle(GetConnectionSocketName()); | 443 IPC::ChannelHandle chan_handle(GetConnectionSocketName()); |
| 444 scoped_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix( | 444 scoped_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix( |
| 445 chan_handle, IPC::Channel::MODE_NONE, &listener, nullptr)); | 445 chan_handle, IPC::Channel::MODE_NONE, &listener)); |
| 446 ASSERT_FALSE(channel->Connect()); | 446 ASSERT_FALSE(channel->Connect()); |
| 447 } | 447 } |
| 448 | 448 |
| 449 TEST_F(IPCChannelPosixTest, IsNamedServerInitialized) { | 449 TEST_F(IPCChannelPosixTest, IsNamedServerInitialized) { |
| 450 const std::string& connection_socket_name = GetConnectionSocketName(); | 450 const std::string& connection_socket_name = GetConnectionSocketName(); |
| 451 IPCChannelPosixTestListener listener(false); | 451 IPCChannelPosixTestListener listener(false); |
| 452 IPC::ChannelHandle chan_handle(connection_socket_name); | 452 IPC::ChannelHandle chan_handle(connection_socket_name); |
| 453 ASSERT_TRUE(base::DeleteFile(base::FilePath(connection_socket_name), false)); | 453 ASSERT_TRUE(base::DeleteFile(base::FilePath(connection_socket_name), false)); |
| 454 ASSERT_FALSE(IPC::Channel::IsNamedServerInitialized( | 454 ASSERT_FALSE(IPC::Channel::IsNamedServerInitialized( |
| 455 connection_socket_name)); | 455 connection_socket_name)); |
| 456 scoped_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix( | 456 scoped_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix( |
| 457 chan_handle, IPC::Channel::MODE_NAMED_SERVER, &listener, nullptr)); | 457 chan_handle, IPC::Channel::MODE_NAMED_SERVER, &listener)); |
| 458 ASSERT_TRUE(IPC::Channel::IsNamedServerInitialized( | 458 ASSERT_TRUE(IPC::Channel::IsNamedServerInitialized( |
| 459 connection_socket_name)); | 459 connection_socket_name)); |
| 460 channel->Close(); | 460 channel->Close(); |
| 461 ASSERT_FALSE(IPC::Channel::IsNamedServerInitialized( | 461 ASSERT_FALSE(IPC::Channel::IsNamedServerInitialized( |
| 462 connection_socket_name)); | 462 connection_socket_name)); |
| 463 unlink(chan_handle.name.c_str()); | 463 unlink(chan_handle.name.c_str()); |
| 464 } | 464 } |
| 465 | 465 |
| 466 // A long running process that connects to us | 466 // A long running process that connects to us |
| 467 MULTIPROCESS_TEST_MAIN(IPCChannelPosixTestConnectionProc) { | 467 MULTIPROCESS_TEST_MAIN(IPCChannelPosixTestConnectionProc) { |
| 468 base::MessageLoopForIO message_loop; | 468 base::MessageLoopForIO message_loop; |
| 469 IPCChannelPosixTestListener listener(true); | 469 IPCChannelPosixTestListener listener(true); |
| 470 IPC::ChannelHandle handle(IPCChannelPosixTest::GetConnectionSocketName()); | 470 IPC::ChannelHandle handle(IPCChannelPosixTest::GetConnectionSocketName()); |
| 471 IPCChannelPosixTest::SetUpSocket(&handle, IPC::Channel::MODE_NAMED_CLIENT); | 471 IPCChannelPosixTest::SetUpSocket(&handle, IPC::Channel::MODE_NAMED_CLIENT); |
| 472 scoped_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix( | 472 scoped_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix( |
| 473 handle, IPC::Channel::MODE_NAMED_CLIENT, &listener, nullptr)); | 473 handle, IPC::Channel::MODE_NAMED_CLIENT, &listener)); |
| 474 EXPECT_TRUE(channel->Connect()); | 474 EXPECT_TRUE(channel->Connect()); |
| 475 IPCChannelPosixTest::SpinRunLoop(TestTimeouts::action_max_timeout()); | 475 IPCChannelPosixTest::SpinRunLoop(TestTimeouts::action_max_timeout()); |
| 476 EXPECT_EQ(IPCChannelPosixTestListener::MESSAGE_RECEIVED, listener.status()); | 476 EXPECT_EQ(IPCChannelPosixTestListener::MESSAGE_RECEIVED, listener.status()); |
| 477 return 0; | 477 return 0; |
| 478 } | 478 } |
| 479 | 479 |
| 480 // Simple external process that shouldn't be able to connect to us. | 480 // Simple external process that shouldn't be able to connect to us. |
| 481 MULTIPROCESS_TEST_MAIN(IPCChannelPosixFailConnectionProc) { | 481 MULTIPROCESS_TEST_MAIN(IPCChannelPosixFailConnectionProc) { |
| 482 base::MessageLoopForIO message_loop; | 482 base::MessageLoopForIO message_loop; |
| 483 IPCChannelPosixTestListener listener(false); | 483 IPCChannelPosixTestListener listener(false); |
| 484 IPC::ChannelHandle handle(IPCChannelPosixTest::GetConnectionSocketName()); | 484 IPC::ChannelHandle handle(IPCChannelPosixTest::GetConnectionSocketName()); |
| 485 IPCChannelPosixTest::SetUpSocket(&handle, IPC::Channel::MODE_NAMED_CLIENT); | 485 IPCChannelPosixTest::SetUpSocket(&handle, IPC::Channel::MODE_NAMED_CLIENT); |
| 486 scoped_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix( | 486 scoped_ptr<IPC::ChannelPosix> channel(new IPC::ChannelPosix( |
| 487 handle, IPC::Channel::MODE_NAMED_CLIENT, &listener, nullptr)); | 487 handle, IPC::Channel::MODE_NAMED_CLIENT, &listener)); |
| 488 | 488 |
| 489 // In this case connect may succeed or fail depending on if the packet | 489 // In this case connect may succeed or fail depending on if the packet |
| 490 // actually gets sent at sendmsg. Since we never delay on send, we may not | 490 // actually gets sent at sendmsg. Since we never delay on send, we may not |
| 491 // see the error. However even if connect succeeds, eventually we will get an | 491 // see the error. However even if connect succeeds, eventually we will get an |
| 492 // error back since the channel will be closed when we attempt to read from | 492 // error back since the channel will be closed when we attempt to read from |
| 493 // it. | 493 // it. |
| 494 bool connected = channel->Connect(); | 494 bool connected = channel->Connect(); |
| 495 if (connected) { | 495 if (connected) { |
| 496 IPCChannelPosixTest::SpinRunLoop(TestTimeouts::action_max_timeout()); | 496 IPCChannelPosixTest::SpinRunLoop(TestTimeouts::action_max_timeout()); |
| 497 EXPECT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, listener.status()); | 497 EXPECT_EQ(IPCChannelPosixTestListener::CHANNEL_ERROR, listener.status()); |
| 498 } else { | 498 } else { |
| 499 EXPECT_EQ(IPCChannelPosixTestListener::DISCONNECTED, listener.status()); | 499 EXPECT_EQ(IPCChannelPosixTestListener::DISCONNECTED, listener.status()); |
| 500 } | 500 } |
| 501 return 0; | 501 return 0; |
| 502 } | 502 } |
| 503 | 503 |
| 504 } // namespace | 504 } // namespace |
| OLD | NEW |