| // Copyright 2019 The Fuchsia 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 <fuchsia/examples/cpp/fidl.h> |
| #include <lib/async-testing/test_loop.h> |
| #include <lib/sys/service/cpp/service_aggregate.h> |
| #include <lib/sys/service/cpp/service_watcher.h> |
| #include <lib/sys/service/cpp/test_base.h> |
| #include <zircon/types.h> |
| |
| #include <gmock/gmock.h> |
| |
| namespace sys { |
| namespace { |
| |
| class ServiceWatcherTest : public testing::TestBase { |
| protected: |
| async::TestLoop& loop() { return loop_; } |
| |
| private: |
| async::TestLoop loop_; |
| }; |
| |
| TEST_F(ServiceWatcherTest, Begin) { |
| auto service_aggregate = OpenServiceAggregateIn<fuchsia::examples::EchoService>(ns()); |
| ASSERT_TRUE(service_aggregate.is_valid()); |
| |
| std::vector<std::pair<fuchsia::io::WatchEvent, std::string>> instances; |
| ServiceWatcher watcher([&instances](fuchsia::io::WatchEvent event, std::string instance) { |
| instances.emplace_back(std::make_pair(event, std::move(instance))); |
| }); |
| zx_status_t status = watcher.Begin(service_aggregate, loop().dispatcher()); |
| ASSERT_EQ(ZX_OK, status); |
| |
| ASSERT_TRUE(loop().RunUntilIdle()); |
| EXPECT_THAT(instances, ::testing::UnorderedElementsAre( |
| std::make_pair(fuchsia::io::WatchEvent::EXISTING, "default"), |
| std::make_pair(fuchsia::io::WatchEvent::EXISTING, "my_instance"))); |
| |
| instances.clear(); |
| int ret = MkDir("/fuchsia.examples.EchoService/added"); |
| ASSERT_EQ(0, ret); |
| ASSERT_TRUE(loop().RunUntilIdle()); |
| EXPECT_THAT(instances, ::testing::UnorderedElementsAre( |
| std::make_pair(fuchsia::io::WatchEvent::ADDED, "added"))); |
| |
| instances.clear(); |
| ret = RmDir("/fuchsia.examples.EchoService/added"); |
| ASSERT_EQ(0, ret); |
| ASSERT_TRUE(loop().RunUntilIdle()); |
| EXPECT_THAT(instances, ::testing::UnorderedElementsAre( |
| std::make_pair(fuchsia::io::WatchEvent::REMOVED, "added"))); |
| |
| status = watcher.Cancel(); |
| ASSERT_EQ(ZX_OK, status); |
| |
| instances.clear(); |
| ret = MkDir("/fuchsia.examples.EchoService/added-after"); |
| ASSERT_EQ(0, ret); |
| ASSERT_FALSE(loop().RunUntilIdle()); |
| ASSERT_TRUE(instances.empty()); |
| } |
| |
| } // namespace |
| } // namespace sys |