blob: f6336bf79697c54e13e7fd737d58a11c14349f94 [file] [log] [blame]
/*
* Copyright 2022 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.cts;
import static android.Manifest.permission.BLUETOOTH_CONNECT;
import static android.Manifest.permission.BLUETOOTH_PRIVILEGED;
import android.app.UiAutomation;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothStatusCodes;
import android.sysprop.BluetoothProperties;
import android.test.AndroidTestCase;
import android.util.Log;
import androidx.test.InstrumentationRegistry;
import java.lang.invoke.MethodHandles;
import java.util.List;
public class BluetoothConfigTest extends AndroidTestCase {
private static final String TAG = MethodHandles.lookup().lookupClass().getSimpleName();
private boolean mHasBluetooth;
private BluetoothAdapter mAdapter;
private UiAutomation mUiAutomation;
@Override
public void setUp() throws Exception {
super.setUp();
mHasBluetooth = TestUtils.hasBluetooth();
if (!mHasBluetooth) return;
mUiAutomation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
mUiAutomation.adoptShellPermissionIdentity(BLUETOOTH_CONNECT);
BluetoothManager manager = getContext().getSystemService(BluetoothManager.class);
mAdapter = manager.getAdapter();
assertTrue(BTAdapterUtils.enableAdapter(mAdapter, mContext));
}
@Override
public void tearDown() throws Exception {
super.tearDown();
if (!mHasBluetooth) return;
assertTrue(BTAdapterUtils.disableAdapter(mAdapter, mContext));
mAdapter = null;
mUiAutomation.dropShellPermissionIdentity();
}
private int checkIsProfileEnabledInList(int profile, List<Integer> supportedProfiles) {
final boolean isEnabled = TestUtils.isProfileEnabled(profile);
final boolean isSupported = supportedProfiles.contains(profile);
if (isEnabled == isSupported) {
return 0;
}
Log.e(TAG, "Profile config does not match for profile: "
+ BluetoothProfile.getProfileName(profile)
+ ". Config currently return: " + isEnabled
+ ". Is profile in the list: " + isSupported);
return 1;
}
public void testProfileEnabledValueInList() {
if (!mHasBluetooth) {
return;
}
mUiAutomation.adoptShellPermissionIdentity(BLUETOOTH_CONNECT, BLUETOOTH_PRIVILEGED);
final List<Integer> pList = mAdapter.getSupportedProfiles();
int wrong_config_in_list = checkIsProfileEnabledInList(BluetoothProfile.A2DP, pList)
+ checkIsProfileEnabledInList(BluetoothProfile.A2DP_SINK, pList)
+ checkIsProfileEnabledInList(BluetoothProfile.AVRCP_CONTROLLER, pList)
+ checkIsProfileEnabledInList(BluetoothProfile.CSIP_SET_COORDINATOR, pList)
+ checkIsProfileEnabledInList(BluetoothProfile.GATT, pList)
+ checkIsProfileEnabledInList(BluetoothProfile.HAP_CLIENT, pList)
+ checkIsProfileEnabledInList(BluetoothProfile.HEADSET, pList)
+ checkIsProfileEnabledInList(BluetoothProfile.HEADSET_CLIENT, pList)
+ checkIsProfileEnabledInList(BluetoothProfile.HEARING_AID, pList)
+ checkIsProfileEnabledInList(BluetoothProfile.HID_DEVICE, pList)
+ checkIsProfileEnabledInList(BluetoothProfile.HID_HOST, pList)
+ checkIsProfileEnabledInList(BluetoothProfile.LE_AUDIO, pList)
+ checkIsProfileEnabledInList(BluetoothProfile.LE_AUDIO_BROADCAST, pList)
+ checkIsProfileEnabledInList(BluetoothProfile.LE_AUDIO_BROADCAST_ASSISTANT, pList)
+ checkIsProfileEnabledInList(BluetoothProfile.MAP, pList)
+ checkIsProfileEnabledInList(BluetoothProfile.MAP_CLIENT, pList)
+ checkIsProfileEnabledInList(BluetoothProfile.OPP, pList)
+ checkIsProfileEnabledInList(BluetoothProfile.PAN, pList)
+ checkIsProfileEnabledInList(BluetoothProfile.PBAP, pList)
+ checkIsProfileEnabledInList(BluetoothProfile.PBAP_CLIENT, pList)
+ checkIsProfileEnabledInList(BluetoothProfile.SAP, pList)
+ checkIsProfileEnabledInList(BluetoothProfile.VOLUME_CONTROL, pList);
assertEquals("Config does not match adapter hardware support. CHECK THE PREVIOUS LOGS.",
0, wrong_config_in_list);
}
private int checkIsProfileEnabled(int profile, int adapterSupport) {
final boolean isEnabled = TestUtils.isProfileEnabled(profile);
final boolean isSupported = BluetoothStatusCodes.FEATURE_SUPPORTED == adapterSupport;
if (isEnabled == isSupported) {
return 0;
}
Log.e(TAG, "Profile config does not match for profile: "
+ BluetoothProfile.getProfileName(profile)
+ ". Config currently return: " + TestUtils.isProfileEnabled(profile)
+ ". Adapter support return: " + adapterSupport);
return 1;
}
public void testProfileEnabledValue() {
if (!mHasBluetooth) {
return;
}
int wrong_config =
checkIsProfileEnabled(BluetoothProfile.LE_AUDIO,
mAdapter.isLeAudioSupported())
+ checkIsProfileEnabled(BluetoothProfile.LE_AUDIO_BROADCAST,
mAdapter.isLeAudioBroadcastSourceSupported())
+ checkIsProfileEnabled(BluetoothProfile.LE_AUDIO_BROADCAST_ASSISTANT,
mAdapter.isLeAudioBroadcastAssistantSupported());
assertEquals("Config does not match adapter hardware support. CHECK THE PREVIOUS LOGS.",
0, wrong_config);
}
public void testBleCDDRequirement() {
if (!mHasBluetooth) {
return;
}
// If device implementations return true for isLeAudioSupported():
// [C-7-5] MUST enable simultaneously:
// BAP unicast client,
// CSIP set coordinator,
// MCP server,
// VCP controller,
// CCP server,
if (mAdapter.isLeAudioSupported()
== BluetoothStatusCodes.FEATURE_SUPPORTED) {
assertTrue("BAP unicast config must be true when LeAudio is supported. [C-7-5]",
BluetoothProperties.isProfileBapUnicastClientEnabled().orElse(false));
assertTrue("CSIP config must be true when LeAudio is supported. [C-7-5]",
BluetoothProperties.isProfileCsipSetCoordinatorEnabled().orElse(false));
assertTrue("MCP config must be true when LeAudio is supported. [C-7-5]",
BluetoothProperties.isProfileMcpServerEnabled().orElse(false));
assertTrue("VCP config must be true when LeAudio is supported. [C-7-5]",
BluetoothProperties.isProfileVcpControllerEnabled().orElse(false));
assertTrue("CCP config must be true when LeAudio is supported. [C-7-5]",
BluetoothProperties.isProfileCcpServerEnabled().orElse(false));
}
// If device implementations return true for isLeAudioBroadcastSourceSupported():
// [C-8-2] MUST enable simultaneously:
// BAP broadcast source,
// BAP broadcast assistant
if (mAdapter.isLeAudioBroadcastSourceSupported()
== BluetoothStatusCodes.FEATURE_SUPPORTED) {
assertTrue("BAP broadcast source config must be true when adapter support "
+ "BroadcastSource. [C-8-2]",
BluetoothProperties.isProfileBapBroadcastSourceEnabled().orElse(false));
assertTrue("BAP broadcast assistant config must be true when adapter support "
+ "BroadcastSource. [C-8-2]",
BluetoothProperties.isProfileBapBroadcastAssistEnabled().orElse(false));
}
}
}