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

Commit f84c1c74 authored by Charlie Boutier's avatar Charlie Boutier
Browse files

BumbleBluetoothTest: Add Dck Gatt Discover tests

Add a test to verify the DK gatt implementation on Bumble and
be sure it is discoverable from the Android side

Test: atest BumbleBluetoothTests
Bug: 294274195
Change-Id: Icd05237fa77e38e9d6dc1de4d3e10fa270796c2e
parent 3e6cd433
Loading
Loading
Loading
Loading
+19 −4
Original line number Diff line number Diff line
@@ -31,10 +31,11 @@ android_test_helper_app {
        "pandora_experimental-proto-java",
    ],

    // Include all test java files.
    srcs: ["src/**/*.java"],

    platform_apis: true,
    // Include all test java and kotlin files.
    srcs: [
        "src/**/*.java",
        "src/**/*.kt",
    ],
}

// This empty test host is needed for building required host binary
@@ -60,3 +61,17 @@ java_test_host {
        "general-tests",
    ],
}

python_binary_host {
    name: "bumble_pandora_server",
    main: "src/bumble_server.py",
    srcs: [
        "src/bumble_server.py",
    ],
    libs: [
        "bumble-pandora",
        "bumble_services_experimental-python",
        "pandora-python",
        "pandora_experimental-python",
    ],
}
+99 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * 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
 *
 *      http://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.
 */

package android.bluetooth

import android.content.Context
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.compatibility.common.util.AdoptShellPermissionsRule
import com.google.common.truth.Truth.assertThat
import com.google.protobuf.Empty
import io.grpc.Deadline
import java.util.UUID
import java.util.concurrent.TimeUnit
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito.any
import org.mockito.Mockito.eq
import org.mockito.Mockito.mock
import org.mockito.Mockito.timeout
import org.mockito.Mockito.verify
import pandora.HostProto.AdvertiseRequest
import pandora.HostProto.OwnAddressType

@RunWith(AndroidJUnit4::class)
public class DckTest {
    private val TAG = "DckTest"
    private val TIMEOUT: Long = 2000

    private val context: Context = ApplicationProvider.getApplicationContext()
    private val bluetoothManager = context.getSystemService(BluetoothManager::class.java)!!
    private val bluetoothAdapter = bluetoothManager.adapter

    // CCC DK Specification R3 1.2.0 r14 section 19.2.1.2 Bluetooth Le Pairing
    private val CCC_DK_UUID = UUID.fromString("0000FFF5-0000-1000-8000-00805f9b34fb")

    @Rule @JvmField val mPermissionRule = AdoptShellPermissionsRule()

    @Rule @JvmField val mBumble = PandoraDevice()

    @Test
    fun testDiscoverDkGattService() {
        mBumble
            .dckBlocking()
            .withDeadline(Deadline.after(TIMEOUT, TimeUnit.MILLISECONDS))
            .register(Empty.getDefaultInstance())

        mBumble
            .hostBlocking()
            .advertise(
                AdvertiseRequest.newBuilder()
                    .setLegacy(true)
                    .setConnectable(true)
                    .setOwnAddressType(OwnAddressType.RANDOM)
                    .build()
            )

        val bumbleDevice =
            bluetoothAdapter.getRemoteLeDevice(
                Utils.BUMBLE_RANDOM_ADDRESS,
                BluetoothDevice.ADDRESS_TYPE_RANDOM
            )
        val gattCallback = mock(BluetoothGattCallback::class.java)
        var bumbleGatt = bumbleDevice.connectGatt(context, false, gattCallback)
        verify(gattCallback, timeout(TIMEOUT))
            .onConnectionStateChange(
                any(),
                eq(BluetoothGatt.GATT_SUCCESS),
                eq(BluetoothProfile.STATE_CONNECTED)
            )

        bumbleGatt.discoverServices()
        verify(gattCallback, timeout(TIMEOUT))
            .onServicesDiscovered(any(), eq(BluetoothGatt.GATT_SUCCESS))
        assertThat(bumbleGatt.getService(CCC_DK_UUID)).isNotNull()

        bumbleGatt.disconnect()
        verify(gattCallback, timeout(TIMEOUT))
            .onConnectionStateChange(
                any(),
                eq(BluetoothGatt.GATT_SUCCESS),
                eq(BluetoothProfile.STATE_DISCONNECTED)
            )
    }
}
+7 −7
Original line number Diff line number Diff line
@@ -32,11 +32,10 @@ import android.bluetooth.le.BluetoothLeScanner;
import android.content.Context;

import androidx.test.core.app.ApplicationProvider;
import androidx.test.runner.AndroidJUnit4;
import androidx.test.ext.junit.runners.AndroidJUnit4;

import com.android.compatibility.common.util.AdoptShellPermissionsRule;


import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
@@ -54,8 +53,6 @@ import pandora.HostProto.OwnAddressType;
public class GattClientTest {
    private static final String TAG = "GattClientTest";

    private static final String BUMBLE_RPA = "51:F7:A8:75:AC:5E";

    @ClassRule public static final AdoptShellPermissionsRule PERM = new AdoptShellPermissionsRule();

    @Rule public final PandoraDevice mBumble = new PandoraDevice();
@@ -70,7 +67,8 @@ public class GattClientTest {
        advertiseWithBumble();

        BluetoothDevice device =
            mAdapter.getRemoteLeDevice(BUMBLE_RPA, BluetoothDevice.ADDRESS_TYPE_RANDOM);
                mAdapter.getRemoteLeDevice(
                        Utils.BUMBLE_RANDOM_ADDRESS, BluetoothDevice.ADDRESS_TYPE_RANDOM);

        for (int i = 0; i < 10; i++) {
            BluetoothGattCallback gattCallback = mock(BluetoothGattCallback.class);
@@ -101,7 +99,8 @@ public class GattClientTest {
        advertiseWithBumble();

        BluetoothDevice device =
            mAdapter.getRemoteLeDevice(BUMBLE_RPA, BluetoothDevice.ADDRESS_TYPE_RANDOM);
                mAdapter.getRemoteLeDevice(
                        Utils.BUMBLE_RANDOM_ADDRESS, BluetoothDevice.ADDRESS_TYPE_RANDOM);

        for (int i = 0; i < 10; i++) {
            BluetoothGattCallback gattCallback = mock(BluetoothGattCallback.class);
@@ -123,7 +122,8 @@ public class GattClientTest {
        advertiseWithBumble();

        BluetoothDevice device =
                mAdapter.getRemoteLeDevice(BUMBLE_RPA, BluetoothDevice.ADDRESS_TYPE_RANDOM);
                mAdapter.getRemoteLeDevice(
                        Utils.BUMBLE_RANDOM_ADDRESS, BluetoothDevice.ADDRESS_TYPE_RANDOM);
        BluetoothGattCallback gattCallback = mock(BluetoothGattCallback.class);
        InOrder inOrder = inOrder(gattCallback);

+1 −1
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ import android.util.Log;

import androidx.core.util.Pair;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.runner.AndroidJUnit4;
import androidx.test.ext.junit.runners.AndroidJUnit4;

import com.android.compatibility.common.util.AdoptShellPermissionsRule;

+1 −1
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ import android.os.ParcelUuid;
import android.util.Log;

import androidx.test.core.app.ApplicationProvider;
import androidx.test.runner.AndroidJUnit4;
import androidx.test.ext.junit.runners.AndroidJUnit4;

import com.android.compatibility.common.util.AdoptShellPermissionsRule;

Loading