use rsvici::{error::Category, Client};
use pretty_assertions::assert_eq;
use serde::Deserialize;
use tokio_test::io::Builder;
#[derive(Debug, Deserialize, Eq, PartialEq)]
struct Version {
daemon: String,
version: String,
sysname: String,
release: String,
machine: String,
}
#[tokio::test]
async fn request() {
#[rustfmt::skip]
let mock_stream = Builder::new()
.write(&[
0, 0, 0, 9,
0, 7, b'v', b'e', b'r', b's', b'i', b'o', b'n',
])
.read(&[
0, 0, 0, 100,
1,
3, 6, b'd', b'a', b'e', b'm', b'o', b'n', 0, 14, b'c', b'h', b'a', b'r', b'o', b'n', b'-', b's', b'y', b's', b't', b'e', b'm', b'd',
3, 7, b'v', b'e', b'r', b's', b'i', b'o', b'n', 0, 5, b'5', b'.', b'9', b'.', b'5',
3, 7, b's', b'y', b's', b'n', b'a', b'm', b'e', 0, 5, b'L', b'i', b'n', b'u', b'x',
3, 7, b'r', b'e', b'l', b'e', b'a', b's', b'e', 0, 15, b'5', b'.', b'1', b'6', b'.', b'1', b'6', b'-', b'a', b'r', b'c', b'h', b'1', b'-', b'1',
3, 7, b'm', b'a', b'c', b'h', b'i', b'n', b'e', 0, 6, b'x', b'8', b'6', b'_', b'6', b'4',
])
.build();
let mut client = Client::new(mock_stream);
let actual: Version = client.request("version", ()).await.unwrap();
assert_eq!(
actual,
Version {
daemon: "charon-systemd".to_string(),
version: "5.9.5".to_string(),
sysname: "Linux".to_string(),
release: "5.16.16-arch1-1".to_string(),
machine: "x86_64".to_string(),
}
);
}
#[tokio::test]
async fn request_unknown_cmd() {
#[rustfmt::skip]
let mock_stream = Builder::new()
.write(&[
0, 0, 0, 14,
0, 12, b'n', b'o', b'n', b'-', b'e', b'x', b'i', b's', b't', b'i', b'n', b'g',
])
.read(&[
0, 0, 0, 1,
2,
])
.build();
let mut client = Client::new(mock_stream);
let actual = client.request::<(), Version>("non-existing", ()).await.unwrap_err();
assert_eq!(actual.classify(), Category::UnknownCmd);
}