blob: 548efb18617aeb7d2642dfa12fea297c057418dc [file] [log] [blame]
// Copyright 2024 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.
use fidl_fuchsia_io as fio;
use io_conformance_util::test_harness::TestHarness;
use io_conformance_util::*;
#[fuchsia::test]
async fn dir_get_flags() {
let harness = TestHarness::new().await;
let dir = harness.get_directory(vec![], fio::PERM_READABLE | fio::PERM_WRITABLE);
let flags = dir.get_flags().await.expect("get_flags failed").expect("Failed to get node flags");
assert_eq!(flags, fio::Flags::PROTOCOL_DIRECTORY | fio::PERM_READABLE | fio::PERM_WRITABLE);
}
#[fuchsia::test]
async fn file_get_flags() {
let harness = TestHarness::new().await;
let entries = vec![file(TEST_FILE, vec![])];
let dir = harness.get_directory(entries, fio::PERM_READABLE);
let file = dir
.open_node::<fio::FileMarker>(
&TEST_FILE,
fio::PERM_READABLE | fio::Flags::FILE_APPEND,
None,
)
.await
.expect("open failed");
let flags =
file.get_flags().await.expect("get_flags failed").expect("Failed to get node flags");
assert_eq!(
flags,
fio::Flags::PROTOCOL_FILE
| fio::Flags::PERM_READ_BYTES
| fio::Flags::PERM_GET_ATTRIBUTES
| fio::Flags::FILE_APPEND
);
}
#[fuchsia::test]
async fn node_reference_get_flags() {
let harness = TestHarness::new().await;
let entries = vec![file(TEST_FILE, vec![])];
let dir = harness.get_directory(entries, fio::PERM_READABLE);
let node_reference = dir
.open_node::<fio::NodeMarker>(
&TEST_FILE,
fio::Flags::PROTOCOL_NODE | fio::Flags::PERM_GET_ATTRIBUTES,
None,
)
.await
.expect("open failed");
let flags = node_reference
.get_flags()
.await
.expect("get_flags failed")
.expect("Failed to get node flags");
assert_eq!(flags, fio::Flags::PROTOCOL_NODE | fio::Flags::PERM_GET_ATTRIBUTES);
// Unless `fio::Flags::PERM_GET_ATTRIBUTES` is specified, the opened connection will not have
// that right.
let node_reference = dir
.open_node::<fio::NodeMarker>(&TEST_FILE, fio::Flags::PROTOCOL_NODE, None)
.await
.expect("open failed");
let flags = node_reference
.get_flags()
.await
.expect("get_flags failed")
.expect("Failed to get node flags");
assert_eq!(flags, fio::Flags::PROTOCOL_NODE);
}
#[fuchsia::test]
async fn file_set_flags() {
let harness = TestHarness::new().await;
let entries = vec![file(TEST_FILE, vec![])];
let dir = harness.get_directory(entries, fio::PERM_READABLE);
let file = dir
.open_node::<fio::FileMarker>(&TEST_FILE, fio::Flags::empty(), None)
.await
.expect("open failed");
// Check that no rights were set.
let flags =
file.get_flags().await.expect("get_flags failed").expect("Failed to get node flags");
assert_eq!(flags, fio::Flags::PROTOCOL_FILE);
// We should be able to do this without any rights
file.set_flags(fio::Flags::FILE_APPEND)
.await
.expect("set_flags failed")
.expect("Failed to set node flags");
// Check that `fio::Flags::FILE_APPEND` was set.
let flags =
file.get_flags().await.expect("get_flags failed").expect("Failed to get node flags");
assert_eq!(flags, fio::Flags::PROTOCOL_FILE | fio::Flags::FILE_APPEND);
}
#[fuchsia::test]
async fn file_set_flags_empty_clears_append_mode() {
let harness = TestHarness::new().await;
let entries = vec![file(TEST_FILE, vec![])];
let dir = harness.get_directory(entries, fio::PERM_READABLE);
let file = dir
.open_node::<fio::FileMarker>(&TEST_FILE, fio::Flags::FILE_APPEND, None)
.await
.expect("open failed");
let flags =
file.get_flags().await.expect("get_flags failed").expect("Failed to get node flags");
assert_eq!(flags, fio::Flags::PROTOCOL_FILE | fio::Flags::FILE_APPEND);
file.set_flags(fio::Flags::empty())
.await
.expect("set_flags failed")
.expect("Failed to set node flags");
let flags =
file.get_flags().await.expect("get_flags failed").expect("Failed to get node flags");
assert_eq!(flags, fio::Flags::PROTOCOL_FILE);
}
#[fuchsia::test]
async fn file_set_flags_invalid_flags() {
let harness = TestHarness::new().await;
let entries = vec![file(TEST_FILE, vec![])];
let dir = harness.get_directory(entries, fio::PERM_READABLE);
let file = dir
.open_node::<fio::FileMarker>(&TEST_FILE, fio::Flags::empty(), None)
.await
.expect("open failed");
// The only valid flag to set with fuchsia.io/Node.SetFlags is fuchsia.io/Flags.FILE_APPEND.
let err = file
.set_flags(fio::Flags::FILE_APPEND | fio::Flags::PERM_GET_ATTRIBUTES)
.await
.expect("set_flags failed")
.map_err(zx::Status::from_raw)
.expect_err("set_flags only supports setting Flags.FILE_APPEND");
assert_eq!(err, zx::Status::INVALID_ARGS);
}
#[fuchsia::test]
async fn dir_set_flags_not_supported() {
let harness = TestHarness::new().await;
let dir = harness.get_directory(vec![], fio::Flags::empty());
let err = dir
.set_flags(fio::Flags::empty())
.await
.expect("set_flags failed")
.map_err(zx::Status::from_raw)
.expect_err("set_flags should be unsupported for directory nodes");
assert_eq!(err, zx::Status::NOT_SUPPORTED);
}
#[fuchsia::test]
async fn node_reference_set_flags_not_supported() {
let harness = TestHarness::new().await;
let entries = vec![file(TEST_FILE, vec![])];
let dir = harness.get_directory(entries, fio::PERM_READABLE);
let node_reference = dir
.open_node::<fio::NodeMarker>(&TEST_FILE, fio::Flags::PROTOCOL_NODE, None)
.await
.expect("open failed");
let err = node_reference
.set_flags(fio::Flags::empty())
.await
.expect("set_flags failed")
.map_err(zx::Status::from_raw)
.expect_err("set_flags should be unsupported for directory nodes");
assert_eq!(err, zx::Status::NOT_SUPPORTED);
}