311 lines
12 KiB
Rust
311 lines
12 KiB
Rust
use std::{str::FromStr, vec};
|
|
|
|
use auditable_serde::VersionInfo;
|
|
use wasm_encoder::{Component, Module};
|
|
use wasm_metadata::*;
|
|
|
|
#[test]
|
|
fn add_to_empty_component() {
|
|
let mut add = AddMetadata::default();
|
|
add.name = AddMetadataField::Set("foo".to_owned());
|
|
add.language = vec![("bar".to_owned(), "1.0".to_owned())];
|
|
add.processed_by = vec![("baz".to_owned(), "1.0".to_owned())];
|
|
add.sdk = vec![];
|
|
add.authors = AddMetadataField::Set(Authors::new("Chashu Cat"));
|
|
add.description = AddMetadataField::Set(Description::new("Chashu likes tuna"));
|
|
add.licenses = AddMetadataField::Set(
|
|
Licenses::new("Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT").unwrap(),
|
|
);
|
|
add.source = AddMetadataField::Set(
|
|
Source::new("https://github.com/bytecodealliance/wasm-tools").unwrap(),
|
|
);
|
|
add.homepage = AddMetadataField::Set(
|
|
Homepage::new("https://github.com/bytecodealliance/wasm-tools").unwrap(),
|
|
);
|
|
add.revision = AddMetadataField::Set(Revision::new("de978e17a80c1118f606fce919ba9b7d5a04a5ad"));
|
|
add.version = AddMetadataField::Set(Version::new("1.0.0"));
|
|
|
|
let json_str = r#"{"packages":[{"name":"adler","version":"0.2.3","source":"registry"}]}"#;
|
|
let info = VersionInfo::from_str(json_str).unwrap();
|
|
let mut component = Component::new();
|
|
component.section(&Dependencies::new(info.clone()));
|
|
let component = component.finish();
|
|
let component = add.to_wasm(&component).unwrap();
|
|
|
|
match Payload::from_binary(&component).unwrap() {
|
|
Payload::Component {
|
|
children,
|
|
metadata:
|
|
Metadata {
|
|
name,
|
|
producers,
|
|
authors,
|
|
description,
|
|
licenses,
|
|
source,
|
|
range,
|
|
homepage,
|
|
revision,
|
|
version,
|
|
dependencies,
|
|
},
|
|
} => {
|
|
assert!(children.is_empty());
|
|
assert_eq!(name, Some("foo".to_owned()));
|
|
let producers = producers.expect("some producers");
|
|
assert_eq!(
|
|
producers.get("language").unwrap().get("bar").unwrap(),
|
|
"1.0"
|
|
);
|
|
assert_eq!(
|
|
producers.get("processed-by").unwrap().get("baz").unwrap(),
|
|
"1.0"
|
|
);
|
|
|
|
assert_eq!(authors.unwrap(), Authors::new("Chashu Cat"));
|
|
assert_eq!(description.unwrap(), Description::new("Chashu likes tuna"));
|
|
assert_eq!(
|
|
licenses.unwrap(),
|
|
Licenses::new("Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT").unwrap()
|
|
);
|
|
assert_eq!(
|
|
source.unwrap(),
|
|
Source::new("https://github.com/bytecodealliance/wasm-tools").unwrap(),
|
|
);
|
|
assert_eq!(
|
|
homepage.unwrap(),
|
|
Homepage::new("https://github.com/bytecodealliance/wasm-tools").unwrap(),
|
|
);
|
|
assert_eq!(
|
|
revision.unwrap(),
|
|
Revision::new("de978e17a80c1118f606fce919ba9b7d5a04a5ad")
|
|
);
|
|
assert_eq!(version.unwrap(), Version::new("1.0.0"));
|
|
assert_eq!(dependencies.unwrap().version_info(), &info,);
|
|
|
|
assert_eq!(range.start, 0);
|
|
assert_eq!(range.end, 465);
|
|
}
|
|
_ => panic!("metadata should be component"),
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn add_to_nested_component() {
|
|
// Create the same old module, stick some metadata into it
|
|
let mut add = AddMetadata::default();
|
|
add.name = AddMetadataField::Set("foo".to_owned());
|
|
add.language = vec![("bar".to_owned(), "1.0".to_owned())];
|
|
add.processed_by = vec![("baz".to_owned(), "1.0".to_owned())];
|
|
add.sdk = vec![];
|
|
add.authors = AddMetadataField::Set(Authors::new("Chashu Cat"));
|
|
add.description = AddMetadataField::Set(Description::new("Chashu likes tuna"));
|
|
add.licenses = AddMetadataField::Set(
|
|
Licenses::new("Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT").unwrap(),
|
|
);
|
|
add.source = AddMetadataField::Set(
|
|
Source::new("https://github.com/bytecodealliance/wasm-tools").unwrap(),
|
|
);
|
|
add.homepage = AddMetadataField::Set(
|
|
Homepage::new("https://github.com/bytecodealliance/wasm-tools").unwrap(),
|
|
);
|
|
add.revision = AddMetadataField::Set(Revision::new("de978e17a80c1118f606fce919ba9b7d5a04a5ad"));
|
|
add.version = AddMetadataField::Set(Version::new("1.0.0"));
|
|
|
|
let json_str = r#"{"packages":[{"name":"adler","version":"0.2.3","source":"registry"}]}"#;
|
|
let info = VersionInfo::from_str(json_str).unwrap();
|
|
let mut component = Module::new();
|
|
component.section(&Dependencies::new(info.clone()));
|
|
let module = component.finish();
|
|
let module = add.to_wasm(&module).unwrap();
|
|
|
|
// Stick that module inside a component.
|
|
let mut component = wasm_encoder::Component::new();
|
|
component.section(&wasm_encoder::RawSection {
|
|
id: wasm_encoder::ComponentSectionId::CoreModule.into(),
|
|
data: &module,
|
|
});
|
|
|
|
let component = component.finish();
|
|
|
|
// Add some different metadata to the component.
|
|
let mut add = AddMetadata::default();
|
|
add.name = AddMetadataField::Set("gussie".to_owned());
|
|
add.sdk = vec![("willa".to_owned(), "sparky".to_owned())];
|
|
let component = add.to_wasm(&component).unwrap();
|
|
|
|
match Payload::from_binary(&component).unwrap() {
|
|
Payload::Component {
|
|
children,
|
|
metadata: Metadata {
|
|
name, producers, ..
|
|
},
|
|
} => {
|
|
// Check that the component metadata is in the component
|
|
assert_eq!(name, Some("gussie".to_owned()));
|
|
let producers = producers.as_ref().expect("some producers");
|
|
assert_eq!(
|
|
producers.get("sdk").unwrap().get("willa").unwrap(),
|
|
&"sparky".to_owned()
|
|
);
|
|
// Check that there is a single child with the metadata set for the module
|
|
assert_eq!(children.len(), 1);
|
|
|
|
match children.get(0).unwrap() {
|
|
Payload::Module(Metadata {
|
|
name,
|
|
producers,
|
|
authors,
|
|
licenses,
|
|
source,
|
|
range,
|
|
description,
|
|
homepage,
|
|
revision,
|
|
version,
|
|
dependencies,
|
|
}) => {
|
|
assert_eq!(name, &Some("foo".to_owned()));
|
|
let producers = producers.as_ref().expect("some producers");
|
|
assert_eq!(
|
|
producers.get("language").unwrap().get("bar").unwrap(),
|
|
"1.0"
|
|
);
|
|
assert_eq!(
|
|
producers.get("processed-by").unwrap().get("baz").unwrap(),
|
|
"1.0"
|
|
);
|
|
|
|
assert_eq!(authors, &Some(Authors::new("Chashu Cat")));
|
|
assert_eq!(description, &Some(Description::new("Chashu likes tuna")));
|
|
assert_eq!(
|
|
licenses,
|
|
&Some(
|
|
Licenses::new("Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT")
|
|
.unwrap()
|
|
)
|
|
);
|
|
assert_eq!(
|
|
source,
|
|
&Some(
|
|
Source::new("https://github.com/bytecodealliance/wasm-tools").unwrap()
|
|
),
|
|
);
|
|
assert_eq!(
|
|
homepage,
|
|
&Some(
|
|
Homepage::new("https://github.com/bytecodealliance/wasm-tools")
|
|
.unwrap()
|
|
),
|
|
);
|
|
assert_eq!(
|
|
revision,
|
|
&Some(Revision::new("de978e17a80c1118f606fce919ba9b7d5a04a5ad"))
|
|
);
|
|
assert_eq!(version, &Some(Version::new("1.0.0")));
|
|
assert_eq!(dependencies.as_ref().unwrap().version_info(), &info);
|
|
assert_eq!(range.start, 11);
|
|
assert_eq!(range.end, 466);
|
|
}
|
|
_ => panic!("child is a module"),
|
|
}
|
|
}
|
|
_ => panic!("root should be component"),
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn add_then_clear_fields() {
|
|
let mut add1 = AddMetadata::default();
|
|
add1.name = AddMetadataField::Set("foo".to_owned());
|
|
add1.language = vec![("bar".to_owned(), "1.0".to_owned())];
|
|
add1.processed_by = vec![("baz".to_owned(), "1.0".to_owned())];
|
|
add1.sdk = vec![];
|
|
add1.authors = AddMetadataField::Set(Authors::new("Chashu Cat"));
|
|
add1.description = AddMetadataField::Set(Description::new("Chashu likes tuna"));
|
|
add1.licenses = AddMetadataField::Set(
|
|
Licenses::new("Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT").unwrap(),
|
|
);
|
|
add1.source = AddMetadataField::Set(
|
|
Source::new("https://github.com/bytecodealliance/wasm-tools").unwrap(),
|
|
);
|
|
add1.homepage = AddMetadataField::Set(
|
|
Homepage::new("https://github.com/bytecodealliance/wasm-tools").unwrap(),
|
|
);
|
|
add1.revision =
|
|
AddMetadataField::Set(Revision::new("de978e17a80c1118f606fce919ba9b7d5a04a5ad"));
|
|
add1.version = AddMetadataField::Set(Version::new("1.0.0"));
|
|
|
|
let json_str = r#"{"packages":[{"name":"adler","version":"0.2.3","source":"registry"}]}"#;
|
|
let info = VersionInfo::from_str(json_str).unwrap();
|
|
let mut component1 = Component::new();
|
|
component1.section(&Dependencies::new(info.clone()));
|
|
let component1 = component1.finish();
|
|
let component1 = add1.to_wasm(&component1).unwrap();
|
|
|
|
let mut add2 = AddMetadata::default();
|
|
add2.name = AddMetadataField::Clear;
|
|
add2.version = AddMetadataField::Clear;
|
|
add2.description = AddMetadataField::Set(Description::new("Chashu likes something else"));
|
|
add2.revision = AddMetadataField::Clear;
|
|
|
|
let component2 = add2.to_wasm(&component1).unwrap();
|
|
|
|
match Payload::from_binary(&component2).unwrap() {
|
|
Payload::Component {
|
|
children,
|
|
metadata:
|
|
Metadata {
|
|
name,
|
|
producers,
|
|
authors,
|
|
description,
|
|
licenses,
|
|
source,
|
|
range,
|
|
homepage,
|
|
revision,
|
|
version,
|
|
dependencies,
|
|
},
|
|
} => {
|
|
assert!(children.is_empty());
|
|
assert_eq!(name, None);
|
|
let producers = producers.expect("some producers");
|
|
assert_eq!(
|
|
producers.get("language").unwrap().get("bar").unwrap(),
|
|
"1.0"
|
|
);
|
|
assert_eq!(
|
|
producers.get("processed-by").unwrap().get("baz").unwrap(),
|
|
"1.0"
|
|
);
|
|
|
|
assert_eq!(authors.unwrap(), Authors::new("Chashu Cat"));
|
|
assert_eq!(
|
|
description.unwrap(),
|
|
Description::new("Chashu likes something else")
|
|
);
|
|
assert_eq!(
|
|
licenses.unwrap(),
|
|
Licenses::new("Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT").unwrap()
|
|
);
|
|
assert_eq!(
|
|
source.unwrap(),
|
|
Source::new("https://github.com/bytecodealliance/wasm-tools").unwrap(),
|
|
);
|
|
assert_eq!(
|
|
homepage.unwrap(),
|
|
Homepage::new("https://github.com/bytecodealliance/wasm-tools").unwrap(),
|
|
);
|
|
assert_eq!(revision, None);
|
|
assert_eq!(version, None);
|
|
assert_eq!(dependencies.unwrap().version_info(), &info,);
|
|
|
|
assert_eq!(range.start, 0);
|
|
assert_eq!(range.end, 434);
|
|
}
|
|
_ => panic!("metadata should be component"),
|
|
}
|
|
}
|