use crate::nar::write_nar; use crate::tests::fixtures::*; use rstest::*; use rstest_reuse::*; use std::io; use std::sync::Arc; use tokio::io::sink; use tvix_castore::blobservice::BlobService; use tvix_castore::directoryservice::DirectoryService; use tvix_castore::Node; /// Make sure the NARRenderer fails if a referred blob doesn't exist. #[rstest] #[tokio::test] async fn single_file_missing_blob( blob_service: Arc<dyn BlobService>, directory_service: Arc<dyn DirectoryService>, ) { let e = write_nar( sink(), &CASTORE_NODE_HELLOWORLD, // the blobservice is empty intentionally, to provoke the error. blob_service, directory_service, ) .await .expect_err("must fail"); match e { crate::nar::RenderError::NARWriterError(e) => { assert_eq!(io::ErrorKind::NotFound, e.kind()); } _ => panic!("unexpected error: {:?}", e), } } #[apply(castore_fixtures_template)] #[tokio::test] async fn seekable( #[future] blob_service_with_contents: Arc<dyn BlobService>, #[future] directory_service_with_contents: Arc<dyn DirectoryService>, #[case] test_input: &Node, #[case] test_output: Result<Result<&Vec<u8>, io::ErrorKind>, crate::nar::RenderError>, ) { let blob_service = blob_service_with_contents.await; let directory_service = directory_service_with_contents.await; let mut buf: Vec<u8> = vec![]; let read_result = write_nar( &mut buf, test_input, // don't put anything in the stores, as we don't actually do any requests. blob_service, directory_service, ) .await; match (read_result, test_output) { (Ok(_), Err(_)) => panic!("creating reader should have failed but succeeded"), (Ok(_), Ok(Err(_))) => panic!("creating reader should have failed but succeeded"), (Err(err), Ok(Ok(_))) => { panic!("creating reader should have succeeded but failed: {}", err) } (Err(reader_err), Err(expected_err)) => { assert_eq!(format!("{}", reader_err), format!("{}", expected_err)); } (Err(reader_err), Ok(Err(expected_err))) => { let crate::nar::RenderError::NARWriterError(e) = reader_err else { panic!("expected nar writer error") }; assert_eq!(e.kind(), expected_err); } (Ok(_n), Ok(Ok(expected_read_result))) => { assert_eq!(buf, expected_read_result.to_vec()); } } }