summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorziyiw <ziyiw@google.com>2022-04-11 16:36:26 +0000
committerziyiw <ziyiw@google.com>2022-04-11 22:02:29 +0000
commit9e2c303ad9f5412b8f85b20a33f11cb1a79f74b8 (patch)
tree5aef240f54e4be68f801a07d40f1f994157062bf /src
parent34b0a481b93838f22f3b726f71f0663e39a9c040 (diff)
downloaduwb-9e2c303ad9f5412b8f85b20a33f11cb1a79f74b8.tar.gz
Add more test cases for fuzzing & handle errors that should not crash.
Test: manual Bug: 202531943 Change-Id: Iefa68905ec3a7fe4899c48a27682807f66ae2e3e
Diffstat (limited to 'src')
-rw-r--r--src/fuzz/fuzzer.rs166
-rw-r--r--src/rust/adaptation/mod.rs5
-rw-r--r--src/rust/uci/uci_hmsgs.rs8
3 files changed, 176 insertions, 3 deletions
diff --git a/src/fuzz/fuzzer.rs b/src/fuzz/fuzzer.rs
index 72688c7..24accc3 100644
--- a/src/fuzz/fuzzer.rs
+++ b/src/fuzz/fuzzer.rs
@@ -6,7 +6,18 @@ use log::{error, info};
use num_traits::cast::FromPrimitive;
use std::sync::Arc;
use tokio::sync::mpsc;
-use uwb_uci_packets::{SessionInitRspBuilder, StatusCode, UciCommandPacket};
+use uwb_uci_packets::{
+ AndroidGetPowerStatsCmdBuilder, AndroidGetPowerStatsRspBuilder,
+ AndroidSetCountryCodeCmdBuilder, AndroidSetCountryCodeRspBuilder, DeviceResetRspBuilder,
+ GetCapsInfoCmdBuilder, GetCapsInfoRspBuilder, GetDeviceInfoCmdBuilder, GetDeviceInfoRspBuilder,
+ PowerStats, RangeStartCmdBuilder, RangeStartRspBuilder, RangeStopCmdBuilder,
+ RangeStopRspBuilder, SessionDeinitCmdBuilder, SessionDeinitRspBuilder,
+ SessionGetAppConfigCmdBuilder, SessionGetAppConfigRspBuilder, SessionGetCountCmdBuilder,
+ SessionGetCountRspBuilder, SessionGetStateCmdBuilder, SessionGetStateRspBuilder,
+ SessionInitCmdBuilder, SessionInitRspBuilder, SessionSetAppConfigRspBuilder, SessionState,
+ SessionType, SessionUpdateControllerMulticastListRspBuilder, StatusCode, UciCommandPacket,
+ UciPacketChild, UciPacketPacket, UciVendor_9_ResponseBuilder,
+};
use uwb_uci_rust::adaptation::MockUwbAdaptation;
use uwb_uci_rust::error::UwbErr;
use uwb_uci_rust::event_manager::MockEventManager;
@@ -28,7 +39,13 @@ fn create_dispatcher_with_mock_adaptation(msgs: Vec<JNICommand>) -> Result<Dispa
mock_adaptation.expect_hal_close(Ok(()));
}
_ => {
- let (cmd, rsp) = generate_fake_cmd_rsp(msg)?;
+ let (cmd, rsp) = match generate_fake_cmd_rsp(msg) {
+ Ok((command, response)) => (command, response),
+ Err(e) => {
+ mock_adaptation.clear_expected_calls();
+ return Err(e);
+ }
+ };
mock_adaptation.expect_send_uci_message(cmd, Some(rsp), None, Ok(()));
}
}
@@ -50,7 +67,150 @@ fn generate_fake_cmd_rsp(
SessionInitRspBuilder { status: StatusCode::UciStatusOk }.build(),
),
)),
- _ => Err(UwbErr::Undefined),
+ JNICommand::UciGetCapsInfo => Ok((
+ GetCapsInfoCmdBuilder {}.build().into(),
+ uci_hrcv::UciResponse::GetCapsInfoRsp(
+ GetCapsInfoRspBuilder { status: StatusCode::UciStatusOk, tlvs: vec![] }.build(),
+ ),
+ )),
+ JNICommand::UciGetDeviceInfo => Ok((
+ GetDeviceInfoCmdBuilder {}.build().into(),
+ uci_hrcv::UciResponse::GetDeviceInfoRsp(
+ GetDeviceInfoRspBuilder {
+ status: StatusCode::UciStatusOk,
+ uci_version: 0,
+ mac_version: 0,
+ phy_version: 0,
+ uci_test_version: 0,
+ vendor_spec_info: vec![],
+ }
+ .build(),
+ ),
+ )),
+ JNICommand::UciSessionDeinit(session_id) => Ok((
+ SessionDeinitCmdBuilder { session_id: *session_id }.build().into(),
+ uci_hrcv::UciResponse::SessionDeinitRsp(
+ SessionDeinitRspBuilder { status: StatusCode::UciStatusOk }.build(),
+ ),
+ )),
+ JNICommand::UciSessionGetCount => Ok((
+ SessionGetCountCmdBuilder {}.build().into(),
+ uci_hrcv::UciResponse::SessionGetCountRsp(
+ SessionGetCountRspBuilder { status: StatusCode::UciStatusOk, session_count: 1 }
+ .build(),
+ ),
+ )),
+ JNICommand::UciStartRange(session_id) => Ok((
+ RangeStartCmdBuilder { session_id: *session_id }.build().into(),
+ uci_hrcv::UciResponse::RangeStartRsp(
+ RangeStartRspBuilder { status: StatusCode::UciStatusOk }.build(),
+ ),
+ )),
+ JNICommand::UciStopRange(session_id) => Ok((
+ RangeStopCmdBuilder { session_id: *session_id }.build().into(),
+ uci_hrcv::UciResponse::RangeStopRsp(
+ RangeStopRspBuilder { status: StatusCode::UciStatusOk }.build(),
+ ),
+ )),
+ JNICommand::UciGetSessionState(session_id) => Ok((
+ SessionGetStateCmdBuilder { session_id: *session_id }.build().into(),
+ uci_hrcv::UciResponse::SessionGetStateRsp(
+ SessionGetStateRspBuilder {
+ status: StatusCode::UciStatusOk,
+ session_state: SessionState::SessionStateInit,
+ }
+ .build(),
+ ),
+ )),
+ JNICommand::UciSessionUpdateMulticastList {
+ session_id,
+ action,
+ no_of_controlee,
+ address_list,
+ sub_session_id_list,
+ } => Ok((
+ uci_hmsgs::build_multicast_list_update_cmd(
+ *session_id,
+ *action,
+ *no_of_controlee,
+ address_list,
+ sub_session_id_list,
+ )?
+ .build()
+ .into(),
+ uci_hrcv::UciResponse::SessionUpdateControllerMulticastListRsp(
+ SessionUpdateControllerMulticastListRspBuilder { status: StatusCode::UciStatusOk }
+ .build(),
+ ),
+ )),
+ JNICommand::UciSetCountryCode { code } => Ok((
+ uci_hmsgs::build_set_country_code_cmd(&code)?.build().into(),
+ uci_hrcv::UciResponse::AndroidSetCountryCodeRsp(
+ AndroidSetCountryCodeRspBuilder { status: StatusCode::UciStatusOk }.build(),
+ ),
+ )),
+ JNICommand::UciSetAppConfig {
+ session_id,
+ no_of_params,
+ app_config_param_len,
+ app_configs,
+ } => Ok((
+ uci_hmsgs::build_set_app_config_cmd(*session_id, *no_of_params, app_configs)?
+ .build()
+ .into(),
+ uci_hrcv::UciResponse::SessionSetAppConfigRsp(
+ SessionSetAppConfigRspBuilder {
+ status: StatusCode::UciStatusOk,
+ cfg_status: vec![],
+ }
+ .build(),
+ ),
+ )),
+ JNICommand::UciGetAppConfig {
+ session_id,
+ no_of_params,
+ app_config_param_len,
+ app_configs,
+ } => Ok((
+ SessionGetAppConfigCmdBuilder {
+ session_id: *session_id,
+ app_cfg: app_configs.to_vec(),
+ }
+ .build()
+ .into(),
+ uci_hrcv::UciResponse::SessionGetAppConfigRsp(
+ SessionGetAppConfigRspBuilder { status: StatusCode::UciStatusOk, tlvs: vec![] }
+ .build(),
+ ),
+ )),
+ JNICommand::UciRawVendorCmd { gid, oid, payload } => Ok((
+ uci_hmsgs::build_uci_vendor_cmd_packet(*gid, *oid, payload.to_vec())?.into(),
+ uci_hrcv::UciResponse::RawVendorRsp(
+ UciVendor_9_ResponseBuilder { opcode: 0, payload: None }.build().into(),
+ ),
+ )),
+ JNICommand::UciDeviceReset { reset_config } => Ok((
+ uci_hmsgs::build_device_reset_cmd(*reset_config)?.build().into(),
+ uci_hrcv::UciResponse::DeviceResetRsp(
+ DeviceResetRspBuilder { status: StatusCode::UciStatusOk }.build(),
+ ),
+ )),
+ JNICommand::UciGetPowerStats => Ok((
+ AndroidGetPowerStatsCmdBuilder {}.build().into(),
+ uci_hrcv::UciResponse::AndroidGetPowerStatsRsp(
+ AndroidGetPowerStatsRspBuilder {
+ stats: PowerStats {
+ status: StatusCode::UciStatusOk,
+ idle_time_ms: 0,
+ tx_time_ms: 0,
+ rx_time_ms: 0,
+ total_wake_count: 0,
+ },
+ }
+ .build(),
+ ),
+ )),
+ _ => Err(UwbErr::Exit),
}
}
diff --git a/src/rust/adaptation/mod.rs b/src/rust/adaptation/mod.rs
index 5e1c8fd..6d436e0 100644
--- a/src/rust/adaptation/mod.rs
+++ b/src/rust/adaptation/mod.rs
@@ -274,6 +274,11 @@ impl MockUwbAdaptation {
});
}
+ #[allow(dead_code)]
+ pub fn clear_expected_calls(&self) {
+ self.expected_calls.lock().unwrap().clear();
+ }
+
async fn send_hal_event(&self, event: UwbEvent, event_status: UwbStatus) {
self.rsp_sender.send(HalCallback::Event { event, event_status }).unwrap();
}
diff --git a/src/rust/uci/uci_hmsgs.rs b/src/rust/uci/uci_hmsgs.rs
index 67c2c75..9b2f57d 100644
--- a/src/rust/uci/uci_hmsgs.rs
+++ b/src/rust/uci/uci_hmsgs.rs
@@ -47,6 +47,11 @@ pub fn build_multicast_list_update_cmd(
address_list: &[i16],
sub_session_id_list: &[i32],
) -> Result<SessionUpdateControllerMulticastListCmdBuilder, UwbErr> {
+ if usize::from(no_of_controlee) != address_list.len()
+ || usize::from(no_of_controlee) != sub_session_id_list.len()
+ {
+ return Err(UwbErr::InvalidArgs);
+ }
let mut controlees = Vec::new();
for i in 0..no_of_controlee {
controlees.push(Controlee {
@@ -66,6 +71,9 @@ pub fn build_set_app_config_cmd(
no_of_params: u32,
mut app_configs: &[u8],
) -> Result<SessionSetAppConfigCmdBuilder, UwbErr> {
+ if no_of_params != app_configs.len().try_into()? {
+ return Err(UwbErr::InvalidArgs);
+ }
let mut tlvs = Vec::new();
for _ in 0..no_of_params {
let tlv = AppConfigTlv::parse(app_configs)?;