| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 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 | 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 "mojo/public/cpp/application/service_provider_impl.h" | 5 #include "mojo/public/cpp/application/service_provider_impl.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "mojo/public/cpp/application/connect.h" | 9 #include "mojo/public/cpp/application/connect.h" |
| 10 #include "mojo/public/cpp/bindings/strong_binding.h" | 10 #include "mojo/public/cpp/bindings/strong_binding.h" |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 const char kConnectionUrl[] = "https://example.com/me.mojo"; | 58 const char kConnectionUrl[] = "https://example.com/me.mojo"; |
| 59 | 59 |
| 60 const char kPing1[] = "Ping1"; | 60 const char kPing1[] = "Ping1"; |
| 61 const char kPing2[] = "Ping2"; | 61 const char kPing2[] = "Ping2"; |
| 62 const char kPing3[] = "Ping3"; | 62 const char kPing3[] = "Ping3"; |
| 63 | 63 |
| 64 ServiceProviderPtr sp; | 64 ServiceProviderPtr sp; |
| 65 ServiceProviderImpl impl(ConnectionContext(ConnectionContext::Type::INCOMING, | 65 ServiceProviderImpl impl(ConnectionContext(ConnectionContext::Type::INCOMING, |
| 66 kRemoteUrl, kConnectionUrl), | 66 kRemoteUrl, kConnectionUrl), |
| 67 GetProxy(&sp)); | 67 GetProxy(&sp)); |
| 68 EXPECT_EQ(ConnectionContext::Type::INCOMING, impl.connection_context().type); |
| 69 EXPECT_EQ(kRemoteUrl, impl.connection_context().remote_url); |
| 70 EXPECT_EQ(kConnectionUrl, impl.connection_context().connection_url); |
| 68 | 71 |
| 69 impl.AddServiceNew<test::PingService>( | 72 impl.AddService<test::PingService>( |
| 70 [&kRemoteUrl, &kConnectionUrl]( | 73 [&kRemoteUrl, &kConnectionUrl]( |
| 71 const ConnectionContext& connection_context, | 74 const ConnectionContext& connection_context, |
| 72 InterfaceRequest<test::PingService> ping_service_request) { | 75 InterfaceRequest<test::PingService> ping_service_request) { |
| 73 EXPECT_EQ(ConnectionContext::Type::INCOMING, connection_context.type); | 76 EXPECT_EQ(ConnectionContext::Type::INCOMING, connection_context.type); |
| 74 EXPECT_EQ(kRemoteUrl, connection_context.remote_url); | 77 EXPECT_EQ(kRemoteUrl, connection_context.remote_url); |
| 75 EXPECT_EQ(kConnectionUrl, connection_context.connection_url); | 78 EXPECT_EQ(kConnectionUrl, connection_context.connection_url); |
| 76 new PingServiceImpl(std::move(ping_service_request)); | 79 new PingServiceImpl(std::move(ping_service_request)); |
| 77 }, | 80 }, |
| 78 kPing1); | 81 kPing1); |
| 79 | 82 |
| 80 impl.AddServiceNew<test::PingService>( | 83 impl.AddService<test::PingService>( |
| 81 [&kRemoteUrl, &kConnectionUrl]( | 84 [&kRemoteUrl, &kConnectionUrl]( |
| 82 const ConnectionContext& connection_context, | 85 const ConnectionContext& connection_context, |
| 83 InterfaceRequest<test::PingService> ping_service_request) { | 86 InterfaceRequest<test::PingService> ping_service_request) { |
| 84 EXPECT_EQ(ConnectionContext::Type::INCOMING, connection_context.type); | 87 EXPECT_EQ(ConnectionContext::Type::INCOMING, connection_context.type); |
| 85 EXPECT_EQ(kRemoteUrl, connection_context.remote_url); | 88 EXPECT_EQ(kRemoteUrl, connection_context.remote_url); |
| 86 EXPECT_EQ(kConnectionUrl, connection_context.connection_url); | 89 EXPECT_EQ(kConnectionUrl, connection_context.connection_url); |
| 87 new PingServiceImpl(std::move(ping_service_request)); | 90 new PingServiceImpl(std::move(ping_service_request)); |
| 88 }, | 91 }, |
| 89 kPing2); | 92 kPing2); |
| 90 | 93 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 109 // "Ping3" isn't actually registered! | 112 // "Ping3" isn't actually registered! |
| 110 { | 113 { |
| 111 test::PingServicePtr ping3; | 114 test::PingServicePtr ping3; |
| 112 ConnectToService(sp.get(), GetProxy(&ping3), kPing3); | 115 ConnectToService(sp.get(), GetProxy(&ping3), kPing3); |
| 113 ping3.set_connection_error_handler([this] { QuitLoop(true); }); | 116 ping3.set_connection_error_handler([this] { QuitLoop(true); }); |
| 114 ping3->Ping([this] { QuitLoop(false); }); | 117 ping3->Ping([this] { QuitLoop(false); }); |
| 115 loop().Run(); | 118 loop().Run(); |
| 116 } | 119 } |
| 117 loop().RunUntilIdle(); // Run stuff caused by destructors. | 120 loop().RunUntilIdle(); // Run stuff caused by destructors. |
| 118 | 121 |
| 122 impl.RemoveService<test::PingService>(kPing2); |
| 123 |
| 124 // "Ping2" should no longer work. |
| 125 { |
| 126 test::PingServicePtr ping2; |
| 127 ConnectToService(sp.get(), GetProxy(&ping2), kPing2); |
| 128 ping2.set_connection_error_handler([this] { QuitLoop(true); }); |
| 129 ping2->Ping([this] { QuitLoop(false); }); |
| 130 loop().Run(); |
| 131 } |
| 132 loop().RunUntilIdle(); // Run stuff caused by destructors. |
| 133 |
| 134 // But "Ping1" should still work. |
| 135 { |
| 136 test::PingServicePtr ping1; |
| 137 ConnectToService(sp.get(), GetProxy(&ping1), kPing1); |
| 138 ping1.set_connection_error_handler([this] { QuitLoop(false); }); |
| 139 ping1->Ping([this] { QuitLoop(true); }); |
| 140 loop().Run(); |
| 141 } |
| 142 loop().RunUntilIdle(); // Run stuff caused by destructors. |
| 143 |
| 144 impl.RemoveServiceForName(kPing1); |
| 145 |
| 146 // "Ping1" should no longer work. |
| 147 { |
| 148 test::PingServicePtr ping1; |
| 149 ConnectToService(sp.get(), GetProxy(&ping1), kPing1); |
| 150 ping1.set_connection_error_handler([this] { QuitLoop(true); }); |
| 151 ping1->Ping([this] { QuitLoop(false); }); |
| 152 loop().Run(); |
| 153 } |
| 154 loop().RunUntilIdle(); // Run stuff caused by destructors. |
| 155 |
| 119 sp.reset(); | 156 sp.reset(); |
| 120 loop().RunUntilIdle(); | 157 loop().RunUntilIdle(); |
| 121 } | 158 } |
| 122 | 159 |
| 123 TEST_F(ServiceProviderImplTest, CloseAndRebind) { | 160 TEST_F(ServiceProviderImplTest, CloseAndRebind) { |
| 124 const char kRemoteUrl1[] = "https://example.com/remote1.mojo"; | 161 const char kRemoteUrl1[] = "https://example.com/remote1.mojo"; |
| 125 const char kRemoteUrl2[] = "https://example.com/remote2.mojo"; | 162 const char kRemoteUrl2[] = "https://example.com/remote2.mojo"; |
| 126 const char kConnectionUrl[] = "https://example.com/me.mojo"; | 163 const char kConnectionUrl[] = "https://example.com/me.mojo"; |
| 127 const char kPing[] = "Ping"; | 164 const char kPing[] = "Ping"; |
| 128 | 165 |
| 129 ServiceProviderPtr sp1; | 166 ServiceProviderPtr sp1; |
| 130 ServiceProviderImpl impl(ConnectionContext(ConnectionContext::Type::INCOMING, | 167 ServiceProviderImpl impl(ConnectionContext(ConnectionContext::Type::INCOMING, |
| 131 kRemoteUrl1, kConnectionUrl), | 168 kRemoteUrl1, kConnectionUrl), |
| 132 GetProxy(&sp1)); | 169 GetProxy(&sp1)); |
| 170 EXPECT_EQ(ConnectionContext::Type::INCOMING, impl.connection_context().type); |
| 171 EXPECT_EQ(kRemoteUrl1, impl.connection_context().remote_url); |
| 172 EXPECT_EQ(kConnectionUrl, impl.connection_context().connection_url); |
| 133 | 173 |
| 134 impl.AddServiceNew<test::PingService>( | 174 impl.AddService<test::PingService>( |
| 135 [&kRemoteUrl1, &kRemoteUrl2, &kConnectionUrl]( | 175 [&kRemoteUrl1, &kRemoteUrl2, &kConnectionUrl]( |
| 136 const ConnectionContext& connection_context, | 176 const ConnectionContext& connection_context, |
| 137 InterfaceRequest<test::PingService> ping_service_request) { | 177 InterfaceRequest<test::PingService> ping_service_request) { |
| 138 EXPECT_EQ(ConnectionContext::Type::INCOMING, connection_context.type); | 178 EXPECT_EQ(ConnectionContext::Type::INCOMING, connection_context.type); |
| 139 EXPECT_TRUE(connection_context.remote_url == kRemoteUrl1 || | 179 EXPECT_TRUE(connection_context.remote_url == kRemoteUrl1 || |
| 140 connection_context.remote_url == kRemoteUrl2); | 180 connection_context.remote_url == kRemoteUrl2); |
| 141 EXPECT_EQ(kConnectionUrl, connection_context.connection_url); | 181 EXPECT_EQ(kConnectionUrl, connection_context.connection_url); |
| 142 new PingServiceImpl(std::move(ping_service_request)); | 182 new PingServiceImpl(std::move(ping_service_request)); |
| 143 }, | 183 }, |
| 144 kPing); | 184 kPing); |
| 145 | 185 |
| 146 { | 186 { |
| 147 test::PingServicePtr ping; | 187 test::PingServicePtr ping; |
| 148 ConnectToService(sp1.get(), GetProxy(&ping), kPing); | 188 ConnectToService(sp1.get(), GetProxy(&ping), kPing); |
| 149 ping.set_connection_error_handler([this] { QuitLoop(false); }); | 189 ping.set_connection_error_handler([this] { QuitLoop(false); }); |
| 150 ping->Ping([this] { QuitLoop(true); }); | 190 ping->Ping([this] { QuitLoop(true); }); |
| 151 loop().Run(); | 191 loop().Run(); |
| 152 } | 192 } |
| 153 loop().RunUntilIdle(); // Run stuff caused by destructors. | 193 loop().RunUntilIdle(); // Run stuff caused by destructors. |
| 154 | 194 |
| 155 impl.Close(); | 195 impl.Close(); |
| 196 EXPECT_EQ(ConnectionContext::Type::UNKNOWN, impl.connection_context().type); |
| 197 EXPECT_EQ(std::string(), impl.connection_context().remote_url); |
| 198 EXPECT_EQ(std::string(), impl.connection_context().connection_url); |
| 156 sp1.reset(); | 199 sp1.reset(); |
| 157 loop().RunUntilIdle(); | 200 loop().RunUntilIdle(); |
| 158 | 201 |
| 159 ServiceProviderPtr sp2; | 202 ServiceProviderPtr sp2; |
| 160 impl.Bind(ConnectionContext(ConnectionContext::Type::INCOMING, kRemoteUrl2, | 203 impl.Bind(ConnectionContext(ConnectionContext::Type::INCOMING, kRemoteUrl2, |
| 161 kConnectionUrl), | 204 kConnectionUrl), |
| 162 GetProxy(&sp2)); | 205 GetProxy(&sp2)); |
| 206 EXPECT_EQ(ConnectionContext::Type::INCOMING, impl.connection_context().type); |
| 207 EXPECT_EQ(kRemoteUrl2, impl.connection_context().remote_url); |
| 208 EXPECT_EQ(kConnectionUrl, impl.connection_context().connection_url); |
| 163 | 209 |
| 164 { | 210 { |
| 165 test::PingServicePtr ping; | 211 test::PingServicePtr ping; |
| 166 ConnectToService(sp2.get(), GetProxy(&ping), kPing); | 212 ConnectToService(sp2.get(), GetProxy(&ping), kPing); |
| 167 ping.set_connection_error_handler([this] { QuitLoop(false); }); | 213 ping.set_connection_error_handler([this] { QuitLoop(false); }); |
| 168 ping->Ping([this] { QuitLoop(true); }); | 214 ping->Ping([this] { QuitLoop(true); }); |
| 169 loop().Run(); | 215 loop().Run(); |
| 170 } | 216 } |
| 171 loop().RunUntilIdle(); // Run stuff caused by destructors. | 217 loop().RunUntilIdle(); // Run stuff caused by destructors. |
| 172 | 218 |
| 173 // Can close multiple times. | 219 // Can close multiple times. |
| 174 impl.Close(); | 220 impl.Close(); |
| 175 impl.Close(); | 221 impl.Close(); |
| 176 sp2.reset(); | 222 sp2.reset(); |
| 177 loop().RunUntilIdle(); | 223 loop().RunUntilIdle(); |
| 178 } | 224 } |
| 179 | 225 |
| 180 TEST_F(ServiceProviderImplTest, Bind) { | 226 TEST_F(ServiceProviderImplTest, Bind) { |
| 181 const char kRemoteUrl[] = "https://example.com/remote.mojo"; | 227 const char kRemoteUrl[] = "https://example.com/remote.mojo"; |
| 182 const char kConnectionUrl[] = "https://example.com/me.mojo"; | 228 const char kConnectionUrl[] = "https://example.com/me.mojo"; |
| 183 const char kPing[] = "Ping"; | 229 const char kPing[] = "Ping"; |
| 184 | 230 |
| 185 ServiceProviderPtr sp; | 231 ServiceProviderPtr sp; |
| 186 ServiceProviderImpl impl; | 232 ServiceProviderImpl impl; |
| 233 EXPECT_EQ(ConnectionContext::Type::UNKNOWN, impl.connection_context().type); |
| 234 EXPECT_EQ(std::string(), impl.connection_context().remote_url); |
| 235 EXPECT_EQ(std::string(), impl.connection_context().connection_url); |
| 187 | 236 |
| 188 impl.Bind(ConnectionContext(ConnectionContext::Type::INCOMING, kRemoteUrl, | 237 impl.Bind(ConnectionContext(ConnectionContext::Type::INCOMING, kRemoteUrl, |
| 189 kConnectionUrl), | 238 kConnectionUrl), |
| 190 GetProxy(&sp)); | 239 GetProxy(&sp)); |
| 191 | 240 |
| 192 impl.AddServiceNew<test::PingService>( | 241 impl.AddService<test::PingService>( |
| 193 [&kRemoteUrl, &kConnectionUrl]( | 242 [&kRemoteUrl, &kConnectionUrl]( |
| 194 const ConnectionContext& connection_context, | 243 const ConnectionContext& connection_context, |
| 195 InterfaceRequest<test::PingService> request) { | 244 InterfaceRequest<test::PingService> request) { |
| 196 EXPECT_EQ(ConnectionContext::Type::INCOMING, connection_context.type); | 245 EXPECT_EQ(ConnectionContext::Type::INCOMING, connection_context.type); |
| 197 EXPECT_EQ(kRemoteUrl, connection_context.remote_url); | 246 EXPECT_EQ(kRemoteUrl, connection_context.remote_url); |
| 198 EXPECT_EQ(kConnectionUrl, connection_context.connection_url); | 247 EXPECT_EQ(kConnectionUrl, connection_context.connection_url); |
| 199 new PingServiceImpl(std::move(request)); | 248 new PingServiceImpl(std::move(request)); |
| 200 }, | 249 }, |
| 201 kPing); | 250 kPing); |
| 202 | 251 |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 loop().Run(); | 331 loop().Run(); |
| 283 } | 332 } |
| 284 loop().RunUntilIdle(); // Run stuff caused by destructors. | 333 loop().RunUntilIdle(); // Run stuff caused by destructors. |
| 285 | 334 |
| 286 sp.reset(); | 335 sp.reset(); |
| 287 loop().RunUntilIdle(); | 336 loop().RunUntilIdle(); |
| 288 | 337 |
| 289 EXPECT_FALSE(was_run); | 338 EXPECT_FALSE(was_run); |
| 290 } | 339 } |
| 291 | 340 |
| 341 // TODO(vtl): Explicitly test |AddServiceForName()|? |
| 342 |
| 292 } // namespace | 343 } // namespace |
| 293 } // namespace mojo | 344 } // namespace mojo |
| OLD | NEW |