CachedBluetoothDeviceTest.java revision 6258aae54824a7c3cd3974822b0b6835ab8a45de
16258aae54824a7c3cd3974822b0b6835ab8a45deJack He/*
26258aae54824a7c3cd3974822b0b6835ab8a45deJack He * Copyright (C) 2017 The Android Open Source Project
36258aae54824a7c3cd3974822b0b6835ab8a45deJack He *
46258aae54824a7c3cd3974822b0b6835ab8a45deJack He * Licensed under the Apache License, Version 2.0 (the "License");
56258aae54824a7c3cd3974822b0b6835ab8a45deJack He * you may not use this file except in compliance with the License.
66258aae54824a7c3cd3974822b0b6835ab8a45deJack He * You may obtain a copy of the License at
76258aae54824a7c3cd3974822b0b6835ab8a45deJack He *
86258aae54824a7c3cd3974822b0b6835ab8a45deJack He *      http://www.apache.org/licenses/LICENSE-2.0
96258aae54824a7c3cd3974822b0b6835ab8a45deJack He *
106258aae54824a7c3cd3974822b0b6835ab8a45deJack He * Unless required by applicable law or agreed to in writing, software
116258aae54824a7c3cd3974822b0b6835ab8a45deJack He * distributed under the License is distributed on an "AS IS" BASIS,
126258aae54824a7c3cd3974822b0b6835ab8a45deJack He * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136258aae54824a7c3cd3974822b0b6835ab8a45deJack He * See the License for the specific language governing permissions and
146258aae54824a7c3cd3974822b0b6835ab8a45deJack He * limitations under the License.
156258aae54824a7c3cd3974822b0b6835ab8a45deJack He */
166258aae54824a7c3cd3974822b0b6835ab8a45deJack Hepackage com.android.settingslib.bluetooth;
176258aae54824a7c3cd3974822b0b6835ab8a45deJack He
186258aae54824a7c3cd3974822b0b6835ab8a45deJack Heimport static com.google.common.truth.Truth.assertThat;
196258aae54824a7c3cd3974822b0b6835ab8a45deJack He
206258aae54824a7c3cd3974822b0b6835ab8a45deJack Heimport static org.mockito.Mockito.doAnswer;
216258aae54824a7c3cd3974822b0b6835ab8a45deJack Heimport static org.mockito.Mockito.spy;
226258aae54824a7c3cd3974822b0b6835ab8a45deJack Heimport static org.mockito.Mockito.when;
236258aae54824a7c3cd3974822b0b6835ab8a45deJack He
246258aae54824a7c3cd3974822b0b6835ab8a45deJack Heimport android.bluetooth.BluetoothAdapter;
256258aae54824a7c3cd3974822b0b6835ab8a45deJack Heimport android.bluetooth.BluetoothDevice;
266258aae54824a7c3cd3974822b0b6835ab8a45deJack Heimport android.bluetooth.BluetoothProfile;
276258aae54824a7c3cd3974822b0b6835ab8a45deJack Heimport android.content.Context;
286258aae54824a7c3cd3974822b0b6835ab8a45deJack He
296258aae54824a7c3cd3974822b0b6835ab8a45deJack Heimport com.android.settingslib.R;
306258aae54824a7c3cd3974822b0b6835ab8a45deJack Heimport com.android.settingslib.TestConfig;
316258aae54824a7c3cd3974822b0b6835ab8a45deJack He
326258aae54824a7c3cd3974822b0b6835ab8a45deJack Heimport org.junit.Before;
336258aae54824a7c3cd3974822b0b6835ab8a45deJack Heimport org.junit.Test;
346258aae54824a7c3cd3974822b0b6835ab8a45deJack Heimport org.junit.runner.RunWith;
356258aae54824a7c3cd3974822b0b6835ab8a45deJack Heimport org.mockito.Mock;
366258aae54824a7c3cd3974822b0b6835ab8a45deJack Heimport org.mockito.MockitoAnnotations;
376258aae54824a7c3cd3974822b0b6835ab8a45deJack Heimport org.robolectric.RobolectricTestRunner;
386258aae54824a7c3cd3974822b0b6835ab8a45deJack Heimport org.robolectric.RuntimeEnvironment;
396258aae54824a7c3cd3974822b0b6835ab8a45deJack Heimport org.robolectric.annotation.Config;
406258aae54824a7c3cd3974822b0b6835ab8a45deJack He
416258aae54824a7c3cd3974822b0b6835ab8a45deJack He@RunWith(RobolectricTestRunner.class)
426258aae54824a7c3cd3974822b0b6835ab8a45deJack He@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, resourceDir =
436258aae54824a7c3cd3974822b0b6835ab8a45deJack He        "../../res")
446258aae54824a7c3cd3974822b0b6835ab8a45deJack Hepublic class CachedBluetoothDeviceTest {
456258aae54824a7c3cd3974822b0b6835ab8a45deJack He    @Mock
466258aae54824a7c3cd3974822b0b6835ab8a45deJack He    private LocalBluetoothAdapter mAdapter;
476258aae54824a7c3cd3974822b0b6835ab8a45deJack He    @Mock
486258aae54824a7c3cd3974822b0b6835ab8a45deJack He    private LocalBluetoothProfileManager mProfileManager;
496258aae54824a7c3cd3974822b0b6835ab8a45deJack He    @Mock
506258aae54824a7c3cd3974822b0b6835ab8a45deJack He    private HeadsetProfile mHfpProfile;
516258aae54824a7c3cd3974822b0b6835ab8a45deJack He    @Mock
526258aae54824a7c3cd3974822b0b6835ab8a45deJack He    private A2dpProfile mA2dpProfile;
536258aae54824a7c3cd3974822b0b6835ab8a45deJack He    @Mock
546258aae54824a7c3cd3974822b0b6835ab8a45deJack He    private HidProfile mHidProfile;
556258aae54824a7c3cd3974822b0b6835ab8a45deJack He    @Mock
566258aae54824a7c3cd3974822b0b6835ab8a45deJack He    private BluetoothDevice mDevice;
576258aae54824a7c3cd3974822b0b6835ab8a45deJack He    private CachedBluetoothDevice mCachedDevice;
586258aae54824a7c3cd3974822b0b6835ab8a45deJack He    private Context mContext;
596258aae54824a7c3cd3974822b0b6835ab8a45deJack He    private int mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
606258aae54824a7c3cd3974822b0b6835ab8a45deJack He
616258aae54824a7c3cd3974822b0b6835ab8a45deJack He    @Before
626258aae54824a7c3cd3974822b0b6835ab8a45deJack He    public void setUp() {
636258aae54824a7c3cd3974822b0b6835ab8a45deJack He        MockitoAnnotations.initMocks(this);
646258aae54824a7c3cd3974822b0b6835ab8a45deJack He        mContext = RuntimeEnvironment.application;
656258aae54824a7c3cd3974822b0b6835ab8a45deJack He        when(mAdapter.getBluetoothState()).thenReturn(BluetoothAdapter.STATE_ON);
666258aae54824a7c3cd3974822b0b6835ab8a45deJack He        when(mHfpProfile.isProfileReady()).thenReturn(true);
676258aae54824a7c3cd3974822b0b6835ab8a45deJack He        when(mA2dpProfile.isProfileReady()).thenReturn(true);
686258aae54824a7c3cd3974822b0b6835ab8a45deJack He        when(mHidProfile.isProfileReady()).thenReturn(true);
696258aae54824a7c3cd3974822b0b6835ab8a45deJack He        mCachedDevice = spy(
706258aae54824a7c3cd3974822b0b6835ab8a45deJack He                new CachedBluetoothDevice(mContext, mAdapter, mProfileManager, mDevice));
716258aae54824a7c3cd3974822b0b6835ab8a45deJack He        doAnswer((invocation) -> mBatteryLevel).when(mCachedDevice).getBatteryLevel();
726258aae54824a7c3cd3974822b0b6835ab8a45deJack He    }
736258aae54824a7c3cd3974822b0b6835ab8a45deJack He
746258aae54824a7c3cd3974822b0b6835ab8a45deJack He    /**
756258aae54824a7c3cd3974822b0b6835ab8a45deJack He     * Test to verify the current test context object works so that we are not checking null
766258aae54824a7c3cd3974822b0b6835ab8a45deJack He     * against null
776258aae54824a7c3cd3974822b0b6835ab8a45deJack He     */
786258aae54824a7c3cd3974822b0b6835ab8a45deJack He    @Test
796258aae54824a7c3cd3974822b0b6835ab8a45deJack He    public void testContextMock() {
806258aae54824a7c3cd3974822b0b6835ab8a45deJack He        assertThat(mContext.getString(R.string.bluetooth_connected)).isEqualTo("Connected");
816258aae54824a7c3cd3974822b0b6835ab8a45deJack He    }
826258aae54824a7c3cd3974822b0b6835ab8a45deJack He
836258aae54824a7c3cd3974822b0b6835ab8a45deJack He    @Test
846258aae54824a7c3cd3974822b0b6835ab8a45deJack He    public void testGetConnectionSummary_testSingleProfileConnectDisconnect() {
856258aae54824a7c3cd3974822b0b6835ab8a45deJack He        // Test without battery level
866258aae54824a7c3cd3974822b0b6835ab8a45deJack He        // Set HID profile to be connected and test connection state summary
876258aae54824a7c3cd3974822b0b6835ab8a45deJack He        mCachedDevice.onProfileStateChanged(mHidProfile, BluetoothProfile.STATE_CONNECTED);
886258aae54824a7c3cd3974822b0b6835ab8a45deJack He        assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(mContext.getString(
896258aae54824a7c3cd3974822b0b6835ab8a45deJack He                R.string.bluetooth_connected));
906258aae54824a7c3cd3974822b0b6835ab8a45deJack He
916258aae54824a7c3cd3974822b0b6835ab8a45deJack He        // Set HID profile to be disconnected and test connection state summary
926258aae54824a7c3cd3974822b0b6835ab8a45deJack He        mCachedDevice.onProfileStateChanged(mHidProfile, BluetoothProfile.STATE_DISCONNECTED);
936258aae54824a7c3cd3974822b0b6835ab8a45deJack He        assertThat(mCachedDevice.getConnectionSummary()).isNull();
946258aae54824a7c3cd3974822b0b6835ab8a45deJack He
956258aae54824a7c3cd3974822b0b6835ab8a45deJack He        // Test with battery level
966258aae54824a7c3cd3974822b0b6835ab8a45deJack He        mBatteryLevel = 10;
976258aae54824a7c3cd3974822b0b6835ab8a45deJack He        // Set HID profile to be connected and test connection state summary
986258aae54824a7c3cd3974822b0b6835ab8a45deJack He        mCachedDevice.onProfileStateChanged(mHidProfile, BluetoothProfile.STATE_CONNECTED);
996258aae54824a7c3cd3974822b0b6835ab8a45deJack He        assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(mContext.getString(
1006258aae54824a7c3cd3974822b0b6835ab8a45deJack He                R.string.bluetooth_connected_battery_level,
1016258aae54824a7c3cd3974822b0b6835ab8a45deJack He                com.android.settingslib.Utils.formatPercentage(mBatteryLevel)));
1026258aae54824a7c3cd3974822b0b6835ab8a45deJack He
1036258aae54824a7c3cd3974822b0b6835ab8a45deJack He        // Set HID profile to be disconnected and test connection state summary
1046258aae54824a7c3cd3974822b0b6835ab8a45deJack He        mCachedDevice.onProfileStateChanged(mHidProfile, BluetoothProfile.STATE_DISCONNECTED);
1056258aae54824a7c3cd3974822b0b6835ab8a45deJack He        assertThat(mCachedDevice.getConnectionSummary()).isNull();
1066258aae54824a7c3cd3974822b0b6835ab8a45deJack He
1076258aae54824a7c3cd3974822b0b6835ab8a45deJack He        // Test with BluetoothDevice.BATTERY_LEVEL_UNKNOWN battery level
1086258aae54824a7c3cd3974822b0b6835ab8a45deJack He        mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
1096258aae54824a7c3cd3974822b0b6835ab8a45deJack He
1106258aae54824a7c3cd3974822b0b6835ab8a45deJack He        // Set HID profile to be connected and test connection state summary
1116258aae54824a7c3cd3974822b0b6835ab8a45deJack He        mCachedDevice.onProfileStateChanged(mHidProfile, BluetoothProfile.STATE_CONNECTED);
1126258aae54824a7c3cd3974822b0b6835ab8a45deJack He        assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(mContext.getString(
1136258aae54824a7c3cd3974822b0b6835ab8a45deJack He                R.string.bluetooth_connected));
1146258aae54824a7c3cd3974822b0b6835ab8a45deJack He
1156258aae54824a7c3cd3974822b0b6835ab8a45deJack He        // Set HID profile to be disconnected and test connection state summary
1166258aae54824a7c3cd3974822b0b6835ab8a45deJack He        mCachedDevice.onProfileStateChanged(mHidProfile, BluetoothProfile.STATE_DISCONNECTED);
1176258aae54824a7c3cd3974822b0b6835ab8a45deJack He        assertThat(mCachedDevice.getConnectionSummary()).isNull();
1186258aae54824a7c3cd3974822b0b6835ab8a45deJack He    }
1196258aae54824a7c3cd3974822b0b6835ab8a45deJack He
1206258aae54824a7c3cd3974822b0b6835ab8a45deJack He    @Test
1216258aae54824a7c3cd3974822b0b6835ab8a45deJack He    public void testGetConnectionSummary_testMultipleProfileConnectDisconnect() {
1226258aae54824a7c3cd3974822b0b6835ab8a45deJack He        mBatteryLevel = 10;
1236258aae54824a7c3cd3974822b0b6835ab8a45deJack He
1246258aae54824a7c3cd3974822b0b6835ab8a45deJack He        // Set HFP, A2DP and HID profile to be connected and test connection state summary
1256258aae54824a7c3cd3974822b0b6835ab8a45deJack He        mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
1266258aae54824a7c3cd3974822b0b6835ab8a45deJack He        mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
1276258aae54824a7c3cd3974822b0b6835ab8a45deJack He        mCachedDevice.onProfileStateChanged(mHidProfile, BluetoothProfile.STATE_CONNECTED);
1286258aae54824a7c3cd3974822b0b6835ab8a45deJack He        assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(mContext.getString(
1296258aae54824a7c3cd3974822b0b6835ab8a45deJack He                R.string.bluetooth_connected_battery_level,
1306258aae54824a7c3cd3974822b0b6835ab8a45deJack He                com.android.settingslib.Utils.formatPercentage(mBatteryLevel)));
1316258aae54824a7c3cd3974822b0b6835ab8a45deJack He
1326258aae54824a7c3cd3974822b0b6835ab8a45deJack He        // Disconnect HFP only and test connection state summary
1336258aae54824a7c3cd3974822b0b6835ab8a45deJack He        mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
1346258aae54824a7c3cd3974822b0b6835ab8a45deJack He        assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(mContext.getString(
1356258aae54824a7c3cd3974822b0b6835ab8a45deJack He                R.string.bluetooth_connected_no_headset_battery_level,
1366258aae54824a7c3cd3974822b0b6835ab8a45deJack He                com.android.settingslib.Utils.formatPercentage(mBatteryLevel)));
1376258aae54824a7c3cd3974822b0b6835ab8a45deJack He
1386258aae54824a7c3cd3974822b0b6835ab8a45deJack He        // Disconnect A2DP only and test connection state summary
1396258aae54824a7c3cd3974822b0b6835ab8a45deJack He        mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
1406258aae54824a7c3cd3974822b0b6835ab8a45deJack He        mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED);
1416258aae54824a7c3cd3974822b0b6835ab8a45deJack He        assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(mContext.getString(
1426258aae54824a7c3cd3974822b0b6835ab8a45deJack He                R.string.bluetooth_connected_no_a2dp_battery_level,
1436258aae54824a7c3cd3974822b0b6835ab8a45deJack He                com.android.settingslib.Utils.formatPercentage(mBatteryLevel)));
1446258aae54824a7c3cd3974822b0b6835ab8a45deJack He
1456258aae54824a7c3cd3974822b0b6835ab8a45deJack He        // Disconnect both HFP and A2DP and test connection state summary
1466258aae54824a7c3cd3974822b0b6835ab8a45deJack He        mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
1476258aae54824a7c3cd3974822b0b6835ab8a45deJack He        assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(mContext.getString(
1486258aae54824a7c3cd3974822b0b6835ab8a45deJack He                R.string.bluetooth_connected_no_headset_no_a2dp_battery_level,
1496258aae54824a7c3cd3974822b0b6835ab8a45deJack He                com.android.settingslib.Utils.formatPercentage(mBatteryLevel)));
1506258aae54824a7c3cd3974822b0b6835ab8a45deJack He
1516258aae54824a7c3cd3974822b0b6835ab8a45deJack He        // Disconnect all profiles and test connection state summary
1526258aae54824a7c3cd3974822b0b6835ab8a45deJack He        mCachedDevice.onProfileStateChanged(mHidProfile, BluetoothProfile.STATE_DISCONNECTED);
1536258aae54824a7c3cd3974822b0b6835ab8a45deJack He        assertThat(mCachedDevice.getConnectionSummary()).isNull();
1546258aae54824a7c3cd3974822b0b6835ab8a45deJack He    }
1556258aae54824a7c3cd3974822b0b6835ab8a45deJack He}
156