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 Diff line number Diff line
@@ -18,6 +18,7 @@ service AdapterService {
  rpc RestoreFilterAcceptList(google.protobuf.Empty) returns (google.protobuf.Empty) {}
  rpc SetDefaultEventMaskExcept(SetDefaultEventMaskExceptRequest) returns (google.protobuf.Empty) {}
  rpc SetEventFilterInquiryResultAllDevices(google.protobuf.Empty) returns (google.protobuf.Empty) {}
  rpc SetLocalIoCaps(SetLocalIoCapsRequest) returns (SetLocalIoCapsResponse) {}
}

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

@@ -203,3 +205,11 @@ message Connection {
message GenerateOobDataRequest {
  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 Diff line number Diff line
@@ -29,6 +29,12 @@ class AdapterTest(TopshimBaseTest):
    def test_enable_page_scan(self):
        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__":
    test_runner.main()
+5 −0
Original line number Diff line number Diff line
@@ -122,6 +122,11 @@ class AdapterClient(AsyncClosable):
    async def allow_wake_by_hid(self):
        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():
    """Invoke gRPC on topshim for A2DP testing"""
+12 −0
Original line number 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 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 Diff line number Diff line
//! Adapter service facade

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::facade::{
    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 futures::sink::SinkExt;
use grpcio::*;
use num_traits::cast::FromPrimitive;

use std::sync::{Arc, Mutex};
use tokio::runtime::Runtime;
@@ -32,6 +34,12 @@ fn get_bt_dispatcher(
                BaseCallbacks::SspRequest(addr, _, _, variant, 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;
                        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();
        })
    }

    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();
        })
    }
}