use crate::{
metadata::{
tables::{AssemblyRaw, CodedIndex, CodedIndexType, TableDataOwned, TableId, TypeDefRaw},
token::Token,
},
test::{create_test_assembly_with_error, get_testfile_mscorlib, TestAssembly},
Error, Result,
};
pub fn raw_table_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_multiple_assembly_rows()?);
assemblies.push(create_assembly_with_field_list_violation()?);
assemblies.push(create_assembly_with_method_list_violation()?);
assemblies.push(create_assembly_with_empty_module_table()?);
Ok(assemblies)
}
pub fn create_assembly_with_empty_module_table() -> Result<TestAssembly> {
create_test_assembly_with_error(get_testfile_mscorlib, "Malformed", |assembly| {
match assembly.table_row_remove(TableId::Module, 1) {
Ok(()) => {
Ok(())
}
Err(e) => {
Err(Error::Other(format!(
"Cannot remove Module table row: {e} - this test case is not supported"
)))
}
}
})
}
pub fn create_assembly_with_multiple_assembly_rows() -> Result<TestAssembly> {
create_test_assembly_with_error(get_testfile_mscorlib, "Malformed", |assembly| {
let duplicate_assembly = AssemblyRaw {
rid: 2, token: Token::new(0x20000002), offset: 0,
hash_alg_id: 0x8004, major_version: 1,
minor_version: 0,
build_number: 0,
revision_number: 0,
flags: 0,
public_key: 0, name: 1, culture: 0, };
assembly.table_row_add(
TableId::Assembly,
TableDataOwned::Assembly(duplicate_assembly),
)?;
Ok(())
})
}
pub fn create_assembly_with_field_list_violation() -> Result<TestAssembly> {
create_test_assembly_with_error(get_testfile_mscorlib, "Malformed", |assembly| {
let invalid_typedef = TypeDefRaw {
rid: 1,
token: Token::new(0x02000001),
offset: 0,
flags: 0x00100000, type_name: 1, type_namespace: 0, extends: CodedIndex::new(TableId::TypeRef, 1, CodedIndexType::TypeDefOrRef),
field_list: 999999, method_list: 0,
};
assembly.table_row_update(
TableId::TypeDef,
1,
TableDataOwned::TypeDef(invalid_typedef),
)?;
Ok(())
})
}
pub fn create_assembly_with_method_list_violation() -> Result<TestAssembly> {
create_test_assembly_with_error(get_testfile_mscorlib, "Malformed", |assembly| {
let invalid_typedef = TypeDefRaw {
rid: 1,
token: Token::new(0x02000001),
offset: 0,
flags: 0x00100000, type_name: 1, type_namespace: 0, extends: CodedIndex::new(TableId::TypeRef, 1, CodedIndexType::TypeDefOrRef),
field_list: 0,
method_list: 999999, };
assembly.table_row_update(
TableId::TypeDef,
1,
TableDataOwned::TypeDef(invalid_typedef),
)?;
Ok(())
})
}