OLD | NEW |
(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 |
OLD | NEW |