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

Commit 466767c8 authored by Etienne Ruffieux's avatar Etienne Ruffieux Committed by Automerger Merge Worker
Browse files

Merge "PTS bot implementation for GATT profile tests" am: 8744afea am:...

Merge "PTS bot implementation for GATT profile tests" am: 8744afea am: 2cbe1c94 am: 15faf9e3 am: d67e68e9

Original change: https://android-review.googlesource.com/c/platform/packages/modules/Bluetooth/+/2166427



Change-Id: I9199cf701e760e11aea37c294500b7e2228b2302
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 927ae237 d67e68e9
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import sys
import grpc

from mmi2grpc.a2dp import A2DPProxy
from mmi2grpc.gatt import GATTProxy
from mmi2grpc.hfp import HFPProxy
from mmi2grpc.sdp import SDPProxy
from mmi2grpc.sm import SMProxy
@@ -53,6 +54,7 @@ class IUT:

        # Profile proxies.
        self._a2dp = None
        self._gatt = None
        self._hfp = None
        self._sdp = None
        self._sm = None
@@ -66,8 +68,10 @@ class IUT:

    def __exit__(self, exc_type, exc_value, exc_traceback):
        self._a2dp = None
        self._gatt = None
        self._hfp = None
        self._sdp = None
        self._sm = None

    def _retry(self, func):

@@ -111,6 +115,11 @@ class IUT:
            if not self._a2dp:
                self._a2dp = A2DPProxy(grpc.insecure_channel(f'localhost:{self.port}'))
            return self._a2dp.interact(test, interaction, description, pts_address)
        # Handles GATT MMIs.
        if profile in ('GATT'):
            if not self._gatt:
                self._gatt = GATTProxy(grpc.insecure_channel(f'localhost:{self.port}'))
            return self._gatt.interact(test, interaction, description, pts_address)
        # Handles HFP MMIs.
        if profile in ('HFP'):
            if not self._hfp:
+88 −0
Original line number Diff line number Diff line
# Copyright 2022 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import re

from mmi2grpc._helpers import assert_description
from mmi2grpc._proxy import ProfileProxy

from pandora.gatt_grpc import GATT
from pandora.host_grpc import Host


class GATTProxy(ProfileProxy):

    def __init__(self, channel):
        super().__init__()
        self.gatt = GATT(channel)
        self.host = Host(channel)
        self.connection = None

    @assert_description
    def MMI_IUT_INITIATE_CONNECTION(self, pts_addr: bytes, **kwargs):
        """
        Please initiate a GATT connection to the PTS.

        Description: Verify that
        the Implementation Under Test (IUT) can initiate GATT connect request to
        PTS.
        """

        self.connection = self.host.ConnectLE(address=pts_addr).connection
        return "OK"

    @assert_description
    def MMI_IUT_MTU_EXCHANGE(self, **kwargs):
        """
        Please send exchange MTU command to the PTS.

        Description: Verify that
        the Implementation Under Test (IUT) can send Exchange MTU command to the
        tester.
        """

        assert self.connection is not None
        self.gatt.ExchangeMTU(mtu=512, connection=self.connection)
        return "OK"

    def MMI_IUT_SEND_PREPARE_WRITE_REQUEST_VALID_SIZE(self, description: str, **kwargs):
        """
        Please send prepare write request with handle = 'FFFF'O and size = 'XXX'
        to the PTS.

        Description: Verify that the Implementation Under Test
        (IUT) can send data according to negotiate MTU size.
        """

        assert self.connection is not None
        matches = re.findall("'([a0-Z9]*)'O and size = '([a0-Z9]*)'", description)
        handle = int(matches[0][0], 16)
        data = bytes([1]) * int(matches[0][1])
        self.gatt.WriteCharacteristicFromHandle(connection=self.connection, handle=handle, value=data)
        return "OK"

    @assert_description
    def MMI_IUT_INITIATE_DISCONNECTION(self, **kwargs):
        """
        Please initiate a GATT disconnection to the PTS.

        Description: Verify
        that the Implementation Under Test (IUT) can initiate GATT disconnect
        request to PTS.
        """

        assert self.connection is not None
        self.host.DisconnectLE(connection=self.connection)
        self.connection = None
        return "OK"
+5 −2
Original line number Diff line number Diff line
@@ -115,18 +115,21 @@ genrule {
         "    $(in)",
    srcs: [
        "proto/pandora/a2dp.proto",
        "proto/pandora/gatt.proto",
        "proto/pandora/hfp.proto",
        "proto/pandora/host.proto",
        "proto/pandora/sm.proto"
        "proto/pandora/sm.proto",
    ],
    out: [
        "pandora/a2dp_grpc.py",
        "pandora/a2dp_pb2.py",
        "pandora/gatt_grpc.py",
        "pandora/gatt_pb2.py",
        "pandora/hfp_grpc.py",
        "pandora/hfp_pb2.py",
        "pandora/host_grpc.py",
        "pandora/host_pb2.py",
        "pandora/sm_pb2.py",
        "pandora/sm_grpc.py",
        "pandora/sm_pb2.py",
    ]
}
+1 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
        <option name="physical" value="false" />
        <option name="profile" value="A2DP/SRC" />
        <option name="profile" value="AVDTP/SRC" />
        <option name="profile" value="GATT/CL/GAC" />
        <option name="profile" value="HFP/AG/DIS" />
        <option name="profile" value="HFP/AG/HFI" />
        <option name="profile" value="HFP/AG/SLC" />
+29 −0
Original line number Diff line number Diff line
syntax = "proto3";

option java_outer_classname = "GattProto";

package pandora;

import "pandora/host.proto";
import "google/protobuf/empty.proto";

service GATT {
  // Request an MTU size.
  rpc ExchangeMTU(ExchangeMTURequest) returns (google.protobuf.Empty);

  // Writes on a characteristic.
  rpc WriteCharacteristicFromHandle(WriteCharacteristicRequest) returns (google.protobuf.Empty);
}

// Request for the `ExchangeMTU` method.
message ExchangeMTURequest {
  Connection connection = 1;
  int32 mtu = 2;
}

// Request for the `writeCharacteristicFromHandle` method.
message WriteCharacteristicRequest {
  Connection connection = 1;
  uint32 handle = 2;
  bytes value = 3;
}
Loading