summaryrefslogtreecommitdiff
path: root/plugins/svd/tests
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2025-02-14 00:07:53 -0500
committerMason Reed <mason@vector35.com>2025-02-24 20:11:57 -0500
commitfb8eb1501b7f4b8eaefcb26131230ba42083c153 (patch)
tree9eb5f090b0e31e4e49d4afc9e8220b323e7f7a98 /plugins/svd/tests
parentddfdfe03426fa6ed1d73f3114e8f71ac0c54bef7 (diff)
Add SVD Loader Plugin
Diffstat (limited to 'plugins/svd/tests')
-rw-r--r--plugins/svd/tests/mapper.rs57
-rw-r--r--plugins/svd/tests/snapshots/mapper__ARM_Sample.svd_memory_map.snap7
-rw-r--r--plugins/svd/tests/snapshots/mapper__ARM_Sample.svd_types.snap9
-rw-r--r--plugins/svd/tests/snapshots/mapper__bitfield_union_types.snap49
-rw-r--r--plugins/svd/tests/snapshots/mapper__esp32c2.svd_memory_map.snap5
-rw-r--r--plugins/svd/tests/snapshots/mapper__esp32c2.svd_types.snap33
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(&register);
+ 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",
+]