blob: 5d1c4835001285cf114b7b33a274fe747959563a [file] [log] [blame]
#![cfg(all(feature = "local-builder", feature = "sparse"))]
mod utils;
use rayon::prelude::{IndexedParallelIterator, IntoParallelIterator, ParallelIterator};
use tame_index::index::local;
#[test]
fn builds_local_registry() {
let sparse = tame_index::index::RemoteSparseIndex::new(
tame_index::SparseIndex::new(tame_index::IndexLocation::new(
tame_index::IndexUrl::CratesIoSparse,
))
.unwrap(),
reqwest::blocking::Client::new(),
);
let mut mdc = cargo_metadata::MetadataCommand::new();
mdc.features(cargo_metadata::CargoOpt::AllFeatures);
mdc.manifest_path("Cargo.toml");
let md = mdc.exec().expect("failed to gather metadata");
let mut krates = std::collections::BTreeMap::new();
struct IndexPkg {
ik: tame_index::IndexKrate,
versions: Vec<smol_str::SmolStr>,
}
for pkg in &md.packages {
if pkg.name == "tame-index" {
continue;
}
let ip = krates.entry(pkg.name.clone()).or_insert_with(|| {
let ik = sparse
.cached_krate(pkg.name.as_str().try_into().unwrap())
.unwrap()
.unwrap();
IndexPkg {
ik,
versions: Vec::new(),
}
});
ip.versions.push(pkg.version.to_string().into());
}
let client = local::builder::Client::build(reqwest::blocking::ClientBuilder::new()).unwrap();
let lrb_td = utils::tempdir();
let lrb = local::LocalRegistryBuilder::create(lrb_td.path().to_owned()).unwrap();
let config = sparse.index.index_config().unwrap();
krates.into_par_iter().for_each(|(_krate, ipkg)| {
let mut crate_files = Vec::with_capacity(ipkg.versions.len());
ipkg.versions
.into_par_iter()
.map(|vers| {
let iv = ipkg
.ik
.versions
.iter()
.find(|iv| iv.version == vers)
.unwrap();
local::ValidKrate::download(&client, &config, iv).unwrap()
})
.collect_into_vec(&mut crate_files);
lrb.insert(&ipkg.ik, &crate_files).unwrap();
});
let _lr = lrb.finalize(true).unwrap();
// Create a fake project and override the crates.io registry to point to
// the local one we just created, it should get the same metadata
let fake_project = utils::tempdir();
std::fs::copy("Cargo.toml", fake_project.path().join("Cargo.toml")).unwrap();
std::fs::copy("Cargo.lock", fake_project.path().join("Cargo.lock")).unwrap();
let mut config = fake_project.path().join(".cargo");
std::fs::create_dir(&config).unwrap();
config.push("config.toml");
// Windows is terrible
let local_path = lrb_td.path().as_str();
let local_path = local_path.replace('\\', "/");
std::fs::write(
&config,
format!(
r#"
[source.crates-io]
replace-with = "test-registry"
[source.test-registry]
local-registry = "{local_path}""#,
),
)
.unwrap();
// We also need to create a fake lib.rs otherwise cargo will be sad
{
let librs = fake_project.path().join("src/lib.rs");
std::fs::create_dir_all(librs.parent().unwrap()).unwrap();
std::fs::write(librs, "").unwrap();
}
let mut mdc = cargo_metadata::MetadataCommand::new();
mdc.features(cargo_metadata::CargoOpt::AllFeatures);
mdc.manifest_path("Cargo.toml");
// We need to override this otherwise our config won't be picked up
mdc.current_dir(fake_project.path());
// This will fail if we've missed one or more versions in the local registry
mdc.exec().expect("failed to gather metadata");
}
/// Validates we get the correct checksum for a crate
#[test]
fn downloads_and_verifies() {
let client = reqwest::blocking::Client::builder()
.no_gzip()
.build()
.unwrap();
let res = client
.get("https://static.crates.io/crates/wasm-bindgen/wasm-bindgen-0.2.87.crate")
.send()
.unwrap()
.error_for_status()
.unwrap();
let body = res.bytes().unwrap();
use bytes::Buf;
assert!(local::validate_checksum::<{ 16 * 1024 }>(
body.reader(),
&("7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342"
.parse()
.unwrap()),
)
.unwrap());
}