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

Side by Side Diff: ipc/ipc_channel_mojo_unittest.cc

Issue 2316963005: Reworks Channel pausing behavior (Closed)
Patch Set: Created 4 years, 3 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_channel_mojo.cc ('k') | ipc/ipc_channel_proxy.h » ('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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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_channel_mojo.h" 5 #include "ipc/ipc_channel_mojo.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <memory> 10 #include <memory>
(...skipping 721 matching lines...) Expand 10 before | Expand all | Expand 10 after
732 base::WaitableEvent::InitialState::NOT_SIGNALED) { 732 base::WaitableEvent::InitialState::NOT_SIGNALED) {
733 } 733 }
734 734
735 void CreateProxy(IPC::Listener* listener) { 735 void CreateProxy(IPC::Listener* listener) {
736 io_thread_.StartWithOptions( 736 io_thread_.StartWithOptions(
737 base::Thread::Options(base::MessageLoop::TYPE_IO, 0)); 737 base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
738 proxy_ = IPC::SyncChannel::Create( 738 proxy_ = IPC::SyncChannel::Create(
739 listener, io_thread_.task_runner(), &never_signaled_); 739 listener, io_thread_.task_runner(), &never_signaled_);
740 } 740 }
741 741
742 void RunProxy(bool create_paused) { 742 void RunProxy() {
743 std::unique_ptr<IPC::ChannelFactory> factory; 743 std::unique_ptr<IPC::ChannelFactory> factory;
744 if (for_server_) { 744 if (for_server_) {
745 factory = IPC::ChannelMojo::CreateServerFactory( 745 factory = IPC::ChannelMojo::CreateServerFactory(
746 std::move(handle_), io_thread_.task_runner()); 746 std::move(handle_), io_thread_.task_runner());
747 } else { 747 } else {
748 factory = IPC::ChannelMojo::CreateClientFactory( 748 factory = IPC::ChannelMojo::CreateClientFactory(
749 std::move(handle_), io_thread_.task_runner()); 749 std::move(handle_), io_thread_.task_runner());
750 } 750 }
751 proxy_->Init(std::move(factory), true, create_paused); 751 proxy_->Init(std::move(factory), true);
752 } 752 }
753 753
754 IPC::ChannelProxy* proxy() { return proxy_.get(); } 754 IPC::ChannelProxy* proxy() { return proxy_.get(); }
755 755
756 private: 756 private:
757 const bool for_server_; 757 const bool for_server_;
758 758
759 mojo::ScopedMessagePipeHandle handle_; 759 mojo::ScopedMessagePipeHandle handle_;
760 base::Thread io_thread_; 760 base::Thread io_thread_;
761 std::unique_ptr<IPC::ChannelProxy> proxy_; 761 std::unique_ptr<IPC::ChannelProxy> proxy_;
762 base::WaitableEvent never_signaled_; 762 base::WaitableEvent never_signaled_;
763 763
764 DISALLOW_COPY_AND_ASSIGN(ChannelProxyRunner); 764 DISALLOW_COPY_AND_ASSIGN(ChannelProxyRunner);
765 }; 765 };
766 766
767 class IPCChannelProxyMojoTest : public IPCChannelMojoTestBase { 767 class IPCChannelProxyMojoTest : public IPCChannelMojoTestBase {
768 public: 768 public:
769 void InitWithMojo(const std::string& client_name) { 769 void InitWithMojo(const std::string& client_name) {
770 IPCChannelMojoTestBase::InitWithMojo(client_name); 770 IPCChannelMojoTestBase::InitWithMojo(client_name);
771 runner_.reset(new ChannelProxyRunner(TakeHandle(), true)); 771 runner_.reset(new ChannelProxyRunner(TakeHandle(), true));
772 } 772 }
773 void CreateProxy(IPC::Listener* listener) { runner_->CreateProxy(listener); } 773 void CreateProxy(IPC::Listener* listener) { runner_->CreateProxy(listener); }
774 void RunProxy(bool create_paused = false) { 774 void RunProxy() {
775 runner_->RunProxy(create_paused); 775 runner_->RunProxy();
776 } 776 }
777 void DestroyProxy() { 777 void DestroyProxy() {
778 runner_.reset(); 778 runner_.reset();
779 base::RunLoop().RunUntilIdle(); 779 base::RunLoop().RunUntilIdle();
780 } 780 }
781 781
782 IPC::ChannelProxy* proxy() { return runner_->proxy(); } 782 IPC::ChannelProxy* proxy() { return runner_->proxy(); }
783 783
784 private: 784 private:
785 base::MessageLoop message_loop_; 785 base::MessageLoop message_loop_;
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
871 } 871 }
872 872
873 class ChannelProxyClient { 873 class ChannelProxyClient {
874 public: 874 public:
875 void Init(mojo::ScopedMessagePipeHandle handle) { 875 void Init(mojo::ScopedMessagePipeHandle handle) {
876 runner_.reset(new ChannelProxyRunner(std::move(handle), false)); 876 runner_.reset(new ChannelProxyRunner(std::move(handle), false));
877 } 877 }
878 878
879 void CreateProxy(IPC::Listener* listener) { runner_->CreateProxy(listener); } 879 void CreateProxy(IPC::Listener* listener) { runner_->CreateProxy(listener); }
880 880
881 void RunProxy() { runner_->RunProxy(false); } 881 void RunProxy() { runner_->RunProxy(); }
882 882
883 void DestroyProxy() { 883 void DestroyProxy() {
884 runner_.reset(); 884 runner_.reset();
885 base::RunLoop().RunUntilIdle(); 885 base::RunLoop().RunUntilIdle();
886 } 886 }
887 887
888 void RequestQuitAndWaitForAck(IPC::mojom::SimpleTestDriver* driver) { 888 void RequestQuitAndWaitForAck(IPC::mojom::SimpleTestDriver* driver) {
889 base::RunLoop loop; 889 base::RunLoop loop;
890 driver->RequestQuit(loop.QuitClosure()); 890 driver->RequestQuit(loop.QuitClosure());
891 loop.Run(); 891 loop.Run();
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
1245 client_impl.WaitForValueRequest(); 1245 client_impl.WaitForValueRequest();
1246 1246
1247 // Wait for the test driver to perform a classical sync IPC request, with our 1247 // Wait for the test driver to perform a classical sync IPC request, with our
1248 // own sync associated interface message nested inside. 1248 // own sync associated interface message nested inside.
1249 client_impl.UseSyncSenderForRequest(false); 1249 client_impl.UseSyncSenderForRequest(false);
1250 client_impl.WaitForValueRequest(); 1250 client_impl.WaitForValueRequest();
1251 1251
1252 DestroyProxy(); 1252 DestroyProxy();
1253 } 1253 }
1254 1254
1255 TEST_F(IPCChannelProxyMojoTest, CreatePaused) { 1255 TEST_F(IPCChannelProxyMojoTest, Pause) {
1256 // Ensures that creating a paused channel elicits the expected behavior when 1256 // Ensures that pausing a channel elicits the expected behavior when sending
1257 // sending messages, unpausing, sending more messages, and then manually 1257 // messages, unpausing, sending more messages, and then manually flushing.
1258 // flushing. Specifically a sequence like: 1258 // Specifically a sequence like:
1259 // 1259 //
1260 // Connect() 1260 // Connect()
1261 // Send(A) 1261 // Send(A)
1262 // Pause()
1262 // Send(B) 1263 // Send(B)
1264 // Send(C)
1263 // Unpause(false) 1265 // Unpause(false)
1264 // Send(C) 1266 // Send(D)
1267 // Send(E)
1265 // Flush() 1268 // Flush()
1266 // 1269 //
1267 // must result in the other end receiving messages C, A, and then B, in that 1270 // must result in the other end receiving messages A, D, E, B, D; in that
1268 // order. 1271 // order.
1269 // 1272 //
1270 // This behavior is required by some consumers of IPC::Channel, and it is not 1273 // This behavior is required by some consumers of IPC::Channel, and it is not
1271 // sufficient to leave this up to the consumer to implement since associated 1274 // sufficient to leave this up to the consumer to implement since associated
1272 // interface requests and messages also need to be queued according to the 1275 // interface requests and messages also need to be queued according to the
1273 // same policy. 1276 // same policy.
1274 InitWithMojo("CreatePausedClient"); 1277 InitWithMojo("CreatePausedClient");
1275 1278
1276 DummyListener listener; 1279 DummyListener listener;
1277 CreateProxy(&listener); 1280 CreateProxy(&listener);
1278 RunProxy(true /* create_paused */); 1281 RunProxy();
1282
1283 // This message must be sent immediately since the channel is unpaused.
1284 SendValue(proxy(), 1);
1285
1286 proxy()->Pause();
1279 1287
1280 // These messages must be queued internally since the channel is paused. 1288 // These messages must be queued internally since the channel is paused.
1281 SendValue(proxy(), 1);
1282 SendValue(proxy(), 2); 1289 SendValue(proxy(), 2);
1290 SendValue(proxy(), 3);
1283 1291
1284 proxy()->Unpause(false /* flush */); 1292 proxy()->Unpause(false /* flush */);
1285 1293
1286 // These messages must be sent immediately since the channel is unpaused. 1294 // These messages must be sent immediately since the channel is unpaused.
1287 SendValue(proxy(), 3);
1288 SendValue(proxy(), 4); 1295 SendValue(proxy(), 4);
1296 SendValue(proxy(), 5);
1289 1297
1290 // Now we flush the previously queued messages. 1298 // Now we flush the previously queued messages.
1291 proxy()->Flush(); 1299 proxy()->Flush();
1292 1300
1293 EXPECT_TRUE(WaitForClientShutdown()); 1301 EXPECT_TRUE(WaitForClientShutdown());
1294 DestroyProxy(); 1302 DestroyProxy();
1295 } 1303 }
1296 1304
1297 class ExpectValueSequenceListener : public IPC::Listener { 1305 class ExpectValueSequenceListener : public IPC::Listener {
1298 public: 1306 public:
(...skipping 17 matching lines...) Expand all
1316 private: 1324 private:
1317 std::queue<int32_t>* expected_values_; 1325 std::queue<int32_t>* expected_values_;
1318 1326
1319 DISALLOW_COPY_AND_ASSIGN(ExpectValueSequenceListener); 1327 DISALLOW_COPY_AND_ASSIGN(ExpectValueSequenceListener);
1320 }; 1328 };
1321 1329
1322 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(CreatePausedClient, ChannelProxyClient) { 1330 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(CreatePausedClient, ChannelProxyClient) {
1323 std::queue<int32_t> expected_values; 1331 std::queue<int32_t> expected_values;
1324 ExpectValueSequenceListener listener(&expected_values); 1332 ExpectValueSequenceListener listener(&expected_values);
1325 CreateProxy(&listener); 1333 CreateProxy(&listener);
1334 expected_values.push(1);
1335 expected_values.push(4);
1336 expected_values.push(5);
1337 expected_values.push(2);
1326 expected_values.push(3); 1338 expected_values.push(3);
1327 expected_values.push(4);
1328 expected_values.push(1);
1329 expected_values.push(2);
1330 RunProxy(); 1339 RunProxy();
1331 base::RunLoop().Run(); 1340 base::RunLoop().Run();
1332 EXPECT_TRUE(expected_values.empty()); 1341 EXPECT_TRUE(expected_values.empty());
1333 DestroyProxy(); 1342 DestroyProxy();
1334 } 1343 }
1335 1344
1336 #if defined(OS_POSIX) 1345 #if defined(OS_POSIX)
1337 1346
1338 class ListenerThatExpectsFile : public IPC::Listener { 1347 class ListenerThatExpectsFile : public IPC::Listener {
1339 public: 1348 public:
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
1488 Connect(&listener); 1497 Connect(&listener);
1489 1498
1490 base::RunLoop().Run(); 1499 base::RunLoop().Run();
1491 1500
1492 Close(); 1501 Close();
1493 } 1502 }
1494 1503
1495 #endif // OS_LINUX 1504 #endif // OS_LINUX
1496 1505
1497 } // namespace 1506 } // namespace
OLDNEW
« no previous file with comments | « ipc/ipc_channel_mojo.cc ('k') | ipc/ipc_channel_proxy.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698