diff options
| author | Mason Reed <mason@vector35.com> | 2025-02-14 00:07:53 -0500 |
|---|---|---|
| committer | Mason Reed <mason@vector35.com> | 2025-02-24 20:11:57 -0500 |
| commit | fb8eb1501b7f4b8eaefcb26131230ba42083c153 (patch) | |
| tree | 9eb5f090b0e31e4e49d4afc9e8220b323e7f7a98 /plugins/svd/tests | |
| parent | ddfdfe03426fa6ed1d73f3114e8f71ac0c54bef7 (diff) | |
Add SVD Loader Plugin
Diffstat (limited to 'plugins/svd/tests')
6 files changed, 160 insertions, 0 deletions
diff --git a/plugins/svd/tests/mapper.rs b/plugins/svd/tests/mapper.rs new file mode 100644 index 00000000..10f95c40 --- /dev/null +++ b/plugins/svd/tests/mapper.rs @@ -0,0 +1,57 @@ +use binaryninja::binary_view::BinaryViewExt; +use binaryninja::binary_view::{BinaryView, BinaryViewBase}; +use binaryninja::file_metadata::FileMetadata; +use binaryninja::headless::Session; +use std::path::PathBuf; +use svd_ninja::mapper::DeviceMapper; +use svd_ninja::settings::LoadSettings; + +// These are the target files present in OUT_DIR +// Add the files to fixtures +static TARGET_FILES: [&str; 2] = ["ARM_Sample.svd", "esp32c2.svd"]; + +#[test] +fn insta_snapshots() { + let _session = Session::new().expect("Failed to initialize session"); + let out_dir = env!("OUT_DIR").parse::<PathBuf>().unwrap(); + for file_name in TARGET_FILES { + let path = out_dir.join(file_name); + let svd_str = std::fs::read_to_string(&path).expect("Failed to read svd file"); + let device = svd_parser::parse(&svd_str).expect("Failed to parse svd file"); + let view = BinaryView::from_data(&FileMetadata::new(), &[]).expect("Failed to create view"); + let address_size = view.address_size(); + DeviceMapper::new(LoadSettings::default(), address_size, device).map_to_view(&view); + + let types = view + .types() + .to_vec() + .iter() + .map(|ty| ty.ty.to_string()) + .collect::<Vec<String>>(); + let types_snapshot_name = format!("{}_types", file_name); + insta::assert_debug_snapshot!(types_snapshot_name, types); + + // TODO: This does not work yet because memory map is not turned on for raw view? + // let value: Value = serde_json::from_str(&view.memory_map().description()).unwrap(); + // let map = view.memory_map().description(); + // let memory_snapshot_name = format!("{}_memory_map", file_name); + // insta::assert_debug_snapshot!(memory_snapshot_name, value); + } +} + +#[test] +fn test_bitfield_unions() { + let _session = Session::new().expect("Failed to initialize session"); + let out_dir = env!("OUT_DIR").parse::<PathBuf>().unwrap(); + let path = out_dir.join("ARM_Sample.svd"); + let svd_str = std::fs::read_to_string(&path).expect("Failed to read svd file"); + let device = svd_parser::parse(&svd_str).expect("Failed to parse svd file"); + let view = BinaryView::from_data(&FileMetadata::new(), &[]).expect("Failed to create view"); + let address_size = view.address_size(); + let mapper = DeviceMapper::new(LoadSettings::default(), address_size, device.clone()); + + let peripheral = device.get_peripheral("TIMER0").unwrap(); + let register = peripheral.get_register("SR").unwrap(); + let register_ty = mapper.register_type(®ister); + insta::assert_debug_snapshot!("bitfield_union_types", register_ty); +} diff --git a/plugins/svd/tests/snapshots/mapper__ARM_Sample.svd_memory_map.snap b/plugins/svd/tests/snapshots/mapper__ARM_Sample.svd_memory_map.snap new file mode 100644 index 00000000..b1894290 --- /dev/null +++ b/plugins/svd/tests/snapshots/mapper__ARM_Sample.svd_memory_map.snap @@ -0,0 +1,7 @@ +--- +source: plugins/svd/tests/mapper.rs +expression: value +--- +Object { + "MemoryMap": Array [], +} diff --git a/plugins/svd/tests/snapshots/mapper__ARM_Sample.svd_types.snap b/plugins/svd/tests/snapshots/mapper__ARM_Sample.svd_types.snap new file mode 100644 index 00000000..c0cdfb47 --- /dev/null +++ b/plugins/svd/tests/snapshots/mapper__ARM_Sample.svd_types.snap @@ -0,0 +1,9 @@ +--- +source: plugins/svd/tests/mapper.rs +expression: types +--- +[ + "struct TIMER0", + "struct TIMER1", + "struct TIMER2", +] diff --git a/plugins/svd/tests/snapshots/mapper__bitfield_union_types.snap b/plugins/svd/tests/snapshots/mapper__bitfield_union_types.snap new file mode 100644 index 00000000..eac7a59e --- /dev/null +++ b/plugins/svd/tests/snapshots/mapper__bitfield_union_types.snap @@ -0,0 +1,49 @@ +--- +source: plugins/svd/tests/mapper.rs +expression: register_ty +--- +Type { + type_class: StructureTypeClass, + width: 2, + alignment: 1, + is_signed: true (255 confidence), + is_const: false (255 confidence), + is_volatile: false (255 confidence), + child_type: None, + calling_convention: None, + parameters: Some( + [], + ), + has_variable_arguments: false (255 confidence), + can_return: true (255 confidence), + pure: false (255 confidence), + get_structure: Some( + Structure { + width: 2, + structure_type: StructStructureType, + base_structures: [], + members: [ + StructureMember { + ty: Type { type_class: StructureTypeClass, width: 1, alignment: 1, is_signed: true (255 confidence), is_const: false (255 confidence), is_volatile: false (255 confidence), child_type: None, calling_convention: None, parameters: Some([]), has_variable_arguments: false (255 confidence), can_return: true (255 confidence), pure: false (255 confidence), get_structure: Some(Structure { width: 1, structure_type: UnionStructureType, base_structures: [], members: [StructureMember { ty: Type { type_class: EnumerationTypeClass, width: 1, alignment: 1, is_signed: false (255 confidence), is_const: false (255 confidence), is_volatile: false (255 confidence), child_type: None, calling_convention: None, parameters: Some([]), has_variable_arguments: false (255 confidence), can_return: true (255 confidence), pure: false (255 confidence), get_structure: None, get_enumeration: Some(Enumeration { members: [EnumerationMember { name: "Stopped", value: 0, default: false }, EnumerationMember { name: "Running", value: 1, default: false }] }), get_named_type_reference: None, count: 0, offset: 0, stack_adjustment: 0 (0 confidence), registered_name: None } (255 confidence), name: "RUN", offset: 0, access: PublicAccess, scope: NoScope }] }), get_enumeration: None, get_named_type_reference: None, count: 0, offset: 0, stack_adjustment: 0 (0 confidence), registered_name: None } (255 confidence), + name: "bitfield_0x0", + offset: 0, + access: PublicAccess, + scope: NoScope, + }, + StructureMember { + ty: Type { type_class: StructureTypeClass, width: 1, alignment: 1, is_signed: true (255 confidence), is_const: false (255 confidence), is_volatile: false (255 confidence), child_type: None, calling_convention: None, parameters: Some([]), has_variable_arguments: false (255 confidence), can_return: true (255 confidence), pure: false (255 confidence), get_structure: Some(Structure { width: 1, structure_type: UnionStructureType, base_structures: [], members: [StructureMember { ty: Type { type_class: EnumerationTypeClass, width: 1, alignment: 1, is_signed: false (255 confidence), is_const: false (255 confidence), is_volatile: false (255 confidence), child_type: None, calling_convention: None, parameters: Some([]), has_variable_arguments: false (255 confidence), can_return: true (255 confidence), pure: false (255 confidence), get_structure: None, get_enumeration: Some(Enumeration { members: [EnumerationMember { name: "No_Match", value: 0, default: false }, EnumerationMember { name: "Match_Hit", value: 1, default: false }] }), get_named_type_reference: None, count: 0, offset: 0, stack_adjustment: 0 (0 confidence), registered_name: None } (255 confidence), name: "MATCH", offset: 0, access: PublicAccess, scope: NoScope }, StructureMember { ty: Type { type_class: EnumerationTypeClass, width: 1, alignment: 1, is_signed: false (255 confidence), is_const: false (255 confidence), is_volatile: false (255 confidence), child_type: None, calling_convention: None, parameters: Some([]), has_variable_arguments: false (255 confidence), can_return: true (255 confidence), pure: false (255 confidence), get_structure: None, get_enumeration: Some(Enumeration { members: [EnumerationMember { name: "No_Underflow", value: 0, default: false }, EnumerationMember { name: "Underflow", value: 1, default: false }] }), get_named_type_reference: None, count: 0, offset: 0, stack_adjustment: 0 (0 confidence), registered_name: None } (255 confidence), name: "UN", offset: 0, access: PublicAccess, scope: NoScope }, StructureMember { ty: Type { type_class: EnumerationTypeClass, width: 1, alignment: 1, is_signed: false (255 confidence), is_const: false (255 confidence), is_volatile: false (255 confidence), child_type: None, calling_convention: None, parameters: Some([]), has_variable_arguments: false (255 confidence), can_return: true (255 confidence), pure: false (255 confidence), get_structure: None, get_enumeration: Some(Enumeration { members: [EnumerationMember { name: "No_Overflow", value: 0, default: false }, EnumerationMember { name: "Overflow_occured", value: 1, default: false }] }), get_named_type_reference: None, count: 0, offset: 0, stack_adjustment: 0 (0 confidence), registered_name: None } (255 confidence), name: "OV", offset: 0, access: PublicAccess, scope: NoScope }, StructureMember { ty: Type { type_class: EnumerationTypeClass, width: 1, alignment: 1, is_signed: false (255 confidence), is_const: false (255 confidence), is_volatile: false (255 confidence), child_type: None, calling_convention: None, parameters: Some([]), has_variable_arguments: false (255 confidence), can_return: true (255 confidence), pure: false (255 confidence), get_structure: None, get_enumeration: Some(Enumeration { members: [EnumerationMember { name: "Ready", value: 0, default: false }, EnumerationMember { name: "In_Reset", value: 1, default: false }] }), get_named_type_reference: None, count: 0, offset: 0, stack_adjustment: 0 (0 confidence), registered_name: None } (255 confidence), name: "RST", offset: 0, access: PublicAccess, scope: NoScope }, StructureMember { ty: Type { type_class: EnumerationTypeClass, width: 1, alignment: 1, is_signed: false (255 confidence), is_const: false (255 confidence), is_volatile: false (255 confidence), child_type: None, calling_convention: None, parameters: Some([]), has_variable_arguments: false (255 confidence), can_return: true (255 confidence), pure: false (255 confidence), get_structure: None, get_enumeration: Some(Enumeration { members: [EnumerationMember { name: "RELOAD0", value: 0, default: false }, EnumerationMember { name: "RELOAD1", value: 1, default: false }, EnumerationMember { name: "RELOAD2", value: 2, default: false }, EnumerationMember { name: "RELOAD3", value: 3, default: false }] }), get_named_type_reference: None, count: 0, offset: 0, stack_adjustment: 0 (0 confidence), registered_name: None } (255 confidence), name: "RELOAD", offset: 0, access: PublicAccess, scope: NoScope }] }), get_enumeration: None, get_named_type_reference: None, count: 0, offset: 0, stack_adjustment: 0 (0 confidence), registered_name: None } (255 confidence), + name: "bitfield_0x1", + offset: 1, + access: PublicAccess, + scope: NoScope, + }, + ], + }, + ), + get_enumeration: None, + get_named_type_reference: None, + count: 0, + offset: 0, + stack_adjustment: 0 (0 confidence), + registered_name: None, +} diff --git a/plugins/svd/tests/snapshots/mapper__esp32c2.svd_memory_map.snap b/plugins/svd/tests/snapshots/mapper__esp32c2.svd_memory_map.snap new file mode 100644 index 00000000..926b4363 --- /dev/null +++ b/plugins/svd/tests/snapshots/mapper__esp32c2.svd_memory_map.snap @@ -0,0 +1,5 @@ +--- +source: plugins/svd/tests/mapper.rs +expression: map +--- +"{\"MemoryMap\":[]}" diff --git a/plugins/svd/tests/snapshots/mapper__esp32c2.svd_types.snap b/plugins/svd/tests/snapshots/mapper__esp32c2.svd_types.snap new file mode 100644 index 00000000..5af743bf --- /dev/null +++ b/plugins/svd/tests/snapshots/mapper__esp32c2.svd_types.snap @@ -0,0 +1,33 @@ +--- +source: plugins/svd/tests/mapper.rs +expression: types +--- +[ + "struct APB_CTRL", + "struct APB_SARADC", + "struct ASSIST_DEBUG", + "struct BB", + "struct DMA", + "struct ECC", + "struct EFUSE", + "struct EXTMEM", + "struct GPIO", + "struct I2C0", + "struct INTERRUPT_CORE0", + "struct IO_MUX", + "struct LEDC", + "struct MODEM_CLKRST", + "struct RNG", + "struct RTC_CNTL", + "struct SENSITIVE", + "struct SHA", + "struct SPI0", + "struct SPI1", + "struct SPI2", + "struct SYSTEM", + "struct SYSTIMER", + "struct TIMG0", + "struct UART0", + "struct UART1", + "struct XTS_AES", +] |
