use crate::{
metadata::{
tables::{AssemblyRaw, TableDataOwned, TableId},
token::Token,
},
test::{
create_passing_test_assembly, create_test_assembly, get_testfile_mscorlib, TestAssembly,
},
Error, Result,
};
pub fn owned_assembly_validator_file_factory() -> Result<Vec<TestAssembly>> {
let mut assemblies = Vec::new();
let Some(clean_testfile) = get_testfile_mscorlib() else {
return Err(Error::Other(
"mscorlib.dll not available - test cannot run".to_string(),
));
};
assemblies.push(TestAssembly::new(&clean_testfile, true));
assemblies.push(create_assembly_with_empty_name()?);
assemblies.push(create_assembly_with_invalid_name_format()?);
assemblies.push(create_assembly_with_maximum_version_numbers()?);
assemblies.push(create_assembly_with_invalid_culture_format()?);
Ok(assemblies)
}
pub fn create_assembly_with_empty_name() -> Result<TestAssembly> {
create_test_assembly(get_testfile_mscorlib, |assembly| {
let empty_name_index = assembly
.string_add("")
.map_err(|e| Error::Other(format!("Failed to add empty assembly name: {e}")))?;
let assembly_rid = 1;
let invalid_assembly = AssemblyRaw {
rid: assembly_rid,
token: Token::new(0x20000000 + assembly_rid),
offset: 0,
hash_alg_id: 0x8004, major_version: 1,
minor_version: 0,
build_number: 0,
revision_number: 0,
flags: 0,
public_key: 0,
name: empty_name_index.placeholder(), culture: 0,
};
assembly
.table_row_update(
TableId::Assembly,
1,
TableDataOwned::Assembly(invalid_assembly),
)
.map_err(|e| Error::Other(format!("Failed to update invalid assembly: {e}")))?;
Ok(())
})
}
pub fn create_assembly_with_invalid_name_format() -> Result<TestAssembly> {
create_test_assembly(get_testfile_mscorlib, |assembly| {
let invalid_name = "Invalid/Assembly*Name";
let invalid_name_index = assembly
.string_add(invalid_name)
.map_err(|e| Error::Other(format!("Failed to add invalid assembly name: {e}")))?;
let assembly_rid = 1;
let invalid_assembly = AssemblyRaw {
rid: assembly_rid,
token: Token::new(0x20000000 + assembly_rid),
offset: 0,
hash_alg_id: 0x8004, major_version: 1,
minor_version: 0,
build_number: 0,
revision_number: 0,
flags: 0,
public_key: 0,
name: invalid_name_index.placeholder(), culture: 0,
};
assembly
.table_row_update(
TableId::Assembly,
1,
TableDataOwned::Assembly(invalid_assembly),
)
.map_err(|e| Error::Other(format!("Failed to update invalid assembly: {e}")))?;
Ok(())
})
}
pub fn create_assembly_with_maximum_version_numbers() -> Result<TestAssembly> {
create_passing_test_assembly(get_testfile_mscorlib, |assembly| {
let assembly_name_index = assembly
.string_add("ValidAssemblyName")
.map_err(|e| Error::Other(format!("Failed to add assembly name: {e}")))?;
let assembly_rid = 1;
let valid_assembly = AssemblyRaw {
rid: assembly_rid,
token: Token::new(0x20000000 + assembly_rid),
offset: 0,
hash_alg_id: 0x8004, major_version: 999, minor_version: 0,
build_number: 0,
revision_number: 0,
flags: 0,
public_key: 0,
name: assembly_name_index.placeholder(),
culture: 0,
};
assembly
.table_row_update(
TableId::Assembly,
1,
TableDataOwned::Assembly(valid_assembly),
)
.map_err(|e| Error::Other(format!("Failed to update assembly: {e}")))?;
Ok(())
})
}
pub fn create_assembly_with_invalid_culture_format() -> Result<TestAssembly> {
create_test_assembly(get_testfile_mscorlib, |assembly| {
let assembly_name_index = assembly
.string_add("ValidAssemblyName")
.map_err(|e| Error::Other(format!("Failed to add assembly name: {e}")))?;
let invalid_culture = "en-US-extra-invalid";
let invalid_culture_index = assembly
.string_add(invalid_culture)
.map_err(|e| Error::Other(format!("Failed to add invalid culture: {e}")))?;
let assembly_rid = 1;
let invalid_assembly = AssemblyRaw {
rid: assembly_rid,
token: Token::new(0x20000000 + assembly_rid),
offset: 0,
hash_alg_id: 0x8004, major_version: 1,
minor_version: 0,
build_number: 0,
revision_number: 0,
flags: 0,
public_key: 0,
name: assembly_name_index.placeholder(),
culture: invalid_culture_index.placeholder(), };
assembly
.table_row_update(
TableId::Assembly,
1,
TableDataOwned::Assembly(invalid_assembly),
)
.map_err(|e| Error::Other(format!("Failed to update invalid assembly: {e}")))?;
Ok(())
})
}