in src/windows/pdb.rs [323:413]
fn test_file(name: &str, flags: TestFlags) {
let (out, name) = if name.starts_with("https://") {
get_data_from_server(name)
} else {
let dll = name.to_string() + ".dll";
(get_new_bp(&dll, None), name)
};
let new = BreakpadObject::parse(&out).unwrap();
let out = get_data(name);
let old = BreakpadObject::parse(&out).unwrap();
check_headers(&new, &old);
let file_map_old = old.file_map();
let file_map_new = new.file_map();
let files_old: HashSet<_> = file_map_old.values().collect();
let files_new: HashSet<_> = file_map_new.values().collect();
for old_file in &files_old {
assert!(
files_new.contains(old_file),
"{}",
"Missing path: {old_file}"
);
}
for new_file in &files_new {
assert!(files_old.contains(new_file), "{}", "Extra path: {new_file}");
}
let mut func_old: Vec<_> = old.func_records().collect();
let mut func_new: Vec<_> = new.func_records().collect();
func_old.sort_by_key(|f| f.as_ref().unwrap().address);
func_new.sort_by_key(|f| f.as_ref().unwrap().address);
if !flags.intersects(TestFlags::NO_FUNCS_LENGTH) {
check_func_len(&func_new, &func_old);
}
for (i, (func_n, func_o)) in func_new.iter().zip(func_old.iter()).enumerate() {
let func_n = func_n.as_ref().unwrap();
let func_o = func_o.as_ref().unwrap();
check_func(i, func_n, func_o, &file_map_new, &file_map_old, &flags);
}
let public_old = old.public_records();
// Remove public constants
let public_old = public_old.filter(|x| {
let x = x.as_ref().unwrap();
!x.name.contains("::FNODOBFM::`string'")
});
let public_new = new.public_records();
assert_eq!(
public_new.clone().count(),
public_old.clone().count(),
"Not the same number of PUBLIC"
);
for (i, (public_n, public_o)) in public_new.zip(public_old).enumerate() {
let public_n = public_n.unwrap();
let public_o = public_o.unwrap();
assert_eq!(
public_n.address,
public_o.address,
"Not the same address for PUBLIC at position {} ({})",
i + 1,
public_n.name
);
if !flags.intersects(TestFlags::NO_MULTIPLICITY) {
assert_eq!(
public_n.multiple, public_o.multiple,
"Not the same multiplicity for PUBLIC at rva {:x}",
public_n.address
);
}
assert_eq!(
public_n.parameter_size, public_o.parameter_size,
"Not the same parameter size for PUBLIC at rva {:x}",
public_n.address
);
/*assert_eq!(
public_n.name, public_o.name,
"Not the same name for PUBLIC at rva {:x}",
public_n.address
);*/
}
}