Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6c9bfb4c authored by Aritra Sen's avatar Aritra Sen
Browse files

Add ability to set I/O capabilities for the device from the adapter client in topshim tests.

Also added appropriate testing and callback handling for the same. This is required for doing SSP for topshim testing in an easier manner.

Bug: 261221141
Test: mma -j $(nproc)
Test: ./build.py
Test: system/gd/cert/run --clean --topshim
Tag: #floss
Change-Id: I9c68a5c560fa9d157b99f1716d2ec84facb68509
parent 48196184
Loading
Loading
Loading
Loading
+10 −0
Original line number Original line Diff line number Diff line
@@ -18,6 +18,7 @@ service AdapterService {
  rpc RestoreFilterAcceptList(google.protobuf.Empty) returns (google.protobuf.Empty) {}
  rpc RestoreFilterAcceptList(google.protobuf.Empty) returns (google.protobuf.Empty) {}
  rpc SetDefaultEventMaskExcept(SetDefaultEventMaskExceptRequest) returns (google.protobuf.Empty) {}
  rpc SetDefaultEventMaskExcept(SetDefaultEventMaskExceptRequest) returns (google.protobuf.Empty) {}
  rpc SetEventFilterInquiryResultAllDevices(google.protobuf.Empty) returns (google.protobuf.Empty) {}
  rpc SetEventFilterInquiryResultAllDevices(google.protobuf.Empty) returns (google.protobuf.Empty) {}
  rpc SetLocalIoCaps(SetLocalIoCapsRequest) returns (SetLocalIoCapsResponse) {}
}
}


service SecurityService {
service SecurityService {
@@ -116,6 +117,7 @@ enum EventType {
  LE_RAND = 2;
  LE_RAND = 2;
  GENERATE_LOCAL_OOB_DATA = 3;
  GENERATE_LOCAL_OOB_DATA = 3;
  HFP_CONNECTION_STATE = 4;
  HFP_CONNECTION_STATE = 4;
  ADAPTER_PROPERTY = 5;
}
}
message FetchEventsRequest {}
message FetchEventsRequest {}


@@ -203,3 +205,11 @@ message Connection {
message GenerateOobDataRequest {
message GenerateOobDataRequest {
  int32 transport = 1;
  int32 transport = 1;
}
}

message SetLocalIoCapsRequest {
  int32 io_capability = 1;
}

message SetLocalIoCapsResponse {
  int32 status = 1;
}
 No newline at end of file
+6 −0
Original line number Original line Diff line number Diff line
@@ -29,6 +29,12 @@ class AdapterTest(TopshimBaseTest):
    def test_enable_page_scan(self):
    def test_enable_page_scan(self):
        self.dut().enable_page_scan()
        self.dut().enable_page_scan()


    def test_set_local_io_caps(self):
        status, properties = self.dut().set_local_io_caps(3)
        assertThat(status).isEqualTo("Success")
        assertThat(len(properties)).isEqualTo(1)
        assertThat(properties[0]).isEqualTo("LocalIoCaps(None_)")



if __name__ == "__main__":
if __name__ == "__main__":
    test_runner.main()
    test_runner.main()
+5 −0
Original line number Original line Diff line number Diff line
@@ -122,6 +122,11 @@ class AdapterClient(AsyncClosable):
    async def allow_wake_by_hid(self):
    async def allow_wake_by_hid(self):
        await self.__adapter_stub.AllowWakeByHid(empty_proto.Empty())
        await self.__adapter_stub.AllowWakeByHid(empty_proto.Empty())


    async def set_local_io_caps(self, io_capability):
        await self.__adapter_stub.SetLocalIoCaps(facade_pb2.SetLocalIoCapsRequest(io_capability=io_capability))
        future = await self._listen_for_event(facade_pb2.EventType.ADAPTER_PROPERTY)
        return future



class A2dpAutomationHelper():
class A2dpAutomationHelper():
    """Invoke gRPC on topshim for A2DP testing"""
    """Invoke gRPC on topshim for A2DP testing"""
+12 −0
Original line number Original line Diff line number Diff line
@@ -173,3 +173,15 @@ class TopshimDevice(AsyncClosable):
            return OobData(data_list[0], data_list[1], data_list[2], data_list[3], data_list[4])
            return OobData(data_list[0], data_list[1], data_list[2], data_list[3], data_list[4])


        return asyncio.get_event_loop().run_until_complete(waiter(f))
        return asyncio.get_event_loop().run_until_complete(waiter(f))

    def set_local_io_caps(self, io_capability=0):
        f = self.__post(self.__adapter.set_local_io_caps(io_capability))

        async def waiter(f):
            data = await f
            data_list = data.split(" :: ")
            status, properties = data_list[0].strip(), data_list[1].strip()
            properties = list(properties[1:-1].strip().split(","))
            return (status, properties)

        return asyncio.get_event_loop().run_until_complete(waiter(f))
+34 −2
Original line number Original line Diff line number Diff line
//! Adapter service facade
//! Adapter service facade


use bt_topshim::btif;
use bt_topshim::btif;
use bt_topshim::btif::{BaseCallbacks, BaseCallbacksDispatcher, BluetoothInterface};
use bt_topshim::btif::{BaseCallbacks, BaseCallbacksDispatcher, BluetoothInterface, BtIoCap};


use bt_topshim_facade_protobuf::empty::Empty;
use bt_topshim_facade_protobuf::empty::Empty;
use bt_topshim_facade_protobuf::facade::{
use bt_topshim_facade_protobuf::facade::{
    EventType, FetchEventsRequest, FetchEventsResponse, SetDefaultEventMaskExceptRequest,
    EventType, FetchEventsRequest, FetchEventsResponse, SetDefaultEventMaskExceptRequest,
    SetDiscoveryModeRequest, SetDiscoveryModeResponse, ToggleStackRequest, ToggleStackResponse,
    SetDiscoveryModeRequest, SetDiscoveryModeResponse, SetLocalIoCapsRequest,
    SetLocalIoCapsResponse, ToggleStackRequest, ToggleStackResponse,
};
};
use bt_topshim_facade_protobuf::facade_grpc::{create_adapter_service, AdapterService};
use bt_topshim_facade_protobuf::facade_grpc::{create_adapter_service, AdapterService};
use futures::sink::SinkExt;
use futures::sink::SinkExt;
use grpcio::*;
use grpcio::*;
use num_traits::cast::FromPrimitive;


use std::sync::{Arc, Mutex};
use std::sync::{Arc, Mutex};
use tokio::runtime::Runtime;
use tokio::runtime::Runtime;
@@ -32,6 +34,12 @@ fn get_bt_dispatcher(
                BaseCallbacks::SspRequest(addr, _, _, variant, passkey) => {
                BaseCallbacks::SspRequest(addr, _, _, variant, passkey) => {
                    btif.lock().unwrap().ssp_reply(&addr, variant, 1, passkey);
                    btif.lock().unwrap().ssp_reply(&addr, variant, 1, passkey);
                }
                }
                BaseCallbacks::AdapterProperties(status, _, properties) => {
                    println!(
                        "Adapter attributes changed, status = {:?}, properties = {:?}",
                        status, properties
                    );
                }
                _ => (),
                _ => (),
            }
            }
        }),
        }),
@@ -128,6 +136,12 @@ impl AdapterService for AdapterServiceImpl {
                        rsp.data = s;
                        rsp.data = s;
                        sink.send((rsp, WriteFlags::default())).await.unwrap();
                        sink.send((rsp, WriteFlags::default())).await.unwrap();
                    }
                    }
                    BaseCallbacks::AdapterProperties(status, _, properties) => {
                        let mut rsp = FetchEventsResponse::new();
                        rsp.event_type = EventType::ADAPTER_PROPERTY;
                        rsp.data = format!("{:?} :: {:?}", status, properties);
                        sink.send((rsp, WriteFlags::default())).await.unwrap();
                    }
                    _ => (),
                    _ => (),
                }
                }
            }
            }
@@ -258,4 +272,22 @@ impl AdapterService for AdapterServiceImpl {
            sink.success(Empty::default()).await.unwrap();
            sink.success(Empty::default()).await.unwrap();
        })
        })
    }
    }

    fn set_local_io_caps(
        &mut self,
        ctx: RpcContext<'_>,
        req: SetLocalIoCapsRequest,
        sink: UnarySink<SetLocalIoCapsResponse>,
    ) {
        let status = self.btif_intf.lock().unwrap().set_adapter_property(
            btif::BluetoothProperty::LocalIoCaps(
                BtIoCap::from_i32(req.io_capability).unwrap_or(BtIoCap::Unknown),
            ),
        );
        let mut resp = SetLocalIoCapsResponse::new();
        resp.status = status;
        ctx.spawn(async move {
            sink.success(resp).await.unwrap();
        })
    }
}
}