1*cf78ab8cSAndroid Build Coastguard Worker // Copyright 2022 Google LLC 2*cf78ab8cSAndroid Build Coastguard Worker // 3*cf78ab8cSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 4*cf78ab8cSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 5*cf78ab8cSAndroid Build Coastguard Worker // You may obtain a copy of the License at 6*cf78ab8cSAndroid Build Coastguard Worker // 7*cf78ab8cSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0 8*cf78ab8cSAndroid Build Coastguard Worker // 9*cf78ab8cSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*cf78ab8cSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 11*cf78ab8cSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*cf78ab8cSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 13*cf78ab8cSAndroid Build Coastguard Worker // limitations under the License. 14*cf78ab8cSAndroid Build Coastguard Worker 15*cf78ab8cSAndroid Build Coastguard Worker use crate::args::{self, Beacon, Command}; 16*cf78ab8cSAndroid Build Coastguard Worker use crate::ffi::frontend_client_ffi::GrpcMethod; 17*cf78ab8cSAndroid Build Coastguard Worker 18*cf78ab8cSAndroid Build Coastguard Worker impl args::Command { 19*cf78ab8cSAndroid Build Coastguard Worker /// Return the respective GrpcMethod for the command grpc_method(&self) -> GrpcMethod20*cf78ab8cSAndroid Build Coastguard Worker pub fn grpc_method(&self) -> GrpcMethod { 21*cf78ab8cSAndroid Build Coastguard Worker match self { 22*cf78ab8cSAndroid Build Coastguard Worker Command::Version => GrpcMethod::GetVersion, 23*cf78ab8cSAndroid Build Coastguard Worker Command::Radio(_) => GrpcMethod::PatchDevice, 24*cf78ab8cSAndroid Build Coastguard Worker Command::Move(_) => GrpcMethod::PatchDevice, 25*cf78ab8cSAndroid Build Coastguard Worker Command::Devices(_) => GrpcMethod::ListDevice, 26*cf78ab8cSAndroid Build Coastguard Worker Command::Reset => GrpcMethod::Reset, 27*cf78ab8cSAndroid Build Coastguard Worker Command::Capture(cmd) => match cmd { 28*cf78ab8cSAndroid Build Coastguard Worker args::Capture::List(_) => GrpcMethod::ListCapture, 29*cf78ab8cSAndroid Build Coastguard Worker args::Capture::Get(_) => GrpcMethod::GetCapture, 30*cf78ab8cSAndroid Build Coastguard Worker args::Capture::Patch(_) => GrpcMethod::PatchCapture, 31*cf78ab8cSAndroid Build Coastguard Worker }, 32*cf78ab8cSAndroid Build Coastguard Worker Command::Gui => { 33*cf78ab8cSAndroid Build Coastguard Worker panic!("No GrpcMethod for Ui Command."); 34*cf78ab8cSAndroid Build Coastguard Worker } 35*cf78ab8cSAndroid Build Coastguard Worker Command::Artifact => { 36*cf78ab8cSAndroid Build Coastguard Worker panic!("No GrpcMethod for Artifact Command."); 37*cf78ab8cSAndroid Build Coastguard Worker } 38*cf78ab8cSAndroid Build Coastguard Worker Command::Beacon(action) => match action { 39*cf78ab8cSAndroid Build Coastguard Worker Beacon::Create(_) => GrpcMethod::CreateDevice, 40*cf78ab8cSAndroid Build Coastguard Worker Beacon::Patch(_) => GrpcMethod::PatchDevice, 41*cf78ab8cSAndroid Build Coastguard Worker Beacon::Remove(_) => GrpcMethod::DeleteChip, 42*cf78ab8cSAndroid Build Coastguard Worker }, 43*cf78ab8cSAndroid Build Coastguard Worker Command::Bumble => { 44*cf78ab8cSAndroid Build Coastguard Worker panic!("No GrpcMethod for Bumble Command."); 45*cf78ab8cSAndroid Build Coastguard Worker } 46*cf78ab8cSAndroid Build Coastguard Worker } 47*cf78ab8cSAndroid Build Coastguard Worker } 48*cf78ab8cSAndroid Build Coastguard Worker } 49*cf78ab8cSAndroid Build Coastguard Worker 50*cf78ab8cSAndroid Build Coastguard Worker #[cfg(test)] 51*cf78ab8cSAndroid Build Coastguard Worker mod tests { 52*cf78ab8cSAndroid Build Coastguard Worker use super::*; 53*cf78ab8cSAndroid Build Coastguard Worker use args::{BinaryProtobuf, NetsimArgs}; 54*cf78ab8cSAndroid Build Coastguard Worker use clap::Parser; 55*cf78ab8cSAndroid Build Coastguard Worker use netsim_proto::frontend::{ 56*cf78ab8cSAndroid Build Coastguard Worker patch_device_request::PatchDeviceFields as PatchDeviceFieldsProto, CreateDeviceRequest, 57*cf78ab8cSAndroid Build Coastguard Worker PatchDeviceRequest, 58*cf78ab8cSAndroid Build Coastguard Worker }; 59*cf78ab8cSAndroid Build Coastguard Worker use netsim_proto::model::chip::ble_beacon::AdvertiseData as AdvertiseDataProto; 60*cf78ab8cSAndroid Build Coastguard Worker use netsim_proto::model::chip::{ 61*cf78ab8cSAndroid Build Coastguard Worker ble_beacon::{ 62*cf78ab8cSAndroid Build Coastguard Worker advertise_settings::{ 63*cf78ab8cSAndroid Build Coastguard Worker AdvertiseMode as AdvertiseModeProto, AdvertiseTxPower as AdvertiseTxPowerProto, 64*cf78ab8cSAndroid Build Coastguard Worker Interval as IntervalProto, Tx_power as TxPowerProto, 65*cf78ab8cSAndroid Build Coastguard Worker }, 66*cf78ab8cSAndroid Build Coastguard Worker AdvertiseSettings as AdvertiseSettingsProto, 67*cf78ab8cSAndroid Build Coastguard Worker }, 68*cf78ab8cSAndroid Build Coastguard Worker BleBeacon as BleBeaconProto, Chip as ChipKindProto, 69*cf78ab8cSAndroid Build Coastguard Worker }; 70*cf78ab8cSAndroid Build Coastguard Worker use netsim_proto::model::chip_create::{ 71*cf78ab8cSAndroid Build Coastguard Worker BleBeaconCreate as BleBeaconCreateProto, Chip as ChipKindCreateProto, 72*cf78ab8cSAndroid Build Coastguard Worker }; 73*cf78ab8cSAndroid Build Coastguard Worker use netsim_proto::model::{ 74*cf78ab8cSAndroid Build Coastguard Worker Chip as ChipProto, ChipCreate as ChipCreateProto, DeviceCreate as DeviceCreateProto, 75*cf78ab8cSAndroid Build Coastguard Worker }; 76*cf78ab8cSAndroid Build Coastguard Worker use netsim_proto::{ 77*cf78ab8cSAndroid Build Coastguard Worker common::ChipKind, 78*cf78ab8cSAndroid Build Coastguard Worker frontend, 79*cf78ab8cSAndroid Build Coastguard Worker model::{ 80*cf78ab8cSAndroid Build Coastguard Worker self, 81*cf78ab8cSAndroid Build Coastguard Worker chip::{Bluetooth as Chip_Bluetooth, Radio as Chip_Radio}, 82*cf78ab8cSAndroid Build Coastguard Worker Position, 83*cf78ab8cSAndroid Build Coastguard Worker }, 84*cf78ab8cSAndroid Build Coastguard Worker }; 85*cf78ab8cSAndroid Build Coastguard Worker use protobuf::Message; 86*cf78ab8cSAndroid Build Coastguard Worker use protobuf::MessageField; 87*cf78ab8cSAndroid Build Coastguard Worker test_command( command: &str, expected_grpc_method: GrpcMethod, expected_request_byte_str: BinaryProtobuf, )88*cf78ab8cSAndroid Build Coastguard Worker fn test_command( 89*cf78ab8cSAndroid Build Coastguard Worker command: &str, 90*cf78ab8cSAndroid Build Coastguard Worker expected_grpc_method: GrpcMethod, 91*cf78ab8cSAndroid Build Coastguard Worker expected_request_byte_str: BinaryProtobuf, 92*cf78ab8cSAndroid Build Coastguard Worker ) { 93*cf78ab8cSAndroid Build Coastguard Worker let command = NetsimArgs::parse_from(command.split_whitespace()).command; 94*cf78ab8cSAndroid Build Coastguard Worker assert_eq!(expected_grpc_method, command.grpc_method()); 95*cf78ab8cSAndroid Build Coastguard Worker let request = command.get_request_bytes(); 96*cf78ab8cSAndroid Build Coastguard Worker assert_eq!(request, expected_request_byte_str); 97*cf78ab8cSAndroid Build Coastguard Worker } 98*cf78ab8cSAndroid Build Coastguard Worker 99*cf78ab8cSAndroid Build Coastguard Worker #[test] test_version_request()100*cf78ab8cSAndroid Build Coastguard Worker fn test_version_request() { 101*cf78ab8cSAndroid Build Coastguard Worker test_command("netsim-cli version", GrpcMethod::GetVersion, Vec::new()) 102*cf78ab8cSAndroid Build Coastguard Worker } 103*cf78ab8cSAndroid Build Coastguard Worker get_expected_radio(name: &str, radio_type: &str, state: &str) -> BinaryProtobuf104*cf78ab8cSAndroid Build Coastguard Worker fn get_expected_radio(name: &str, radio_type: &str, state: &str) -> BinaryProtobuf { 105*cf78ab8cSAndroid Build Coastguard Worker let mut chip = model::Chip { ..Default::default() }; 106*cf78ab8cSAndroid Build Coastguard Worker let chip_state = state == "up"; 107*cf78ab8cSAndroid Build Coastguard Worker if radio_type == "wifi" { 108*cf78ab8cSAndroid Build Coastguard Worker let mut wifi_chip = Chip_Radio::new(); 109*cf78ab8cSAndroid Build Coastguard Worker wifi_chip.state = chip_state.into(); 110*cf78ab8cSAndroid Build Coastguard Worker chip.set_wifi(wifi_chip); 111*cf78ab8cSAndroid Build Coastguard Worker chip.kind = ChipKind::WIFI.into(); 112*cf78ab8cSAndroid Build Coastguard Worker } else if radio_type == "uwb" { 113*cf78ab8cSAndroid Build Coastguard Worker let mut uwb_chip = Chip_Radio::new(); 114*cf78ab8cSAndroid Build Coastguard Worker uwb_chip.state = chip_state.into(); 115*cf78ab8cSAndroid Build Coastguard Worker chip.set_uwb(uwb_chip); 116*cf78ab8cSAndroid Build Coastguard Worker chip.kind = ChipKind::UWB.into(); 117*cf78ab8cSAndroid Build Coastguard Worker } else { 118*cf78ab8cSAndroid Build Coastguard Worker let mut bt_chip = Chip_Bluetooth::new(); 119*cf78ab8cSAndroid Build Coastguard Worker let mut bt_chip_radio = Chip_Radio::new(); 120*cf78ab8cSAndroid Build Coastguard Worker bt_chip_radio.state = chip_state.into(); 121*cf78ab8cSAndroid Build Coastguard Worker if radio_type == "ble" { 122*cf78ab8cSAndroid Build Coastguard Worker bt_chip.low_energy = Some(bt_chip_radio).into(); 123*cf78ab8cSAndroid Build Coastguard Worker } else { 124*cf78ab8cSAndroid Build Coastguard Worker bt_chip.classic = Some(bt_chip_radio).into(); 125*cf78ab8cSAndroid Build Coastguard Worker } 126*cf78ab8cSAndroid Build Coastguard Worker chip.kind = ChipKind::BLUETOOTH.into(); 127*cf78ab8cSAndroid Build Coastguard Worker chip.set_bt(bt_chip); 128*cf78ab8cSAndroid Build Coastguard Worker } 129*cf78ab8cSAndroid Build Coastguard Worker let mut result = frontend::PatchDeviceRequest::new(); 130*cf78ab8cSAndroid Build Coastguard Worker let mut device = PatchDeviceFieldsProto::new(); 131*cf78ab8cSAndroid Build Coastguard Worker device.name = Some(name.to_string()); 132*cf78ab8cSAndroid Build Coastguard Worker device.chips.push(chip); 133*cf78ab8cSAndroid Build Coastguard Worker result.device = Some(device).into(); 134*cf78ab8cSAndroid Build Coastguard Worker result.write_to_bytes().unwrap() 135*cf78ab8cSAndroid Build Coastguard Worker } 136*cf78ab8cSAndroid Build Coastguard Worker 137*cf78ab8cSAndroid Build Coastguard Worker #[test] test_radio_ble()138*cf78ab8cSAndroid Build Coastguard Worker fn test_radio_ble() { 139*cf78ab8cSAndroid Build Coastguard Worker test_command( 140*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli radio ble down 1000", 141*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::PatchDevice, 142*cf78ab8cSAndroid Build Coastguard Worker get_expected_radio("1000", "ble", "down"), 143*cf78ab8cSAndroid Build Coastguard Worker ); 144*cf78ab8cSAndroid Build Coastguard Worker test_command( 145*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli radio ble up 1000", 146*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::PatchDevice, 147*cf78ab8cSAndroid Build Coastguard Worker get_expected_radio("1000", "ble", "up"), 148*cf78ab8cSAndroid Build Coastguard Worker ); 149*cf78ab8cSAndroid Build Coastguard Worker } 150*cf78ab8cSAndroid Build Coastguard Worker 151*cf78ab8cSAndroid Build Coastguard Worker #[test] test_radio_ble_aliases()152*cf78ab8cSAndroid Build Coastguard Worker fn test_radio_ble_aliases() { 153*cf78ab8cSAndroid Build Coastguard Worker test_command( 154*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli radio ble Down 1000", 155*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::PatchDevice, 156*cf78ab8cSAndroid Build Coastguard Worker get_expected_radio("1000", "ble", "down"), 157*cf78ab8cSAndroid Build Coastguard Worker ); 158*cf78ab8cSAndroid Build Coastguard Worker test_command( 159*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli radio ble Up 1000", 160*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::PatchDevice, 161*cf78ab8cSAndroid Build Coastguard Worker get_expected_radio("1000", "ble", "up"), 162*cf78ab8cSAndroid Build Coastguard Worker ); 163*cf78ab8cSAndroid Build Coastguard Worker test_command( 164*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli radio ble DOWN 1000", 165*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::PatchDevice, 166*cf78ab8cSAndroid Build Coastguard Worker get_expected_radio("1000", "ble", "down"), 167*cf78ab8cSAndroid Build Coastguard Worker ); 168*cf78ab8cSAndroid Build Coastguard Worker test_command( 169*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli radio ble UP 1000", 170*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::PatchDevice, 171*cf78ab8cSAndroid Build Coastguard Worker get_expected_radio("1000", "ble", "up"), 172*cf78ab8cSAndroid Build Coastguard Worker ); 173*cf78ab8cSAndroid Build Coastguard Worker } 174*cf78ab8cSAndroid Build Coastguard Worker 175*cf78ab8cSAndroid Build Coastguard Worker #[test] test_radio_classic()176*cf78ab8cSAndroid Build Coastguard Worker fn test_radio_classic() { 177*cf78ab8cSAndroid Build Coastguard Worker test_command( 178*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli radio classic down 100", 179*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::PatchDevice, 180*cf78ab8cSAndroid Build Coastguard Worker get_expected_radio("100", "classic", "down"), 181*cf78ab8cSAndroid Build Coastguard Worker ); 182*cf78ab8cSAndroid Build Coastguard Worker test_command( 183*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli radio classic up 100", 184*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::PatchDevice, 185*cf78ab8cSAndroid Build Coastguard Worker get_expected_radio("100", "classic", "up"), 186*cf78ab8cSAndroid Build Coastguard Worker ); 187*cf78ab8cSAndroid Build Coastguard Worker } 188*cf78ab8cSAndroid Build Coastguard Worker 189*cf78ab8cSAndroid Build Coastguard Worker #[test] test_radio_wifi()190*cf78ab8cSAndroid Build Coastguard Worker fn test_radio_wifi() { 191*cf78ab8cSAndroid Build Coastguard Worker test_command( 192*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli radio wifi down a", 193*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::PatchDevice, 194*cf78ab8cSAndroid Build Coastguard Worker get_expected_radio("a", "wifi", "down"), 195*cf78ab8cSAndroid Build Coastguard Worker ); 196*cf78ab8cSAndroid Build Coastguard Worker test_command( 197*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli radio wifi up b", 198*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::PatchDevice, 199*cf78ab8cSAndroid Build Coastguard Worker get_expected_radio("b", "wifi", "up"), 200*cf78ab8cSAndroid Build Coastguard Worker ); 201*cf78ab8cSAndroid Build Coastguard Worker } 202*cf78ab8cSAndroid Build Coastguard Worker 203*cf78ab8cSAndroid Build Coastguard Worker #[test] test_radio_uwb()204*cf78ab8cSAndroid Build Coastguard Worker fn test_radio_uwb() { 205*cf78ab8cSAndroid Build Coastguard Worker test_command( 206*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli radio uwb down a", 207*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::PatchDevice, 208*cf78ab8cSAndroid Build Coastguard Worker get_expected_radio("a", "uwb", "down"), 209*cf78ab8cSAndroid Build Coastguard Worker ); 210*cf78ab8cSAndroid Build Coastguard Worker test_command( 211*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli radio uwb up b", 212*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::PatchDevice, 213*cf78ab8cSAndroid Build Coastguard Worker get_expected_radio("b", "uwb", "up"), 214*cf78ab8cSAndroid Build Coastguard Worker ); 215*cf78ab8cSAndroid Build Coastguard Worker } 216*cf78ab8cSAndroid Build Coastguard Worker get_expected_move(name: &str, x: f32, y: f32, z: Option<f32>) -> BinaryProtobuf217*cf78ab8cSAndroid Build Coastguard Worker fn get_expected_move(name: &str, x: f32, y: f32, z: Option<f32>) -> BinaryProtobuf { 218*cf78ab8cSAndroid Build Coastguard Worker let mut result = frontend::PatchDeviceRequest::new(); 219*cf78ab8cSAndroid Build Coastguard Worker let mut device = PatchDeviceFieldsProto::new(); 220*cf78ab8cSAndroid Build Coastguard Worker let position = Position { x, y, z: z.unwrap_or_default(), ..Default::default() }; 221*cf78ab8cSAndroid Build Coastguard Worker device.name = Some(name.to_string()); 222*cf78ab8cSAndroid Build Coastguard Worker device.position = Some(position).into(); 223*cf78ab8cSAndroid Build Coastguard Worker result.device = Some(device).into(); 224*cf78ab8cSAndroid Build Coastguard Worker result.write_to_bytes().unwrap() 225*cf78ab8cSAndroid Build Coastguard Worker } 226*cf78ab8cSAndroid Build Coastguard Worker 227*cf78ab8cSAndroid Build Coastguard Worker #[test] test_move_int()228*cf78ab8cSAndroid Build Coastguard Worker fn test_move_int() { 229*cf78ab8cSAndroid Build Coastguard Worker test_command( 230*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli move 1 1 2 3", 231*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::PatchDevice, 232*cf78ab8cSAndroid Build Coastguard Worker get_expected_move("1", 1.0, 2.0, Some(3.0)), 233*cf78ab8cSAndroid Build Coastguard Worker ) 234*cf78ab8cSAndroid Build Coastguard Worker } 235*cf78ab8cSAndroid Build Coastguard Worker 236*cf78ab8cSAndroid Build Coastguard Worker #[test] test_move_float()237*cf78ab8cSAndroid Build Coastguard Worker fn test_move_float() { 238*cf78ab8cSAndroid Build Coastguard Worker test_command( 239*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli move 1000 1.2 3.4 5.6", 240*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::PatchDevice, 241*cf78ab8cSAndroid Build Coastguard Worker get_expected_move("1000", 1.2, 3.4, Some(5.6)), 242*cf78ab8cSAndroid Build Coastguard Worker ) 243*cf78ab8cSAndroid Build Coastguard Worker } 244*cf78ab8cSAndroid Build Coastguard Worker 245*cf78ab8cSAndroid Build Coastguard Worker #[test] test_move_mixed()246*cf78ab8cSAndroid Build Coastguard Worker fn test_move_mixed() { 247*cf78ab8cSAndroid Build Coastguard Worker test_command( 248*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli move 1000 1.1 2 3.4", 249*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::PatchDevice, 250*cf78ab8cSAndroid Build Coastguard Worker get_expected_move("1000", 1.1, 2.0, Some(3.4)), 251*cf78ab8cSAndroid Build Coastguard Worker ) 252*cf78ab8cSAndroid Build Coastguard Worker } 253*cf78ab8cSAndroid Build Coastguard Worker 254*cf78ab8cSAndroid Build Coastguard Worker #[test] test_move_no_z()255*cf78ab8cSAndroid Build Coastguard Worker fn test_move_no_z() { 256*cf78ab8cSAndroid Build Coastguard Worker test_command( 257*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli move 1000 1.2 3.4", 258*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::PatchDevice, 259*cf78ab8cSAndroid Build Coastguard Worker get_expected_move("1000", 1.2, 3.4, None), 260*cf78ab8cSAndroid Build Coastguard Worker ) 261*cf78ab8cSAndroid Build Coastguard Worker } 262*cf78ab8cSAndroid Build Coastguard Worker 263*cf78ab8cSAndroid Build Coastguard Worker #[test] test_devices()264*cf78ab8cSAndroid Build Coastguard Worker fn test_devices() { 265*cf78ab8cSAndroid Build Coastguard Worker test_command("netsim-cli devices", GrpcMethod::ListDevice, Vec::new()) 266*cf78ab8cSAndroid Build Coastguard Worker } 267*cf78ab8cSAndroid Build Coastguard Worker 268*cf78ab8cSAndroid Build Coastguard Worker #[test] test_reset()269*cf78ab8cSAndroid Build Coastguard Worker fn test_reset() { 270*cf78ab8cSAndroid Build Coastguard Worker test_command("netsim-cli reset", GrpcMethod::Reset, Vec::new()) 271*cf78ab8cSAndroid Build Coastguard Worker } 272*cf78ab8cSAndroid Build Coastguard Worker 273*cf78ab8cSAndroid Build Coastguard Worker #[test] test_capture_list()274*cf78ab8cSAndroid Build Coastguard Worker fn test_capture_list() { 275*cf78ab8cSAndroid Build Coastguard Worker test_command("netsim-cli capture list", GrpcMethod::ListCapture, Vec::new()) 276*cf78ab8cSAndroid Build Coastguard Worker } 277*cf78ab8cSAndroid Build Coastguard Worker 278*cf78ab8cSAndroid Build Coastguard Worker #[test] test_capture_list_alias()279*cf78ab8cSAndroid Build Coastguard Worker fn test_capture_list_alias() { 280*cf78ab8cSAndroid Build Coastguard Worker test_command("netsim-cli pcap list", GrpcMethod::ListCapture, Vec::new()) 281*cf78ab8cSAndroid Build Coastguard Worker } 282*cf78ab8cSAndroid Build Coastguard Worker 283*cf78ab8cSAndroid Build Coastguard Worker //TODO: Add capture patch and get tests once able to run tests with cxx definitions 284*cf78ab8cSAndroid Build Coastguard Worker get_create_device_req_bytes( device_name: &str, chip_name: &str, settings: AdvertiseSettingsProto, adv_data: AdvertiseDataProto, scan_response: AdvertiseDataProto, ) -> Vec<u8>285*cf78ab8cSAndroid Build Coastguard Worker fn get_create_device_req_bytes( 286*cf78ab8cSAndroid Build Coastguard Worker device_name: &str, 287*cf78ab8cSAndroid Build Coastguard Worker chip_name: &str, 288*cf78ab8cSAndroid Build Coastguard Worker settings: AdvertiseSettingsProto, 289*cf78ab8cSAndroid Build Coastguard Worker adv_data: AdvertiseDataProto, 290*cf78ab8cSAndroid Build Coastguard Worker scan_response: AdvertiseDataProto, 291*cf78ab8cSAndroid Build Coastguard Worker ) -> Vec<u8> { 292*cf78ab8cSAndroid Build Coastguard Worker let device = MessageField::some(DeviceCreateProto { 293*cf78ab8cSAndroid Build Coastguard Worker name: String::from(device_name), 294*cf78ab8cSAndroid Build Coastguard Worker chips: vec![ChipCreateProto { 295*cf78ab8cSAndroid Build Coastguard Worker name: String::from(chip_name), 296*cf78ab8cSAndroid Build Coastguard Worker kind: ChipKind::BLUETOOTH_BEACON.into(), 297*cf78ab8cSAndroid Build Coastguard Worker chip: Some(ChipKindCreateProto::BleBeacon(BleBeaconCreateProto { 298*cf78ab8cSAndroid Build Coastguard Worker settings: MessageField::some(settings), 299*cf78ab8cSAndroid Build Coastguard Worker adv_data: MessageField::some(adv_data), 300*cf78ab8cSAndroid Build Coastguard Worker scan_response: MessageField::some(scan_response), 301*cf78ab8cSAndroid Build Coastguard Worker ..Default::default() 302*cf78ab8cSAndroid Build Coastguard Worker })), 303*cf78ab8cSAndroid Build Coastguard Worker ..Default::default() 304*cf78ab8cSAndroid Build Coastguard Worker }], 305*cf78ab8cSAndroid Build Coastguard Worker ..Default::default() 306*cf78ab8cSAndroid Build Coastguard Worker }); 307*cf78ab8cSAndroid Build Coastguard Worker 308*cf78ab8cSAndroid Build Coastguard Worker CreateDeviceRequest { device, ..Default::default() }.write_to_bytes().unwrap() 309*cf78ab8cSAndroid Build Coastguard Worker } 310*cf78ab8cSAndroid Build Coastguard Worker get_patch_device_req_bytes( device_name: &str, chip_name: &str, settings: AdvertiseSettingsProto, adv_data: AdvertiseDataProto, scan_response: AdvertiseDataProto, ) -> Vec<u8>311*cf78ab8cSAndroid Build Coastguard Worker fn get_patch_device_req_bytes( 312*cf78ab8cSAndroid Build Coastguard Worker device_name: &str, 313*cf78ab8cSAndroid Build Coastguard Worker chip_name: &str, 314*cf78ab8cSAndroid Build Coastguard Worker settings: AdvertiseSettingsProto, 315*cf78ab8cSAndroid Build Coastguard Worker adv_data: AdvertiseDataProto, 316*cf78ab8cSAndroid Build Coastguard Worker scan_response: AdvertiseDataProto, 317*cf78ab8cSAndroid Build Coastguard Worker ) -> Vec<u8> { 318*cf78ab8cSAndroid Build Coastguard Worker let device = MessageField::some(PatchDeviceFieldsProto { 319*cf78ab8cSAndroid Build Coastguard Worker name: Some(String::from(device_name)), 320*cf78ab8cSAndroid Build Coastguard Worker chips: vec![ChipProto { 321*cf78ab8cSAndroid Build Coastguard Worker name: String::from(chip_name), 322*cf78ab8cSAndroid Build Coastguard Worker kind: ChipKind::BLUETOOTH_BEACON.into(), 323*cf78ab8cSAndroid Build Coastguard Worker chip: Some(ChipKindProto::BleBeacon(BleBeaconProto { 324*cf78ab8cSAndroid Build Coastguard Worker bt: MessageField::some(Chip_Bluetooth::new()), 325*cf78ab8cSAndroid Build Coastguard Worker settings: MessageField::some(settings), 326*cf78ab8cSAndroid Build Coastguard Worker adv_data: MessageField::some(adv_data), 327*cf78ab8cSAndroid Build Coastguard Worker scan_response: MessageField::some(scan_response), 328*cf78ab8cSAndroid Build Coastguard Worker ..Default::default() 329*cf78ab8cSAndroid Build Coastguard Worker })), 330*cf78ab8cSAndroid Build Coastguard Worker ..Default::default() 331*cf78ab8cSAndroid Build Coastguard Worker }], 332*cf78ab8cSAndroid Build Coastguard Worker ..Default::default() 333*cf78ab8cSAndroid Build Coastguard Worker }); 334*cf78ab8cSAndroid Build Coastguard Worker 335*cf78ab8cSAndroid Build Coastguard Worker PatchDeviceRequest { device, ..Default::default() }.write_to_bytes().unwrap() 336*cf78ab8cSAndroid Build Coastguard Worker } 337*cf78ab8cSAndroid Build Coastguard Worker 338*cf78ab8cSAndroid Build Coastguard Worker #[test] test_beacon_create_all_params_ble()339*cf78ab8cSAndroid Build Coastguard Worker fn test_beacon_create_all_params_ble() { 340*cf78ab8cSAndroid Build Coastguard Worker let device_name = String::from("device"); 341*cf78ab8cSAndroid Build Coastguard Worker let chip_name = String::from("chip"); 342*cf78ab8cSAndroid Build Coastguard Worker 343*cf78ab8cSAndroid Build Coastguard Worker let timeout = 1234; 344*cf78ab8cSAndroid Build Coastguard Worker let manufacturer_data = vec![0x12, 0x34]; 345*cf78ab8cSAndroid Build Coastguard Worker 346*cf78ab8cSAndroid Build Coastguard Worker let settings = AdvertiseSettingsProto { 347*cf78ab8cSAndroid Build Coastguard Worker interval: Some(IntervalProto::AdvertiseMode(AdvertiseModeProto::BALANCED.into())), 348*cf78ab8cSAndroid Build Coastguard Worker tx_power: Some(TxPowerProto::TxPowerLevel(AdvertiseTxPowerProto::ULTRA_LOW.into())), 349*cf78ab8cSAndroid Build Coastguard Worker scannable: true, 350*cf78ab8cSAndroid Build Coastguard Worker timeout, 351*cf78ab8cSAndroid Build Coastguard Worker ..Default::default() 352*cf78ab8cSAndroid Build Coastguard Worker }; 353*cf78ab8cSAndroid Build Coastguard Worker 354*cf78ab8cSAndroid Build Coastguard Worker let adv_data = AdvertiseDataProto { 355*cf78ab8cSAndroid Build Coastguard Worker include_device_name: true, 356*cf78ab8cSAndroid Build Coastguard Worker include_tx_power_level: true, 357*cf78ab8cSAndroid Build Coastguard Worker manufacturer_data, 358*cf78ab8cSAndroid Build Coastguard Worker ..Default::default() 359*cf78ab8cSAndroid Build Coastguard Worker }; 360*cf78ab8cSAndroid Build Coastguard Worker 361*cf78ab8cSAndroid Build Coastguard Worker let request = get_create_device_req_bytes( 362*cf78ab8cSAndroid Build Coastguard Worker &device_name, 363*cf78ab8cSAndroid Build Coastguard Worker &chip_name, 364*cf78ab8cSAndroid Build Coastguard Worker settings, 365*cf78ab8cSAndroid Build Coastguard Worker adv_data, 366*cf78ab8cSAndroid Build Coastguard Worker Default::default(), 367*cf78ab8cSAndroid Build Coastguard Worker ); 368*cf78ab8cSAndroid Build Coastguard Worker 369*cf78ab8cSAndroid Build Coastguard Worker test_command( 370*cf78ab8cSAndroid Build Coastguard Worker format!( 371*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli beacon create ble {} {} --advertise-mode balanced --tx-power-level ultra-low --scannable --timeout {} --include-device-name --include-tx-power-level --manufacturer-data 0x1234", 372*cf78ab8cSAndroid Build Coastguard Worker device_name, chip_name, timeout, 373*cf78ab8cSAndroid Build Coastguard Worker ) 374*cf78ab8cSAndroid Build Coastguard Worker .as_str(), 375*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::CreateDevice, 376*cf78ab8cSAndroid Build Coastguard Worker request, 377*cf78ab8cSAndroid Build Coastguard Worker ) 378*cf78ab8cSAndroid Build Coastguard Worker } 379*cf78ab8cSAndroid Build Coastguard Worker 380*cf78ab8cSAndroid Build Coastguard Worker #[test] test_beacon_patch_all_params_ble()381*cf78ab8cSAndroid Build Coastguard Worker fn test_beacon_patch_all_params_ble() { 382*cf78ab8cSAndroid Build Coastguard Worker let device_name = String::from("device"); 383*cf78ab8cSAndroid Build Coastguard Worker let chip_name = String::from("chip"); 384*cf78ab8cSAndroid Build Coastguard Worker 385*cf78ab8cSAndroid Build Coastguard Worker let interval = 1234; 386*cf78ab8cSAndroid Build Coastguard Worker let timeout = 9999; 387*cf78ab8cSAndroid Build Coastguard Worker let tx_power_level = -3; 388*cf78ab8cSAndroid Build Coastguard Worker let manufacturer_data = vec![0xab, 0xcd, 0xef]; 389*cf78ab8cSAndroid Build Coastguard Worker 390*cf78ab8cSAndroid Build Coastguard Worker let settings = AdvertiseSettingsProto { 391*cf78ab8cSAndroid Build Coastguard Worker interval: Some(IntervalProto::Milliseconds(interval)), 392*cf78ab8cSAndroid Build Coastguard Worker tx_power: Some(TxPowerProto::Dbm(tx_power_level)), 393*cf78ab8cSAndroid Build Coastguard Worker scannable: true, 394*cf78ab8cSAndroid Build Coastguard Worker timeout, 395*cf78ab8cSAndroid Build Coastguard Worker ..Default::default() 396*cf78ab8cSAndroid Build Coastguard Worker }; 397*cf78ab8cSAndroid Build Coastguard Worker let adv_data = AdvertiseDataProto { 398*cf78ab8cSAndroid Build Coastguard Worker include_device_name: true, 399*cf78ab8cSAndroid Build Coastguard Worker include_tx_power_level: true, 400*cf78ab8cSAndroid Build Coastguard Worker manufacturer_data, 401*cf78ab8cSAndroid Build Coastguard Worker ..Default::default() 402*cf78ab8cSAndroid Build Coastguard Worker }; 403*cf78ab8cSAndroid Build Coastguard Worker 404*cf78ab8cSAndroid Build Coastguard Worker let request = get_patch_device_req_bytes( 405*cf78ab8cSAndroid Build Coastguard Worker &device_name, 406*cf78ab8cSAndroid Build Coastguard Worker &chip_name, 407*cf78ab8cSAndroid Build Coastguard Worker settings, 408*cf78ab8cSAndroid Build Coastguard Worker adv_data, 409*cf78ab8cSAndroid Build Coastguard Worker Default::default(), 410*cf78ab8cSAndroid Build Coastguard Worker ); 411*cf78ab8cSAndroid Build Coastguard Worker 412*cf78ab8cSAndroid Build Coastguard Worker test_command( 413*cf78ab8cSAndroid Build Coastguard Worker format!( 414*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli beacon patch ble {} {} --advertise-mode {} --scannable --timeout {} --tx-power-level {} --manufacturer-data 0xabcdef --include-device-name --include-tx-power-level", 415*cf78ab8cSAndroid Build Coastguard Worker device_name, chip_name, interval, timeout, tx_power_level 416*cf78ab8cSAndroid Build Coastguard Worker ) 417*cf78ab8cSAndroid Build Coastguard Worker .as_str(), 418*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::PatchDevice, 419*cf78ab8cSAndroid Build Coastguard Worker request, 420*cf78ab8cSAndroid Build Coastguard Worker ) 421*cf78ab8cSAndroid Build Coastguard Worker } 422*cf78ab8cSAndroid Build Coastguard Worker 423*cf78ab8cSAndroid Build Coastguard Worker #[test] test_beacon_create_scan_response()424*cf78ab8cSAndroid Build Coastguard Worker fn test_beacon_create_scan_response() { 425*cf78ab8cSAndroid Build Coastguard Worker let device_name = String::from("device"); 426*cf78ab8cSAndroid Build Coastguard Worker let chip_name = String::from("chip"); 427*cf78ab8cSAndroid Build Coastguard Worker 428*cf78ab8cSAndroid Build Coastguard Worker let scan_response = AdvertiseDataProto { 429*cf78ab8cSAndroid Build Coastguard Worker include_device_name: true, 430*cf78ab8cSAndroid Build Coastguard Worker include_tx_power_level: true, 431*cf78ab8cSAndroid Build Coastguard Worker manufacturer_data: vec![0x21, 0xbe, 0xef], 432*cf78ab8cSAndroid Build Coastguard Worker ..Default::default() 433*cf78ab8cSAndroid Build Coastguard Worker }; 434*cf78ab8cSAndroid Build Coastguard Worker 435*cf78ab8cSAndroid Build Coastguard Worker let request = get_create_device_req_bytes( 436*cf78ab8cSAndroid Build Coastguard Worker &device_name, 437*cf78ab8cSAndroid Build Coastguard Worker &chip_name, 438*cf78ab8cSAndroid Build Coastguard Worker Default::default(), 439*cf78ab8cSAndroid Build Coastguard Worker Default::default(), 440*cf78ab8cSAndroid Build Coastguard Worker scan_response, 441*cf78ab8cSAndroid Build Coastguard Worker ); 442*cf78ab8cSAndroid Build Coastguard Worker 443*cf78ab8cSAndroid Build Coastguard Worker test_command( 444*cf78ab8cSAndroid Build Coastguard Worker format!( 445*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli beacon create ble {} {} --scan-response-include-device-name --scan-response-include-tx-power-level --scan-response-manufacturer-data 0x21beef", 446*cf78ab8cSAndroid Build Coastguard Worker device_name, chip_name 447*cf78ab8cSAndroid Build Coastguard Worker ) 448*cf78ab8cSAndroid Build Coastguard Worker .as_str(), 449*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::CreateDevice, 450*cf78ab8cSAndroid Build Coastguard Worker request, 451*cf78ab8cSAndroid Build Coastguard Worker ); 452*cf78ab8cSAndroid Build Coastguard Worker } 453*cf78ab8cSAndroid Build Coastguard Worker 454*cf78ab8cSAndroid Build Coastguard Worker #[test] test_beacon_patch_scan_response()455*cf78ab8cSAndroid Build Coastguard Worker fn test_beacon_patch_scan_response() { 456*cf78ab8cSAndroid Build Coastguard Worker let device_name = String::from("device"); 457*cf78ab8cSAndroid Build Coastguard Worker let chip_name = String::from("chip"); 458*cf78ab8cSAndroid Build Coastguard Worker 459*cf78ab8cSAndroid Build Coastguard Worker let scan_response = AdvertiseDataProto { 460*cf78ab8cSAndroid Build Coastguard Worker include_device_name: true, 461*cf78ab8cSAndroid Build Coastguard Worker include_tx_power_level: true, 462*cf78ab8cSAndroid Build Coastguard Worker manufacturer_data: vec![0x59, 0xbe, 0xac, 0x09], 463*cf78ab8cSAndroid Build Coastguard Worker ..Default::default() 464*cf78ab8cSAndroid Build Coastguard Worker }; 465*cf78ab8cSAndroid Build Coastguard Worker 466*cf78ab8cSAndroid Build Coastguard Worker let request = get_patch_device_req_bytes( 467*cf78ab8cSAndroid Build Coastguard Worker &device_name, 468*cf78ab8cSAndroid Build Coastguard Worker &chip_name, 469*cf78ab8cSAndroid Build Coastguard Worker Default::default(), 470*cf78ab8cSAndroid Build Coastguard Worker Default::default(), 471*cf78ab8cSAndroid Build Coastguard Worker scan_response, 472*cf78ab8cSAndroid Build Coastguard Worker ); 473*cf78ab8cSAndroid Build Coastguard Worker 474*cf78ab8cSAndroid Build Coastguard Worker test_command( 475*cf78ab8cSAndroid Build Coastguard Worker format!( 476*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli beacon patch ble {} {} --scan-response-include-device-name --scan-response-include-tx-power-level --scan-response-manufacturer-data 59beac09", 477*cf78ab8cSAndroid Build Coastguard Worker device_name, chip_name 478*cf78ab8cSAndroid Build Coastguard Worker ) 479*cf78ab8cSAndroid Build Coastguard Worker .as_str(), 480*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::PatchDevice, 481*cf78ab8cSAndroid Build Coastguard Worker request, 482*cf78ab8cSAndroid Build Coastguard Worker ); 483*cf78ab8cSAndroid Build Coastguard Worker } 484*cf78ab8cSAndroid Build Coastguard Worker 485*cf78ab8cSAndroid Build Coastguard Worker #[test] test_beacon_create_ble_tx_power()486*cf78ab8cSAndroid Build Coastguard Worker fn test_beacon_create_ble_tx_power() { 487*cf78ab8cSAndroid Build Coastguard Worker let device_name = String::from("device"); 488*cf78ab8cSAndroid Build Coastguard Worker let chip_name = String::from("chip"); 489*cf78ab8cSAndroid Build Coastguard Worker 490*cf78ab8cSAndroid Build Coastguard Worker let settings = AdvertiseSettingsProto { 491*cf78ab8cSAndroid Build Coastguard Worker tx_power: Some(TxPowerProto::TxPowerLevel(AdvertiseTxPowerProto::HIGH.into())), 492*cf78ab8cSAndroid Build Coastguard Worker ..Default::default() 493*cf78ab8cSAndroid Build Coastguard Worker }; 494*cf78ab8cSAndroid Build Coastguard Worker let adv_data = AdvertiseDataProto { include_tx_power_level: true, ..Default::default() }; 495*cf78ab8cSAndroid Build Coastguard Worker 496*cf78ab8cSAndroid Build Coastguard Worker let request = get_create_device_req_bytes( 497*cf78ab8cSAndroid Build Coastguard Worker &device_name, 498*cf78ab8cSAndroid Build Coastguard Worker &chip_name, 499*cf78ab8cSAndroid Build Coastguard Worker settings, 500*cf78ab8cSAndroid Build Coastguard Worker adv_data, 501*cf78ab8cSAndroid Build Coastguard Worker Default::default(), 502*cf78ab8cSAndroid Build Coastguard Worker ); 503*cf78ab8cSAndroid Build Coastguard Worker 504*cf78ab8cSAndroid Build Coastguard Worker test_command( 505*cf78ab8cSAndroid Build Coastguard Worker format!( 506*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli beacon create ble {} {} --tx-power-level high --include-tx-power-level", 507*cf78ab8cSAndroid Build Coastguard Worker device_name, chip_name 508*cf78ab8cSAndroid Build Coastguard Worker ) 509*cf78ab8cSAndroid Build Coastguard Worker .as_str(), 510*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::CreateDevice, 511*cf78ab8cSAndroid Build Coastguard Worker request, 512*cf78ab8cSAndroid Build Coastguard Worker ) 513*cf78ab8cSAndroid Build Coastguard Worker } 514*cf78ab8cSAndroid Build Coastguard Worker 515*cf78ab8cSAndroid Build Coastguard Worker #[test] test_beacon_create_default()516*cf78ab8cSAndroid Build Coastguard Worker fn test_beacon_create_default() { 517*cf78ab8cSAndroid Build Coastguard Worker let request = get_create_device_req_bytes( 518*cf78ab8cSAndroid Build Coastguard Worker Default::default(), 519*cf78ab8cSAndroid Build Coastguard Worker Default::default(), 520*cf78ab8cSAndroid Build Coastguard Worker Default::default(), 521*cf78ab8cSAndroid Build Coastguard Worker Default::default(), 522*cf78ab8cSAndroid Build Coastguard Worker Default::default(), 523*cf78ab8cSAndroid Build Coastguard Worker ); 524*cf78ab8cSAndroid Build Coastguard Worker 525*cf78ab8cSAndroid Build Coastguard Worker test_command("netsim-cli beacon create ble", GrpcMethod::CreateDevice, request) 526*cf78ab8cSAndroid Build Coastguard Worker } 527*cf78ab8cSAndroid Build Coastguard Worker 528*cf78ab8cSAndroid Build Coastguard Worker #[test] test_beacon_patch_interval()529*cf78ab8cSAndroid Build Coastguard Worker fn test_beacon_patch_interval() { 530*cf78ab8cSAndroid Build Coastguard Worker let device_name = String::from("device"); 531*cf78ab8cSAndroid Build Coastguard Worker let chip_name = String::from("chip"); 532*cf78ab8cSAndroid Build Coastguard Worker 533*cf78ab8cSAndroid Build Coastguard Worker let settings = AdvertiseSettingsProto { 534*cf78ab8cSAndroid Build Coastguard Worker interval: Some(IntervalProto::AdvertiseMode(AdvertiseModeProto::LOW_LATENCY.into())), 535*cf78ab8cSAndroid Build Coastguard Worker ..Default::default() 536*cf78ab8cSAndroid Build Coastguard Worker }; 537*cf78ab8cSAndroid Build Coastguard Worker 538*cf78ab8cSAndroid Build Coastguard Worker let request = get_patch_device_req_bytes( 539*cf78ab8cSAndroid Build Coastguard Worker &device_name, 540*cf78ab8cSAndroid Build Coastguard Worker &chip_name, 541*cf78ab8cSAndroid Build Coastguard Worker settings, 542*cf78ab8cSAndroid Build Coastguard Worker Default::default(), 543*cf78ab8cSAndroid Build Coastguard Worker Default::default(), 544*cf78ab8cSAndroid Build Coastguard Worker ); 545*cf78ab8cSAndroid Build Coastguard Worker 546*cf78ab8cSAndroid Build Coastguard Worker test_command( 547*cf78ab8cSAndroid Build Coastguard Worker format!( 548*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli beacon patch ble {} {} --advertise-mode low-latency", 549*cf78ab8cSAndroid Build Coastguard Worker device_name, chip_name 550*cf78ab8cSAndroid Build Coastguard Worker ) 551*cf78ab8cSAndroid Build Coastguard Worker .as_str(), 552*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::PatchDevice, 553*cf78ab8cSAndroid Build Coastguard Worker request, 554*cf78ab8cSAndroid Build Coastguard Worker ) 555*cf78ab8cSAndroid Build Coastguard Worker } 556*cf78ab8cSAndroid Build Coastguard Worker 557*cf78ab8cSAndroid Build Coastguard Worker #[test] test_beacon_create_ble_with_address()558*cf78ab8cSAndroid Build Coastguard Worker fn test_beacon_create_ble_with_address() { 559*cf78ab8cSAndroid Build Coastguard Worker let address = String::from("12:34:56:78:9a:bc"); 560*cf78ab8cSAndroid Build Coastguard Worker 561*cf78ab8cSAndroid Build Coastguard Worker let device = MessageField::some(DeviceCreateProto { 562*cf78ab8cSAndroid Build Coastguard Worker chips: vec![ChipCreateProto { 563*cf78ab8cSAndroid Build Coastguard Worker kind: ChipKind::BLUETOOTH_BEACON.into(), 564*cf78ab8cSAndroid Build Coastguard Worker chip: Some(ChipKindCreateProto::BleBeacon(BleBeaconCreateProto { 565*cf78ab8cSAndroid Build Coastguard Worker address: address.clone(), 566*cf78ab8cSAndroid Build Coastguard Worker settings: MessageField::some(AdvertiseSettingsProto::default()), 567*cf78ab8cSAndroid Build Coastguard Worker adv_data: MessageField::some(AdvertiseDataProto::default()), 568*cf78ab8cSAndroid Build Coastguard Worker scan_response: MessageField::some(AdvertiseDataProto::default()), 569*cf78ab8cSAndroid Build Coastguard Worker ..Default::default() 570*cf78ab8cSAndroid Build Coastguard Worker })), 571*cf78ab8cSAndroid Build Coastguard Worker ..Default::default() 572*cf78ab8cSAndroid Build Coastguard Worker }], 573*cf78ab8cSAndroid Build Coastguard Worker ..Default::default() 574*cf78ab8cSAndroid Build Coastguard Worker }); 575*cf78ab8cSAndroid Build Coastguard Worker 576*cf78ab8cSAndroid Build Coastguard Worker let request = frontend::CreateDeviceRequest { device, ..Default::default() } 577*cf78ab8cSAndroid Build Coastguard Worker .write_to_bytes() 578*cf78ab8cSAndroid Build Coastguard Worker .unwrap(); 579*cf78ab8cSAndroid Build Coastguard Worker 580*cf78ab8cSAndroid Build Coastguard Worker test_command( 581*cf78ab8cSAndroid Build Coastguard Worker format!("netsim-cli beacon create ble --address {}", address).as_str(), 582*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::CreateDevice, 583*cf78ab8cSAndroid Build Coastguard Worker request, 584*cf78ab8cSAndroid Build Coastguard Worker ) 585*cf78ab8cSAndroid Build Coastguard Worker } 586*cf78ab8cSAndroid Build Coastguard Worker 587*cf78ab8cSAndroid Build Coastguard Worker #[test] test_beacon_patch_ble_with_address()588*cf78ab8cSAndroid Build Coastguard Worker fn test_beacon_patch_ble_with_address() { 589*cf78ab8cSAndroid Build Coastguard Worker let address = String::from("12:34:56:78:9a:bc"); 590*cf78ab8cSAndroid Build Coastguard Worker let device_name = String::from("device"); 591*cf78ab8cSAndroid Build Coastguard Worker let chip_name = String::from("chip"); 592*cf78ab8cSAndroid Build Coastguard Worker 593*cf78ab8cSAndroid Build Coastguard Worker let device = MessageField::some(PatchDeviceFieldsProto { 594*cf78ab8cSAndroid Build Coastguard Worker name: Some(device_name.clone()), 595*cf78ab8cSAndroid Build Coastguard Worker chips: vec![ChipProto { 596*cf78ab8cSAndroid Build Coastguard Worker name: chip_name.clone(), 597*cf78ab8cSAndroid Build Coastguard Worker kind: ChipKind::BLUETOOTH_BEACON.into(), 598*cf78ab8cSAndroid Build Coastguard Worker chip: Some(ChipKindProto::BleBeacon(BleBeaconProto { 599*cf78ab8cSAndroid Build Coastguard Worker bt: MessageField::some(Chip_Bluetooth::new()), 600*cf78ab8cSAndroid Build Coastguard Worker address: address.clone(), 601*cf78ab8cSAndroid Build Coastguard Worker settings: MessageField::some(AdvertiseSettingsProto::default()), 602*cf78ab8cSAndroid Build Coastguard Worker adv_data: MessageField::some(AdvertiseDataProto::default()), 603*cf78ab8cSAndroid Build Coastguard Worker scan_response: MessageField::some(AdvertiseDataProto::default()), 604*cf78ab8cSAndroid Build Coastguard Worker ..Default::default() 605*cf78ab8cSAndroid Build Coastguard Worker })), 606*cf78ab8cSAndroid Build Coastguard Worker ..Default::default() 607*cf78ab8cSAndroid Build Coastguard Worker }], 608*cf78ab8cSAndroid Build Coastguard Worker ..Default::default() 609*cf78ab8cSAndroid Build Coastguard Worker }); 610*cf78ab8cSAndroid Build Coastguard Worker 611*cf78ab8cSAndroid Build Coastguard Worker let request = 612*cf78ab8cSAndroid Build Coastguard Worker frontend::PatchDeviceRequest { device, ..Default::default() }.write_to_bytes().unwrap(); 613*cf78ab8cSAndroid Build Coastguard Worker 614*cf78ab8cSAndroid Build Coastguard Worker test_command( 615*cf78ab8cSAndroid Build Coastguard Worker format!( 616*cf78ab8cSAndroid Build Coastguard Worker "netsim-cli beacon patch ble {} {} --address {}", 617*cf78ab8cSAndroid Build Coastguard Worker device_name, chip_name, address 618*cf78ab8cSAndroid Build Coastguard Worker ) 619*cf78ab8cSAndroid Build Coastguard Worker .as_str(), 620*cf78ab8cSAndroid Build Coastguard Worker GrpcMethod::PatchDevice, 621*cf78ab8cSAndroid Build Coastguard Worker request, 622*cf78ab8cSAndroid Build Coastguard Worker ) 623*cf78ab8cSAndroid Build Coastguard Worker } 624*cf78ab8cSAndroid Build Coastguard Worker 625*cf78ab8cSAndroid Build Coastguard Worker #[test] test_beacon_negative_timeout_fails()626*cf78ab8cSAndroid Build Coastguard Worker fn test_beacon_negative_timeout_fails() { 627*cf78ab8cSAndroid Build Coastguard Worker let command = String::from("netsim-cli beacon create ble --timeout -1234"); 628*cf78ab8cSAndroid Build Coastguard Worker assert!(NetsimArgs::try_parse_from(command.split_whitespace()).is_err()); 629*cf78ab8cSAndroid Build Coastguard Worker } 630*cf78ab8cSAndroid Build Coastguard Worker 631*cf78ab8cSAndroid Build Coastguard Worker #[test] test_create_beacon_large_tx_power_fails()632*cf78ab8cSAndroid Build Coastguard Worker fn test_create_beacon_large_tx_power_fails() { 633*cf78ab8cSAndroid Build Coastguard Worker let command = 634*cf78ab8cSAndroid Build Coastguard Worker format!("netsim-cli beacon create ble --tx-power-level {}", (i8::MAX as i32) + 1); 635*cf78ab8cSAndroid Build Coastguard Worker assert!(NetsimArgs::try_parse_from(command.split_whitespace()).is_err()); 636*cf78ab8cSAndroid Build Coastguard Worker } 637*cf78ab8cSAndroid Build Coastguard Worker 638*cf78ab8cSAndroid Build Coastguard Worker #[test] test_create_beacon_unknown_mode_fails()639*cf78ab8cSAndroid Build Coastguard Worker fn test_create_beacon_unknown_mode_fails() { 640*cf78ab8cSAndroid Build Coastguard Worker let command = String::from("netsim-cli beacon create ble --advertise-mode not-a-mode"); 641*cf78ab8cSAndroid Build Coastguard Worker assert!(NetsimArgs::try_parse_from(command.split_whitespace()).is_err()); 642*cf78ab8cSAndroid Build Coastguard Worker } 643*cf78ab8cSAndroid Build Coastguard Worker 644*cf78ab8cSAndroid Build Coastguard Worker #[test] test_patch_beacon_negative_timeout_fails()645*cf78ab8cSAndroid Build Coastguard Worker fn test_patch_beacon_negative_timeout_fails() { 646*cf78ab8cSAndroid Build Coastguard Worker let command = String::from("netsim-cli beacon patch ble --timeout -1234"); 647*cf78ab8cSAndroid Build Coastguard Worker assert!(NetsimArgs::try_parse_from(command.split_whitespace()).is_err()); 648*cf78ab8cSAndroid Build Coastguard Worker } 649*cf78ab8cSAndroid Build Coastguard Worker 650*cf78ab8cSAndroid Build Coastguard Worker #[test] test_patch_beacon_large_tx_power_fails()651*cf78ab8cSAndroid Build Coastguard Worker fn test_patch_beacon_large_tx_power_fails() { 652*cf78ab8cSAndroid Build Coastguard Worker let command = 653*cf78ab8cSAndroid Build Coastguard Worker format!("netsim-cli beacon patch ble --tx-power-level {}", (i8::MAX as i32) + 1); 654*cf78ab8cSAndroid Build Coastguard Worker assert!(NetsimArgs::try_parse_from(command.split_whitespace()).is_err()); 655*cf78ab8cSAndroid Build Coastguard Worker } 656*cf78ab8cSAndroid Build Coastguard Worker 657*cf78ab8cSAndroid Build Coastguard Worker #[test] test_patch_beacon_unknown_mode_fails()658*cf78ab8cSAndroid Build Coastguard Worker fn test_patch_beacon_unknown_mode_fails() { 659*cf78ab8cSAndroid Build Coastguard Worker let command = String::from("netsim-cli beacon patch ble --advertise-mode not-a-mode"); 660*cf78ab8cSAndroid Build Coastguard Worker assert!(NetsimArgs::try_parse_from(command.split_whitespace()).is_err()); 661*cf78ab8cSAndroid Build Coastguard Worker } 662*cf78ab8cSAndroid Build Coastguard Worker 663*cf78ab8cSAndroid Build Coastguard Worker #[test] test_create_beacon_mfg_data_fails()664*cf78ab8cSAndroid Build Coastguard Worker fn test_create_beacon_mfg_data_fails() { 665*cf78ab8cSAndroid Build Coastguard Worker let command = String::from("netsim-cli beacon create ble --manufacturer-data not-a-number"); 666*cf78ab8cSAndroid Build Coastguard Worker assert!(NetsimArgs::try_parse_from(command.split_whitespace()).is_err()); 667*cf78ab8cSAndroid Build Coastguard Worker } 668*cf78ab8cSAndroid Build Coastguard Worker 669*cf78ab8cSAndroid Build Coastguard Worker #[test] test_patch_beacon_mfg_data_fails()670*cf78ab8cSAndroid Build Coastguard Worker fn test_patch_beacon_mfg_data_fails() { 671*cf78ab8cSAndroid Build Coastguard Worker let command = String::from("netsim-cli beacon patch ble --manufacturer-data not-a-number"); 672*cf78ab8cSAndroid Build Coastguard Worker assert!(NetsimArgs::try_parse_from(command.split_whitespace()).is_err()); 673*cf78ab8cSAndroid Build Coastguard Worker } 674*cf78ab8cSAndroid Build Coastguard Worker } 675