mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-06 05:17:42 +00:00
fix(rpc): add issue 2815 regression and docker validation (#2828)
This commit is contained in:
@@ -36,6 +36,7 @@ pub(crate) fn encode_msgpack_map<T: Serialize>(value: &T) -> Result<Vec<u8>, rmp
|
||||
mod tests {
|
||||
use super::*;
|
||||
use rmp_serde::Deserializer;
|
||||
use rustfs_madmin::{BackendDisks, BackendInfo, Disk, ITEM_ONLINE, StorageInfo};
|
||||
use serde::Deserialize;
|
||||
use std::collections::HashMap;
|
||||
use std::io::Cursor;
|
||||
@@ -90,4 +91,66 @@ mod tests {
|
||||
let decoded: Nested = Deserialize::deserialize(&mut Deserializer::new(Cursor::new(&buf))).unwrap();
|
||||
assert_eq!(val, decoded);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn storage_info_map_encoding_round_trip_matches_issue_2815_contract() {
|
||||
let mut online_disks = BackendDisks::new();
|
||||
online_disks.0.insert("node1".into(), 4);
|
||||
let mut offline_disks = BackendDisks::new();
|
||||
offline_disks.0.insert("node2".into(), 0);
|
||||
|
||||
let value = StorageInfo {
|
||||
disks: vec![Disk {
|
||||
endpoint: "node1:9000".into(),
|
||||
state: ITEM_ONLINE.into(),
|
||||
local: true,
|
||||
pool_index: 0,
|
||||
set_index: 0,
|
||||
disk_index: 0,
|
||||
..Default::default()
|
||||
}],
|
||||
backend: BackendInfo {
|
||||
online_disks,
|
||||
offline_disks,
|
||||
total_sets: vec![1],
|
||||
drives_per_set: vec![4],
|
||||
..Default::default()
|
||||
},
|
||||
};
|
||||
|
||||
let buf = encode_msgpack_map(&value).unwrap();
|
||||
let marker = buf[0];
|
||||
assert!(
|
||||
(0x80..=0x8f).contains(&marker) || marker == 0xde || marker == 0xdf,
|
||||
"StorageInfo map-encoded payload must start with a map marker, got 0x{marker:02x}"
|
||||
);
|
||||
let decoded: StorageInfo = Deserialize::deserialize(&mut Deserializer::new(Cursor::new(&buf))).unwrap();
|
||||
|
||||
assert_eq!(decoded.disks.len(), 1);
|
||||
assert_eq!(decoded.disks[0].endpoint, "node1:9000");
|
||||
assert_eq!(decoded.backend.online_disks.0.get("node1"), Some(&4));
|
||||
assert_eq!(decoded.backend.offline_disks.0.get("node2"), Some(&0));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn storage_info_tuple_encoding_uses_array_marker_that_issue_2815_fixed() {
|
||||
let mut online_disks = BackendDisks::new();
|
||||
online_disks.0.insert("node1".into(), 4);
|
||||
|
||||
let value = StorageInfo {
|
||||
backend: BackendInfo {
|
||||
online_disks,
|
||||
..Default::default()
|
||||
},
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
let mut buf = Vec::new();
|
||||
value.serialize(&mut Serializer::new(&mut buf)).unwrap();
|
||||
let marker = buf[0];
|
||||
assert!(
|
||||
(0x90..=0x9f).contains(&marker) || marker == 0xdc || marker == 0xdd,
|
||||
"legacy tuple-mode StorageInfo must start with an array marker, got 0x{marker:02x}"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user