use oca::{
ocp1::{
encoder, parser,
pdu::{
Command, Handle, Header, KeepAlive, MessageCount, MessagePdu, Notification1,
Notification1EventData, Notification1Parameters, Notification2,
Notification2ExceptionData, Notification2ExceptionType, Notification2Type, Parameters,
PduSize, PduType, ProtocolVersion, Response,
},
},
types::{OcaEvent, OcaMethod, OcaMethodId, OcaONo, OcaStatus},
};
#[test]
fn encodes_a_message_that_the_parser_reads_back() {
let message = MessagePdu {
header: Header {
protocol_version: ProtocolVersion::V1,
pdu_size: PduSize::from((Header::SIZE + 5) as u32),
pdu_type: PduType::Command,
message_count: MessageCount::try_from(1).unwrap(),
},
data: b"hello",
};
let mut buffer = [0u8; 64];
let encoded = encoder::encode_pdu(&message, &mut buffer).unwrap();
let (parsed, leftover) = parser::message_pdu(encoded).unwrap();
assert_eq!(message, parsed);
assert!(leftover.is_empty());
}
#[test]
fn encodes_a_command_that_the_parser_reads_back() {
let command = Command {
handle: Handle::from(42),
method: OcaMethod {
object: OcaONo::from(7),
id: OcaMethodId { level: 2, index: 3 },
},
parameters: Parameters {
count: 3,
parameters: b"abc",
},
};
let mut buffer = [0u8; 64];
let encoded = encoder::encode_message(&command, &mut buffer).unwrap();
let (parsed, leftover) = parser::message_pdu(encoded)
.and_then(|(pdu, _)| parser::command(pdu.data))
.unwrap();
assert_eq!(command, parsed);
assert!(leftover.is_empty());
}
#[test]
fn encodes_a_response_that_the_parser_reads_back() {
let response = Response {
handle: Handle::from(42),
status: OcaStatus::Err(5),
parameters: Parameters {
count: 3,
parameters: b"abc",
},
};
let mut buffer = [0u8; 64];
let encoded = encoder::encode_message(&response, &mut buffer).unwrap();
let (parsed, leftover) = parser::message_pdu(encoded)
.and_then(|(pdu, _)| parser::response(pdu.data))
.unwrap();
assert_eq!(response, parsed);
assert!(leftover.is_empty());
}
#[test]
fn encodes_a_notification1_that_the_parser_reads_back() {
let notification = Notification1 {
target: OcaMethod {
object: 100.into(),
id: (1, 3).into(),
},
parameters: Notification1Parameters {
context: b"foo",
event_data: Notification1EventData {
event: OcaEvent {
object: 100.into(),
id: (1, 1).into(),
},
parameters: Parameters {
count: 2,
parameters: b"helloworld",
},
},
},
};
let mut buffer = [0u8; 64];
let encoded = encoder::encode_message(¬ification, &mut buffer).unwrap();
let (parsed, leftover) = parser::message_pdu(encoded)
.and_then(|(pdu, _)| parser::notification1(pdu.data))
.unwrap();
assert_eq!(notification, parsed);
assert!(leftover.is_empty());
}
#[test]
fn encodes_a_notification2_event_that_the_parser_reads_back() {
let notification = Notification2 {
event: OcaEvent {
object: 100.into(),
id: (1, 1).into(),
},
r#type: Notification2Type::Event(b"some-cool-event"),
};
let mut buffer = [0u8; 64];
let encoded = encoder::encode_message(¬ification, &mut buffer).unwrap();
let (parsed, leftover) = parser::message_pdu(encoded)
.and_then(|(pdu, _)| parser::notification2(pdu.data))
.unwrap();
assert_eq!(notification, parsed);
assert!(leftover.is_empty());
}
#[test]
fn encodes_a_notification2_exception_that_the_parser_reads_back() {
let notification = Notification2 {
event: OcaEvent {
object: 100.into(),
id: (1, 1).into(),
},
r#type: Notification2Type::Exception(Notification2ExceptionData {
r#type: Notification2ExceptionType::Unspecified,
try_again: false,
data: b"whoops!",
}),
};
let mut buffer = [0u8; 64];
let encoded = encoder::encode_message(¬ification, &mut buffer).unwrap();
let (parsed, leftover) = parser::message_pdu(encoded)
.and_then(|(pdu, _)| parser::notification2(pdu.data))
.unwrap();
assert_eq!(notification, parsed);
assert!(leftover.is_empty());
}
#[test]
fn encodes_keep_alive_seconds_that_the_parser_reads_back() {
let keep_alive = KeepAlive::Seconds(30);
let mut buffer = [0u8; 64];
let encoded = encoder::encode_message(&keep_alive, &mut buffer).unwrap();
let parsed = parser::message_pdu(encoded)
.and_then(|(pdu, _)| parser::keep_alive(pdu.data))
.unwrap();
assert_eq!(keep_alive, parsed);
}
#[test]
fn encodes_keep_alive_milliseconds_that_the_parser_reads_back() {
let keep_alive = KeepAlive::Milliseconds(1500);
let mut buffer = [0u8; 64];
let encoded = encoder::encode_message(&keep_alive, &mut buffer).unwrap();
let parsed = parser::message_pdu(encoded)
.and_then(|(pdu, _)| parser::keep_alive(pdu.data))
.unwrap();
assert_eq!(keep_alive, parsed);
}