blob: 6b4d4148282cb7d97279095ef1ca5ca6c0b4a16a [file] [log] [blame]
// Copyright 2022 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, fuchsia_zircon as zx,
io_conformance_util::{test_harness::TestHarness, *},
};
#[fuchsia::test]
async fn file_read_with_sufficient_rights() {
let harness = TestHarness::new().await;
for file_flags in harness
.file_rights
.valid_combos_with(fio::OpenFlags::RIGHT_READABLE | fio::OpenFlags::NOT_DIRECTORY)
{
let root = root_directory(vec![file(TEST_FILE, vec![])]);
let test_dir = harness.get_directory(root, harness.dir_rights.all());
let file = open_node::<fio::FileMarker>(&test_dir, file_flags, TEST_FILE).await;
let _data: Vec<u8> = file
.read(0)
.await
.expect("read failed")
.map_err(zx::Status::from_raw)
.expect("read error");
}
}
#[fuchsia::test]
async fn file_read_with_insufficient_rights() {
let harness = TestHarness::new().await;
for file_flags in harness
.file_rights
.valid_combos_without(fio::OpenFlags::RIGHT_READABLE | fio::OpenFlags::NOT_DIRECTORY)
{
let root = root_directory(vec![file(TEST_FILE, vec![])]);
let test_dir = harness.get_directory(root, harness.dir_rights.all());
let file = open_node::<fio::FileMarker>(&test_dir, file_flags, TEST_FILE).await;
let result = file.read(0).await.expect("read failed").map_err(zx::Status::from_raw);
assert_eq!(result, Err(zx::Status::BAD_HANDLE))
}
}
#[fuchsia::test]
async fn file_read_with_max_transfer() {
let harness = TestHarness::new().await;
for file_flags in harness
.file_rights
.valid_combos_with(fio::OpenFlags::RIGHT_READABLE | fio::OpenFlags::NOT_DIRECTORY)
{
let contents = vec![0u8; fio::MAX_TRANSFER_SIZE as usize];
let root = root_directory(vec![file(TEST_FILE, contents)]);
let test_dir = harness.get_directory(root, harness.dir_rights.all());
let file = open_node::<fio::FileMarker>(&test_dir, file_flags, TEST_FILE).await;
let len = file
.read(fio::MAX_TRANSFER_SIZE)
.await
.expect("read failed")
.map_err(zx::Status::from_raw)
.expect("read error")
.len();
assert_eq!(len, fio::MAX_TRANSFER_SIZE as usize);
}
}
#[fuchsia::test]
async fn file_read_over_max_transfer() {
let harness = TestHarness::new().await;
for file_flags in harness
.file_rights
.valid_combos_with(fio::OpenFlags::RIGHT_READABLE | fio::OpenFlags::NOT_DIRECTORY)
{
let contents = vec![0u8; fio::MAX_TRANSFER_SIZE as usize + 1];
let root = root_directory(vec![file(TEST_FILE, contents)]);
let test_dir = harness.get_directory(root, harness.dir_rights.all());
let file = open_node::<fio::FileMarker>(&test_dir, file_flags, TEST_FILE).await;
let result = file
.read(fio::MAX_TRANSFER_SIZE + 1)
.await
.expect("read failed")
.map_err(zx::Status::from_raw);
assert_eq!(result, Err(zx::Status::OUT_OF_RANGE))
}
}
#[fuchsia::test]
async fn file_read_at_with_sufficient_rights() {
let harness = TestHarness::new().await;
for file_flags in harness
.file_rights
.valid_combos_with(fio::OpenFlags::RIGHT_READABLE | fio::OpenFlags::NOT_DIRECTORY)
{
let root = root_directory(vec![file(TEST_FILE, vec![])]);
let test_dir = harness.get_directory(root, harness.dir_rights.all());
let file = open_node::<fio::FileMarker>(&test_dir, file_flags, TEST_FILE).await;
let _: Vec<u8> = file
.read_at(0, 0)
.await
.expect("read_at failed")
.map_err(zx::Status::from_raw)
.expect("read_at error");
}
}
#[fuchsia::test]
async fn file_read_at_with_insufficient_rights() {
let harness = TestHarness::new().await;
for file_flags in harness
.file_rights
.valid_combos_without(fio::OpenFlags::RIGHT_READABLE | fio::OpenFlags::NOT_DIRECTORY)
{
let root = root_directory(vec![file(TEST_FILE, vec![])]);
let test_dir = harness.get_directory(root, harness.dir_rights.all());
let file = open_node::<fio::FileMarker>(&test_dir, file_flags, TEST_FILE).await;
let result =
file.read_at(0, 0).await.expect("read_at failed").map_err(zx::Status::from_raw);
assert_eq!(result, Err(zx::Status::BAD_HANDLE))
}
}
#[fuchsia::test]
async fn file_read_at_with_max_transfer() {
let harness = TestHarness::new().await;
for file_flags in harness
.file_rights
.valid_combos_with(fio::OpenFlags::RIGHT_READABLE | fio::OpenFlags::NOT_DIRECTORY)
{
let contents = vec![0u8; fio::MAX_TRANSFER_SIZE as usize];
let root = root_directory(vec![file(TEST_FILE, contents)]);
let test_dir = harness.get_directory(root, harness.dir_rights.all());
let file = open_node::<fio::FileMarker>(&test_dir, file_flags, TEST_FILE).await;
let len = file
.read_at(fio::MAX_TRANSFER_SIZE, 0)
.await
.expect("read_at failed")
.map_err(zx::Status::from_raw)
.expect("read_at error")
.len();
assert_eq!(len, fio::MAX_TRANSFER_SIZE as usize)
}
}
#[fuchsia::test]
async fn file_read_at_over_max_transfer() {
let harness = TestHarness::new().await;
for file_flags in harness
.file_rights
.valid_combos_with(fio::OpenFlags::RIGHT_READABLE | fio::OpenFlags::NOT_DIRECTORY)
{
let contents = vec![0u8; fio::MAX_TRANSFER_SIZE as usize + 1];
let root = root_directory(vec![file(TEST_FILE, contents)]);
let test_dir = harness.get_directory(root, harness.dir_rights.all());
let file = open_node::<fio::FileMarker>(&test_dir, file_flags, TEST_FILE).await;
let result = file
.read_at(fio::MAX_TRANSFER_SIZE + 1, 0)
.await
.expect("read_at failed")
.map_err(zx::Status::from_raw);
assert_eq!(result, Err(zx::Status::OUT_OF_RANGE))
}
}
#[fuchsia::test]
async fn file_read_in_subdirectory() {
let harness = TestHarness::new().await;
for file_flags in harness
.file_rights
.valid_combos_with(fio::OpenFlags::RIGHT_READABLE | fio::OpenFlags::NOT_DIRECTORY)
{
let root = root_directory(vec![directory("subdir", vec![file("testing.txt", vec![])])]);
let test_dir = harness.get_directory(root, harness.dir_rights.all());
let file = open_node::<fio::FileMarker>(&test_dir, file_flags, "subdir/testing.txt").await;
let _data: Vec<u8> = file
.read(0)
.await
.expect("read failed")
.map_err(zx::Status::from_raw)
.expect("read error");
}
}