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

Side by Side Diff: ipc/ipc_sync_channel_unittest.cc

Issue 2027303002: Migrate WaitableEvent to enum-based constructor in ipc/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@WEvent_enums
Patch Set: Created 4 years, 6 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
« no previous file with comments | « ipc/ipc_sync_channel.cc ('k') | ipc/ipc_sync_message.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #include "ipc/ipc_sync_channel.h" 5 #include "ipc/ipc_sync_channel.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <string> 10 #include <string>
(...skipping 24 matching lines...) Expand all
35 namespace IPC { 35 namespace IPC {
36 namespace { 36 namespace {
37 37
38 // Base class for a "process" with listener and IPC threads. 38 // Base class for a "process" with listener and IPC threads.
39 class Worker : public Listener, public Sender { 39 class Worker : public Listener, public Sender {
40 public: 40 public:
41 // Will create a channel without a name. 41 // Will create a channel without a name.
42 Worker(Channel::Mode mode, 42 Worker(Channel::Mode mode,
43 const std::string& thread_name, 43 const std::string& thread_name,
44 const std::string& channel_name) 44 const std::string& channel_name)
45 : done_(new WaitableEvent(false, false)), 45 : done_(
46 channel_created_(new WaitableEvent(false, false)), 46 new WaitableEvent(base::WaitableEvent::ResetPolicy::AUTOMATIC,
47 base::WaitableEvent::InitialState::NOT_SIGNALED)),
48 channel_created_(
49 new WaitableEvent(base::WaitableEvent::ResetPolicy::AUTOMATIC,
50 base::WaitableEvent::InitialState::NOT_SIGNALED)),
47 channel_name_(channel_name), 51 channel_name_(channel_name),
48 mode_(mode), 52 mode_(mode),
49 ipc_thread_((thread_name + "_ipc").c_str()), 53 ipc_thread_((thread_name + "_ipc").c_str()),
50 listener_thread_((thread_name + "_listener").c_str()), 54 listener_thread_((thread_name + "_listener").c_str()),
51 overrided_thread_(NULL), 55 overrided_thread_(NULL),
52 shutdown_event_(true, false), 56 shutdown_event_(base::WaitableEvent::ResetPolicy::MANUAL,
57 base::WaitableEvent::InitialState::NOT_SIGNALED),
53 is_shutdown_(false) {} 58 is_shutdown_(false) {}
54 59
55 // Will create a named channel and use this name for the threads' name. 60 // Will create a named channel and use this name for the threads' name.
56 Worker(const std::string& channel_name, Channel::Mode mode) 61 Worker(const std::string& channel_name, Channel::Mode mode)
57 : done_(new WaitableEvent(false, false)), 62 : done_(
58 channel_created_(new WaitableEvent(false, false)), 63 new WaitableEvent(base::WaitableEvent::ResetPolicy::AUTOMATIC,
64 base::WaitableEvent::InitialState::NOT_SIGNALED)),
65 channel_created_(
66 new WaitableEvent(base::WaitableEvent::ResetPolicy::AUTOMATIC,
67 base::WaitableEvent::InitialState::NOT_SIGNALED)),
59 channel_name_(channel_name), 68 channel_name_(channel_name),
60 mode_(mode), 69 mode_(mode),
61 ipc_thread_((channel_name + "_ipc").c_str()), 70 ipc_thread_((channel_name + "_ipc").c_str()),
62 listener_thread_((channel_name + "_listener").c_str()), 71 listener_thread_((channel_name + "_listener").c_str()),
63 overrided_thread_(NULL), 72 overrided_thread_(NULL),
64 shutdown_event_(true, false), 73 shutdown_event_(base::WaitableEvent::ResetPolicy::MANUAL,
65 is_shutdown_(false) { 74 base::WaitableEvent::InitialState::NOT_SIGNALED),
66 } 75 is_shutdown_(false) {}
67 76
68 ~Worker() override { 77 ~Worker() override {
69 // Shutdown() must be called before destruction. 78 // Shutdown() must be called before destruction.
70 CHECK(is_shutdown_); 79 CHECK(is_shutdown_);
71 } 80 }
72 void AddRef() { } 81 void AddRef() { }
73 void Release() { } 82 void Release() { }
74 bool Send(Message* msg) override { return channel_->Send(msg); } 83 bool Send(Message* msg) override { return channel_->Send(msg); }
75 void WaitForChannelCreation() { channel_created_->Wait(); } 84 void WaitForChannelCreation() { channel_created_->Wait(); }
76 void CloseChannel() { 85 void CloseChannel() {
77 DCHECK(base::MessageLoop::current() == ListenerThread()->message_loop()); 86 DCHECK(base::MessageLoop::current() == ListenerThread()->message_loop());
78 channel_->Close(); 87 channel_->Close();
79 } 88 }
80 void Start() { 89 void Start() {
81 StartThread(&listener_thread_, base::MessageLoop::TYPE_DEFAULT); 90 StartThread(&listener_thread_, base::MessageLoop::TYPE_DEFAULT);
82 ListenerThread()->task_runner()->PostTask( 91 ListenerThread()->task_runner()->PostTask(
83 FROM_HERE, base::Bind(&Worker::OnStart, this)); 92 FROM_HERE, base::Bind(&Worker::OnStart, this));
84 } 93 }
85 void Shutdown() { 94 void Shutdown() {
86 // The IPC thread needs to outlive SyncChannel. We can't do this in 95 // The IPC thread needs to outlive SyncChannel. We can't do this in
87 // ~Worker(), since that'll reset the vtable pointer (to Worker's), which 96 // ~Worker(), since that'll reset the vtable pointer (to Worker's), which
88 // may result in a race conditions. See http://crbug.com/25841. 97 // may result in a race conditions. See http://crbug.com/25841.
89 WaitableEvent listener_done(false, false), ipc_done(false, false); 98 WaitableEvent listener_done(
99 base::WaitableEvent::ResetPolicy::AUTOMATIC,
100 base::WaitableEvent::InitialState::NOT_SIGNALED),
101 ipc_done(base::WaitableEvent::ResetPolicy::AUTOMATIC,
102 base::WaitableEvent::InitialState::NOT_SIGNALED);
90 ListenerThread()->task_runner()->PostTask( 103 ListenerThread()->task_runner()->PostTask(
91 FROM_HERE, base::Bind(&Worker::OnListenerThreadShutdown1, this, 104 FROM_HERE, base::Bind(&Worker::OnListenerThreadShutdown1, this,
92 &listener_done, &ipc_done)); 105 &listener_done, &ipc_done));
93 listener_done.Wait(); 106 listener_done.Wait();
94 ipc_done.Wait(); 107 ipc_done.Wait();
95 ipc_thread_.Stop(); 108 ipc_thread_.Stop();
96 listener_thread_.Stop(); 109 listener_thread_.Stop();
97 is_shutdown_ = true; 110 is_shutdown_ = true;
98 } 111 }
99 void OverrideThread(base::Thread* overrided_thread) { 112 void OverrideThread(base::Thread* overrided_thread) {
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 Send(reply_msg); 460 Send(reply_msg);
448 got_first_reply_->Wait(); 461 got_first_reply_->Wait();
449 CloseChannel(); 462 CloseChannel();
450 Done(); 463 Done();
451 } 464 }
452 465
453 WaitableEvent* got_first_reply_; 466 WaitableEvent* got_first_reply_;
454 }; 467 };
455 468
456 void NoHang(bool pump_during_send) { 469 void NoHang(bool pump_during_send) {
457 WaitableEvent got_first_reply(false, false); 470 WaitableEvent got_first_reply(
471 base::WaitableEvent::ResetPolicy::AUTOMATIC,
472 base::WaitableEvent::InitialState::NOT_SIGNALED);
458 std::vector<Worker*> workers; 473 std::vector<Worker*> workers;
459 workers.push_back( 474 workers.push_back(
460 new NoHangServer(&got_first_reply, pump_during_send, "NoHang")); 475 new NoHangServer(&got_first_reply, pump_during_send, "NoHang"));
461 workers.push_back(new NoHangClient(&got_first_reply, "NoHang")); 476 workers.push_back(new NoHangClient(&got_first_reply, "NoHang"));
462 RunTest(workers); 477 RunTest(workers);
463 } 478 }
464 479
465 // Tests that caller doesn't hang if receiver dies 480 // Tests that caller doesn't hang if receiver dies
466 TEST_F(IPCSyncChannelTest, NoHang) { 481 TEST_F(IPCSyncChannelTest, NoHang) {
467 NoHang(false); 482 NoHang(false);
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
723 void Multiple(bool server_pump, bool client_pump) { 738 void Multiple(bool server_pump, bool client_pump) {
724 std::vector<Worker*> workers; 739 std::vector<Worker*> workers;
725 740
726 // A shared worker thread so that server1 and server2 run on one thread. 741 // A shared worker thread so that server1 and server2 run on one thread.
727 base::Thread worker_thread("Multiple"); 742 base::Thread worker_thread("Multiple");
728 ASSERT_TRUE(worker_thread.Start()); 743 ASSERT_TRUE(worker_thread.Start());
729 744
730 // Server1 sends a sync msg to client1, which blocks the reply until 745 // Server1 sends a sync msg to client1, which blocks the reply until
731 // server2 (which runs on the same worker thread as server1) responds 746 // server2 (which runs on the same worker thread as server1) responds
732 // to a sync msg from client2. 747 // to a sync msg from client2.
733 WaitableEvent client1_msg_received(false, false); 748 WaitableEvent client1_msg_received(
734 WaitableEvent client1_can_reply(false, false); 749 base::WaitableEvent::ResetPolicy::AUTOMATIC,
750 base::WaitableEvent::InitialState::NOT_SIGNALED);
751 WaitableEvent client1_can_reply(
752 base::WaitableEvent::ResetPolicy::AUTOMATIC,
753 base::WaitableEvent::InitialState::NOT_SIGNALED);
735 754
736 Worker* worker; 755 Worker* worker;
737 756
738 worker = new MultipleServer2(); 757 worker = new MultipleServer2();
739 worker->OverrideThread(&worker_thread); 758 worker->OverrideThread(&worker_thread);
740 workers.push_back(worker); 759 workers.push_back(worker);
741 760
742 worker = new MultipleClient2( 761 worker = new MultipleClient2(
743 &client1_msg_received, &client1_can_reply, client_pump); 762 &client1_msg_received, &client1_can_reply, client_pump);
744 workers.push_back(worker); 763 workers.push_back(worker);
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after
1248 1267
1249 int ping_; 1268 int ping_;
1250 RestrictedDispatchServer* server_; 1269 RestrictedDispatchServer* server_;
1251 NonRestrictedDispatchServer* server2_; 1270 NonRestrictedDispatchServer* server2_;
1252 int* success_; 1271 int* success_;
1253 WaitableEvent* sent_ping_event_; 1272 WaitableEvent* sent_ping_event_;
1254 std::unique_ptr<SyncChannel> non_restricted_channel_; 1273 std::unique_ptr<SyncChannel> non_restricted_channel_;
1255 }; 1274 };
1256 1275
1257 TEST_F(IPCSyncChannelTest, RestrictedDispatch) { 1276 TEST_F(IPCSyncChannelTest, RestrictedDispatch) {
1258 WaitableEvent sent_ping_event(false, false); 1277 WaitableEvent sent_ping_event(
1259 WaitableEvent wait_event(false, false); 1278 base::WaitableEvent::ResetPolicy::AUTOMATIC,
1279 base::WaitableEvent::InitialState::NOT_SIGNALED);
1280 WaitableEvent wait_event(base::WaitableEvent::ResetPolicy::AUTOMATIC,
1281 base::WaitableEvent::InitialState::NOT_SIGNALED);
1260 RestrictedDispatchServer* server = 1282 RestrictedDispatchServer* server =
1261 new RestrictedDispatchServer(&sent_ping_event, &wait_event); 1283 new RestrictedDispatchServer(&sent_ping_event, &wait_event);
1262 NonRestrictedDispatchServer* server2 = 1284 NonRestrictedDispatchServer* server2 =
1263 new NonRestrictedDispatchServer(&wait_event); 1285 new NonRestrictedDispatchServer(&wait_event);
1264 1286
1265 int success = 0; 1287 int success = 0;
1266 std::vector<Worker*> workers; 1288 std::vector<Worker*> workers;
1267 workers.push_back(server); 1289 workers.push_back(server);
1268 workers.push_back(server2); 1290 workers.push_back(server2);
1269 workers.push_back(new RestrictedDispatchClient( 1291 workers.push_back(new RestrictedDispatchClient(
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
1479 bool done_issued_; 1501 bool done_issued_;
1480 }; 1502 };
1481 1503
1482 TEST_F(IPCSyncChannelTest, RestrictedDispatchDeadlock) { 1504 TEST_F(IPCSyncChannelTest, RestrictedDispatchDeadlock) {
1483 std::vector<Worker*> workers; 1505 std::vector<Worker*> workers;
1484 1506
1485 // A shared worker thread so that server1 and server2 run on one thread. 1507 // A shared worker thread so that server1 and server2 run on one thread.
1486 base::Thread worker_thread("RestrictedDispatchDeadlock"); 1508 base::Thread worker_thread("RestrictedDispatchDeadlock");
1487 ASSERT_TRUE(worker_thread.Start()); 1509 ASSERT_TRUE(worker_thread.Start());
1488 1510
1489 WaitableEvent server1_ready(false, false); 1511 WaitableEvent server1_ready(base::WaitableEvent::ResetPolicy::AUTOMATIC,
1490 WaitableEvent server2_ready(false, false); 1512 base::WaitableEvent::InitialState::NOT_SIGNALED);
1513 WaitableEvent server2_ready(base::WaitableEvent::ResetPolicy::AUTOMATIC,
1514 base::WaitableEvent::InitialState::NOT_SIGNALED);
1491 1515
1492 WaitableEvent event0(false, false); 1516 WaitableEvent event0(base::WaitableEvent::ResetPolicy::AUTOMATIC,
1493 WaitableEvent event1(false, false); 1517 base::WaitableEvent::InitialState::NOT_SIGNALED);
1494 WaitableEvent event2(false, false); 1518 WaitableEvent event1(base::WaitableEvent::ResetPolicy::AUTOMATIC,
1495 WaitableEvent event3(false, false); 1519 base::WaitableEvent::InitialState::NOT_SIGNALED);
1520 WaitableEvent event2(base::WaitableEvent::ResetPolicy::AUTOMATIC,
1521 base::WaitableEvent::InitialState::NOT_SIGNALED);
1522 WaitableEvent event3(base::WaitableEvent::ResetPolicy::AUTOMATIC,
1523 base::WaitableEvent::InitialState::NOT_SIGNALED);
1496 WaitableEvent* events[4] = {&event0, &event1, &event2, &event3}; 1524 WaitableEvent* events[4] = {&event0, &event1, &event2, &event3};
1497 1525
1498 RestrictedDispatchDeadlockServer* server1; 1526 RestrictedDispatchDeadlockServer* server1;
1499 RestrictedDispatchDeadlockServer* server2; 1527 RestrictedDispatchDeadlockServer* server2;
1500 RestrictedDispatchDeadlockClient1* client1; 1528 RestrictedDispatchDeadlockClient1* client1;
1501 RestrictedDispatchDeadlockClient2* client2; 1529 RestrictedDispatchDeadlockClient2* client2;
1502 1530
1503 server2 = new RestrictedDispatchDeadlockServer(2, &server2_ready, events, 1531 server2 = new RestrictedDispatchDeadlockServer(2, &server2_ready, events,
1504 NULL); 1532 NULL);
1505 server2->OverrideThread(&worker_thread); 1533 server2->OverrideThread(&worker_thread);
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
1609 1637
1610 #if defined(OS_ANDROID) 1638 #if defined(OS_ANDROID)
1611 #define MAYBE_RestrictedDispatch4WayDeadlock \ 1639 #define MAYBE_RestrictedDispatch4WayDeadlock \
1612 DISABLED_RestrictedDispatch4WayDeadlock 1640 DISABLED_RestrictedDispatch4WayDeadlock
1613 #else 1641 #else
1614 #define MAYBE_RestrictedDispatch4WayDeadlock RestrictedDispatch4WayDeadlock 1642 #define MAYBE_RestrictedDispatch4WayDeadlock RestrictedDispatch4WayDeadlock
1615 #endif 1643 #endif
1616 TEST_F(IPCSyncChannelTest, MAYBE_RestrictedDispatch4WayDeadlock) { 1644 TEST_F(IPCSyncChannelTest, MAYBE_RestrictedDispatch4WayDeadlock) {
1617 int success = 0; 1645 int success = 0;
1618 std::vector<Worker*> workers; 1646 std::vector<Worker*> workers;
1619 WaitableEvent event0(true, false); 1647 WaitableEvent event0(base::WaitableEvent::ResetPolicy::MANUAL,
1620 WaitableEvent event1(true, false); 1648 base::WaitableEvent::InitialState::NOT_SIGNALED);
1621 WaitableEvent event2(true, false); 1649 WaitableEvent event1(base::WaitableEvent::ResetPolicy::MANUAL,
1622 WaitableEvent event3(true, false); 1650 base::WaitableEvent::InitialState::NOT_SIGNALED);
1651 WaitableEvent event2(base::WaitableEvent::ResetPolicy::MANUAL,
1652 base::WaitableEvent::InitialState::NOT_SIGNALED);
1653 WaitableEvent event3(base::WaitableEvent::ResetPolicy::MANUAL,
1654 base::WaitableEvent::InitialState::NOT_SIGNALED);
1623 workers.push_back(new RestrictedDispatchPipeWorker( 1655 workers.push_back(new RestrictedDispatchPipeWorker(
1624 "channel0", &event0, "channel1", &event1, 1, &success)); 1656 "channel0", &event0, "channel1", &event1, 1, &success));
1625 workers.push_back(new RestrictedDispatchPipeWorker( 1657 workers.push_back(new RestrictedDispatchPipeWorker(
1626 "channel1", &event1, "channel2", &event2, 2, NULL)); 1658 "channel1", &event1, "channel2", &event2, 2, NULL));
1627 workers.push_back(new RestrictedDispatchPipeWorker( 1659 workers.push_back(new RestrictedDispatchPipeWorker(
1628 "channel2", &event2, "channel3", &event3, 3, NULL)); 1660 "channel2", &event2, "channel3", &event3, 3, NULL));
1629 workers.push_back(new RestrictedDispatchPipeWorker( 1661 workers.push_back(new RestrictedDispatchPipeWorker(
1630 "channel3", &event3, "channel0", &event0, 4, NULL)); 1662 "channel3", &event3, "channel0", &event0, 4, NULL));
1631 RunTest(workers); 1663 RunTest(workers);
1632 EXPECT_EQ(3, success); 1664 EXPECT_EQ(3, success);
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1727 Send(new SyncChannelTestMsg_Reentrant2()); 1759 Send(new SyncChannelTestMsg_Reentrant2());
1728 Done(); 1760 Done();
1729 } 1761 }
1730 1762
1731 private: 1763 private:
1732 WaitableEvent* server_ready_; 1764 WaitableEvent* server_ready_;
1733 }; 1765 };
1734 1766
1735 TEST_F(IPCSyncChannelTest, ReentrantReply) { 1767 TEST_F(IPCSyncChannelTest, ReentrantReply) {
1736 std::vector<Worker*> workers; 1768 std::vector<Worker*> workers;
1737 WaitableEvent server_ready(false, false); 1769 WaitableEvent server_ready(base::WaitableEvent::ResetPolicy::AUTOMATIC,
1770 base::WaitableEvent::InitialState::NOT_SIGNALED);
1738 workers.push_back(new ReentrantReplyServer2()); 1771 workers.push_back(new ReentrantReplyServer2());
1739 workers.push_back(new ReentrantReplyServer1(&server_ready)); 1772 workers.push_back(new ReentrantReplyServer1(&server_ready));
1740 workers.push_back(new ReentrantReplyClient(&server_ready)); 1773 workers.push_back(new ReentrantReplyClient(&server_ready));
1741 RunTest(workers); 1774 RunTest(workers);
1742 } 1775 }
1743 1776
1744 //------------------------------------------------------------------------------ 1777 //------------------------------------------------------------------------------
1745 1778
1746 // Generate a validated channel ID using Channel::GenerateVerifiedChannelID(). 1779 // Generate a validated channel ID using Channel::GenerateVerifiedChannelID().
1747 1780
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1823 } 1856 }
1824 1857
1825 // Windows needs to send an out-of-band secret to verify the client end of the 1858 // Windows needs to send an out-of-band secret to verify the client end of the
1826 // channel. Test that we still connect correctly in that case. 1859 // channel. Test that we still connect correctly in that case.
1827 TEST_F(IPCSyncChannelTest, Verified) { 1860 TEST_F(IPCSyncChannelTest, Verified) {
1828 Verified(); 1861 Verified();
1829 } 1862 }
1830 1863
1831 } // namespace 1864 } // namespace
1832 } // namespace IPC 1865 } // namespace IPC
OLDNEW
« no previous file with comments | « ipc/ipc_sync_channel.cc ('k') | ipc/ipc_sync_message.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698