summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRoshan Pius <rpius@google.com>2022-04-07 14:35:21 -0700
committerRoshan Pius <rpius@google.com>2022-04-08 21:09:07 +0000
commit36369f568b525d69a4ec94e396eb6d33c21b2af7 (patch)
tree179e6d94804c5372702bf8f3cc77393f6dca5731 /src
parent5e1598e3db544b9585e6dced771c86959e774e7c (diff)
downloaduwb-36369f568b525d69a4ec94e396eb6d33c21b2af7.tar.gz
uwb(uci-rust): Cleanup MockUwbAdaption
Clients using mocks should ideally be only dealing with the interface exposed by the corresponding module. The current impl of MockUwbAdaptation needs clients to dig into the internals of UwbClientCallback. For ex: Uci module tests have to deal with packet fragmentation inside UwbClientCallback impl which should be hidden from unit tests of clients. Bug: 216552887 Test: atest libuwb_uci_rust_tests Change-Id: I071daedd7b1f92089ac4db28707c44baf7a1598e
Diffstat (limited to 'src')
-rw-r--r--src/fuzz/fuzzer.rs12
-rw-r--r--src/rust/adaptation/mod.rs81
-rw-r--r--src/rust/uci/mod.rs75
3 files changed, 85 insertions, 83 deletions
diff --git a/src/fuzz/fuzzer.rs b/src/fuzz/fuzzer.rs
index f56739f..72688c7 100644
--- a/src/fuzz/fuzzer.rs
+++ b/src/fuzz/fuzzer.rs
@@ -6,12 +6,12 @@ use log::{error, info};
use num_traits::cast::FromPrimitive;
use std::sync::Arc;
use tokio::sync::mpsc;
-use uwb_uci_packets::{SessionInitRspBuilder, StatusCode};
+use uwb_uci_packets::{SessionInitRspBuilder, StatusCode, UciCommandPacket};
use uwb_uci_rust::adaptation::MockUwbAdaptation;
use uwb_uci_rust::error::UwbErr;
use uwb_uci_rust::event_manager::MockEventManager;
use uwb_uci_rust::uci::{
- uci_hmsgs, Dispatcher, DispatcherImpl, HalCallback, JNICommand, SyncUwbAdaptation,
+ uci_hmsgs, uci_hrcv, Dispatcher, DispatcherImpl, HalCallback, JNICommand, SyncUwbAdaptation,
};
fn create_dispatcher_with_mock_adaptation(msgs: Vec<JNICommand>) -> Result<DispatcherImpl, UwbErr> {
@@ -40,11 +40,15 @@ fn create_dispatcher_with_mock_adaptation(msgs: Vec<JNICommand>) -> Result<Dispa
)
}
-fn generate_fake_cmd_rsp(msg: &JNICommand) -> Result<(Vec<u8>, Vec<u8>), UwbErr> {
+fn generate_fake_cmd_rsp(
+ msg: &JNICommand,
+) -> Result<(UciCommandPacket, uci_hrcv::UciResponse), UwbErr> {
match msg {
JNICommand::UciSessionInit(session_id, session_type) => Ok((
uci_hmsgs::build_session_init_cmd(*session_id, *session_type)?.build().into(),
- SessionInitRspBuilder { status: StatusCode::UciStatusOk }.build().into(),
+ uci_hrcv::UciResponse::SessionInitRsp(
+ SessionInitRspBuilder { status: StatusCode::UciStatusOk }.build(),
+ ),
)),
_ => Err(UwbErr::Undefined),
}
diff --git a/src/rust/adaptation/mod.rs b/src/rust/adaptation/mod.rs
index 5f6f1c3..5e1c8fd 100644
--- a/src/rust/adaptation/mod.rs
+++ b/src/rust/adaptation/mod.rs
@@ -2,7 +2,6 @@
use crate::error::UwbErr;
use crate::uci::uci_hrcv;
-use crate::uci::uci_logger::MockUciLogger;
use crate::uci::uci_logger::{UciLogMode, UciLogger, UciLoggerImpl};
use crate::uci::HalCallback;
use android_hardware_uwb::aidl::android::hardware::uwb::{
@@ -216,9 +215,9 @@ enum ExpectedCall {
out: Result<()>,
},
SendUciMessage {
- expected_data: Vec<u8>,
- rsp_data: Option<Vec<u8>>,
- notf_data: Option<Vec<u8>>,
+ expected_cmd: UciCommandPacket,
+ rsp: Option<uci_hrcv::UciResponse>,
+ notf: Option<uci_hrcv::UciNotification>,
out: Result<()>,
},
}
@@ -262,36 +261,29 @@ impl MockUwbAdaptation {
#[allow(dead_code)]
pub fn expect_send_uci_message(
&self,
- expected_data: Vec<u8>,
- rsp_data: Option<Vec<u8>>,
- notf_data: Option<Vec<u8>>,
+ expected_cmd: UciCommandPacket,
+ rsp: Option<uci_hrcv::UciResponse>,
+ notf: Option<uci_hrcv::UciNotification>,
out: Result<()>,
) {
self.expected_calls.lock().unwrap().push_back(ExpectedCall::SendUciMessage {
- expected_data,
- rsp_data,
- notf_data,
+ expected_cmd,
+ rsp,
+ notf,
out,
});
}
- fn create_uwb_client_callback(
- rsp_sender: mpsc::UnboundedSender<HalCallback>,
- ) -> UwbClientCallback {
- // Add tests for the mock logger.
- UwbClientCallback::new(rsp_sender, Arc::new(MockUciLogger::new()))
+ async fn send_hal_event(&self, event: UwbEvent, event_status: UwbStatus) {
+ self.rsp_sender.send(HalCallback::Event { event, event_status }).unwrap();
}
- async fn send_client_event(&self, event: UwbEvent, status: UwbStatus) {
- let uwb_client_callback =
- MockUwbAdaptation::create_uwb_client_callback(self.rsp_sender.clone());
- let _ = uwb_client_callback.onHalEvent(event, status).await;
+ async fn send_uci_response(&self, rsp: uci_hrcv::UciResponse) {
+ self.rsp_sender.send(HalCallback::UciRsp(rsp)).unwrap();
}
- async fn send_client_message(&self, rsp_data: Vec<u8>) {
- let uwb_client_callback =
- MockUwbAdaptation::create_uwb_client_callback(self.rsp_sender.clone());
- let _ = uwb_client_callback.onUciMessage(&rsp_data).await;
+ async fn send_uci_notification(&self, ntf: uci_hrcv::UciNotification) {
+ self.rsp_sender.send(HalCallback::UciNtf(ntf)).unwrap();
}
}
@@ -335,7 +327,7 @@ impl UwbAdaptation for MockUwbAdaptation {
match expected_out {
Some(out) => {
let status = if out.is_ok() { UwbStatus::OK } else { UwbStatus::FAILED };
- self.send_client_event(UwbEvent::OPEN_CPLT, status).await;
+ self.send_hal_event(UwbEvent::OPEN_CPLT, status).await;
out
}
None => {
@@ -361,7 +353,7 @@ impl UwbAdaptation for MockUwbAdaptation {
match expected_out {
Some(out) => {
let status = if out.is_ok() { UwbStatus::OK } else { UwbStatus::FAILED };
- self.send_client_event(UwbEvent::CLOSE_CPLT, status).await;
+ self.send_hal_event(UwbEvent::CLOSE_CPLT, status).await;
out
}
None => {
@@ -387,7 +379,7 @@ impl UwbAdaptation for MockUwbAdaptation {
match expected_out {
Some(out) => {
let status = if out.is_ok() { UwbStatus::OK } else { UwbStatus::FAILED };
- self.send_client_event(UwbEvent::POST_INIT_CPLT, status).await;
+ self.send_hal_event(UwbEvent::POST_INIT_CPLT, status).await;
out
}
None => {
@@ -427,11 +419,13 @@ impl UwbAdaptation for MockUwbAdaptation {
let expected_out = {
let mut expected_calls = self.expected_calls.lock().unwrap();
match expected_calls.pop_front() {
- Some(ExpectedCall::SendUciMessage { expected_data, rsp_data, notf_data, out })
- if expected_data == cmd.to_vec() =>
- {
- Some((rsp_data, notf_data, out))
- }
+ Some(ExpectedCall::SendUciMessage {
+ expected_cmd,
+ rsp,
+ notf,
+ out,
+ // PDL generated packets do not implement PartialEq, so use the raw bytes for comparison.
+ }) if expected_cmd.clone().to_bytes() == cmd.to_bytes() => Some((rsp, notf, out)),
Some(call) => {
expected_calls.push_front(call);
None
@@ -441,12 +435,12 @@ impl UwbAdaptation for MockUwbAdaptation {
};
match expected_out {
- Some((rsp_data, notf_data, out)) => {
- if let Some(rsp) = rsp_data {
- self.send_client_message(rsp).await;
+ Some((rsp, notf, out)) => {
+ if let Some(rsp) = rsp {
+ self.send_uci_response(rsp).await;
}
- if let Some(notf) = notf_data {
- self.send_client_message(notf).await;
+ if let Some(notf) = notf {
+ self.send_uci_notification(notf).await;
}
out
}
@@ -459,12 +453,6 @@ impl UwbAdaptation for MockUwbAdaptation {
}
#[cfg(test)]
-fn create_uwb_client_callback(rsp_sender: mpsc::UnboundedSender<HalCallback>) -> UwbClientCallback {
- // Add tests for the mock logger.
- UwbClientCallback::new(rsp_sender, Arc::new(MockUciLogger::new()))
-}
-
-#[cfg(test)]
pub mod tests {
#![allow(non_snake_case)]
use super::*;
@@ -479,6 +467,15 @@ pub mod tests {
SessionInit { expected_session_id: i32, out: BinderResult<()> },
SendUciMessage { expected_data: Vec<u8>, out: BinderResult<i32> },
}
+ use crate::uci::uci_logger::MockUciLogger;
+
+ #[cfg(test)]
+ fn create_uwb_client_callback(
+ rsp_sender: mpsc::UnboundedSender<HalCallback>,
+ ) -> UwbClientCallback {
+ // Add tests for the mock logger.
+ UwbClientCallback::new(rsp_sender, Arc::new(MockUciLogger::new()))
+ }
pub struct MockHal {
expected_calls: StdMutex<VecDeque<ExpectedHalCall>>,
diff --git a/src/rust/uci/mod.rs b/src/rust/uci/mod.rs
index a24d2f2..a8d8893 100644
--- a/src/rust/uci/mod.rs
+++ b/src/rust/uci/mod.rs
@@ -556,16 +556,16 @@ impl Dispatcher for DispatcherImpl {
#[cfg(test)]
mod tests {
+ use self::uci_hrcv::UciNotification;
+ use self::uci_hrcv::UciResponse;
+
use super::*;
use crate::adaptation::MockUwbAdaptation;
use crate::event_manager::MockEventManager;
use android_hardware_uwb::aidl::android::hardware::uwb::{
UwbEvent::UwbEvent, UwbStatus::UwbStatus,
};
- use uwb_uci_packets::{
- DeviceState, DeviceStatusNtfBuilder, GetDeviceInfoRspBuilder, Packet, UciPacketHalPacket,
- UciPacketPacket,
- };
+ use uwb_uci_packets::*;
fn setup_dispatcher(
config_fn: fn(&mut Arc<MockUwbAdaptation>, &mut MockEventManager),
@@ -609,9 +609,9 @@ mod tests {
Ok((dispatcher, rsp_sender))
}
- fn generate_fake_cmd_rsp_data() -> (Vec<u8>, Vec<u8>) {
- let cmd_data = GetDeviceInfoCmdBuilder {}.build().to_vec();
- let rsp_packet: UciPacketPacket = GetDeviceInfoRspBuilder {
+ fn generate_fake_get_device_cmd_rsp() -> (GetDeviceInfoCmdPacket, GetDeviceInfoRspPacket) {
+ let cmd = GetDeviceInfoCmdBuilder {}.build();
+ let rsp = GetDeviceInfoRspBuilder {
status: StatusCode::UciStatusOk,
uci_version: 0,
mac_version: 0,
@@ -619,21 +619,12 @@ mod tests {
uci_test_version: 0,
vendor_spec_info: vec![],
}
- .build()
- .into();
- // Convert to UciPacketHalPacket
- let mut rsp_frags: Vec<UciPacketHalPacket> = rsp_packet.into();
- let rsp_data = rsp_frags.pop().unwrap().to_vec();
-
- (cmd_data, rsp_data)
+ .build();
+ (cmd, rsp)
}
- fn generate_fake_ntf_data() -> Vec<u8> {
- let ntf_packet: UciPacketPacket =
- DeviceStatusNtfBuilder { device_state: DeviceState::DeviceStateReady }.build().into();
- // Convert to UciPacketHalPacket
- let mut ntf_frags: Vec<UciPacketHalPacket> = ntf_packet.into();
- ntf_frags.pop().unwrap().to_vec()
+ fn generate_fake_device_status_ntf() -> DeviceStatusNtfPacket {
+ DeviceStatusNtfBuilder { device_state: DeviceState::DeviceStateReady }.build()
}
#[test]
@@ -674,10 +665,15 @@ mod tests {
}
#[test]
- fn test_send_uci_message() -> Result<()> {
+ fn test_get_device_info() -> Result<()> {
let mut dispatcher = setup_dispatcher(|mock_adaptation, _mock_event_manager| {
- let (cmd_data, rsp_data) = generate_fake_cmd_rsp_data();
- mock_adaptation.expect_send_uci_message(cmd_data, Some(rsp_data), None, Ok(()));
+ let (cmd, rsp) = generate_fake_get_device_cmd_rsp();
+ mock_adaptation.expect_send_uci_message(
+ cmd.into(),
+ Some(UciResponse::GetDeviceInfoRsp(rsp)),
+ None,
+ Ok(()),
+ );
})?;
dispatcher.block_on_jni_command(JNICommand::UciGetDeviceInfo)?;
@@ -685,14 +681,19 @@ mod tests {
}
#[test]
- fn test_send_uci_message_with_retry() -> Result<()> {
+ fn test_get_device_info_with_uci_retry() -> Result<()> {
let mut dispatcher = setup_dispatcher(|mock_adaptation, _mock_event_manager| {
- let (cmd_data, rsp_data) = generate_fake_cmd_rsp_data();
+ let (cmd, rsp) = generate_fake_get_device_cmd_rsp();
// Let the first 2 tries not response data, then the 3rd tries response successfully.
- mock_adaptation.expect_send_uci_message(cmd_data.clone(), None, None, Ok(()));
- mock_adaptation.expect_send_uci_message(cmd_data.clone(), None, None, Ok(()));
- mock_adaptation.expect_send_uci_message(cmd_data, Some(rsp_data), None, Ok(()));
+ mock_adaptation.expect_send_uci_message(cmd.clone().into(), None, None, Ok(()));
+ mock_adaptation.expect_send_uci_message(cmd.clone().into(), None, None, Ok(()));
+ mock_adaptation.expect_send_uci_message(
+ cmd.into(),
+ Some(UciResponse::GetDeviceInfoRsp(rsp)),
+ None,
+ Ok(()),
+ );
})?;
dispatcher.block_on_jni_command(JNICommand::UciGetDeviceInfo)?;
@@ -700,10 +701,10 @@ mod tests {
}
#[test]
- fn test_send_uci_message_failed() -> Result<()> {
+ fn test_get_device_info_send_uci_message_failed() -> Result<()> {
let dispatcher = setup_dispatcher(|mock_adaptation, _mock_event_manager| {
- let (cmd_data, _rsp_data) = generate_fake_cmd_rsp_data();
- mock_adaptation.expect_send_uci_message(cmd_data, None, None, Err(UwbErr::failed()));
+ let (cmd, _rsp) = generate_fake_get_device_cmd_rsp();
+ mock_adaptation.expect_send_uci_message(cmd.into(), None, None, Err(UwbErr::failed()));
})?;
dispatcher
@@ -713,14 +714,14 @@ mod tests {
}
#[test]
- fn test_notification() -> Result<()> {
+ fn test_device_status_notification() -> Result<()> {
let mut dispatcher = setup_dispatcher(|mock_adaptation, mock_event_manager| {
- let (cmd_data, rsp_data) = generate_fake_cmd_rsp_data();
- let ntf_data = generate_fake_ntf_data();
+ let (cmd, rsp) = generate_fake_get_device_cmd_rsp();
+ let ntf = generate_fake_device_status_ntf();
mock_adaptation.expect_send_uci_message(
- cmd_data,
- Some(rsp_data),
- Some(ntf_data),
+ cmd.into(),
+ Some(UciResponse::GetDeviceInfoRsp(rsp)),
+ Some(UciNotification::DeviceStatusNtf(ntf)),
Ok(()),
);
mock_event_manager.expect_device_status_notification_received(Ok(()));