use super::*;
#[test]
fn webc_invalid_data() {
let content = WebC::parse(b"Nweb", &ParseOptions::default());
pretty_assertions::assert_eq!(
content.unwrap_err().0.as_str(),
"Invalid WebC file (can\'t get magic header)"
);
let content = WebC::parse(b"\0webc0x1", &ParseOptions::default());
pretty_assertions::assert_eq!(content.unwrap_err().0.as_str(), "Version not supported");
let content = WebC::parse(b"\0webc001", &ParseOptions::default());
pretty_assertions::assert_eq!(
content.unwrap_err().0.as_str(),
"Failed to get checksum type at offset 8..24"
);
pretty_assertions::assert_eq!(
WebC::compute_checksum(b"\0webc001----------------"),
Ok(None)
);
let content = WebC::parse(b"\0webc001----------------", &ParseOptions::default());
pretty_assertions::assert_eq!(
content.unwrap_err().0.as_str(),
"Failed to get signature length at offset 280..284"
);
}
#[test]
fn test_encode_decode_file_entry() {
use crate::FsEntryType::*;
use std::borrow::Cow;
let entries = vec![
FsEntry {
fs_type: Dir,
text: Cow::Borrowed("a"),
offset_start: 58,
offset_end: 91,
},
FsEntry {
fs_type: Dir,
text: Cow::Borrowed("b"),
offset_start: 91,
offset_end: 91,
},
];
pretty_assertions::assert_eq!(
FsEntry::parse(&FsEntry::into_bytes(&entries).unwrap_or_default()),
entries
);
}
#[test]
fn test_volume() {
let mut files = BTreeMap::new();
files.insert(
DirOrFile::File(Path::new("/a/c/file.txt").to_path_buf()),
b"hello".to_vec(),
);
files.insert(DirOrFile::Dir(Path::new("/b").to_path_buf()), Vec::new());
let volume_bytes = Volume::serialize_files(files);
let volume = Volume::parse(&volume_bytes).unwrap();
pretty_assertions::assert_eq!(volume.get_file("/a/c/file.txt"), Ok(&b"hello"[..]));
}
#[test]
fn test_encode_decode_webc() {
let mut files = BTreeMap::new();
files.insert(
DirOrFile::File(Path::new("atom.wasm").to_path_buf()),
b"atom wasm content".to_vec(),
);
let atom_volume = Volume::serialize_atoms(files);
let atom_volume = Volume::parse(&atom_volume).unwrap();
let mut files = BTreeMap::new();
files.insert(
DirOrFile::File(Path::new("dependency.txt").to_path_buf()),
b"dependency!".to_vec(),
);
let file_volume = Volume::serialize_files(files);
let file_volume = Volume::parse(&file_volume).unwrap();
let webc = WebC {
version: 1,
checksum: None,
signature: Some(Signature {
valid_until: 1024,
valid: false,
data: Vec::new(),
}),
manifest: Manifest {
origin: None,
use_map: IndexMap::default(),
package: IndexMap::default(),
atoms: IndexMap::default(),
commands: IndexMap::default(),
bindings: Vec::new(),
entrypoint: None,
},
atoms: atom_volume,
volumes: {
let mut map = IndexMap::default();
map.insert("files".to_string(), file_volume);
map
},
};
let bytes = webc.into_bytes(GenerateChecksum::NoChecksum).unwrap();
pretty_assertions::assert_eq!(WebC::parse(&bytes, &ParseOptions::default()).unwrap(), webc);
}