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

Commit 8c72856d authored by Kyunglyul Hyun's avatar Kyunglyul Hyun Committed by Automerger Merge Worker
Browse files

Merge "Use TestLooper in MapClientServiceTest" into main am: 4ca82e98 am:...

Merge "Use TestLooper in MapClientServiceTest" into main am: 4ca82e98 am: 71826219 am: 3aa74db1

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



Change-Id: I10cd922951f5bf94cce9126bc975bbddeb5d02c0
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents cc89d8a7 3aa74db1
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -66,6 +66,8 @@ public class MapClientService extends ProfileService {
    @VisibleForTesting
    private Handler mHandler;

    @VisibleForTesting Looper mSmLooper;

    public static boolean isEnabled() {
        return BluetoothProperties.isProfileMapClientEnabled().orElse(false);
    }
@@ -169,7 +171,9 @@ public class MapClientService extends ProfileService {
    private synchronized void addDeviceToMapAndConnect(BluetoothDevice device) {
        // When creating a new statemachine, its state is set to CONNECTING - which will trigger
        // connect.
        MceStateMachine mapStateMachine = new MceStateMachine(this, device);
        MceStateMachine mapStateMachine;
        if (mSmLooper != null) mapStateMachine = new MceStateMachine(this, device, mSmLooper);
        else mapStateMachine = new MceStateMachine(this, device);
        mMapInstanceMap.put(device, mapStateMachine);
    }

@@ -367,9 +371,10 @@ public class MapClientService extends ProfileService {
     * cleanupDevice removes the associated state machine from the instance map
     *
     * @param device BluetoothDevice address of remote device
     * @param sm the state machine to clean up or {@code null} to clean up any state machine.
     */
    @VisibleForTesting
    public void cleanupDevice(BluetoothDevice device) {
    public void cleanupDevice(BluetoothDevice device, MceStateMachine sm) {
        if (DBG) {
            StringBuilder sb = new StringBuilder();
            dump(sb);
@@ -379,8 +384,12 @@ public class MapClientService extends ProfileService {
        synchronized (mMapInstanceMap) {
            MceStateMachine stateMachine = mMapInstanceMap.get(device);
            if (stateMachine != null) {
                if (sm == null || stateMachine == sm) {
                    mMapInstanceMap.remove(device);
                    stateMachine.doQuit();
                } else {
                    Log.w(TAG, "Trying to clean up wrong state machine");
                }
            }
        }
        if (DBG) {
+25 −2
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ import android.bluetooth.BluetoothUuid;
import android.bluetooth.SdpMasRecord;
import android.content.Intent;
import android.net.Uri;
import android.os.Looper;
import android.os.Message;
import android.os.SystemProperties;
import android.provider.Telephony;
@@ -219,17 +220,39 @@ class MceStateMachine extends StateMachine {
        this(service, device, null, null);
    }

    MceStateMachine(MapClientService service, BluetoothDevice device, Looper looper) {
        this(service, device, null, null, looper);
    }

    @VisibleForTesting
    MceStateMachine(MapClientService service, BluetoothDevice device, MasClient masClient,
            MapClientContent database) {
        super(TAG);
        mService = service;
        mMasClient = masClient;
        mDevice = device;
        mDatabase = database;
        initStateMachine();
    }

    @VisibleForTesting
    MceStateMachine(
            MapClientService service,
            BluetoothDevice device,
            MasClient masClient,
            MapClientContent database,
            Looper looper) {
        super(TAG, looper);
        mService = service;
        mMasClient = masClient;
        mDevice = device;
        mDatabase = database;
        initStateMachine();
    }

    private void initStateMachine() {
        mPreviousState = BluetoothProfile.STATE_DISCONNECTED;

        mDevice = device;
        mDisconnected = new Disconnected();
        mConnecting = new Connecting();
        mDisconnecting = new Disconnecting();
@@ -250,7 +273,7 @@ class MceStateMachine extends StateMachine {
    @Override
    protected void onQuitting() {
        if (mService != null) {
            mService.cleanupDevice(mDevice);
            mService.cleanupDevice(mDevice, this);
        }
    }

+39 −1
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothUuid;
import android.bluetooth.SdpMasRecord;
import android.os.Looper;
import android.os.test.TestLooper;

import androidx.test.filters.MediumTest;
import androidx.test.rule.ServiceTestRule;
@@ -62,6 +63,7 @@ public class MapClientServiceTest {
    private MapClientService mService = null;
    private BluetoothAdapter mAdapter = null;
    private BluetoothDevice mRemoteDevice;
    private TestLooper mTestLooper;

    @Before
    public void setUp() throws Exception {
@@ -70,8 +72,13 @@ public class MapClientServiceTest {
        doReturn(mDatabaseManager).when(mAdapterService).getDatabase();
        doReturn(true, false).when(mAdapterService).isStartedProfile(anyString());
        TestUtils.startService(mServiceRule, MapClientService.class);

        mTestLooper = new TestLooper();

        mService = MapClientService.getMapClientService();
        assertThat(mService).isNotNull();
        mService.mSmLooper = mTestLooper.getLooper();

        // Try getting the Bluetooth adapter
        mAdapter = BluetoothAdapter.getDefaultAdapter();
        assertThat(mAdapter).isNotNull();
@@ -80,11 +87,13 @@ public class MapClientServiceTest {

    @After
    public void tearDown() throws Exception {
        mService.mSmLooper = null;
        TestUtils.stopService(mServiceRule, MapClientService.class);
        mService = MapClientService.getMapClientService();
        assertThat(mService).isNull();
        TestUtils.clearAdapterService(mAdapterService);
        BluetoothMethodProxy.setInstanceForTesting(null);
        mTestLooper.dispatchAll();
    }

    @Test
@@ -237,11 +246,39 @@ public class MapClientServiceTest {
        MceStateMachine sm = mock(MceStateMachine.class);
        mService.getInstanceMap().put(mRemoteDevice, sm);

        mService.cleanupDevice(mRemoteDevice);
        mService.cleanupDevice(mRemoteDevice, sm);

        assertThat(mService.getInstanceMap()).doesNotContainKey(mRemoteDevice);
    }

    @Test
    public void disconnect_doesNotCleanUpNewStateMachineOfSameDevice() {
        int connectionPolicy = BluetoothProfile.CONNECTION_POLICY_ALLOWED;
        when(mDatabaseManager.getProfileConnectionPolicy(
                        mRemoteDevice, BluetoothProfile.MAP_CLIENT))
                .thenReturn(connectionPolicy);

        mService.connect(mRemoteDevice);
        MceStateMachine connectedSm = mService.getInstanceMap().get(mRemoteDevice);
        assertThat(connectedSm).isNotNull();

        connectedSm.sendMessage(MceStateMachine.MSG_MAS_SDP_DONE, mock(SdpMasRecord.class));
        connectedSm.sendMessage(MceStateMachine.MSG_MAS_CONNECTED);
        // Stay it connected
        while (mTestLooper.isIdle() && connectedSm.getState() != BluetoothProfile.STATE_CONNECTED) {
            mTestLooper.dispatchNext();
        }

        MceStateMachine sm = mock(MceStateMachine.class);
        mService.getInstanceMap().put(mRemoteDevice, sm);

        connectedSm.disconnect();
        mTestLooper.dispatchAll();
        assertThat(connectedSm.getState()).isEqualTo(BluetoothProfile.STATE_DISCONNECTED);

        assertThat(mService.getInstanceMap()).containsKey(mRemoteDevice);
    }

    @Test
    public void aclDisconnectedNoTransport_whenConnected_doesNotCallDisconnect() {
        int connectionState = BluetoothProfile.STATE_CONNECTED;
@@ -251,6 +288,7 @@ public class MapClientServiceTest {

        mService.aclDisconnected(mRemoteDevice, BluetoothDevice.ERROR);
        TestUtils.waitForLooperToBeIdle(Looper.getMainLooper());
        mTestLooper.dispatchAll();

        verify(sm, never()).disconnect();
    }
+1 −1
Original line number Diff line number Diff line
@@ -129,7 +129,7 @@ public class MapClientTest {
        TestUtils.waitForLooperToFinishScheduledTask(sm.getHandler().getLooper());

        Assert.assertEquals(BluetoothProfile.STATE_CONNECTING, sm.getState());
        mService.cleanupDevice(device);
        mService.cleanupDevice(device, sm);
        Assert.assertNull(mService.getInstanceMap().get(device));
    }