From aea378ad6190808202ed877c8761204ae6e6ec61 Mon Sep 17 00:00:00 2001 From: Pierrick Couderc Date: Wed, 18 Sep 2024 09:58:15 +0200 Subject: [PATCH 1/2] Kernel/SDK: Mock: state support setting a DAL slot --- src/kernel_sdk/mock/src/state/mod.rs | 22 ++++++++++++++++++++++ src/kernel_sdk/mock/src/state/store.rs | 4 ++++ 2 files changed, 26 insertions(+) diff --git a/src/kernel_sdk/mock/src/state/mod.rs b/src/kernel_sdk/mock/src/state/mod.rs index 25b43e5e2991..ba88552f7846 100644 --- a/src/kernel_sdk/mock/src/state/mod.rs +++ b/src/kernel_sdk/mock/src/state/mod.rs @@ -161,6 +161,15 @@ impl HostState { ) -> Option<&Vec> { self.store.0.retrieve_dal_slot(published_level, slot_index) } + + pub(crate) fn set_dal_slot( + &mut self, + published_level: i32, + slot_index: u8, + data: Vec, + ) { + self.store.0.set_dal_slot(published_level, slot_index, data) + } } #[cfg(test)] @@ -582,4 +591,17 @@ mod tests { .unwrap(); assert_eq!(read_back, [4, 0, 0, 0]); } + + #[test] + fn set_and_get_dal_slot() { + let mut state = HostState::default(); + let data = vec![b'z'; 512]; + let published_level = 10; + let slot_index = 4; + state.set_dal_slot(published_level, slot_index, data.clone()); + let data_in_slot = state + .get_dal_slot(published_level, slot_index) + .expect("Slot should contain data"); + assert_eq!(&data, data_in_slot); + } } diff --git a/src/kernel_sdk/mock/src/state/store.rs b/src/kernel_sdk/mock/src/state/store.rs index 0235f481fbd7..ece5c9bfd5c6 100644 --- a/src/kernel_sdk/mock/src/state/store.rs +++ b/src/kernel_sdk/mock/src/state/store.rs @@ -196,6 +196,10 @@ impl Store { ) -> Option<&Vec> { self.dal_slots.get(&(published_level, slot_index)) } + + pub fn set_dal_slot(&mut self, published_level: i32, slot_index: u8, data: Vec) { + self.dal_slots.insert((published_level, slot_index), data); + } } fn path_steps(path: &str) -> impl Iterator { -- GitLab From 08e940d4b7b40f95c8970ae52178e6d54bb634d0 Mon Sep 17 00:00:00 2001 From: Pierrick Couderc Date: Wed, 18 Sep 2024 09:58:47 +0200 Subject: [PATCH 2/2] Kernel/SDK: Mock: add helper function to set a DAL slot --- src/kernel_sdk/mock/src/host.rs | 36 +++++++++++++++++++++++++++++++++ src/kernel_sdk/mock/src/lib.rs | 16 +++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/src/kernel_sdk/mock/src/host.rs b/src/kernel_sdk/mock/src/host.rs index 9b74b49d3fd9..a6d8ba8cb8b1 100644 --- a/src/kernel_sdk/mock/src/host.rs +++ b/src/kernel_sdk/mock/src/host.rs @@ -486,4 +486,40 @@ mod tests { assert_ne!(new_value_in_store, initial_value_in_store); assert_eq!(new_value_in_store, smaller_value); } + + #[test] + fn dal_slot_are_padded_with_zeroes() { + let mut mock = MockHost::default(); + let data = vec![b'v'; 100]; + let published_level = (mock.level()) as i32; + let slot_index = 4; + mock.set_dal_slot(published_level, slot_index, &data); + + // Read the slot completely + let dal_parameters = mock.reveal_dal_parameters(); + let slot_size = dal_parameters.slot_size as usize; + let page_size = dal_parameters.page_size as usize; + let mut slot = vec![0; slot_size]; + let number_of_pages = (slot_size / page_size) as i16; + let mut offset = 0; + for page_index in 0..number_of_pages { + let page_len = mock + .reveal_dal_page( + published_level, + slot_index, + page_index, + &mut slot[offset..(offset + page_size)], + ) + .expect("Page is expected to be readable"); + offset += page_len; + assert_eq!(page_len, page_size) + } + + let data_in_slot = &slot[..100]; + let padding = &slot[100..]; + + assert_eq!(slot.len(), slot_size); + assert_eq!(&data, data_in_slot); + assert!(padding.iter().all(|b| *b == 0)); + } } diff --git a/src/kernel_sdk/mock/src/lib.rs b/src/kernel_sdk/mock/src/lib.rs index 3278f961ebef..45c7fe79cd52 100644 --- a/src/kernel_sdk/mock/src/lib.rs +++ b/src/kernel_sdk/mock/src/lib.rs @@ -307,6 +307,22 @@ impl MockHost { self.as_mut().add_input(inbox_message); } + + ////Set the content of the given DAL slot with the data. Adds the necessary + /// padding to fill the slot completely. + pub fn set_dal_slot(&mut self, published_level: i32, slot_index: u8, data: &[u8]) { + let slot_size = self.as_mut().get_dal_parameters().slot_size; + let mut slot = vec![0_u8; slot_size as usize]; + assert!( + data.len() <= (slot_size as usize), + "Data of size {} cannot fit in a DAL slot of size {}", + data.len(), + slot_size + ); + slot[..data.len()].as_mut().copy_from_slice(data); + self.as_mut() + .set_dal_slot(published_level, slot_index, slot); + } } fn info_for_level(level: i32) -> inbox::InfoPerLevel { -- GitLab