blob: b04d7b7f5900dd876be4a002ad2a9a85d4586671 [file] [log] [blame]
// Copyright 2023 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 assert_matches::assert_matches;
use fidl_fuchsia_io as fio;
use io_conformance_util::test_harness::TestHarness;
use io_conformance_util::*;
#[fuchsia::test]
async fn test_open_node_on_directory() {
let harness = TestHarness::new().await;
let dir = harness.get_directory(vec![], harness.dir_rights.all_flags());
let (_proxy, on_representation) = dir
.open_node_repr::<fio::NodeMarker>(
".",
fio::Flags::FLAG_SEND_REPRESENTATION | fio::Flags::PROTOCOL_NODE,
None,
)
.await
.unwrap();
assert_matches!(on_representation, fio::Representation::Node(fio::NodeInfo { .. }));
// If other protocol types are specified, the target must match at least one.
let error: zx::Status = dir
.open_node::<fio::NodeMarker>(
".",
fio::Flags::PROTOCOL_NODE | fio::Flags::PROTOCOL_FILE,
None,
)
.await
.unwrap_err();
assert_eq!(error, zx::Status::NOT_FILE);
}
#[fuchsia::test]
async fn test_open_node_on_file() {
let harness = TestHarness::new().await;
let entries = vec![file("file", vec![])];
let dir = harness.get_directory(entries, harness.dir_rights.all_flags());
let (_proxy, representation) = dir
.open_node_repr::<fio::NodeMarker>(
"file",
fio::Flags::FLAG_SEND_REPRESENTATION | fio::Flags::PROTOCOL_NODE,
None,
)
.await
.unwrap();
assert_matches!(representation, fio::Representation::Node(fio::NodeInfo { .. }));
// If other protocol types are specified, the target must match at least one.
let error: zx::Status = dir
.open_node::<fio::NodeMarker>(
"file",
fio::Flags::PROTOCOL_NODE | fio::Flags::PROTOCOL_DIRECTORY,
None,
)
.await
.unwrap_err();
assert_eq!(error, zx::Status::NOT_DIR);
let error: zx::Status = dir
.open_node::<fio::NodeMarker>(
"file",
fio::Flags::PROTOCOL_NODE | fio::Flags::PROTOCOL_SYMLINK,
None,
)
.await
.unwrap_err();
assert_eq!(error, zx::Status::WRONG_TYPE);
}
#[fuchsia::test]
async fn test_set_flags_on_node() {
let harness = TestHarness::new().await;
let entries = vec![file("file", vec![])];
let dir = harness.get_directory(entries, harness.dir_rights.all_flags());
let proxy =
dir.open_node::<fio::NodeMarker>("file", fio::Flags::PROTOCOL_NODE, None).await.unwrap();
assert_eq!(
zx::Status::ok(
proxy.set_flags(fio::Flags::FILE_APPEND).await.expect("set_flags failed").unwrap_err()
),
Err(zx::Status::NOT_SUPPORTED)
);
}
#[fuchsia::test]
async fn test_open_node_with_attributes() {
let harness = TestHarness::new().await;
let dir = harness.get_directory(vec![], harness.dir_rights.all_flags());
let (_proxy, representation) = dir
.open_node_repr::<fio::NodeMarker>(
".",
fio::Flags::FLAG_SEND_REPRESENTATION | fio::Flags::PROTOCOL_NODE,
Some(fio::Options {
attributes: Some(
fio::NodeAttributesQuery::PROTOCOLS | fio::NodeAttributesQuery::ABILITIES,
),
..Default::default()
}),
)
.await
.unwrap();
assert_matches!(representation,
fio::Representation::Node(fio::NodeInfo {
attributes: Some(fio::NodeAttributes2 { mutable_attributes, immutable_attributes }),
..
})
if mutable_attributes == fio::MutableNodeAttributes::default()
&& immutable_attributes
== fio::ImmutableNodeAttributes {
protocols: Some(fio::NodeProtocolKinds::DIRECTORY),
abilities: Some(harness.supported_dir_abilities()),
..Default::default()
}
);
}