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

Side by Side Diff: mojo/public/cpp/bindings/tests/associated_interface_unittest.cc

Issue 2522333002: Provide a Mojo equivalent of ThreadSafeSender. (Closed)
Patch Set: Addresses @tsepez comment Created 4 years 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_proxy.h ('k') | mojo/public/cpp/bindings/tests/interface_ptr_unittest.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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 #include <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 1032 matching lines...) Expand 10 before | Expand all | Expand 10 after
1043 base::PlatformThread::CurrentId())); 1043 base::PlatformThread::CurrentId()));
1044 }, 1044 },
1045 base::SequencedTaskRunnerHandle::Get(), run_loop.QuitClosure(), 1045 base::SequencedTaskRunnerHandle::Get(), run_loop.QuitClosure(),
1046 thread_safe_sender); 1046 thread_safe_sender);
1047 other_thread.message_loop()->task_runner()->PostTask(FROM_HERE, run_method); 1047 other_thread.message_loop()->task_runner()->PostTask(FROM_HERE, run_method);
1048 1048
1049 // Block until the method callback is called on the background thread. 1049 // Block until the method callback is called on the background thread.
1050 run_loop.Run(); 1050 run_loop.Run();
1051 } 1051 }
1052 1052
1053 struct ForwarderTestContext {
1054 IntegerSenderConnectionPtr connection_ptr;
1055 std::unique_ptr<IntegerSenderConnectionImpl> interface_impl;
1056 };
1057
1058 TEST_F(AssociatedInterfaceTest, BindLaterThreadSafeAssociatedInterfacePtr) {
1059 // Create a ThreadSafeAssociatedPtr that we'll bind from a different thread.
1060 scoped_refptr<ThreadSafeIntegerSenderAssociatedPtr> thread_safe_ptr =
1061 ThreadSafeIntegerSenderAssociatedPtr::CreateUnbound();
1062
1063 // Start the thread from where we'll bind the interface pointer.
1064 base::Thread other_thread("service test thread");
1065 other_thread.Start();
1066 const scoped_refptr<base::SingleThreadTaskRunner>& other_thread_task_runner =
1067 other_thread.message_loop()->task_runner();
1068 ForwarderTestContext* context = new ForwarderTestContext();
1069 {
1070 base::RunLoop run_loop;
1071 auto run_method = base::Bind(
1072 [](const scoped_refptr<base::TaskRunner>& main_task_runner,
1073 const base::Closure& quit_closure,
1074 const scoped_refptr<ThreadSafeIntegerSenderAssociatedPtr>&
1075 thread_safe_ptr,
1076 ForwarderTestContext* context) {
1077 // We are on the background thread, create the interface ptr.
1078 context->interface_impl =
1079 base::MakeUnique<IntegerSenderConnectionImpl>(
1080 GetProxy(&(context->connection_ptr)));
1081 IntegerSenderAssociatedPtr sender;
1082 context->connection_ptr->GetSender(
1083 GetProxy(&sender, context->connection_ptr.associated_group()));
1084 thread_safe_ptr->Bind(std::move(sender));
1085 main_task_runner->PostTask(FROM_HERE, quit_closure);
1086 },
1087 base::SequencedTaskRunnerHandle::Get(), run_loop.QuitClosure(),
1088 thread_safe_ptr, context);
1089
1090 other_thread_task_runner->PostTask(FROM_HERE, run_method);
1091 // Block until the associated pointer is bound.
1092 run_loop.Run();
1093 }
1094
1095 {
1096 // Now we can call methods on the interface from the main thread.
1097 auto echo_callback =
1098 base::Bind([](const base::Closure& quit_closure, int32_t result) {
1099 EXPECT_EQ(123, result);
1100 quit_closure.Run();
1101 });
1102 base::RunLoop run_loop;
1103 (*thread_safe_ptr)
1104 ->Echo(123, base::Bind(echo_callback, run_loop.QuitClosure()));
1105 // Block until the method callback is called.
1106 run_loop.Run();
1107 }
1108
1109 other_thread_task_runner->DeleteSoon(FROM_HERE, context);
1110
1111 // Reset the pointer now so the InterfacePtr associated resources can be
1112 // deleted before the background thread's message loop is invalidated.
1113 thread_safe_ptr = nullptr;
1114 }
1115
1053 } // namespace 1116 } // namespace
1054 } // namespace test 1117 } // namespace test
1055 } // namespace mojo 1118 } // namespace mojo
OLDNEW
« no previous file with comments | « ipc/ipc_channel_proxy.h ('k') | mojo/public/cpp/bindings/tests/interface_ptr_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698