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

Commit 76219848 authored by Myles Watson's avatar Myles Watson
Browse files

AclManager: Add an incoming connection test

Add FetchIncomingConnection to get the next events.

Bug: 148096951
Test: ./cert/run_cert_facade_only.sh
Change-Id: I68576f027fb4a703e3dc360ac09c2206539feb8a
parent dfb6bd70
Loading
Loading
Loading
Loading
+73 −0
Original line number Diff line number Diff line
@@ -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)
+15 −7
Original line number Diff line number Diff line
@@ -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;
@@ -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_++;
  }

+1 −0
Original line number Diff line number Diff line
@@ -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 {