Skip to content

Commit

Permalink
Add tests and highlight issues with should_panic (#654)
Browse files Browse the repository at this point in the history
  • Loading branch information
alfiedotwtf committed Oct 25, 2024
1 parent fea5065 commit 63dbf8e
Show file tree
Hide file tree
Showing 7 changed files with 387 additions and 21 deletions.
19 changes: 10 additions & 9 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ members = ["component", "ci/build-channel", "ci/compare-versions"]

[dev-dependencies]
chrono = "0.4.33"
regex = "1.11"
strip-ansi-escapes = "0.2.0"

[lints.clippy]
Expand Down
110 changes: 110 additions & 0 deletions component/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ impl Component {
&& name != FORC)
|| name == FORC_CLIENT
}

pub fn is_in_same_distribution(forc: &Component, component: &Component) -> bool {
component.repository_name == forc.repository_name
&& component.tarball_prefix == forc.tarball_prefix
}
}

#[derive(Debug)]
Expand Down Expand Up @@ -253,4 +258,109 @@ mod tests {
fn test_collect_plugin_executables() {
assert!(Components::collect_plugin_executables().is_ok());
}

#[test]
fn test_from_name_forc() {
let component = Component::from_name(FORC).unwrap();
assert_eq!(component.name, FORC, "forc is a publishable component");
}

#[test]
fn test_from_name_publishables() {
for publishable in Components::collect_publishables().unwrap() {
let component = Component::from_name(&publishable.name).unwrap();
assert_eq!(
component.name, publishable.name,
"{} is a publishable component",
publishable.name
);
}
}

#[test]
fn test_from_name_plugins() {
for plugin in Components::collect_plugins().unwrap() {
let component = Component::from_name(&plugin.name).unwrap();
assert_eq!(
component.name, plugin.name,
"{} is a plugin in {}",
plugin.name, component.name
);
}
}

// This currently panics because resolving the component from the executable
// is incorrect for some executables
#[test]
#[should_panic]
fn test_from_name_executables() {
for executable in &Components::collect_plugin_executables().unwrap() {
let component = Component::from_name(executable).unwrap();
assert!(
component.executables.contains(executable),
"{} is an executable in {}",
executable,
component.name
);
}
}

#[test]
fn test_is_distributed_by_forc_forc() {
assert!(
Components::is_distributed_by_forc("forc"),
"forc is distributed by forc"
);
}

#[test]
fn test_is_distributed_by_forc_publishables() {
for publishable in Components::collect_publishables().unwrap() {
let component = Component::from_name(&publishable.name).unwrap();
is_distributed_by_forc(&component);
}
}

#[test]
#[should_panic] // TODO: #654 will fix this
fn test_is_distributed_by_forc_plugins() {
for plugin in Components::collect_plugins().unwrap() {
let component = Component::from_name(&plugin.name).unwrap();
is_distributed_by_forc(&component);
}
}

#[test]
#[should_panic] // TODO: #654 will fix this
fn test_is_distributed_by_forc_executables() {
for executable in Components::collect_plugin_executables().unwrap() {
let components = Components::collect().unwrap();
let component = components
.component
.values()
.find(|c| c.executables.contains(&executable))
.unwrap();

is_distributed_by_forc(component);
}
}

fn is_distributed_by_forc(component: &Component) {
let forc = Component::from_name(FORC).unwrap();
let is_distributed = Components::is_distributed_by_forc(&component.name);

if Component::is_in_same_distribution(&forc, component) {
assert!(
is_distributed,
"{:?} is distributed by forc",
component.name
)
} else {
assert!(
!is_distributed,
"{:?} is not distributed by forc",
component.name
)
}
}
}
67 changes: 67 additions & 0 deletions src/target_triple.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,3 +90,70 @@ impl TargetTriple {
}
}
}

#[cfg(test)]
mod test_from_component {
use super::*;
use component::{Component, Components};
use regex::Regex;

#[test]
fn forc() {
let component = Component::from_name("forc").unwrap();
let target_triple = TargetTriple::from_component(&component.name).unwrap();
test_target_triple(&component, &target_triple);
}

#[test]
fn publishables() {
for publishable in Components::collect_publishables().unwrap() {
let component = Component::from_name(&publishable.name).unwrap();
let target_triple = TargetTriple::from_component(&component.name).unwrap();
test_target_triple(&component, &target_triple);
}
}

#[test]
#[should_panic] // TODO: #654 will fix this
fn plugins() {
for plugin in Components::collect_plugins().unwrap() {
let component = Component::from_name(&plugin.name).unwrap();
let target_triple = TargetTriple::from_component(&component.name).unwrap();
test_target_triple(&component, &target_triple);
}
}

#[test]
#[should_panic] // TODO: #654 will fix this
fn executables() {
for executable in Components::collect_plugin_executables().unwrap() {
let components = Components::collect().unwrap();
let component = components
.component
.values()
.find(|c| c.executables.contains(&executable))
.unwrap();

let target_triple = TargetTriple::from_component(&component.name).unwrap();
test_target_triple(component, &target_triple);
}
}

fn test_target_triple(component: &Component, target_triple: &TargetTriple) {
let forc = Component::from_name("forc").unwrap();

let expected_triple_regex = if Component::is_in_same_distribution(&forc, component) {
"^(darwin|linux)_(arm64|amd64)$"
} else {
"^(aarch64|x86_64)-(apple|unknown)-(darwin|linux-gnu)$"
};

let expected_triple = Regex::new(expected_triple_regex).unwrap();
assert!(
expected_triple.is_match(&target_triple.0),
"{} has triple '{}'",
component.name,
&target_triple.0
);
}
}
8 changes: 4 additions & 4 deletions src/toolchain_override.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,27 +21,27 @@ use tracing::{info, warn};
// additional info to OverrideCfg (representation of 'fuel-toolchain.toml').
// In this case, we want the path to the toml file. More info might be
// needed in future.
#[derive(Debug, Deserialize, Serialize)]
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct ToolchainOverride {
pub cfg: OverrideCfg,
pub path: PathBuf,
}

// Representation of the entire 'fuel-toolchain.toml'.
#[derive(Debug, Deserialize, Serialize)]
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct OverrideCfg {
pub toolchain: ToolchainCfg,
pub components: Option<HashMap<String, Version>>,
}

// Represents the [toolchain] table in 'fuel-toolchain.toml'.
#[derive(Debug, Deserialize)]
#[derive(Clone, Debug, Deserialize)]
pub struct ToolchainCfg {
#[serde(deserialize_with = "deserialize_channel")]
pub channel: Channel,
}

#[derive(Debug, Deserialize, Serialize)]
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Channel {
pub name: String,
pub date: Option<Date>,
Expand Down
Loading

0 comments on commit 63dbf8e

Please sign in to comment.