blob: faa8d95909ebb81d6decc4f394152226e30094b1 [file] [log] [blame]
// Copyright 2021 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 "src/lib/fsl/io/device_watcher.h"
#include <fuchsia/io/cpp/fidl.h>
#include <lib/async-loop/loop.h>
#include <lib/async/cpp/task.h>
#include <lib/fdio/directory.h>
#include <lib/fdio/namespace.h>
#include <lib/fidl/cpp/interface_handle.h>
#include <lib/fit/defer.h>
#include <fbl/ref_ptr.h>
#include <gtest/gtest.h>
#include "src/lib/fxl/macros.h"
#include "src/lib/testing/loop_fixture/real_loop_fixture.h"
#include "src/storage/lib/vfs/cpp/pseudo_dir.h"
#include "src/storage/lib/vfs/cpp/synchronous_vfs.h"
#include "src/storage/lib/vfs/cpp/vfs_types.h"
namespace fsl {
namespace {
class DeviceWatcher : public gtest::RealLoopFixture {};
// Test that the callback is never called with ".".
TEST_F(DeviceWatcher, IgnoreDot) {
async::Loop fs_loop{&kAsyncLoopConfigNeverAttachToThread};
fs_loop.StartThread("fs-loop");
auto empty_dir = fbl::MakeRefCounted<fs::PseudoDir>();
fs::SynchronousVfs vfs(fs_loop.dispatcher());
fidl::InterfaceHandle<fuchsia::io::Directory> dir_handle;
auto request = dir_handle.NewRequest();
async::PostTask(fs_loop.dispatcher(), [&, request = std::move(request)]() mutable {
vfs.Serve(empty_dir, request.TakeChannel(), fs::VnodeConnectionOptions::ReadOnly());
});
fdio_ns_t* ns;
const char* kDevicePath = "/test-device-path";
EXPECT_EQ(ZX_OK, fdio_ns_get_installed(&ns));
EXPECT_EQ(ZX_OK, fdio_ns_bind(ns, kDevicePath, dir_handle.TakeChannel().release()));
auto defer_unbind = fit::defer([&]() { fdio_ns_unbind(ns, kDevicePath); });
auto device_watcher = fsl::DeviceWatcher::CreateWithIdleCallback(
kDevicePath,
[](const fidl::ClientEnd<fuchsia_io::Directory>& dir, const std::string& filename) {
// The pseudo-directory is empty, so this callback should never be called.
ADD_FAILURE() << filename;
},
[this]() { QuitLoop(); });
ASSERT_TRUE(device_watcher);
// Wait until the idle callback has run.
RunLoop();
fs_loop.Shutdown();
}
} // namespace
} // namespace fsl