Add unit test and fix problems when installing package

This commit is contained in:
Felix Schütt
2022-10-17 17:58:37 +02:00
parent 68a55c208b
commit a96049884f
2 changed files with 73 additions and 14 deletions

View File

@@ -290,7 +290,8 @@ fn try_lookup_command(sv: &mut SplitVersion) -> Result<PackageDownloadInfo, anyh
} }
fn try_execute_local_package(args: &[String], sv: &SplitVersion) -> Result<(), anyhow::Error> { fn try_execute_local_package(args: &[String], sv: &SplitVersion) -> Result<(), anyhow::Error> {
let package = match wasmer_registry::get_local_package(&sv.package, sv.version.as_deref()) { let package = match wasmer_registry::get_local_package(None, &sv.package, sv.version.as_deref())
{
Some(p) => p, Some(p) => p,
None => return Err(anyhow::anyhow!("no local package {sv:?} found")), None => return Err(anyhow::anyhow!("no local package {sv:?} found")),
}; };
@@ -321,7 +322,7 @@ fn try_autoinstall_package(
) -> Result<(), anyhow::Error> { ) -> Result<(), anyhow::Error> {
let sp = start_spinner(format!("Installing package {} ...", sv.package)); let sp = start_spinner(format!("Installing package {} ...", sv.package));
let v = sv.version.as_deref(); let v = sv.version.as_deref();
let result = wasmer_registry::install_package(&sv.package, v, package, force_install); let result = wasmer_registry::install_package(None, &sv.package, v, package, force_install);
sp.close(); sp.close();
print!("\r\n"); print!("\r\n");
let (package, buf) = match result { let (package, buf) = match result {
@@ -461,7 +462,7 @@ fn split_version(s: &str) -> Result<SplitVersion, anyhow::Error> {
fn print_packages() -> Result<(), anyhow::Error> { fn print_packages() -> Result<(), anyhow::Error> {
use prettytable::{format, row, Table}; use prettytable::{format, row, Table};
let rows = get_all_local_packages() let rows = get_all_local_packages(None)
.into_iter() .into_iter()
.map(|pkg| { .map(|pkg| {
let commands = pkg let commands = pkg

View File

@@ -488,10 +488,13 @@ fn get_all_names_in_dir(dir: &PathBuf) -> Vec<(PathBuf, String)> {
} }
/// Returns a list of all locally installed packages /// Returns a list of all locally installed packages
pub fn get_all_local_packages() -> Vec<LocalPackage> { pub fn get_all_local_packages(registry: Option<&str>) -> Vec<LocalPackage> {
let mut packages = Vec::new(); let mut packages = Vec::new();
let registries = match registry {
for registry in get_all_available_registries().unwrap_or_default() { Some(s) => vec![s.to_string()],
None => get_all_available_registries().unwrap_or_default(),
};
for registry in registries {
let host = match url::Url::parse(&registry) { let host = match url::Url::parse(&registry) {
Ok(o) => o.host_str().map(|s| s.to_string()), Ok(o) => o.host_str().map(|s| s.to_string()),
Err(_) => continue, Err(_) => continue,
@@ -533,8 +536,12 @@ pub fn get_all_local_packages() -> Vec<LocalPackage> {
packages packages
} }
pub fn get_local_package(name: &str, version: Option<&str>) -> Option<LocalPackage> { pub fn get_local_package(
get_all_local_packages() registry: Option<&str>,
name: &str,
version: Option<&str>,
) -> Option<LocalPackage> {
get_all_local_packages(registry)
.iter() .iter()
.find(|p| { .find(|p| {
if p.name != name { if p.name != name {
@@ -744,9 +751,8 @@ pub fn query_available_packages_from_registry(
use crate::graphql::{execute_query, get_packages_query, GetPackagesQuery}; use crate::graphql::{execute_query, get_packages_query, GetPackagesQuery};
use graphql_client::GraphQLQuery; use graphql_client::GraphQLQuery;
let name_query = name.split('/').nth(1).unwrap_or(name);
let q = GetPackagesQuery::build_query(get_packages_query::Variables { let q = GetPackagesQuery::build_query(get_packages_query::Variables {
names: vec![name_query.to_string()], names: vec![name.to_string()],
}); });
let response: get_packages_query::ResponseData = let response: get_packages_query::ResponseData =
@@ -783,7 +789,8 @@ pub fn query_available_packages_from_registry(
.unwrap_or_default() .unwrap_or_default()
.iter() .iter()
.map(|s| s.get_name()) .map(|s| s.get_name())
.collect(), .collect::<Vec<_>>()
.join(", "),
url: v.distribution.download_url.clone(), url: v.distribution.download_url.clone(),
}); });
@@ -823,7 +830,7 @@ pub fn query_package_from_registry(
return false; return false;
} }
if version == Some(&v.version) { if version != Some(&v.version) {
return false; return false;
} }
@@ -896,6 +903,7 @@ pub fn download_and_unpack_targz(url: &str, target_path: &Path) -> Result<PathBu
} }
pub fn install_package( pub fn install_package(
registry: Option<&str>,
name: &str, name: &str,
version: Option<&str>, version: Option<&str>,
package_download_info: Option<PackageDownloadInfo>, package_download_info: Option<PackageDownloadInfo>,
@@ -904,7 +912,10 @@ pub fn install_package(
let package_info = match package_download_info { let package_info = match package_download_info {
Some(s) => s, Some(s) => s,
None => { None => {
let registries = get_all_available_registries()?; let registries = match registry {
Some(s) => vec![s.to_string()],
None => get_all_available_registries()?,
};
let mut url_of_package = None; let mut url_of_package = None;
let mut error_packages = Vec::new(); let mut error_packages = Vec::new();
@@ -993,7 +1004,7 @@ pub fn install_package(
let version = package_info.version; let version = package_info.version;
let name = package_info.package; let name = package_info.package;
if !dir.join("wapm.toml").exists() { if !dir.join("wapm.toml").exists() || force_install {
download_and_unpack_targz(&package_info.url, &dir)?; download_and_unpack_targz(&package_info.url, &dir)?;
} }
let target_path = dir; let target_path = dir;
@@ -1066,3 +1077,50 @@ pub fn get_all_available_registries() -> Result<Vec<String>, String> {
} }
Ok(registries) Ok(registries)
} }
#[test]
fn test_install_package() {
let registry = "https://registry.wapm.io/graphql";
if !test_if_registry_present(registry).unwrap_or(false) {
panic!("registry.wapm.io not reachable, test will fail");
}
let wabt = query_package_from_registry(registry, "wasmer/wabt", Some("1.0.29")).unwrap();
assert_eq!(wabt.registry, registry);
assert_eq!(wabt.package, "wasmer/wabt");
assert_eq!(wabt.version, "1.0.29");
assert_eq!(
wabt.commands,
"wat2wasm, wast2json, wasm2wat, wasm-interp, wasm-validate, wasm-strip"
);
assert_eq!(
wabt.url,
"https://registry-cdn.wapm.io/packages/wasmer/wabt/wabt-1.0.29.tar.gz".to_string()
);
let (package, _) =
install_package(Some(registry), "wasmer/wabt", Some("1.0.29"), None, true).unwrap();
assert_eq!(
package.path,
get_global_install_dir("registry.wapm.io")
.unwrap()
.join("wasmer")
.join("wabt")
.join("1.0.29")
);
let all_installed_packages = get_all_local_packages(Some(registry));
let is_installed = all_installed_packages
.iter()
.any(|p| p.name == "wasmer/wabt" && p.version == "1.0.29");
if !is_installed {
let panic_str = get_all_local_packages(Some(registry))
.iter()
.map(|p| format!("{} {} {}", p.registry, p.name, p.version))
.collect::<Vec<_>>()
.join("\r\n");
panic!("get all local packages: failed to install:\r\n{panic_str}");
}
}