use debpkg; use tempfile::NamedTempFile; use std::convert::TryFrom; use std::env; use assert_matches::assert_matches; fn get_deb_path(filename: &str) -> std::path::PathBuf { let root_dir = &env::var("CARGO_MANIFEST_DIR").unwrap(); let mut source_path = std::path::PathBuf::from(root_dir); source_path.push("tests"); source_path.push("debs"); source_path.push(filename); source_path } #[test] fn empty_ar_fails_parse() { let file = NamedTempFile::new().unwrap(); let reader = file.reopen().unwrap(); let _ = ar::Builder::new(&file); drop(file); let pkg_result = debpkg::DebPkg::parse(&reader).err().unwrap(); assert_matches!(pkg_result, debpkg::Error::Io(_)); } #[test] fn ar_with_out_debian_binary_fails_parse() { let file = NamedTempFile::new().unwrap(); let reader = file.reopen().unwrap(); let mut archive = ar::Builder::new(&file); let header = ar::Header::new(b"debian-trinary".to_vec(), 4); archive.append(&header, "2.0\n".as_bytes()).unwrap(); drop(file); let pkg_result = debpkg::DebPkg::parse(&reader).err().unwrap(); assert_matches!(pkg_result, debpkg::Error::MissingDebianBinary); } #[test] fn ar_with_wrong_debian_binary_content_fails_parse() { let file = NamedTempFile::new().unwrap(); let reader = file.reopen().unwrap(); let mut archive = ar::Builder::new(&file); let header = ar::Header::new(b"debian-binary".to_vec(), 4); archive.append(&header, "3.0\n".as_bytes()).unwrap(); drop(file); let pkg_result = debpkg::DebPkg::parse(&reader).err().unwrap(); assert_matches!(pkg_result, debpkg::Error::InvalidVersion); } #[test] fn ar_with_only_debian_binary_fails_control() { let file = NamedTempFile::new().unwrap(); let reader = file.reopen().unwrap(); let mut archive = ar::Builder::new(&file); let header = ar::Header::new(b"debian-binary".to_vec(), 4); archive.append(&header, "2.0\n".as_bytes()).unwrap(); drop(file); let mut pkg = debpkg::DebPkg::parse(&reader).unwrap(); let control_result = pkg.control().err().unwrap(); assert_matches!(control_result, debpkg::Error::MissingControlArchive); } #[test] fn ar_with_empty_control_tar_fails_control_extract() { let file = NamedTempFile::new().unwrap(); let reader = file.reopen().unwrap(); let mut archive = ar::Builder::new(&file); let header = ar::Header::new(b"debian-binary".to_vec(), 4); archive.append(&header, "2.0\n".as_bytes()).unwrap(); let control_tar = tar::Builder::new(std::vec::Vec::new()); let control_tar = control_tar.into_inner().unwrap(); let header = ar::Header::new( b"control.tar".to_vec(), u64::try_from(control_tar.len()).unwrap(), ); archive.append(&header, &control_tar[..]).unwrap(); drop(file); let mut pkg = debpkg::DebPkg::parse(&reader).unwrap(); let control_result = pkg.control().err().unwrap(); assert_matches!(control_result, debpkg::Error::UnknownEntryFormat); } #[test] fn ar_with_empty_control_fails_extract() { let file = NamedTempFile::new().unwrap(); let reader = file.reopen().unwrap(); let mut archive = ar::Builder::new(&file); let header = ar::Header::new(b"debian-binary".to_vec(), 4); archive.append(&header, "2.0\n".as_bytes()).unwrap(); let control_file_contents = b"control"; let mut header = tar::Header::new_ustar(); header.set_size(u64::try_from(control_file_contents.len()).unwrap()); header.set_cksum(); let mut control_tar = tar::Builder::new(std::vec::Vec::new()); control_tar .append_data( &mut header, std::path::Path::new("./control"), &control_file_contents[..], ) .unwrap(); let control_tar = control_tar.into_inner().unwrap(); let header = ar::Header::new( b"control.tar".to_vec(), u64::try_from(control_tar.len()).unwrap(), ); archive.append(&header, &control_tar[..]).unwrap(); drop(file); let mut pkg = debpkg::DebPkg::parse(&reader).unwrap(); let control_tar = pkg.control().unwrap(); let control_result = debpkg::Control::extract(control_tar).err().unwrap(); assert_matches!(control_result, debpkg::Error::InvalidControlFile); } #[test] fn xz_utils_parses() { let xz_deb_path = get_deb_path("xz-utils_5.2.4-1_amd64.deb"); let xz_deb = std::fs::File::open(xz_deb_path).unwrap(); let mut pkg = debpkg::DebPkg::parse(xz_deb).unwrap(); let control_tar = pkg.control().unwrap(); let control = debpkg::Control::extract(control_tar).unwrap(); assert!(control.name() == "xz-utils"); let mut data = pkg.data().unwrap(); let dir = tempfile::TempDir::new().unwrap(); data.unpack(dir).unwrap(); drop(data); let (major, minor) = pkg.format_version(); assert!(major == 2); assert!(minor == 0); } #[test] fn libgssglue_utils_parses() { let libgssglue_deb_path = get_deb_path("libgssglue1_0.3-4_amd64.deb"); let libgssglue_deb = std::fs::File::open(libgssglue_deb_path).unwrap(); let mut pkg = debpkg::DebPkg::parse(libgssglue_deb).unwrap(); let control_tar = pkg.control().unwrap(); let control = debpkg::Control::extract(control_tar).unwrap(); assert!(control.name() == "libgssglue1"); assert!(control.version() == "0.3-4"); assert!(control.get("Architecture").unwrap() == "amd64"); assert!(control.get("ARCHitecture").unwrap() == "amd64"); assert!(control.get("BLAH").is_none()); let mut data = pkg.data().unwrap(); let dir = tempfile::TempDir::new().unwrap(); data.unpack(dir).unwrap(); drop(data); let (major, minor) = pkg.format_version(); assert!(major == 2); assert!(minor == 0); }