xref: /aosp_15_r20/tools/netsim/rust/cli/src/requests.rs (revision cf78ab8cffb8fc9207af348f23af247fb04370a6)
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