diff options
author | ziyiw <ziyiw@google.com> | 2022-04-11 16:36:26 +0000 |
---|---|---|
committer | ziyiw <ziyiw@google.com> | 2022-04-11 22:02:29 +0000 |
commit | 9e2c303ad9f5412b8f85b20a33f11cb1a79f74b8 (patch) | |
tree | 5aef240f54e4be68f801a07d40f1f994157062bf /src | |
parent | 34b0a481b93838f22f3b726f71f0663e39a9c040 (diff) | |
download | uwb-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.rs | 166 | ||||
-rw-r--r-- | src/rust/adaptation/mod.rs | 5 | ||||
-rw-r--r-- | src/rust/uci/uci_hmsgs.rs | 8 |
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)?; |