Skip to content
This repository was archived by the owner on Jul 4, 2022. It is now read-only.
Prev Previous commit
Next Next commit
Fix storage::read (#7084)
* Fix `storage::read`

It should return the length of the storage item after the given offset.
Before it returned always the length of the full storage item.

* Fix tests
  • Loading branch information
bkchr authored and jordy25519 committed Sep 14, 2020
commit dae6f0851ff428e74383395c0fc1b0fb57b7bae8
11 changes: 6 additions & 5 deletions primitives/io/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ pub trait Storage {
let data = &value[value_offset.min(value.len())..];
let written = std::cmp::min(data.len(), value_out.len());
value_out[..written].copy_from_slice(&data[..written]);
value.len() as u32
data.len() as u32
})
}

Expand Down Expand Up @@ -153,7 +153,7 @@ pub trait Storage {
let data = &value[value_offset.min(value.len())..];
let written = std::cmp::min(data.len(), value_out.len());
value_out[..written].copy_from_slice(&data[..written]);
value.len() as u32
data.len() as u32
})
}

Expand Down Expand Up @@ -972,17 +972,18 @@ mod tests {

#[test]
fn read_storage_works() {
let value = b"\x0b\0\0\0Hello world".to_vec();
let mut t = BasicExternalities::new(Storage {
top: map![b":test".to_vec() => b"\x0b\0\0\0Hello world".to_vec()],
top: map![b":test".to_vec() => value.clone()],
children: map![],
});

t.execute_with(|| {
let mut v = [0u8; 4];
assert!(storage::read(b":test", &mut v[..], 0).unwrap() >= 4);
assert_eq!(storage::read(b":test", &mut v[..], 0).unwrap(), value.len() as u32);
assert_eq!(v, [11u8, 0, 0, 0]);
let mut w = [0u8; 11];
assert!(storage::read(b":test", &mut w[..], 4).unwrap() >= 11);
assert_eq!(storage::read(b":test", &mut w[..], 4).unwrap(), value.len() as u32 - 4);
assert_eq!(&w, b"Hello world");
});
}
Expand Down
12 changes: 4 additions & 8 deletions test-utils/runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -951,17 +951,13 @@ fn test_read_storage() {
sp_io::storage::set(KEY, b"test");

let mut v = [0u8; 4];
let r = sp_io::storage::read(
KEY,
&mut v,
0
);
let r = sp_io::storage::read(KEY, &mut v, 0);
assert_eq!(r, Some(4));
assert_eq!(&v, b"test");

let mut v = [0u8; 4];
let r = sp_io::storage::read(KEY, &mut v, 8);
assert_eq!(r, Some(4));
let r = sp_io::storage::read(KEY, &mut v, 4);
assert_eq!(r, Some(0));
assert_eq!(&v, &[0, 0, 0, 0]);
}

Expand Down Expand Up @@ -998,7 +994,7 @@ fn test_read_child_storage() {
&mut v,
8,
);
assert_eq!(r, Some(4));
assert_eq!(r, Some(0));
assert_eq!(&v, &[0, 0, 0, 0]);
}

Expand Down