| // Copyright 2018 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 "base/fuchsia/filtered_service_directory.h" |
| |
| #include <lib/zx/channel.h> |
| #include <utility> |
| |
| #include "base/fuchsia/service_directory_test_base.h" |
| #include "starboard/types.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace base { |
| namespace fuchsia { |
| |
| class FilteredServiceDirectoryTest : public ServiceDirectoryTestBase { |
| public: |
| FilteredServiceDirectoryTest() { |
| filtered_service_dir_ = |
| std::make_unique<FilteredServiceDirectory>(client_context_.get()); |
| filtered_client_context_ = std::make_unique<ComponentContext>( |
| filtered_service_dir_->ConnectClient()); |
| } |
| |
| protected: |
| std::unique_ptr<FilteredServiceDirectory> filtered_service_dir_; |
| std::unique_ptr<ComponentContext> filtered_client_context_; |
| }; |
| |
| // Verify that we can connect to a whitelisted service. |
| TEST_F(FilteredServiceDirectoryTest, Connect) { |
| filtered_service_dir_->AddService(testfidl::TestInterface::Name_); |
| |
| auto stub = |
| filtered_client_context_->ConnectToService<testfidl::TestInterface>(); |
| VerifyTestInterface(&stub, false); |
| } |
| |
| // Verify that multiple connections to the same service work properly. |
| TEST_F(FilteredServiceDirectoryTest, ConnectMultiple) { |
| filtered_service_dir_->AddService(testfidl::TestInterface::Name_); |
| |
| auto stub1 = |
| filtered_client_context_->ConnectToService<testfidl::TestInterface>(); |
| auto stub2 = |
| filtered_client_context_->ConnectToService<testfidl::TestInterface>(); |
| VerifyTestInterface(&stub1, false); |
| VerifyTestInterface(&stub2, false); |
| } |
| |
| // Verify that non-whitelisted services are blocked. |
| TEST_F(FilteredServiceDirectoryTest, ServiceBlocked) { |
| auto stub = |
| filtered_client_context_->ConnectToService<testfidl::TestInterface>(); |
| VerifyTestInterface(&stub, true); |
| } |
| |
| // Verify that FilteredServiceDirectory handles the case when the target service |
| // is not available in the underlying service directory. |
| TEST_F(FilteredServiceDirectoryTest, NoService) { |
| filtered_service_dir_->AddService(testfidl::TestInterface::Name_); |
| |
| service_binding_.reset(); |
| |
| auto stub = |
| filtered_client_context_->ConnectToService<testfidl::TestInterface>(); |
| VerifyTestInterface(&stub, true); |
| } |
| |
| // Verify that FilteredServiceDirectory handles the case when the underlying |
| // service directory is destroyed. |
| TEST_F(FilteredServiceDirectoryTest, NoServiceDir) { |
| filtered_service_dir_->AddService(testfidl::TestInterface::Name_); |
| |
| service_binding_.reset(); |
| service_directory_.reset(); |
| |
| auto stub = |
| filtered_client_context_->ConnectToService<testfidl::TestInterface>(); |
| VerifyTestInterface(&stub, true); |
| } |
| |
| } // namespace fuchsia |
| } // namespace base |