mod cache {
use std::collections::HashMap;
use std::fmt::Write as _;
use cxx::{CxxVector, UniquePtr};
use rust_apt::cache::*;
use rust_apt::raw::{IntoRawIter, ItemDesc, create_acquire};
use rust_apt::util::*;
use rust_apt::{DepType, new_cache};
#[test]
fn auto_removeable() {
let cache = new_cache!().unwrap();
let sort = PackageSort::default().auto_removable().names();
for pkg in cache.packages(&sort) {
println!("{}", pkg.name())
}
}
#[test]
fn manually_installed() {
let cache = new_cache!().unwrap();
let sort = PackageSort::default().manually_installed().names();
for pkg in cache.packages(&sort) {
println!("{}", pkg.name())
}
}
#[test]
fn time_cache_iter() {
let cache = new_cache!().unwrap();
let sort = PackageSort::default().include_virtual();
use std::time::Instant;
let now = Instant::now();
dbg!(cache.packages(&sort).count());
let elapsed = now.elapsed();
println!("Elapsed: {:.2?}", elapsed);
let now = Instant::now();
dbg!(cache.iter().count());
let elapsed = now.elapsed();
println!("Elapsed: {:.2?}", elapsed);
let now = Instant::now();
dbg!(unsafe { cache.begin().raw_iter().count() });
let elapsed = now.elapsed();
println!("Elapsed: {:.2?}", elapsed);
}
#[test]
fn with_debs() {
let cache = new_cache!(&[
"tests/files/cache/apt.deb",
"tests/files/cache/dep-pkg1_0.0.1.deb",
])
.unwrap();
cache.get("apt").unwrap().get_version("5000:1.0.0").unwrap();
cache.get("dep-pkg1").unwrap();
assert!(new_cache!(&["tests/files/this-file-doesnt-exist.deb"]).is_err());
assert!(new_cache!(&["tests/files/cache/pkg.deb"]).is_err());
}
#[test]
fn with_packages() {
let cache = new_cache!(&["tests/files/cache/Packages",]).unwrap();
cache.get("apt").unwrap().get_version("5000:1.0.0").unwrap();
cache.get("broken-or-dep").unwrap();
cache.get("dep-pkg1").unwrap().get_version("0.0.1").unwrap();
cache.get("dep-pkg1").unwrap().get_version("0.0.2").unwrap();
cache.get("dep-pkg2").unwrap();
cache.get("no-description").unwrap();
assert!(new_cache!(&["tests/files/cache/Packages.gz"]).is_err());
}
#[test]
fn empty_deps() {
let cache = new_cache!().unwrap();
let sort = PackageSort::default();
for pkg in cache.packages(&sort) {
for version in pkg.versions() {
version.depends_map();
}
}
}
#[test]
fn parent_pkg() {
let cache = new_cache!().unwrap();
let pkg = cache.get("apt").unwrap();
let version = pkg.versions().next().unwrap();
let parent = version.parent();
assert_eq!(pkg.index(), parent.index())
}
#[test]
fn get_version() {
let cache = new_cache!().unwrap();
let pkg = cache.get("apt").unwrap();
let cand = pkg.candidate().unwrap();
assert!(pkg.get_version(cand.version()).is_some());
assert!(pkg.get_version("9.0.0.1").is_none());
}
#[test]
fn all_packages() {
let cache = new_cache!().unwrap();
let sort = PackageSort::default();
assert!(cache.packages(&sort).next().is_some());
for pkg in cache.packages(&sort) {
println!("{}:{}", pkg.name(), pkg.arch())
}
}
#[test]
fn descriptions() {
let cache = new_cache!(&["tests/files/cache/Packages"]).unwrap();
let pkg = cache.get("dep-pkg1").unwrap();
let cand = pkg.candidate().unwrap();
let summary = cand.summary().unwrap();
let description = cand.description().unwrap();
assert_ne!(summary, description);
}
#[test]
fn no_description() {
let cache = new_cache!(&["tests/files/cache/no-description_0.0.1.deb"]).unwrap();
let pkg = cache.get("no-description").unwrap();
let cand = pkg.candidate().unwrap();
if let Some(desc) = cand.description() {
println!("{desc}");
}
}
#[test]
fn version_uris() {
let cache = new_cache!().unwrap();
let pkg = cache.get("apt").unwrap();
let cand = pkg.candidate().unwrap();
assert!(cand.uris().next().is_some());
dbg!(cand.uris().collect::<Vec<_>>());
}
#[test]
fn depcache_marked() {
let cache = new_cache!().unwrap();
let pkg = cache.get("apt").unwrap();
assert!(!pkg.marked_install());
assert!(!pkg.marked_upgrade());
assert!(!pkg.marked_delete());
assert!(pkg.marked_keep());
assert!(!pkg.marked_downgrade());
assert!(!pkg.marked_reinstall());
assert!(!pkg.is_now_broken());
assert!(!pkg.is_inst_broken());
}
#[test]
fn hashes() {
let cache = new_cache!().unwrap();
let pkg = cache.get("apt").unwrap();
let version = pkg.candidate().unwrap();
assert!(version.sha256().is_some());
assert!(version.hash("sha256").is_some());
assert!(version.sha512().is_none());
assert!(version.hash("md5sum").is_some());
assert!(version.hash("sha1").is_none())
}
#[test]
fn shortname() {
let cache = new_cache!().unwrap();
let sort = PackageSort::default();
for pkg in cache.packages(&sort) {
assert!(!pkg.name().contains(':'))
}
}
#[test]
fn depends() {
let cache = new_cache!().unwrap();
let pkg = cache.get("apt").unwrap();
let cand = pkg.candidate().unwrap();
for deps in cand.dependencies().unwrap() {
for dep in deps.iter() {
assert!(!dep.all_targets().is_empty());
}
}
assert!(cand.recommends().is_some());
assert!(cand.suggests().is_some());
assert!(cand.get_depends(&DepType::Replaces).is_some());
assert!(cand.get_depends(&DepType::DpkgBreaks).is_some());
let mut dep_str = String::new();
dep_str.push_str("Depends: ");
dbg!(cand.depends_map().get(&DepType::Depends).unwrap());
for dep in cand.depends_map().get(&DepType::Depends).unwrap() {
if dep.is_or() {
let mut or_str = String::new();
let total = dep.len() - 1;
for (num, base_dep) in dep.iter().enumerate() {
or_str.push_str(base_dep.name());
if let Some(comp) = base_dep.comp_type() {
let _ = write!(or_str, "({} {})", comp, base_dep.version().unwrap());
}
if num != total {
or_str.push_str(" | ");
} else {
or_str.push_str(", ");
}
}
dep_str.push_str(&or_str)
} else {
let lone_dep = dep.first();
dep_str.push_str(lone_dep.name());
if let Some(comp) = lone_dep.comp_type() {
let _ = write!(dep_str, " ({} {})", comp, lone_dep.version().unwrap());
}
dep_str.push_str(", ");
}
}
println!("{dep_str}");
}
#[test]
fn test_hashmap() {
let cache = new_cache!().unwrap();
#[allow(clippy::mutable_key_type)]
let mut pkg_map = HashMap::new();
#[allow(clippy::mutable_key_type)]
let mut ver_map = HashMap::new();
let sort = PackageSort::default();
for pkg in cache.packages(&sort) {
let value = pkg.arch().to_string();
pkg_map.insert(pkg, value);
}
for (pkg, _arch) in pkg_map.iter() {
if let Some(cand) = pkg.candidate() {
let value = cand.arch().to_string();
ver_map.insert(cand, value);
}
}
}
#[test]
fn debug_interfaces() {
let cache = new_cache!().unwrap();
let pkg = cache.get("apt").unwrap();
println!("{pkg:?}");
println!("{pkg:#?}");
let cand = pkg.candidate().unwrap();
println!("{cand:?}");
println!("{cand:#?}");
for dep_vec in cand.depends_map().values() {
for dep in dep_vec {
println!("{dep:#?}");
}
}
let pkg = cache.get("python3:any").unwrap();
for provider in pkg.provides() {
println!("{provider:#?}")
}
}
#[test]
fn display_interfaces() {
let cache = new_cache!().unwrap();
let pkg = cache.get("apt").unwrap();
println!("{pkg}");
let cand = pkg.candidate().unwrap();
println!("{cand}");
for dep_vec in cand.depends_map().values() {
for dep in dep_vec {
println!("{dep}");
}
}
let pkg = cache.get("python3:any").unwrap();
for provider in pkg.provides() {
println!("{provider}")
}
}
#[test]
fn parent_dep() {
let cache = new_cache!().unwrap();
let sort = PackageSort::default();
for pkg in cache.packages(&sort) {
for deps in pkg.rdepends().values() {
for dep in deps {
let base_dep = dep.first();
base_dep.version().unwrap();
}
}
if let Some(cand) = pkg.candidate() {
if let Some(deps) = cand.dependencies() {
for dep in &deps {
let base_dep = dep.first();
base_dep.version();
}
}
}
}
}
#[test]
fn provides_list() {
let cache = new_cache!().unwrap();
let pkg = cache.get("apt").unwrap();
let cand = pkg.candidate().unwrap();
let provides_list: Vec<_> = cand.provides().collect();
assert!(provides_list.len() == 1);
let provide = provides_list.first().unwrap();
assert!(provide.name() == "apt-transport-https");
assert!(provide.version_str().unwrap() == cand.version());
}
#[test]
fn rev_provides_list() {
let cache = new_cache!(&["tests/files/cache/Packages"]).unwrap();
let dep_pkg = cache.get("dep-pkg1").unwrap();
let dep_ver = dep_pkg.candidate().unwrap();
let virt = cache.get("rust-apt-test-virtual").unwrap();
{
let mut providers = virt.provides().filter(|p| match p.version_str() {
Err(_) => false,
Ok(version) => version == dep_ver.version(),
});
let provider = providers.next().unwrap();
assert!(providers.next().is_none());
assert_eq!(provider.package().name(), "dep-pkg1");
assert_eq!(provider.version_str().unwrap(), dep_ver.version());
}
{
let mut providers = virt.provides().filter(|p| match p.version_str() {
Err(_) => false,
Ok(version) => version == "50000000000.0.0",
});
assert!(providers.next().is_none());
}
}
#[test]
fn sources() {
let cache = new_cache!().unwrap();
let uris: UniquePtr<CxxVector<ItemDesc>>;
let acquire = unsafe { create_acquire() };
cache.get_indexes(&acquire);
uris = unsafe { acquire.uris() };
assert!(!uris.is_empty());
for item in uris.iter() {
println!("{} = {}", item.uri(), item.owner().dest_file())
}
}
#[test]
fn cache_count() {
let cache = new_cache!().unwrap();
match cache.depcache().disk_size() {
DiskSpace::Require(num) => {
assert_eq!(num, 0);
},
DiskSpace::Free(num) => {
panic!("Whoops it should be 0, not {num}.");
},
}
}
#[test]
fn test_unit_str() {
let testcase = [
(1649267441664_u64, "1.50 TiB", "1.65 TB"),
(1610612736_u64, "1.50 GiB", "1.61 GB"),
(1572864_u64, "1.50 MiB", "1.57 MB"),
(1536_u64, "1.50 KiB", "1.54 KB"),
(1024_u64, "1024 B", "1.02 KB"),
(1_u64, "1 B", "1 B"),
];
for (num, binary, decimal) in testcase {
assert_eq!(binary, unit_str(num, NumSys::Binary));
assert_eq!(decimal, unit_str(num, NumSys::Decimal));
}
}
#[test]
fn version_comparisons() {
let cache = new_cache!().unwrap();
let apt = cache.get("apt").unwrap();
let dpkg = cache.get("dpkg").unwrap();
let apt_ver = apt.candidate().unwrap();
let dpkg_ver = dpkg.candidate().unwrap();
assert!(apt_ver > dpkg_ver);
assert!(dpkg_ver < apt_ver);
assert!(apt_ver != dpkg_ver);
}
#[test]
fn good_resolution() {
let cache = new_cache!(&["tests/files/cache/Packages"]).unwrap();
let pkg = cache.get("dep-pkg2").unwrap();
pkg.mark_install(true, true);
pkg.protect();
cache.resolve(false).unwrap();
let dep = cache.get("dep-pkg1").unwrap();
assert!(dep.marked_install());
assert_eq!(dep.install_version().unwrap().version(), "0.0.2");
}
#[test]
fn depcache_clear() {
let cache = new_cache!().unwrap();
let pkg = cache.get("apt").unwrap();
pkg.mark_delete(true);
assert!(pkg.marked_delete());
cache.depcache().clear_marked().unwrap();
assert!(!pkg.marked_delete());
}
#[test]
fn origins() {
let cache = new_cache!().unwrap();
let apt = cache.get("apt").unwrap();
let apt_ver = apt.candidate().unwrap();
let pkg_files = apt_ver.package_files().collect::<Vec<_>>();
assert!(!pkg_files.is_empty());
for pkg_file in pkg_files {
assert!(pkg_file.filename().is_some());
assert!(pkg_file.archive().is_some());
println!("{}", pkg_file.filename().unwrap());
if pkg_file.is_downloadable() {
assert!(pkg_file.origin().is_some());
assert!(pkg_file.codename().is_some());
assert!(pkg_file.label().is_some());
assert!(pkg_file.site().is_some());
assert!(pkg_file.arch().is_some());
}
assert!(pkg_file.component().is_some());
assert!(pkg_file.index_type().is_some());
assert_ne!(pkg_file.index(), 0);
assert!(pkg_file.index_file().is_trusted());
}
}
#[test]
fn depcache_install_ver() {
let cache = new_cache!(&[
"tests/files/cache/dep-pkg1_0.0.1.deb",
"tests/files/cache/dep-pkg1_0.0.2.deb",
])
.unwrap();
let pkg = cache.get("dep-pkg1").unwrap();
pkg.mark_install(false, false);
assert!(pkg.installed().is_none());
let install_ver = pkg.install_version().unwrap();
assert!(install_ver.version() == "0.0.2");
let old_ver = pkg.get_version("0.0.1").unwrap();
old_ver.set_candidate();
pkg.mark_install(false, false);
let install_ver = pkg.install_version().unwrap();
assert!(install_ver.version() == "0.0.1");
}
#[test]
fn broken_pkgs() {
let cache = new_cache!(&["tests/files/cache/broken-or-dep_0.0.1.deb"]).unwrap();
let pkg = cache.get("broken-or-dep").unwrap();
pkg.protect();
pkg.mark_install(false, true);
let expected = concat!(
" broken-or-dep : Depends: not-exist (>= 3.6.1) but it is not installable or\n",
" really-not-exist but it is not installable\n",
" Depends: python3-not-exist but it is not installable\n",
);
let err = cache.resolve(false).unwrap_err();
for pkg in cache.iter() {
if let Some(broken) = show_broken_pkg(&cache, &pkg, false) {
assert_eq!(broken, expected);
println!("{broken}");
}
}
println!("{err}");
}
}