blob: c8026837f9410683acf7e6b2572a5c9cd0cae4d3 [file] [log] [blame]
/*
* Copyright 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 com.android.server.bluetooth;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import android.os.HandlerThread;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@RunWith(AndroidJUnit4.class)
public class BluetoothManagerServiceTest {
static int sTimeout = 3000;
BluetoothManagerService mManagerService;
Context mContext;
@Mock BluetoothServerProxy mBluetoothServerProxy;
@Mock BluetoothManagerService.BluetoothHandler mHandler;
HandlerThread mHandlerThread;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mContext =
spy(
new ContextWrapper(
InstrumentationRegistry.getInstrumentation().getTargetContext()));
mHandlerThread = new HandlerThread("BluetoothManagerServiceTest");
}
@After
public void tearDown() {
mHandlerThread.quitSafely();
}
private void createBluetoothManagerService() {
doReturn(mock(Intent.class))
.when(mContext)
.registerReceiverForAllUsers(any(), any(), eq(null), eq(null));
BluetoothServerProxy.setInstanceForTesting(mBluetoothServerProxy);
// Mock the handler to avoid handle message & to terminate the thread after
// test
doReturn(mHandlerThread).when(mBluetoothServerProxy).createHandlerThread(any());
doReturn(mHandler).when(mBluetoothServerProxy).newBluetoothHandler(any());
// Mock these functions so security errors won't throw
doReturn("name")
.when(mBluetoothServerProxy)
.settingsSecureGetString(any(), eq(Settings.Secure.BLUETOOTH_NAME));
doReturn("00:11:22:33:44:55")
.when(mBluetoothServerProxy)
.settingsSecureGetString(any(), eq(Settings.Secure.BLUETOOTH_ADDRESS));
mManagerService = new BluetoothManagerService(mContext);
}
@Test
public void onUserRestrictionsChanged_disallowBluetooth_onlySendDisableMessageOnSystemUser()
throws InterruptedException {
// Spy UserManager so we can mimic the case when restriction settings changed
UserManager userManager = mock(UserManager.class);
doReturn(userManager).when(mContext).getSystemService(UserManager.class);
doReturn(true)
.when(userManager)
.hasUserRestrictionForUser(eq(UserManager.DISALLOW_BLUETOOTH), any());
doReturn(false)
.when(userManager)
.hasUserRestrictionForUser(eq(UserManager.DISALLOW_BLUETOOTH_SHARING), any());
createBluetoothManagerService();
// Check if disable message sent once for system user only
// Since Message object is recycled after processed, use proxy function to get what value
// test run on user -1, should not turning Bluetooth off
mManagerService.onUserRestrictionsChanged(UserHandle.CURRENT);
verify(mBluetoothServerProxy, timeout(sTimeout).times(0))
.handlerSendWhatMessage(mHandler, BluetoothManagerService.MESSAGE_DISABLE);
// called from SYSTEM user, should try to toggle Bluetooth off
mManagerService.onUserRestrictionsChanged(UserHandle.SYSTEM);
verify(mBluetoothServerProxy, timeout(sTimeout))
.handlerSendWhatMessage(mHandler, BluetoothManagerService.MESSAGE_DISABLE);
}
@Test
public void testApmEnhancementEnabled() {
createBluetoothManagerService();
mManagerService.setBluetoothModeChangeHelper(new BluetoothModeChangeHelper(mContext));
// Change the apm enhancement enabled value to 0
Settings.Global.putInt(mContext.getContentResolver(), "apm_enhancement_enabled", 0);
assertThat(
Settings.Global.getInt(
mContext.getContentResolver(), "apm_enhancement_enabled", 0))
.isEqualTo(0);
// Confirm that apm enhancement enabled value has been updated to 1
mManagerService.loadApmEnhancementStateFromResource();
assertThat(
Settings.Global.getInt(
mContext.getContentResolver(), "apm_enhancement_enabled", 0))
.isEqualTo(1);
}
}