Index: mojo/public/cpp/application/tests/service_provider_impl_unittest.cc |
diff --git a/mojo/public/cpp/application/tests/service_provider_impl_unittest.cc b/mojo/public/cpp/application/tests/service_provider_impl_unittest.cc |
deleted file mode 100644 |
index 39a9c75d52074e0d416da4d1bde2c17866a61b5f..0000000000000000000000000000000000000000 |
--- a/mojo/public/cpp/application/tests/service_provider_impl_unittest.cc |
+++ /dev/null |
@@ -1,352 +0,0 @@ |
-// Copyright 2016 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "mojo/public/cpp/application/service_provider_impl.h" |
- |
-#include <utility> |
- |
-#include "gtest/gtest.h" |
-#include "mojo/public/cpp/application/connect.h" |
-#include "mojo/public/cpp/bindings/strong_binding.h" |
-#include "mojo/public/cpp/system/macros.h" |
-#include "mojo/public/cpp/utility/run_loop.h" |
-#include "mojo/public/interfaces/application/service_provider.mojom.h" |
-#include "mojo/public/interfaces/bindings/tests/ping_service.mojom.h" |
- |
-namespace mojo { |
-namespace { |
- |
-class ServiceProviderImplTest : public testing::Test { |
- public: |
- ServiceProviderImplTest() {} |
- ~ServiceProviderImplTest() override { loop_.RunUntilIdle(); } |
- |
- RunLoop& loop() { return loop_; } |
- |
- protected: |
- void QuitLoop(bool ok) { |
- EXPECT_TRUE(ok); |
- loop_.Quit(); |
- } |
- |
- private: |
- RunLoop loop_; |
- |
- MOJO_DISALLOW_COPY_AND_ASSIGN(ServiceProviderImplTest); |
-}; |
- |
-class PingServiceImpl : public test::PingService { |
- public: |
- PingServiceImpl(InterfaceRequest<test::PingService> ping_service_request) |
- : strong_binding_(this, std::move(ping_service_request)) {} |
- ~PingServiceImpl() override {} |
- |
- // |test::PingService|: |
- void Ping(const PingCallback& callback) override { callback.Run(); } |
- |
- private: |
- StrongBinding<test::PingService> strong_binding_; |
- |
- MOJO_DISALLOW_COPY_AND_ASSIGN(PingServiceImpl); |
-}; |
- |
-TEST_F(ServiceProviderImplTest, Basic) { |
- const char kRemoteUrl[] = "https://example.com/remote.mojo"; |
- const char kConnectionUrl[] = "https://example.com/me.mojo"; |
- |
- const char kPing1[] = "Ping1"; |
- const char kPing2[] = "Ping2"; |
- const char kPing3[] = "Ping3"; |
- |
- ServiceProviderPtr sp; |
- ServiceProviderImpl impl(ConnectionContext(ConnectionContext::Type::INCOMING, |
- kRemoteUrl, kConnectionUrl), |
- GetProxy(&sp)); |
- EXPECT_EQ(ConnectionContext::Type::INCOMING, impl.connection_context().type); |
- EXPECT_EQ(kRemoteUrl, impl.connection_context().remote_url); |
- EXPECT_EQ(kConnectionUrl, impl.connection_context().connection_url); |
- |
- impl.AddService<test::PingService>( |
- [&kRemoteUrl, &kConnectionUrl]( |
- const ConnectionContext& connection_context, |
- InterfaceRequest<test::PingService> ping_service_request) { |
- EXPECT_EQ(ConnectionContext::Type::INCOMING, connection_context.type); |
- EXPECT_EQ(kRemoteUrl, connection_context.remote_url); |
- EXPECT_EQ(kConnectionUrl, connection_context.connection_url); |
- new PingServiceImpl(std::move(ping_service_request)); |
- }, |
- kPing1); |
- |
- impl.AddService<test::PingService>( |
- [&kRemoteUrl, &kConnectionUrl]( |
- const ConnectionContext& connection_context, |
- InterfaceRequest<test::PingService> ping_service_request) { |
- EXPECT_EQ(ConnectionContext::Type::INCOMING, connection_context.type); |
- EXPECT_EQ(kRemoteUrl, connection_context.remote_url); |
- EXPECT_EQ(kConnectionUrl, connection_context.connection_url); |
- new PingServiceImpl(std::move(ping_service_request)); |
- }, |
- kPing2); |
- |
- { |
- test::PingServicePtr ping1; |
- ConnectToService(sp.get(), GetProxy(&ping1), kPing1); |
- ping1.set_connection_error_handler([this] { QuitLoop(false); }); |
- ping1->Ping([this] { QuitLoop(true); }); |
- loop().Run(); |
- } |
- loop().RunUntilIdle(); // Run stuff caused by destructors. |
- |
- { |
- test::PingServicePtr ping2; |
- ConnectToService(sp.get(), GetProxy(&ping2), kPing2); |
- ping2.set_connection_error_handler([this] { QuitLoop(false); }); |
- ping2->Ping([this] { QuitLoop(true); }); |
- loop().Run(); |
- } |
- loop().RunUntilIdle(); // Run stuff caused by destructors. |
- |
- // "Ping3" isn't actually registered! |
- { |
- test::PingServicePtr ping3; |
- ConnectToService(sp.get(), GetProxy(&ping3), kPing3); |
- ping3.set_connection_error_handler([this] { QuitLoop(true); }); |
- ping3->Ping([this] { QuitLoop(false); }); |
- loop().Run(); |
- } |
- loop().RunUntilIdle(); // Run stuff caused by destructors. |
- |
- impl.RemoveService<test::PingService>(kPing2); |
- |
- // "Ping2" should no longer work. |
- { |
- test::PingServicePtr ping2; |
- ConnectToService(sp.get(), GetProxy(&ping2), kPing2); |
- ping2.set_connection_error_handler([this] { QuitLoop(true); }); |
- ping2->Ping([this] { QuitLoop(false); }); |
- loop().Run(); |
- } |
- loop().RunUntilIdle(); // Run stuff caused by destructors. |
- |
- // But "Ping1" should still work. |
- { |
- test::PingServicePtr ping1; |
- ConnectToService(sp.get(), GetProxy(&ping1), kPing1); |
- ping1.set_connection_error_handler([this] { QuitLoop(false); }); |
- ping1->Ping([this] { QuitLoop(true); }); |
- loop().Run(); |
- } |
- loop().RunUntilIdle(); // Run stuff caused by destructors. |
- |
- impl.RemoveServiceForName(kPing1); |
- |
- // "Ping1" should no longer work. |
- { |
- test::PingServicePtr ping1; |
- ConnectToService(sp.get(), GetProxy(&ping1), kPing1); |
- ping1.set_connection_error_handler([this] { QuitLoop(true); }); |
- ping1->Ping([this] { QuitLoop(false); }); |
- loop().Run(); |
- } |
- loop().RunUntilIdle(); // Run stuff caused by destructors. |
- |
- sp.reset(); |
- loop().RunUntilIdle(); |
-} |
- |
-TEST_F(ServiceProviderImplTest, CloseAndRebind) { |
- const char kRemoteUrl1[] = "https://example.com/remote1.mojo"; |
- const char kRemoteUrl2[] = "https://example.com/remote2.mojo"; |
- const char kConnectionUrl[] = "https://example.com/me.mojo"; |
- const char kPing[] = "Ping"; |
- |
- ServiceProviderPtr sp1; |
- ServiceProviderImpl impl(ConnectionContext(ConnectionContext::Type::INCOMING, |
- kRemoteUrl1, kConnectionUrl), |
- GetProxy(&sp1)); |
- EXPECT_EQ(ConnectionContext::Type::INCOMING, impl.connection_context().type); |
- EXPECT_EQ(kRemoteUrl1, impl.connection_context().remote_url); |
- EXPECT_EQ(kConnectionUrl, impl.connection_context().connection_url); |
- |
- impl.AddService<test::PingService>( |
- [&kRemoteUrl1, &kRemoteUrl2, &kConnectionUrl]( |
- const ConnectionContext& connection_context, |
- InterfaceRequest<test::PingService> ping_service_request) { |
- EXPECT_EQ(ConnectionContext::Type::INCOMING, connection_context.type); |
- EXPECT_TRUE(connection_context.remote_url == kRemoteUrl1 || |
- connection_context.remote_url == kRemoteUrl2); |
- EXPECT_EQ(kConnectionUrl, connection_context.connection_url); |
- new PingServiceImpl(std::move(ping_service_request)); |
- }, |
- kPing); |
- |
- { |
- test::PingServicePtr ping; |
- ConnectToService(sp1.get(), GetProxy(&ping), kPing); |
- ping.set_connection_error_handler([this] { QuitLoop(false); }); |
- ping->Ping([this] { QuitLoop(true); }); |
- loop().Run(); |
- } |
- loop().RunUntilIdle(); // Run stuff caused by destructors. |
- |
- impl.Close(); |
- EXPECT_EQ(ConnectionContext::Type::UNKNOWN, impl.connection_context().type); |
- EXPECT_EQ(std::string(), impl.connection_context().remote_url); |
- EXPECT_EQ(std::string(), impl.connection_context().connection_url); |
- sp1.reset(); |
- loop().RunUntilIdle(); |
- |
- ServiceProviderPtr sp2; |
- impl.Bind(ConnectionContext(ConnectionContext::Type::INCOMING, kRemoteUrl2, |
- kConnectionUrl), |
- GetProxy(&sp2)); |
- EXPECT_EQ(ConnectionContext::Type::INCOMING, impl.connection_context().type); |
- EXPECT_EQ(kRemoteUrl2, impl.connection_context().remote_url); |
- EXPECT_EQ(kConnectionUrl, impl.connection_context().connection_url); |
- |
- { |
- test::PingServicePtr ping; |
- ConnectToService(sp2.get(), GetProxy(&ping), kPing); |
- ping.set_connection_error_handler([this] { QuitLoop(false); }); |
- ping->Ping([this] { QuitLoop(true); }); |
- loop().Run(); |
- } |
- loop().RunUntilIdle(); // Run stuff caused by destructors. |
- |
- // Can close multiple times. |
- impl.Close(); |
- impl.Close(); |
- sp2.reset(); |
- loop().RunUntilIdle(); |
-} |
- |
-TEST_F(ServiceProviderImplTest, Bind) { |
- const char kRemoteUrl[] = "https://example.com/remote.mojo"; |
- const char kConnectionUrl[] = "https://example.com/me.mojo"; |
- const char kPing[] = "Ping"; |
- |
- ServiceProviderPtr sp; |
- ServiceProviderImpl impl; |
- EXPECT_EQ(ConnectionContext::Type::UNKNOWN, impl.connection_context().type); |
- EXPECT_EQ(std::string(), impl.connection_context().remote_url); |
- EXPECT_EQ(std::string(), impl.connection_context().connection_url); |
- |
- impl.Bind(ConnectionContext(ConnectionContext::Type::INCOMING, kRemoteUrl, |
- kConnectionUrl), |
- GetProxy(&sp)); |
- |
- impl.AddService<test::PingService>( |
- [&kRemoteUrl, &kConnectionUrl]( |
- const ConnectionContext& connection_context, |
- InterfaceRequest<test::PingService> request) { |
- EXPECT_EQ(ConnectionContext::Type::INCOMING, connection_context.type); |
- EXPECT_EQ(kRemoteUrl, connection_context.remote_url); |
- EXPECT_EQ(kConnectionUrl, connection_context.connection_url); |
- new PingServiceImpl(std::move(request)); |
- }, |
- kPing); |
- |
- { |
- test::PingServicePtr ping; |
- ConnectToService(sp.get(), GetProxy(&ping), kPing); |
- ping.set_connection_error_handler([this] { QuitLoop(false); }); |
- ping->Ping([this] { QuitLoop(true); }); |
- loop().Run(); |
- } |
- loop().RunUntilIdle(); // Run stuff caused by destructors. |
- |
- sp.reset(); |
- loop().RunUntilIdle(); |
-} |
- |
-class FauxServiceProvider : public ServiceProvider { |
- public: |
- explicit FauxServiceProvider( |
- std::function<void(const std::string& service_name)> |
- on_connect_to_service) |
- : on_connect_to_service_(on_connect_to_service) {} |
- ~FauxServiceProvider() override {} |
- |
- // |ServiceProvider|: |
- void ConnectToService(const String& service_name, |
- ScopedMessagePipeHandle client_handle) override { |
- on_connect_to_service_(service_name.get()); |
- } |
- |
- private: |
- std::function<void(const std::string& service_name)> on_connect_to_service_; |
- |
- MOJO_DISALLOW_COPY_AND_ASSIGN(FauxServiceProvider); |
-}; |
- |
-TEST_F(ServiceProviderImplTest, FallbackServiceProvider) { |
- const char kWhatever[] = "Whatever"; |
- |
- ServiceProviderPtr sp; |
- ServiceProviderImpl impl(ConnectionContext(ConnectionContext::Type::INCOMING, |
- "https://example.com/remote.mojo", |
- "https://example.com/me.mojo"), |
- GetProxy(&sp)); |
- |
- { |
- test::PingServicePtr ping; |
- ConnectToService(sp.get(), GetProxy(&ping), kWhatever); |
- ping.set_connection_error_handler([this] { QuitLoop(true); }); |
- ping->Ping([this] { QuitLoop(false); }); |
- loop().Run(); |
- } |
- loop().RunUntilIdle(); // Run stuff caused by destructors. |
- |
- bool was_run = false; |
- FauxServiceProvider fallback_sp( |
- [this, &kWhatever, &was_run](const std::string& service_name) { |
- EXPECT_EQ(kWhatever, service_name); |
- was_run = true; |
- }); |
- impl.set_fallback_service_provider(&fallback_sp); |
- |
- { |
- test::PingServicePtr ping; |
- ConnectToService(sp.get(), GetProxy(&ping), kWhatever); |
- ping.set_connection_error_handler([this] { QuitLoop(true); }); |
- EXPECT_FALSE(was_run); |
- ping->Ping([this] { QuitLoop(false); }); |
- loop().Run(); |
- EXPECT_TRUE(was_run); |
- } |
- loop().RunUntilIdle(); // Run stuff caused by destructors. |
- |
- // Clear the fallback. |
- impl.set_fallback_service_provider(nullptr); |
- was_run = false; |
- |
- { |
- test::PingServicePtr ping; |
- ConnectToService(sp.get(), GetProxy(&ping), kWhatever); |
- ping.set_connection_error_handler([this] { QuitLoop(true); }); |
- ping->Ping([this] { QuitLoop(false); }); |
- loop().Run(); |
- } |
- loop().RunUntilIdle(); // Run stuff caused by destructors. |
- |
- sp.reset(); |
- loop().RunUntilIdle(); |
- |
- EXPECT_FALSE(was_run); |
-} |
- |
-TEST_F(ServiceProviderImplTest, ConstructRequestNotPending) { |
- ServiceProviderImpl impl(ConnectionContext(ConnectionContext::Type::INCOMING, |
- "https://example.com/remote.mojo", |
- "https://example.com/me.mojo"), |
- InterfaceRequest<ServiceProvider>()); |
- EXPECT_EQ(ConnectionContext::Type::UNKNOWN, impl.connection_context().type); |
- EXPECT_EQ(std::string(), impl.connection_context().remote_url); |
- EXPECT_EQ(std::string(), impl.connection_context().connection_url); |
-} |
- |
-// TODO(vtl): Explicitly test |AddServiceForName()|? |
- |
-} // namespace |
-} // namespace mojo |