Files
k-os/crates/servers/storage-server/src/tests/protocol.rs

73 lines
2.3 KiB
Rust

use crate::filesystem::FileHandle;
use crate::protocol::*;
use server_framework::{Decode, Encode};
#[test]
fn every_request_roundtrips() {
let h = FileHandle::new(3);
for req in [
StorageRequest::Attach,
StorageRequest::Open { path_len: 9 },
StorageRequest::Read { handle: h, len: 100 },
StorageRequest::Write { handle: h, len: 7 },
StorageRequest::Close { handle: h },
StorageRequest::FileSize { handle: h },
StorageRequest::ListDir { path_len: 1 },
StorageRequest::Create { path_len: 5 },
StorageRequest::Delete { path_len: 5 },
StorageRequest::Mkdir { path_len: 4 },
StorageRequest::Grant {
path_len: 4,
write: true,
},
StorageRequest::Grant {
path_len: 0,
write: false,
},
StorageRequest::Release,
StorageRequest::SetKey { half: 1, words: [7, 9] },
] {
assert_eq!(StorageRequest::decode(req.encode()), Some(req));
}
}
#[test]
fn every_response_roundtrips() {
for resp in [
StorageResponse::Attached { size: BUFFER_SIZE },
StorageResponse::Handle(FileHandle::new(2)),
StorageResponse::Data { bytes: 512 },
StorageResponse::Written { bytes: 8 },
StorageResponse::Ok,
StorageResponse::DirEntries { count: 3 },
StorageResponse::Size(4096),
StorageResponse::NotFound,
StorageResponse::Error,
StorageResponse::ReadOnly,
StorageResponse::NotAttached,
StorageResponse::Granted,
StorageResponse::Denied,
] {
assert_eq!(StorageResponse::decode(resp.encode()), Some(resp));
}
}
#[test]
fn handles_that_do_not_fit_are_rejected_not_truncated() {
assert_eq!(StorageRequest::decode([2, 0x1_0003, 10, 0]), None);
assert_eq!(StorageRequest::decode([4, usize::MAX, 0, 0]), None);
}
#[test]
fn unknown_opcodes_do_not_decode() {
assert_eq!(StorageRequest::decode([99, 0, 0, 0]), None);
assert_eq!(StorageRequest::decode([usize::MAX, 0, 0, 0]), None);
}
#[test]
fn wire_numbers_are_the_shared_ones() {
use types::storage::{op, reply};
assert_eq!(StorageRequest::Read { handle: FileHandle::new(0), len: 0 }.encode()[0], op::READ);
assert_eq!(StorageResponse::ReadOnly.encode()[0], reply::READ_ONLY);
}