blob: 67a758f8c4f1a24059de9a9d9f75a4175518032a [file] [log] [blame]
// Copyright 2020 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.
/// This module tests calls to the get_blob API.
use {
super::*, fidl::endpoints::create_proxy, fidl_fuchsia_io::FileEvent::OnOpen_,
fidl_fuchsia_pkg::GetBlobError, fidl_fuchsia_pkg_ext::BlobId, fuchsia_zircon::Status,
futures::channel::oneshot, matches::assert_matches, vfs::file::vmo::read_only_static,
};
async fn verify_get_blob_with_read_success(env: &TestEnv, blob: &str, file_contents: &str) {
let (file_proxy, server_end) = create_proxy().unwrap();
let res = env
.local_mirror_proxy()
.get_blob(&mut BlobId::parse(blob).unwrap().into(), server_end)
.await;
assert_eq!(res.unwrap(), Ok(()));
assert_matches!(
file_proxy.take_event_stream().next().await,
Some(Ok(OnOpen_{s, info: Some(_)})) if Status::ok(s) == Ok(())
);
assert_eq!(io_util::read_file(&file_proxy).await.unwrap(), file_contents.to_owned());
}
#[fuchsia::test]
async fn success() {
let env = TestEnv::builder()
.usb_dir(pseudo_directory! {
"0" => pseudo_directory! {
"fuchsia_pkg" => pseudo_directory! {
"blobs" => pseudo_directory! {
"00" => pseudo_directory! {
"00000000000000000000000000000000000000000000000000000000000000" =>
read_only_static("ben"),
"11111111111111111111111111111111111111111111111111111111111111" =>
read_only_static("dan"),
},
"aa" => pseudo_directory! {
"bbccddeeff00112233445566778899aabbccddeeff00112233445566778899" =>
read_only_static("kevin"),
},
},
"repository_metadata" => pseudo_directory! {},
},
},
})
.build()
.await;
verify_get_blob_with_read_success(
&env,
"0000000000000000000000000000000000000000000000000000000000000000",
"ben",
)
.await;
verify_get_blob_with_read_success(
&env,
"0011111111111111111111111111111111111111111111111111111111111111",
"dan",
)
.await;
verify_get_blob_with_read_success(
&env,
"aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899",
"kevin",
)
.await;
}
#[fuchsia::test]
async fn missing_blob() {
let env = TestEnv::builder().build().await;
let (file_proxy, server_end) = create_proxy().unwrap();
let res = env
.local_mirror_proxy()
.get_blob(
&mut BlobId::parse("0000000000000000000000000000000000000000000000000000000000000000")
.unwrap()
.into(),
server_end,
)
.await;
assert_eq!(res.unwrap(), Ok(()));
assert_matches!(
file_proxy.take_event_stream().next().await,
Some(Ok(OnOpen_{s, info: None})) if Status::from_raw(s) == Status::NOT_FOUND
);
assert_matches!(io_util::read_file(&file_proxy).await, Err(_));
}
#[fuchsia::test]
async fn error_opening_blob() {
let (blobs_closed_sender, blobs_closed_recv) = oneshot::channel();
let env = TestEnv::builder()
.usb_dir(pseudo_directory! {
"0" => pseudo_directory! {
"fuchsia_pkg" => pseudo_directory! {
"blobs" => DropAndSignal::new(blobs_closed_sender),
"repository_metadata" => pseudo_directory! {},
}
}
})
.build()
.await;
// Wait for the channel connecting the pkg-local-mirror to the blobs dir to close.
// This ensures that GetBlob calls will fail with the expected fidl error.
let () = blobs_closed_recv.await.unwrap();
let (file_proxy, server_end) = create_proxy().unwrap();
let res = env
.local_mirror_proxy()
.get_blob(
&mut BlobId::parse("0000000000000000000000000000000000000000000000000000000000000000")
.unwrap()
.into(),
server_end,
)
.await;
assert_eq!(res.unwrap(), Err(GetBlobError::ErrorOpeningBlob));
assert_matches!(file_proxy.take_event_stream().next().await, None);
assert_matches!(io_util::read_file(&file_proxy).await, Err(_));
}