blob: 56454c0801020313f9094d3e50b3b75204520b14 [file] [log] [blame]
mod utils;
use tame_index::{index::cache::ValidCacheEntry, utils::get_index_details, IndexCache};
/// Validates that we can parse the current version of cache entries emitted by
/// cargo by reading the cache entry that should be there for one of this crate's
/// dependencies. This test should only fail if you have built the crate, wiped
/// the crates.io cache, then run the test executable without using cargo. If
/// you do that, that is your fault.
#[test]
fn parses_current_cargo_cache() {
let (path, _url) = get_index_details(tame_index::CRATES_IO_HTTP_INDEX, None).unwrap();
let cache = IndexCache::at_path(path);
let lock = &utils::unlocked();
let cached = cache
.read_cache_file("camino".try_into().unwrap(), lock)
.expect("failed to read cache file")
.expect("cache file not found");
let vce = ValidCacheEntry::read(&cached)
.expect("failed to parse cargo cache file, we might need to update this crate");
assert!(
vce.revision.starts_with("etag:"),
"cargo rarely/never writes anything but etag revisions to the cache"
);
let camino = vce
.to_krate(None)
.expect("failed to parse cache entry")
.unwrap();
// The initial version of camino used by this crate, this version will _always_
// exist in the index, even if it yanked in the future, and is otherwise immutable
let camino_version = camino
.versions
.iter()
.find(|iv| iv.version == "1.1.4")
.expect("failed to find expected version");
assert_eq!(
"c530edf18f37068ac2d977409ed5cd50d53d73bc653c7647b48eb78976ac9ae2",
camino_version.checksum.to_string()
);
}
/// Validates we can write cache files the exact same as the current version of cargo
#[test]
fn serializes_current_cargo_cache() {
let (path, _url) = get_index_details(tame_index::CRATES_IO_HTTP_INDEX, None).unwrap();
let cache = IndexCache::at_path(path);
let lock = &utils::unlocked();
let cargos = cache
.read_cache_file("camino".try_into().unwrap(), lock)
.expect("failed to read cache file")
.expect("cache file not found");
let cargo_ce = ValidCacheEntry::read(&cargos)
.expect("failed to parse cargo cache file, we might need to update this crate");
let cargos_krate = cargo_ce.to_krate(None).unwrap().unwrap();
let mut ours = Vec::new();
cargos_krate
.write_cache_entry(&mut ours, cargo_ce.revision)
.expect("failed to write");
let our_ce = ValidCacheEntry::read(&ours).expect("failed to parse our cache file");
assert_eq!(cargo_ce.revision, our_ce.revision);
assert_eq!(cargo_ce.version_entries, our_ce.version_entries);
}