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

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

Issue 2283543002: Add support for dispatch contexts on BindingSet (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 | « mojo/public/cpp/bindings/tests/BUILD.gn ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <memory>
6 #include <utility>
7
8 #include "base/message_loop/message_loop.h"
9 #include "base/run_loop.h"
10 #include "mojo/public/cpp/bindings/associated_binding_set.h"
11 #include "mojo/public/cpp/bindings/binding_set.h"
12 #include "mojo/public/interfaces/bindings/tests/ping_service.mojom.h"
13 #include "mojo/public/interfaces/bindings/tests/test_associated_interfaces.mojom .h"
14 #include "testing/gtest/include/gtest/gtest.h"
15
16 namespace mojo {
17 namespace test {
18 namespace {
19
20 class BindingSetTest : public testing::Test {
21 public:
22 BindingSetTest() {}
23 ~BindingSetTest() override {}
24
25 base::MessageLoop& loop() { return loop_; }
26
27 private:
28 base::MessageLoop loop_;
29
30 DISALLOW_COPY_AND_ASSIGN(BindingSetTest);
31 };
32
33 template <typename BindingSetType>
34 void ExpectContextHelper(BindingSetType* binding_set, void* expected_context) {
35 EXPECT_EQ(expected_context, binding_set->dispatch_context());
36 }
37
38 template <typename BindingSetType>
39 base::Closure ExpectContext(BindingSetType* binding_set,
40 void* expected_context) {
41 return base::Bind(
42 &ExpectContextHelper<BindingSetType>, binding_set, expected_context);
43 }
44
45 base::Closure Sequence(const base::Closure& first,
46 const base::Closure& second) {
47 return base::Bind(
48 [] (const base::Closure& first, const base::Closure& second) {
49 first.Run();
50 second.Run();
51 }, first, second);
52 }
53
54 class PingImpl : public PingService {
55 public:
56 PingImpl() {}
57 ~PingImpl() override {}
58
59 void set_ping_handler(const base::Closure& handler) {
60 ping_handler_ = handler;
61 }
62
63 private:
64 // PingService:
65 void Ping(const PingCallback& callback) override {
66 if (!ping_handler_.is_null())
67 ping_handler_.Run();
68 callback.Run();
69 }
70
71 base::Closure ping_handler_;
72 };
73
74 TEST_F(BindingSetTest, BindingSetContext) {
75 PingImpl impl;
76
77 void* context_a = reinterpret_cast<void*>(1);
78 void* context_b = reinterpret_cast<void*>(2);
79
80 BindingSet<PingService> bindings_(BindingSetDispatchMode::WITH_CONTEXT);
81 PingServicePtr ping_a, ping_b;
82 bindings_.AddBinding(&impl, GetProxy(&ping_a), context_a);
83 bindings_.AddBinding(&impl, GetProxy(&ping_b), context_b);
84
85 {
86 impl.set_ping_handler(ExpectContext(&bindings_, context_a));
87 base::RunLoop loop;
88 ping_a->Ping(loop.QuitClosure());
89 loop.Run();
90 }
91
92 {
93 impl.set_ping_handler(ExpectContext(&bindings_, context_b));
94 base::RunLoop loop;
95 ping_b->Ping(loop.QuitClosure());
96 loop.Run();
97 }
98
99 {
100 base::RunLoop loop;
101 bindings_.set_connection_error_handler(
102 Sequence(ExpectContext(&bindings_, context_a), loop.QuitClosure()));
103 ping_a.reset();
104 loop.Run();
105 }
106
107 {
108 base::RunLoop loop;
109 bindings_.set_connection_error_handler(
110 Sequence(ExpectContext(&bindings_, context_b), loop.QuitClosure()));
111 ping_b.reset();
112 loop.Run();
113 }
114
115 EXPECT_TRUE(bindings_.empty());
116 }
117
118 class PingProviderImpl : public AssociatedPingProvider, public PingService {
119 public:
120 PingProviderImpl() : ping_bindings_(BindingSetDispatchMode::WITH_CONTEXT) {}
121 ~PingProviderImpl() override {}
122
123 void set_new_ping_context(void* context) { new_ping_context_ = context; }
124
125 void set_new_ping_handler(const base::Closure& handler) {
126 new_ping_handler_ = handler;
127 }
128
129 void set_ping_handler(const base::Closure& handler) {
130 ping_handler_ = handler;
131 }
132
133 AssociatedBindingSet<PingService>& ping_bindings() { return ping_bindings_; }
134
135 private:
136 // AssociatedPingProvider:
137 void GetPing(PingServiceAssociatedRequest request) override {
138 ping_bindings_.AddBinding(this, std::move(request), new_ping_context_);
139 if (!new_ping_handler_.is_null())
140 new_ping_handler_.Run();
141 }
142
143 // PingService:
144 void Ping(const PingCallback& callback) override {
145 if (!ping_handler_.is_null())
146 ping_handler_.Run();
147 callback.Run();
148 }
149
150 AssociatedBindingSet<PingService> ping_bindings_;
151 void* new_ping_context_ = nullptr;
152 base::Closure ping_handler_;
153 base::Closure new_ping_handler_;
154 };
155
156 TEST_F(BindingSetTest, AssociatedBindingSetContext) {
157 AssociatedPingProviderPtr provider;
158 PingProviderImpl impl;
159 Binding<AssociatedPingProvider> binding(&impl, GetProxy(&provider));
160
161 void* context_a = reinterpret_cast<void*>(1);
162 void* context_b = reinterpret_cast<void*>(2);
163
164 PingServiceAssociatedPtr ping_a;
165 {
166 base::RunLoop loop;
167 impl.set_new_ping_context(context_a);
168 impl.set_new_ping_handler(loop.QuitClosure());
169 provider->GetPing(GetProxy(&ping_a, provider.associated_group()));
170 loop.Run();
171 }
172
173 PingServiceAssociatedPtr ping_b;
174 {
175 base::RunLoop loop;
176 impl.set_new_ping_context(context_b);
177 impl.set_new_ping_handler(loop.QuitClosure());
178 provider->GetPing(GetProxy(&ping_b, provider.associated_group()));
179 loop.Run();
180 }
181
182 {
183 impl.set_ping_handler(ExpectContext(&impl.ping_bindings(), context_a));
184 base::RunLoop loop;
185 ping_a->Ping(loop.QuitClosure());
186 loop.Run();
187 }
188
189 {
190 impl.set_ping_handler(ExpectContext(&impl.ping_bindings(), context_b));
191 base::RunLoop loop;
192 ping_b->Ping(loop.QuitClosure());
193 loop.Run();
194 }
195
196 {
197 base::RunLoop loop;
198 impl.ping_bindings().set_connection_error_handler(
199 Sequence(ExpectContext(&impl.ping_bindings(), context_a),
200 loop.QuitClosure()));
201 ping_a.reset();
202 loop.Run();
203 }
204
205 {
206 base::RunLoop loop;
207 impl.ping_bindings().set_connection_error_handler(
208 Sequence(ExpectContext(&impl.ping_bindings(), context_b),
209 loop.QuitClosure()));
210 ping_b.reset();
211 loop.Run();
212 }
213
214 EXPECT_TRUE(impl.ping_bindings().empty());
215 }
216
217 TEST_F(BindingSetTest, MasterInterfaceBindingSetContext) {
218 AssociatedPingProviderPtr provider_a, provider_b;
219 PingProviderImpl impl;
220 BindingSet<AssociatedPingProvider> bindings(
221 BindingSetDispatchMode::WITH_CONTEXT);
222
223 void* context_a = reinterpret_cast<void*>(1);
224 void* context_b = reinterpret_cast<void*>(2);
225
226 bindings.AddBinding(&impl, GetProxy(&provider_a), context_a);
227 bindings.AddBinding(&impl, GetProxy(&provider_b), context_b);
228
229 {
230 PingServiceAssociatedPtr ping;
231 base::RunLoop loop;
232 impl.set_new_ping_handler(
233 Sequence(ExpectContext(&bindings, context_a), loop.QuitClosure()));
234 provider_a->GetPing(GetProxy(&ping, provider_a.associated_group()));
235 loop.Run();
236 }
237
238 {
239 PingServiceAssociatedPtr ping;
240 base::RunLoop loop;
241 impl.set_new_ping_handler(
242 Sequence(ExpectContext(&bindings, context_b), loop.QuitClosure()));
243 provider_b->GetPing(GetProxy(&ping, provider_b.associated_group()));
244 loop.Run();
245 }
246
247 {
248 base::RunLoop loop;
249 bindings.set_connection_error_handler(
250 Sequence(ExpectContext(&bindings, context_a), loop.QuitClosure()));
251 provider_a.reset();
252 loop.Run();
253 }
254
255 {
256 base::RunLoop loop;
257 bindings.set_connection_error_handler(
258 Sequence(ExpectContext(&bindings, context_b), loop.QuitClosure()));
259 provider_b.reset();
260 loop.Run();
261 }
262
263 EXPECT_TRUE(bindings.empty());
264 }
265
266 } // namespace
267 } // namespace test
268 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/public/cpp/bindings/tests/BUILD.gn ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698