Skip to content

Commit f475d24

Browse files
committed
fix: wrong cursor for NodeSeqItem
feat: add test for NodeSeq Signed-off-by: Woshiluo Luo <woshiluo.luo@outlook.com>
1 parent 7b165d3 commit f475d24

File tree

2 files changed

+83
-1
lines changed

2 files changed

+83
-1
lines changed

src/de_mut/node.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ impl<'de> Deserialize<'de> for Node<'_> {
201201
if key == "/" {
202202
self_cursor = match value.cursor {
203203
ValueCursor::Body(cursor) => Some(cursor),
204+
ValueCursor::Node(result) => Some(result.next_cursor),
204205
_ => {
205206
unreachable!("root of NodeSeq shouble be body cursor")
206207
}

src/de_mut/node_seq.rs

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ impl<'de> Iterator for NodeSeqIter<'de, '_> {
145145
Some(Self::Item {
146146
dtb: self.de.dtb,
147147
reg: self.de.reg,
148-
body: node_reuslt.start_cursor,
148+
body: node_reuslt.skip_cursor,
149149
at: suf_name,
150150
})
151151
}
@@ -173,3 +173,84 @@ impl<'de> NodeSeqItem<'de> {
173173
.unwrap()
174174
}
175175
}
176+
177+
#[cfg(test)]
178+
mod tests {
179+
use crate::buildin::{NodeSeq, Reg};
180+
use crate::{from_raw_mut, Dtb, DtbPtr};
181+
use serde_derive::Deserialize;
182+
183+
const RAW_DEVICE_TREE: &[u8] = include_bytes!("../../examples/bl808.dtb");
184+
const BUFFER_SIZE: usize = RAW_DEVICE_TREE.len();
185+
const RAW_DEVICE_TREE_QEMU: &[u8] = include_bytes!("../../examples/qemu-virt.dtb");
186+
const BUFFER_SIZE_QEMU: usize = RAW_DEVICE_TREE_QEMU.len();
187+
#[derive(Deserialize)]
188+
pub struct Tree<'a> {
189+
/// Memory information.
190+
pub memory: NodeSeq<'a>,
191+
}
192+
/// Memory range.
193+
#[derive(Deserialize)]
194+
#[serde(rename_all = "kebab-case")]
195+
pub struct Memory<'a> {
196+
pub reg: Reg<'a>,
197+
}
198+
#[test]
199+
fn test_nodeseq_without_at() {
200+
#[repr(align(8))]
201+
struct AlignedBuffer {
202+
pub data: [u8; RAW_DEVICE_TREE.len()],
203+
}
204+
let mut aligned_data: Box<AlignedBuffer> = Box::new(AlignedBuffer {
205+
data: [0; BUFFER_SIZE],
206+
});
207+
aligned_data.data[..BUFFER_SIZE].clone_from_slice(RAW_DEVICE_TREE);
208+
let mut slice = aligned_data.data.to_vec();
209+
let ptr = DtbPtr::from_raw(slice.as_mut_ptr()).unwrap();
210+
let dtb = Dtb::from(ptr).share();
211+
212+
let t: Tree = from_raw_mut(&dtb).unwrap();
213+
assert_eq!(t.memory.len(), 1);
214+
let range = t
215+
.memory
216+
.iter()
217+
.next()
218+
.unwrap()
219+
.deserialize::<Memory>()
220+
.reg
221+
.iter()
222+
.next()
223+
.unwrap()
224+
.0;
225+
assert_eq!(range, 1342177280..1408237568);
226+
}
227+
#[test]
228+
fn test_nodeseq_with_at() {
229+
#[repr(align(8))]
230+
struct AlignedBuffer {
231+
pub data: [u8; RAW_DEVICE_TREE_QEMU.len()],
232+
}
233+
let mut aligned_data: Box<AlignedBuffer> = Box::new(AlignedBuffer {
234+
data: [0; BUFFER_SIZE_QEMU],
235+
});
236+
aligned_data.data[..BUFFER_SIZE_QEMU].clone_from_slice(RAW_DEVICE_TREE_QEMU);
237+
let mut slice = aligned_data.data.to_vec();
238+
let ptr = DtbPtr::from_raw(slice.as_mut_ptr()).unwrap();
239+
let dtb = Dtb::from(ptr).share();
240+
241+
let t: Tree = from_raw_mut(&dtb).unwrap();
242+
assert_eq!(t.memory.len(), 1);
243+
let range = t
244+
.memory
245+
.iter()
246+
.next()
247+
.unwrap()
248+
.deserialize::<Memory>()
249+
.reg
250+
.iter()
251+
.next()
252+
.unwrap()
253+
.0;
254+
assert_eq!(range, 2147483648..6442450944);
255+
}
256+
}

0 commit comments

Comments
 (0)