Loading system/gd/hci/cert/acl_manager_test.py +73 −0 Original line number Diff line number Diff line Loading @@ -184,6 +184,79 @@ class AclManagerTest(GdFacadeOnlyBaseTestClass): acl_data_asserts.assert_event_occurs( lambda packet: b'SomeAclData' in packet.payload) def test_cert_connects(self): self.register_for_event(hci_packets.EventCode.CONNECTION_COMPLETE) self.register_for_event(hci_packets.EventCode.ROLE_CHANGE) with EventCallbackStream(self.cert_device.hci.FetchEvents(empty_proto.Empty())) as cert_hci_event_stream, \ EventCallbackStream(self.cert_device.hci.FetchAclPackets(empty_proto.Empty())) as cert_acl_data_stream, \ EventCallbackStream(self.device_under_test.hci_acl_manager.FetchIncomingConnection(empty_proto.Empty())) as incoming_connection_stream, \ EventCallbackStream(self.device_under_test.hci_acl_manager.FetchAclData(empty_proto.Empty())) as acl_data_stream: cert_hci_event_asserts = EventAsserts(cert_hci_event_stream) incoming_connection_asserts = EventAsserts( incoming_connection_stream) cert_acl_data_asserts = EventAsserts(cert_acl_data_stream) acl_data_asserts = EventAsserts(acl_data_stream) # DUT Enables scans and gets its address dut_address = self.device_under_test.hci_controller.GetMacAddress( empty_proto.Empty()).address self.device_under_test.neighbor.EnablePageScan( neighbor_facade.EnableMsg(enabled=True)) # Cert connects self.enqueue_hci_command( hci_packets.CreateConnectionBuilder( dut_address.decode('utf-8'), 0xcc18, # Packet Type hci_packets.PageScanRepetitionMode.R1, 0x0, hci_packets.ClockOffsetValid.INVALID, hci_packets.CreateConnectionRoleSwitch.ALLOW_ROLE_SWITCH), False) conn_handle = 0xfff def get_handle(packet): packet_bytes = packet.event if b'\x03\x0b\x00' in packet_bytes: nonlocal conn_handle cc_view = hci_packets.ConnectionCompleteView( hci_packets.EventPacketView( bt_packets.PacketViewLittleEndian( list(packet_bytes)))) conn_handle = cc_view.GetConnectionHandle() return True return False # DUT gets a connection request incoming_connection_asserts.assert_event_occurs(get_handle) self.device_under_test.hci_acl_manager.SendAclData( acl_manager_facade.AclData( handle=conn_handle, payload=bytes( b'\x29\x00\x07\x00This is just SomeMoreAclData from the DUT' ))) conn_handle = 0xfff cert_hci_event_asserts.assert_event_occurs(get_handle) cert_handle = conn_handle self.enqueue_acl_data( cert_handle, hci_packets.PacketBoundaryFlag.FIRST_AUTOMATICALLY_FLUSHABLE, hci_packets.BroadcastFlag.POINT_TO_POINT, bytes( b'\x26\x00\x07\x00This is just SomeAclData from the Cert')) cert_acl_data_asserts.assert_event_occurs( lambda packet: b'SomeMoreAclData' in packet.data) acl_data_asserts.assert_event_occurs( lambda packet: b'SomeAclData' in packet.payload) def test_recombination_l2cap_packet(self): self.register_for_event(hci_packets.EventCode.CONNECTION_REQUEST) self.register_for_event(hci_packets.EventCode.CONNECTION_COMPLETE) Loading system/gd/hci/facade/acl_manager_facade.cc +15 −7 Original line number Diff line number Diff line Loading @@ -96,6 +96,16 @@ class AclManagerFacadeService : public AclManagerFacade::Service, } }; ::grpc::Status FetchIncomingConnection(::grpc::ServerContext* context, const google::protobuf::Empty* request, ::grpc::ServerWriter<ConnectionEvent>* writer) override { if (per_connection_events_.size() > current_connection_request_) { return ::grpc::Status(::grpc::StatusCode::RESOURCE_EXHAUSTED, "Only one outstanding connection is supported"); } per_connection_events_.emplace_back(std::make_unique<::bluetooth::grpc::GrpcEventQueue<ConnectionEvent>>( std::string("incoming connection ") + std::to_string(current_connection_request_))); return per_connection_events_[current_connection_request_]->RunLoop(context, writer); } ::grpc::Status SendAclData(::grpc::ServerContext* context, const AclData* request, ::google::protobuf::Empty* response) override { std::promise<void> promise; Loading Loading @@ -172,13 +182,11 @@ class AclManagerFacadeService : public AclManagerFacade::Service, current_connection_request_), facade_handler_); shared_connection->RegisterCallbacks(this, facade_handler_); { std::unique_ptr<BasePacketBuilder> builder = ConnectionCompleteBuilder::Create( ErrorCode::SUCCESS, to_handle(current_connection_request_), addr, LinkType::ACL, Enable::DISABLED); ConnectionEvent success; success.set_event(builder_to_string(std::move(builder))); per_connection_events_[current_connection_request_]->OnIncomingEvent(success); } current_connection_request_++; } Loading system/gd/hci/facade/acl_manager_facade.proto +1 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ service AclManagerFacade { rpc AuthenticationRequested(HandleMsg) returns (google.protobuf.Empty) {} rpc SendAclData(AclData) returns (google.protobuf.Empty) {} rpc FetchAclData(google.protobuf.Empty) returns (stream AclData) {} rpc FetchIncomingConnection(google.protobuf.Empty) returns (stream ConnectionEvent) {} } message HandleMsg { Loading Loading
system/gd/hci/cert/acl_manager_test.py +73 −0 Original line number Diff line number Diff line Loading @@ -184,6 +184,79 @@ class AclManagerTest(GdFacadeOnlyBaseTestClass): acl_data_asserts.assert_event_occurs( lambda packet: b'SomeAclData' in packet.payload) def test_cert_connects(self): self.register_for_event(hci_packets.EventCode.CONNECTION_COMPLETE) self.register_for_event(hci_packets.EventCode.ROLE_CHANGE) with EventCallbackStream(self.cert_device.hci.FetchEvents(empty_proto.Empty())) as cert_hci_event_stream, \ EventCallbackStream(self.cert_device.hci.FetchAclPackets(empty_proto.Empty())) as cert_acl_data_stream, \ EventCallbackStream(self.device_under_test.hci_acl_manager.FetchIncomingConnection(empty_proto.Empty())) as incoming_connection_stream, \ EventCallbackStream(self.device_under_test.hci_acl_manager.FetchAclData(empty_proto.Empty())) as acl_data_stream: cert_hci_event_asserts = EventAsserts(cert_hci_event_stream) incoming_connection_asserts = EventAsserts( incoming_connection_stream) cert_acl_data_asserts = EventAsserts(cert_acl_data_stream) acl_data_asserts = EventAsserts(acl_data_stream) # DUT Enables scans and gets its address dut_address = self.device_under_test.hci_controller.GetMacAddress( empty_proto.Empty()).address self.device_under_test.neighbor.EnablePageScan( neighbor_facade.EnableMsg(enabled=True)) # Cert connects self.enqueue_hci_command( hci_packets.CreateConnectionBuilder( dut_address.decode('utf-8'), 0xcc18, # Packet Type hci_packets.PageScanRepetitionMode.R1, 0x0, hci_packets.ClockOffsetValid.INVALID, hci_packets.CreateConnectionRoleSwitch.ALLOW_ROLE_SWITCH), False) conn_handle = 0xfff def get_handle(packet): packet_bytes = packet.event if b'\x03\x0b\x00' in packet_bytes: nonlocal conn_handle cc_view = hci_packets.ConnectionCompleteView( hci_packets.EventPacketView( bt_packets.PacketViewLittleEndian( list(packet_bytes)))) conn_handle = cc_view.GetConnectionHandle() return True return False # DUT gets a connection request incoming_connection_asserts.assert_event_occurs(get_handle) self.device_under_test.hci_acl_manager.SendAclData( acl_manager_facade.AclData( handle=conn_handle, payload=bytes( b'\x29\x00\x07\x00This is just SomeMoreAclData from the DUT' ))) conn_handle = 0xfff cert_hci_event_asserts.assert_event_occurs(get_handle) cert_handle = conn_handle self.enqueue_acl_data( cert_handle, hci_packets.PacketBoundaryFlag.FIRST_AUTOMATICALLY_FLUSHABLE, hci_packets.BroadcastFlag.POINT_TO_POINT, bytes( b'\x26\x00\x07\x00This is just SomeAclData from the Cert')) cert_acl_data_asserts.assert_event_occurs( lambda packet: b'SomeMoreAclData' in packet.data) acl_data_asserts.assert_event_occurs( lambda packet: b'SomeAclData' in packet.payload) def test_recombination_l2cap_packet(self): self.register_for_event(hci_packets.EventCode.CONNECTION_REQUEST) self.register_for_event(hci_packets.EventCode.CONNECTION_COMPLETE) Loading
system/gd/hci/facade/acl_manager_facade.cc +15 −7 Original line number Diff line number Diff line Loading @@ -96,6 +96,16 @@ class AclManagerFacadeService : public AclManagerFacade::Service, } }; ::grpc::Status FetchIncomingConnection(::grpc::ServerContext* context, const google::protobuf::Empty* request, ::grpc::ServerWriter<ConnectionEvent>* writer) override { if (per_connection_events_.size() > current_connection_request_) { return ::grpc::Status(::grpc::StatusCode::RESOURCE_EXHAUSTED, "Only one outstanding connection is supported"); } per_connection_events_.emplace_back(std::make_unique<::bluetooth::grpc::GrpcEventQueue<ConnectionEvent>>( std::string("incoming connection ") + std::to_string(current_connection_request_))); return per_connection_events_[current_connection_request_]->RunLoop(context, writer); } ::grpc::Status SendAclData(::grpc::ServerContext* context, const AclData* request, ::google::protobuf::Empty* response) override { std::promise<void> promise; Loading Loading @@ -172,13 +182,11 @@ class AclManagerFacadeService : public AclManagerFacade::Service, current_connection_request_), facade_handler_); shared_connection->RegisterCallbacks(this, facade_handler_); { std::unique_ptr<BasePacketBuilder> builder = ConnectionCompleteBuilder::Create( ErrorCode::SUCCESS, to_handle(current_connection_request_), addr, LinkType::ACL, Enable::DISABLED); ConnectionEvent success; success.set_event(builder_to_string(std::move(builder))); per_connection_events_[current_connection_request_]->OnIncomingEvent(success); } current_connection_request_++; } Loading
system/gd/hci/facade/acl_manager_facade.proto +1 −0 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ service AclManagerFacade { rpc AuthenticationRequested(HandleMsg) returns (google.protobuf.Empty) {} rpc SendAclData(AclData) returns (google.protobuf.Empty) {} rpc FetchAclData(google.protobuf.Empty) returns (stream AclData) {} rpc FetchIncomingConnection(google.protobuf.Empty) returns (stream ConnectionEvent) {} } message HandleMsg { Loading