Skip to content

Commit

Permalink
Add tests for LayerSpec::replace_template_vars.
Browse files Browse the repository at this point in the history
  • Loading branch information
nfachan committed Jan 1, 2025
1 parent ac945f9 commit 23b1428
Showing 1 changed file with 116 additions and 43 deletions.
159 changes: 116 additions & 43 deletions crates/maelstrom-client-base/src/spec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1027,44 +1027,6 @@ enum LayerSpecType {
SharedLibraryDependencies,
}

impl<'de> Deserialize<'de> for LayerSpec {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let content = Content::deserialize(deserializer)?;
let Content::Map(fields) = &content else {
return Err(D::Error::custom(
"expected a map in order to parse a layer specification",
));
};
let Some(kind) = fields.iter().find_map(|(key, _)| {
key.as_str().and_then(|field| match field {
"tar" => Some(LayerSpecType::Tar),
"glob" => Some(LayerSpecType::Glob),
"paths" => Some(LayerSpecType::Paths),
"stubs" => Some(LayerSpecType::Stubs),
"symlinks" => Some(LayerSpecType::Symlinks),
"shared_library_dependencies" => Some(LayerSpecType::SharedLibraryDependencies),
_ => None,
})
}) else {
return Err(D::Error::custom("couldn't determine layer type"));
};
let deserializer = ContentRefDeserializer::<D::Error>::new(&content);
match kind {
LayerSpecType::Tar => TarLayerSpec::deserialize(deserializer).map(Self::Tar),
LayerSpecType::Glob => GlobLayerSpec::deserialize(deserializer).map(Self::Glob),
LayerSpecType::Paths => PathsLayerSpec::deserialize(deserializer).map(Self::Paths),
LayerSpecType::Stubs => StubsLayerSpec::deserialize(deserializer).map(Self::Stubs),
LayerSpecType::Symlinks => {
SymlinksLayerSpec::deserialize(deserializer).map(Self::Symlinks)
}
LayerSpecType::SharedLibraryDependencies => {
SharedLibraryDependenciesLayerSpec::deserialize(deserializer)
.map(Self::SharedLibraryDependencies)
}
}
}
}

#[derive(
Clone,
Debug,
Expand Down Expand Up @@ -1245,6 +1207,44 @@ macro_rules! shared_library_dependencies_layer_spec {
};
}

impl<'de> Deserialize<'de> for LayerSpec {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let content = Content::deserialize(deserializer)?;
let Content::Map(fields) = &content else {
return Err(D::Error::custom(
"expected a map in order to parse a layer specification",
));
};
let Some(kind) = fields.iter().find_map(|(key, _)| {
key.as_str().and_then(|field| match field {
"tar" => Some(LayerSpecType::Tar),
"glob" => Some(LayerSpecType::Glob),
"paths" => Some(LayerSpecType::Paths),
"stubs" => Some(LayerSpecType::Stubs),
"symlinks" => Some(LayerSpecType::Symlinks),
"shared_library_dependencies" => Some(LayerSpecType::SharedLibraryDependencies),
_ => None,
})
}) else {
return Err(D::Error::custom("couldn't determine layer type"));
};
let deserializer = ContentRefDeserializer::<D::Error>::new(&content);
match kind {
LayerSpecType::Tar => TarLayerSpec::deserialize(deserializer).map(Self::Tar),
LayerSpecType::Glob => GlobLayerSpec::deserialize(deserializer).map(Self::Glob),
LayerSpecType::Paths => PathsLayerSpec::deserialize(deserializer).map(Self::Paths),
LayerSpecType::Stubs => StubsLayerSpec::deserialize(deserializer).map(Self::Stubs),
LayerSpecType::Symlinks => {
SymlinksLayerSpec::deserialize(deserializer).map(Self::Symlinks)
}
LayerSpecType::SharedLibraryDependencies => {
SharedLibraryDependenciesLayerSpec::deserialize(deserializer)
.map(Self::SharedLibraryDependencies)
}
}
}
}

impl LayerSpec {
pub fn replace_template_vars(&mut self, vars: &TemplateVars) -> Result<()> {
match self {
Expand Down Expand Up @@ -3062,12 +3062,85 @@ mod tests {
}
}

/*
#[test]
fn replace_template_vars() {
assert!(false);
mod replace_template_vars {
use super::*;

#[track_caller]
fn replace_template_vars_test(toml: &str, expected: LayerSpec) {
let mut actual: LayerSpec = parse_toml(toml);
actual
.replace_template_vars(&TemplateVars::new([
("foo", "foo-value"),
("bar", "bar-value"),
]))
.unwrap();
assert_eq!(actual, expected);
}

#[test]
fn tar() {
replace_template_vars_test(
indoc! {r#"
tar = "<foo>/<bar>/baz.tar"
"#},
tar_layer_spec!("foo-value/bar-value/baz.tar"),
);
}

#[test]
fn glob() {
replace_template_vars_test(
indoc! {r#"
glob = "<foo>/<bar>/*.tar"
strip_prefix = "<foo>/"
prepend_prefix = "<bar>/"
"#},
glob_layer_spec! {
"foo-value/bar-value/*.tar",
strip_prefix: "<foo>/",
prepend_prefix: "<bar>/",
},
);
}

#[test]
fn paths() {
replace_template_vars_test(
indoc! {r#"
paths = ["<foo>/foo.tar", "<bar>/bar.tar"]
strip_prefix = "<foo>/"
prepend_prefix = "<bar>/"
"#},
paths_layer_spec! {
["foo-value/foo.tar", "bar-value/bar.tar"],
strip_prefix: "<foo>/",
prepend_prefix: "<bar>/",
},
);
}

#[test]
fn stubs() {
replace_template_vars_test(
indoc! {r#"
stubs = ["<foo>/foo/", "<bar>/bar/"]
"#},
stubs_layer_spec!(["foo-value/foo/", "bar-value/bar/"]),
);
}

#[test]
fn symlinks() {
replace_template_vars_test(
indoc! {r#"
symlinks = [ { link = "<foo>/symlink", target = "<bar>/target"} ]
"#},
symlinks_layer_spec!([
symlink_spec!("foo-value/symlink" => "bar-value/target")
]),
);
}
}
*/
}

mod container_spec {
Expand Down

0 comments on commit 23b1428

Please sign in to comment.