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

Commit 185b7bd5 authored by Aritra Sen's avatar Aritra Sen Committed by Gerrit Code Review
Browse files

Merge "Add ability to set I/O capabilities for the device from the adapter...

Merge "Add ability to set I/O capabilities for the device from the adapter client in topshim tests."
parents ec8f5c80 6c9bfb4c
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();
        })
    }
}
}