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

Commit 52bd4a10 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 am: 466767c8

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



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


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


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


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


    def _retry(self, func):
    def _retry(self, func):


@@ -111,6 +115,11 @@ class IUT:
            if not self._a2dp:
            if not self._a2dp:
                self._a2dp = A2DPProxy(grpc.insecure_channel(f'localhost:{self.port}'))
                self._a2dp = A2DPProxy(grpc.insecure_channel(f'localhost:{self.port}'))
            return self._a2dp.interact(test, interaction, description, pts_address)
            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.
        # Handles HFP MMIs.
        if profile in ('HFP'):
        if profile in ('HFP'):
            if not self._hfp:
            if not self._hfp:
+88 −0
Original line number Original line 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 Original line Diff line number Diff line
@@ -115,18 +115,21 @@ genrule {
         "    $(in)",
         "    $(in)",
    srcs: [
    srcs: [
        "proto/pandora/a2dp.proto",
        "proto/pandora/a2dp.proto",
        "proto/pandora/gatt.proto",
        "proto/pandora/hfp.proto",
        "proto/pandora/hfp.proto",
        "proto/pandora/host.proto",
        "proto/pandora/host.proto",
        "proto/pandora/sm.proto"
        "proto/pandora/sm.proto",
    ],
    ],
    out: [
    out: [
        "pandora/a2dp_grpc.py",
        "pandora/a2dp_grpc.py",
        "pandora/a2dp_pb2.py",
        "pandora/a2dp_pb2.py",
        "pandora/gatt_grpc.py",
        "pandora/gatt_pb2.py",
        "pandora/hfp_grpc.py",
        "pandora/hfp_grpc.py",
        "pandora/hfp_pb2.py",
        "pandora/hfp_pb2.py",
        "pandora/host_grpc.py",
        "pandora/host_grpc.py",
        "pandora/host_pb2.py",
        "pandora/host_pb2.py",
        "pandora/sm_pb2.py",
        "pandora/sm_grpc.py",
        "pandora/sm_grpc.py",
        "pandora/sm_pb2.py",
    ]
    ]
}
}
+1 −0
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@
        <option name="physical" value="false" />
        <option name="physical" value="false" />
        <option name="profile" value="A2DP/SRC" />
        <option name="profile" value="A2DP/SRC" />
        <option name="profile" value="AVDTP/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/DIS" />
        <option name="profile" value="HFP/AG/HFI" />
        <option name="profile" value="HFP/AG/HFI" />
        <option name="profile" value="HFP/AG/SLC" />
        <option name="profile" value="HFP/AG/SLC" />
+29 −0
Original line number Original line 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