IronRDP/crates/ironrdp-testsuite-core/tests/rdcleanpath.rs
Benoît Cortier 55176ff99b
refactor: write_padding! and read_padding! macros (#177)
Macros ensuring optimal handling of padding at compile time.
2023-08-15 21:36:53 +03:00

125 lines
3.8 KiB
Rust

use ironrdp_rdcleanpath::{DetectionResult, RDCleanPathPdu, VERSION_1};
use rstest::rstest;
fn request() -> RDCleanPathPdu {
RDCleanPathPdu::new_request(
vec![0xDE, 0xAD, 0xBE, 0xFF],
"destination".to_owned(),
"proxy auth".to_owned(),
Some("PCB".to_owned()),
)
.unwrap()
}
const REQUEST_DER: &[u8] = &[
0x30, 0x32, 0xA0, 0x4, 0x2, 0x2, 0xD, 0x3E, 0xA2, 0xD, 0xC, 0xB, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6E, 0x61, 0x74,
0x69, 0x6F, 0x6E, 0xA3, 0xC, 0xC, 0xA, 0x70, 0x72, 0x6F, 0x78, 0x79, 0x20, 0x61, 0x75, 0x74, 0x68, 0xA5, 0x5, 0xC,
0x3, 0x50, 0x43, 0x42, 0xA6, 0x6, 0x4, 0x4, 0xDE, 0xAD, 0xBE, 0xFF,
];
fn response_success() -> RDCleanPathPdu {
RDCleanPathPdu::new_response(
"192.168.7.95".to_owned(),
vec![0xDE, 0xAD, 0xBE, 0xFF],
[
vec![0xDE, 0xAD, 0xBE, 0xFF],
vec![0xDE, 0xAD, 0xBE, 0xFF],
vec![0xDE, 0xAD, 0xBE, 0xFF],
],
)
.unwrap()
}
const RESPONSE_SUCCESS_DER: &[u8] = &[
0x30, 0x34, 0xA0, 0x4, 0x2, 0x2, 0xD, 0x3E, 0xA6, 0x6, 0x4, 0x4, 0xDE, 0xAD, 0xBE, 0xFF, 0xA7, 0x14, 0x30, 0x12,
0x4, 0x4, 0xDE, 0xAD, 0xBE, 0xFF, 0x4, 0x4, 0xDE, 0xAD, 0xBE, 0xFF, 0x4, 0x4, 0xDE, 0xAD, 0xBE, 0xFF, 0xA9, 0xE,
0xC, 0xC, 0x31, 0x39, 0x32, 0x2E, 0x31, 0x36, 0x38, 0x2E, 0x37, 0x2E, 0x39, 0x35,
];
fn response_http_error() -> RDCleanPathPdu {
RDCleanPathPdu::new_http_error(500)
}
const RESPONSE_HTTP_ERROR_DER: &[u8] = &[
0x30, 0x15, 0xA0, 0x4, 0x2, 0x2, 0xD, 0x3E, 0xA1, 0xD, 0x30, 0xB, 0xA0, 0x3, 0x2, 0x1, 0x1, 0xA1, 0x4, 0x2, 0x2,
0x1, 0xF4,
];
fn response_tls_error() -> RDCleanPathPdu {
RDCleanPathPdu::new_tls_error(48)
}
const RESPONSE_TLS_ERROR_DER: &[u8] = &[
0x30, 0x14, 0xA0, 0x04, 0x02, 0x02, 0x0D, 0x3E, 0xA1, 0x0C, 0x30, 0x0A, 0xA0, 0x03, 0x02, 0x01, 0x01, 0xA3, 0x03,
0x02, 0x01, 0x30,
];
#[rstest]
#[case(request())]
#[case(response_success())]
#[case(response_http_error())]
#[case(response_tls_error())]
fn smoke(#[case] message: RDCleanPathPdu) {
let encoded = message.to_der().unwrap();
let decoded = RDCleanPathPdu::from_der(&encoded).unwrap();
assert_eq!(message, decoded);
}
macro_rules! assert_serialization {
($left:expr, $right:expr) => {{
if $left != $right {
let left = hex::encode(&$left);
let right = hex::encode(&$right);
let comparison = pretty_assertions::StrComparison::new(&left, &right);
panic!(
"assertion failed: `({} == {})`\n\n{comparison}",
stringify!($left),
stringify!($right),
);
}
}};
}
#[rstest]
#[case(request(), REQUEST_DER)]
#[case(response_success(), RESPONSE_SUCCESS_DER)]
#[case(response_http_error(), RESPONSE_HTTP_ERROR_DER)]
#[case(response_tls_error(), RESPONSE_TLS_ERROR_DER)]
fn serialization(#[case] message: RDCleanPathPdu, #[case] expected_der: &[u8]) {
let encoded = message.to_der().unwrap();
assert_serialization!(encoded, expected_der);
}
#[rstest]
#[case(REQUEST_DER)]
#[case(RESPONSE_SUCCESS_DER)]
#[case(RESPONSE_HTTP_ERROR_DER)]
#[case(RESPONSE_TLS_ERROR_DER)]
fn detect(#[case] der: &[u8]) {
let result = RDCleanPathPdu::detect(der);
let DetectionResult::Detected {
version: detected_version,
total_length: detected_length,
} = result
else {
panic!("unexpected result: {result:?}");
};
assert_eq!(detected_version, VERSION_1);
assert_eq!(detected_length, der.len());
}
#[rstest]
#[case(&[])]
#[case(&[0x30])]
#[case(&[0x30, 0x15])]
#[case(&[0x30, 0x15, 0xA0])]
#[case(&[0x30, 0x32, 0xA0, 0x4])]
#[case(&[0x30, 0x32, 0xA0, 0x4, 0x2])]
#[case(&[0x30, 0x32, 0xA0, 0x4, 0x2, 0x2])]
#[case(&[0x30, 0x32, 0xA0, 0x4, 0x2, 0x2, 0xD])]
fn detect_not_enough(#[case] payload: &[u8]) {
let result = RDCleanPathPdu::detect(payload);
assert_eq!(result, DetectionResult::NotEnoughBytes);
}