Index: ipc/ipc_sync_channel_unittest.cc |
=================================================================== |
--- ipc/ipc_sync_channel_unittest.cc (revision 33329) |
+++ ipc/ipc_sync_channel_unittest.cc (working copy) |
@@ -104,8 +104,8 @@ |
if (pump) |
msg->EnableMessagePumping(); |
bool result = SendWithTimeout(msg, timeout); |
- DCHECK(result == succeed); |
- DCHECK(answer == (succeed ? 42 : 0)); |
+ DCHECK_EQ(result, succeed); |
+ DCHECK_EQ(answer, (succeed ? 42 : 0)); |
return result; |
} |
bool SendDouble(bool pump, bool succeed) { |
@@ -114,12 +114,13 @@ |
if (pump) |
msg->EnableMessagePumping(); |
bool result = Send(msg); |
- DCHECK(result == succeed); |
- DCHECK(answer == (succeed ? 10 : 0)); |
+ DCHECK_EQ(result, succeed); |
+ DCHECK_EQ(answer, (succeed ? 10 : 0)); |
return result; |
} |
Channel::Mode mode() { return mode_; } |
WaitableEvent* done_event() { return done_.get(); } |
+ void ResetChannel() { channel_.reset(); } |
protected: |
// Derived classes need to call this when they've completed their part of |
@@ -389,19 +390,34 @@ |
class UnblockServer : public Worker { |
public: |
- UnblockServer(bool pump_during_send) |
+ UnblockServer(bool pump_during_send, bool delete_during_send) |
: Worker(Channel::MODE_SERVER, "unblock_server"), |
- pump_during_send_(pump_during_send) { } |
+ pump_during_send_(pump_during_send), |
+ delete_during_send_(delete_during_send) { } |
void Run() { |
- SendAnswerToLife(pump_during_send_, base::kNoTimeout, true); |
+ if (delete_during_send_) { |
+ // Use custom code since race conditions mean the answer may or may not be |
+ // available. |
+ int answer = 0; |
+ SyncMessage* msg = new SyncChannelTestMsg_AnswerToLife(&answer); |
+ if (pump_during_send_) |
+ msg->EnableMessagePumping(); |
+ Send(msg); |
+ } else { |
+ SendAnswerToLife(pump_during_send_, base::kNoTimeout, true); |
+ } |
Done(); |
} |
- void OnDouble(int in, int* out) { |
- *out = in * 2; |
+ void OnDoubleDelay(int in, Message* reply_msg) { |
+ SyncChannelTestMsg_Double::WriteReplyParams(reply_msg, in * 2); |
+ Send(reply_msg); |
+ if (delete_during_send_) |
+ ResetChannel(); |
} |
bool pump_during_send_; |
+ bool delete_during_send_; |
}; |
class UnblockClient : public Worker { |
@@ -419,9 +435,9 @@ |
bool pump_during_send_; |
}; |
-void Unblock(bool server_pump, bool client_pump) { |
+void Unblock(bool server_pump, bool client_pump, bool delete_during_send) { |
std::vector<Worker*> workers; |
- workers.push_back(new UnblockServer(server_pump)); |
+ workers.push_back(new UnblockServer(server_pump, delete_during_send)); |
workers.push_back(new UnblockClient(client_pump)); |
RunTest(workers); |
} |
@@ -430,14 +446,24 @@ |
// Tests that the caller unblocks to answer a sync message from the receiver. |
TEST_F(IPCSyncChannelTest, Unblock) { |
- Unblock(false, false); |
- Unblock(false, true); |
- Unblock(true, false); |
- Unblock(true, true); |
+ Unblock(false, false, false); |
+ Unblock(false, true, false); |
+ Unblock(true, false, false); |
+ Unblock(true, true, false); |
} |
//----------------------------------------------------------------------------- |
+// Tests that the the IPC::SyncChannel object can be deleted during a Send. |
+TEST_F(IPCSyncChannelTest, ChannelDeleteDuringSend) { |
+ Unblock(false, false, true); |
+ Unblock(false, true, true); |
+ Unblock(true, false, true); |
+ Unblock(true, true, true); |
+} |
+ |
+//----------------------------------------------------------------------------- |
+ |
namespace { |
class RecursiveServer : public Worker { |
@@ -710,7 +736,7 @@ |
msg->EnableMessagePumping(); |
bool result = Send(msg); |
DCHECK(result); |
- DCHECK(response == expected_text_); |
+ DCHECK_EQ(response, expected_text_); |
LOG(INFO) << __FUNCTION__ << " Received reply: " |
<< response.c_str(); |
@@ -801,7 +827,7 @@ |
// Need to send another message to get the client to call Done(). |
result = Send(new SyncChannelTestMsg_AnswerToLife(&answer)); |
DCHECK(result); |
- DCHECK(answer == 42); |
+ DCHECK_EQ(answer, 42); |
Done(); |
} |
@@ -848,7 +874,7 @@ |
void ChattyServer(bool pump_during_send) { |
std::vector<Worker*> workers; |
- workers.push_back(new UnblockServer(pump_during_send)); |
+ workers.push_back(new UnblockServer(pump_during_send, false)); |
workers.push_back(new ChattyClient()); |
RunTest(workers); |
} |