feat(tvix/store): add import::import_path
This imports the contents at a given Path into the tvix store. It doesn't register the contents at a Path in the store itself, that's up to the PathInfoService. Change-Id: I2c493532d65b90f199ddb7dfc90249f5c2957dee Reviewed-on: https://cl.tvl.fyi/c/depot/+/8159 Reviewed-by: raitobezarius <tvl@lahfa.xyz> Tested-by: BuildkiteCI
This commit is contained in:
parent
52a5181eba
commit
b29d1ae372
7 changed files with 392 additions and 0 deletions
136
tvix/store/src/tests/import.rs
Normal file
136
tvix/store/src/tests/import.rs
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
use super::utils::{gen_blob_service, gen_chunk_service, gen_directory_service};
|
||||
use crate::blobservice::BlobService;
|
||||
use crate::directoryservice::DirectoryService;
|
||||
use crate::import::import_path;
|
||||
use crate::proto;
|
||||
use crate::tests::fixtures::DIRECTORY_COMPLICATED;
|
||||
use crate::tests::fixtures::*;
|
||||
use tempfile::TempDir;
|
||||
|
||||
#[cfg(target_family = "unix")]
|
||||
#[test]
|
||||
fn symlink() {
|
||||
let tmpdir = TempDir::new().unwrap();
|
||||
|
||||
let data_dir = tmpdir.path().join("data");
|
||||
std::fs::create_dir_all(&data_dir).unwrap();
|
||||
std::os::unix::fs::symlink("/nix/store/somewhereelse", data_dir.join("doesntmatter")).unwrap();
|
||||
|
||||
let root_node = import_path(
|
||||
&mut gen_blob_service(tmpdir.path()),
|
||||
&mut gen_chunk_service(tmpdir.path()),
|
||||
&mut gen_directory_service(tmpdir.path()),
|
||||
data_dir.join("doesntmatter"),
|
||||
)
|
||||
.expect("must succeed");
|
||||
|
||||
assert_eq!(
|
||||
crate::proto::node::Node::Symlink(proto::SymlinkNode {
|
||||
name: "doesntmatter".to_string(),
|
||||
target: "/nix/store/somewhereelse".to_string(),
|
||||
}),
|
||||
root_node,
|
||||
)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn single_file() {
|
||||
let tmpdir = TempDir::new().unwrap();
|
||||
|
||||
let data_dir = tmpdir.path().join("data");
|
||||
std::fs::create_dir_all(&data_dir).unwrap();
|
||||
std::fs::write(data_dir.join("root"), HELLOWORLD_BLOB_CONTENTS).unwrap();
|
||||
|
||||
let mut blob_service = gen_blob_service(tmpdir.path());
|
||||
|
||||
let root_node = import_path(
|
||||
&mut blob_service,
|
||||
&mut gen_chunk_service(tmpdir.path()),
|
||||
&mut gen_directory_service(tmpdir.path()),
|
||||
data_dir.join("root"),
|
||||
)
|
||||
.expect("must succeed");
|
||||
|
||||
assert_eq!(
|
||||
crate::proto::node::Node::File(proto::FileNode {
|
||||
name: "root".to_string(),
|
||||
digest: HELLOWORLD_BLOB_DIGEST.to_vec(),
|
||||
size: HELLOWORLD_BLOB_CONTENTS.len() as u32,
|
||||
executable: false,
|
||||
}),
|
||||
root_node,
|
||||
);
|
||||
|
||||
// ensure the blob has been uploaded
|
||||
assert!(blob_service
|
||||
.stat(&proto::StatBlobRequest {
|
||||
digest: HELLOWORLD_BLOB_DIGEST.to_vec(),
|
||||
include_chunks: false,
|
||||
..Default::default()
|
||||
})
|
||||
.unwrap()
|
||||
.is_some());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn complicated() {
|
||||
let tmpdir = TempDir::new().unwrap();
|
||||
|
||||
let data_dir = tmpdir.path().join("data");
|
||||
|
||||
// Populate path to import
|
||||
std::fs::create_dir_all(&data_dir).unwrap();
|
||||
// File ``.keep`
|
||||
std::fs::write(data_dir.join(".keep"), vec![]).unwrap();
|
||||
// Symlink `aa`
|
||||
std::os::unix::fs::symlink("/nix/store/somewhereelse", data_dir.join("aa")).unwrap();
|
||||
// Directory `keep`
|
||||
std::fs::create_dir(data_dir.join("keep")).unwrap();
|
||||
// File ``keep/.keep`
|
||||
std::fs::write(data_dir.join("keep").join(".keep"), vec![]).unwrap();
|
||||
|
||||
let mut blob_service = gen_blob_service(tmpdir.path());
|
||||
let mut directory_service = gen_directory_service(tmpdir.path());
|
||||
|
||||
let root_node = import_path(
|
||||
&mut blob_service,
|
||||
&mut gen_chunk_service(tmpdir.path()),
|
||||
&mut directory_service,
|
||||
data_dir,
|
||||
)
|
||||
.expect("must succeed");
|
||||
|
||||
// ensure root_node matched expectations
|
||||
assert_eq!(
|
||||
crate::proto::node::Node::Directory(proto::DirectoryNode {
|
||||
name: "data".to_string(),
|
||||
digest: DIRECTORY_COMPLICATED.digest(),
|
||||
size: DIRECTORY_COMPLICATED.size(),
|
||||
}),
|
||||
root_node,
|
||||
);
|
||||
|
||||
// ensure DIRECTORY_WITH_KEEP and DIRECTORY_COMPLICATED have been uploaded
|
||||
assert!(directory_service
|
||||
.get(&proto::get_directory_request::ByWhat::Digest(
|
||||
DIRECTORY_WITH_KEEP.digest()
|
||||
))
|
||||
.unwrap()
|
||||
.is_some());
|
||||
assert!(directory_service
|
||||
.get(&proto::get_directory_request::ByWhat::Digest(
|
||||
DIRECTORY_COMPLICATED.digest()
|
||||
))
|
||||
.unwrap()
|
||||
.is_some());
|
||||
|
||||
// ensure EMPTY_BLOB_CONTENTS has been uploaded
|
||||
assert!(blob_service
|
||||
.stat(&proto::StatBlobRequest {
|
||||
digest: EMPTY_BLOB_DIGEST.to_vec(),
|
||||
include_chunks: false,
|
||||
include_bao: false
|
||||
})
|
||||
.unwrap()
|
||||
.is_some());
|
||||
}
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
pub mod fixtures;
|
||||
mod import;
|
||||
mod nar_renderer;
|
||||
pub mod utils;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue