diff --git a/crates/wasm-metadata/src/rewrite.rs b/crates/wasm-metadata/src/rewrite.rs index 0b0e1ed3bc..50261c7ae4 100644 --- a/crates/wasm-metadata/src/rewrite.rs +++ b/crates/wasm-metadata/src/rewrite.rs @@ -96,70 +96,56 @@ pub(crate) fn rewrite_wasm( if metadata.authors.is_keep() { let authors = crate::Authors::parse_custom_section(c)?; authors.append_to(&mut output); - continue; - } else if metadata.authors.is_clear() { - continue; } + continue; } #[cfg(feature = "oci")] KnownCustom::Unknown if c.name() == "description" => { if metadata.description.is_keep() { let description = crate::Description::parse_custom_section(c)?; description.append_to(&mut output); - continue; - } else if metadata.description.is_clear() { - continue; } + continue; } #[cfg(feature = "oci")] KnownCustom::Unknown if c.name() == "licenses" => { if metadata.licenses.is_keep() { let licenses = crate::Licenses::parse_custom_section(c)?; licenses.append_to(&mut output); - continue; - } else if metadata.licenses.is_clear() { - continue; } + continue; } #[cfg(feature = "oci")] KnownCustom::Unknown if c.name() == "source" => { if metadata.source.is_keep() { let source = crate::Source::parse_custom_section(c)?; source.append_to(&mut output); - continue; - } else if metadata.source.is_clear() { - continue; } + continue; } #[cfg(feature = "oci")] KnownCustom::Unknown if c.name() == "homepage" => { if metadata.homepage.is_keep() { let homepage = crate::Homepage::parse_custom_section(c)?; homepage.append_to(&mut output); - continue; - } else if metadata.homepage.is_clear() { - continue; } + continue; } #[cfg(feature = "oci")] KnownCustom::Unknown if c.name() == "revision" => { if metadata.revision.is_keep() { let revision = crate::Revision::parse_custom_section(c)?; revision.append_to(&mut output); - continue; - } else if metadata.revision.is_clear() { - continue; } + continue; } #[cfg(feature = "oci")] KnownCustom::Unknown if c.name() == "version" => { if metadata.version.is_keep() { let version = crate::Version::parse_custom_section(c)?; version.append_to(&mut output); - continue; - } else if metadata.version.is_clear() { - continue; } + continue; } _ => {} } diff --git a/crates/wasm-metadata/tests/component.rs b/crates/wasm-metadata/tests/component.rs index 04f6619d11..1507569455 100644 --- a/crates/wasm-metadata/tests/component.rs +++ b/crates/wasm-metadata/tests/component.rs @@ -303,7 +303,7 @@ fn add_then_clear_fields() { assert_eq!(dependencies.unwrap().version_info(), &info,); assert_eq!(range.start, 0); - assert_eq!(range.end, 434); + assert_eq!(range.end, 403); } _ => panic!("metadata should be component"), } diff --git a/crates/wasm-metadata/tests/rewrite.rs b/crates/wasm-metadata/tests/rewrite.rs new file mode 100644 index 0000000000..22c5a2bfda --- /dev/null +++ b/crates/wasm-metadata/tests/rewrite.rs @@ -0,0 +1,70 @@ +#![cfg(feature = "oci")] + +use wasm_encoder::{Component, ComponentSectionId, Module, RawSection}; +use wasm_metadata::*; +use wasmparser::{Parser, Payload}; + +fn metadata(value: &str) -> AddMetadata { + let mut add = AddMetadata::default(); + add.authors = AddMetadataField::Set(Authors::new(value.to_owned())); + add.description = AddMetadataField::Set(Description::new(value.to_owned())); + add.licenses = AddMetadataField::Set(Licenses::new(value).unwrap()); + add.source = + AddMetadataField::Set(Source::new(&format!("https://example.com/{value}")).unwrap()); + add.homepage = + AddMetadataField::Set(Homepage::new(&format!("https://example.com/{value}")).unwrap()); + add.revision = AddMetadataField::Set(Revision::new(value.to_owned())); + add.version = AddMetadataField::Set(Version::new(value.to_owned())); + add +} + +fn custom_sections(wasm: &[u8]) -> Vec<(String, Vec)> { + Parser::new(0) + .parse_all(wasm) + .filter_map(|payload| match payload.unwrap() { + Payload::CustomSection(section) => { + Some((section.name().to_owned(), section.data().to_vec())) + } + _ => None, + }) + .collect() +} + +#[test] +fn replace_existing_oci_metadata() { + for empty in [Module::new().finish(), Component::new().finish()] { + let old = metadata("MIT").to_wasm(&empty).unwrap(); + let add = metadata("Apache-2.0"); + let expected = custom_sections(&add.to_wasm(&empty).unwrap()); + assert_eq!(expected.len(), 7); + let replaced = add.to_wasm(&old).unwrap(); + assert_eq!(custom_sections(&replaced), expected); + assert_eq!(custom_sections(&add.to_wasm(&replaced).unwrap()), expected); + assert_eq!(AddMetadata::default().to_wasm(&old).unwrap(), old); + + let mut clear = AddMetadata::default(); + clear.authors = AddMetadataField::Clear; + clear.description = AddMetadataField::Clear; + clear.licenses = AddMetadataField::Clear; + clear.source = AddMetadataField::Clear; + clear.homepage = AddMetadataField::Clear; + clear.revision = AddMetadataField::Clear; + clear.version = AddMetadataField::Clear; + assert_eq!(clear.to_wasm(&old).unwrap(), empty); + } +} + +#[test] +fn replace_oci_metadata_preserves_nested_sections() { + let module = metadata("MIT").to_wasm(&Module::new().finish()).unwrap(); + let mut component = Component::new(); + component.section(&RawSection { + id: ComponentSectionId::CoreModule as u8, + data: &module, + }); + let input = metadata("MIT").to_wasm(&component.finish()).unwrap(); + let output = metadata("Apache-2.0").to_wasm(&input).unwrap(); + let sections = custom_sections(&output); + assert_eq!(§ions[..7], custom_sections(&module)); + assert_eq!(sections.len(), 14); +}