blob: 188a1a3fc5cad637c7419058526fa0a6ad8911f4 [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.
use {
crate::{PkgFs, TestEnv},
anyhow::Error,
fidl::endpoints::ClientEnd,
fidl_fuchsia_io::DirectoryMarker,
fidl_fuchsia_space::{ErrorCode, ManagerMarker},
fuchsia_async as fasync,
matches::assert_matches,
std::{
fs::{create_dir, File},
path::PathBuf,
},
tempfile::TempDir,
};
struct TempDirPkgFs {
root: TempDir,
}
impl TempDirPkgFs {
fn new() -> Self {
let root = tempfile::tempdir().unwrap();
// pkg-cache needs these dirs to exist to start
create_dir(root.path().join("ctl")).unwrap();
create_dir(root.path().join("system")).unwrap();
create_dir(root.path().join("versions")).unwrap();
Self { root }
}
fn garbage_path(&self) -> PathBuf {
self.root.path().join("ctl/garbage")
}
fn create_garbage(&self) {
File::create(self.garbage_path()).unwrap();
}
fn garbage_exists(&self) -> bool {
self.garbage_path().exists()
}
}
impl PkgFs for TempDirPkgFs {
fn root_dir_handle(&self) -> Result<ClientEnd<DirectoryMarker>, Error> {
Ok(fdio::transfer_fd(File::open(self.root.path()).unwrap()).unwrap().into())
}
}
#[fasync::run_singlethreaded(test)]
async fn gc_garbage_file_deleted() {
let env = TestEnv::new(TempDirPkgFs::new());
env.pkgfs.create_garbage();
let res = env.proxies.space_manager.gc().await;
assert_matches!(res, Ok(Ok(())));
assert!(!env.pkgfs.garbage_exists());
}
#[fasync::run_singlethreaded(test)]
async fn gc_twice_same_client() {
let env = TestEnv::new(TempDirPkgFs::new());
env.pkgfs.create_garbage();
let res = env.proxies.space_manager.gc().await;
assert_matches!(res, Ok(Ok(())));
assert!(!env.pkgfs.garbage_exists());
env.pkgfs.create_garbage();
let res = env.proxies.space_manager.gc().await;
assert_matches!(res, Ok(Ok(())));
assert!(!env.pkgfs.garbage_exists());
}
#[fasync::run_singlethreaded(test)]
async fn gc_twice_different_clients() {
let env = TestEnv::new(TempDirPkgFs::new());
env.pkgfs.create_garbage();
let res = env.proxies.space_manager.gc().await;
assert_matches!(res, Ok(Ok(())));
assert!(!env.pkgfs.garbage_exists());
env.pkgfs.create_garbage();
let second_connection =
env.pkg_cache.connect_to_service::<ManagerMarker>().expect("connect to space manager");
let res = second_connection.gc().await;
assert_matches!(res, Ok(Ok(())));
assert!(!env.pkgfs.garbage_exists());
}
#[fasync::run_singlethreaded(test)]
async fn gc_error_missing_garbage_file() {
let env = TestEnv::new(TempDirPkgFs::new());
let res = env.proxies.space_manager.gc().await;
assert_matches!(res, Ok(Err(ErrorCode::Internal)));
}