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

Commit 51a5fc02 authored by Jack Yu's avatar Jack Yu
Browse files

Fixed the unit tests

Mockito is not thread safe. Fixed by using testable looper
and make all components run in the same thread.

Fix: 408470112
Test: atest FrameworksTelephonyTests
Flag: EXEMPT test fix

Change-Id: Ic7448eeb9bbfe790a9cfc2b16a60192426aac421
parent b51bc363
Loading
Loading
Loading
Loading
+27 −53
Original line number Diff line number Diff line
@@ -25,10 +25,10 @@ import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.verify;

import android.os.AsyncResult;
import android.os.HandlerThread;
import android.os.PersistableBundle;
import android.telephony.AccessNetworkConstants;
import android.telephony.CarrierConfigManager;
import android.telephony.CarrierConfigManager.CarrierConfigChangeListener;
import android.telephony.CellIdentity;
import android.telephony.CellIdentityCdma;
import android.telephony.CellIdentityLte;
@@ -42,14 +42,11 @@ import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.text.TextUtils;

import com.android.internal.telephony.flags.FeatureFlags;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;

import java.util.Collections;
import java.util.concurrent.Executor;
@@ -64,21 +61,20 @@ public class DisplayInfoControllerTest extends TelephonyTest {
    private static final String NETWORK = "TestNet";

    // Mocked classes
    private FeatureFlags mFeatureFlags;

    private DisplayInfoController mDic;
    private ServiceStateTracker mSst;
    private ServiceStateTrackerTestHandler mSstHandler;
    private PersistableBundle mBundle;
    private CarrierConfigManager.CarrierConfigChangeListener mCarrierConfigChangeListener;
    private CarrierConfigChangeListener mCarrierConfigChangeListener;

    private class ServiceStateTrackerTestHandler extends HandlerThread {
        private ServiceStateTrackerTestHandler(String name) {
            super(name);
        }
    @Before
    public void setUp() throws Exception {
        logd("DisplayInfoControllerTest setup!");
        super.setUp(getClass().getSimpleName());

        doReturn((Executor) Runnable::run).when(mContext).getMainExecutor();
        mBundle = mContextFixture.getCarrierConfigBundle();
        mBundle.putBoolean(CarrierConfigManager.KEY_SHOW_ROAMING_INDICATOR_BOOL, true);

        @Override
        public void onLooperPrepared() {
        SignalStrengthController ssc = new SignalStrengthController(mPhone);
        doReturn(ssc).when(mPhone).getSignalStrengthController();
        doReturn(new ServiceState()).when(mPhone).getServiceState();
@@ -88,42 +84,20 @@ public class DisplayInfoControllerTest extends TelephonyTest {
        // Capture listener registered for ServiceStateTracker to emulate the carrier config
        // change notification used later. In this test, it's the second one. The first one
        // comes from RatRatcheter.
            ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener>
        ArgumentCaptor<CarrierConfigChangeListener>
                listenerArgumentCaptor = ArgumentCaptor.forClass(
                    CarrierConfigManager.CarrierConfigChangeListener.class);
                CarrierConfigChangeListener.class);
        mSst = new ServiceStateTracker(mPhone, mSimulatedCommands, mFeatureFlags);
        verify(mCarrierConfigManager, atLeast(2)).registerCarrierConfigChangeListener(any(),
                listenerArgumentCaptor.capture());
        mCarrierConfigChangeListener = listenerArgumentCaptor.getAllValues().get(1);
        doReturn(mSst).when(mPhone).getServiceStateTracker();
            setReady(true);
        }
    }

    @Before
    public void setUp() throws Exception {
        logd("DisplayInfoControllerTest setup!");
        super.setUp(getClass().getSimpleName());

        mFeatureFlags = Mockito.mock(FeatureFlags.class);
        doReturn((Executor) Runnable::run).when(mContext).getMainExecutor();
        mBundle = mContextFixture.getCarrierConfigBundle();
        mBundle.putBoolean(CarrierConfigManager.KEY_SHOW_ROAMING_INDICATOR_BOOL, true);
        mSstHandler = new ServiceStateTrackerTestHandler(getClass().getSimpleName());
        mSstHandler.start();
        waitUntilReady();
        waitForLastHandlerAction(mSstHandler.getThreadHandler());
        processAllMessages();
    }

    @After
    public void tearDown() throws Exception {
        mSst.removeCallbacksAndMessages(null);
        mSst = null;
        mSstHandler.quit();
        mSstHandler.join();
        mSstHandler = null;
        mBundle = null;
        mCarrierConfigChangeListener = null;
        super.tearDown();
    }

@@ -131,7 +105,7 @@ public class DisplayInfoControllerTest extends TelephonyTest {
        mCarrierConfigChangeListener.onCarrierConfigChanged(PHONE_ID,
                SubscriptionManager.INVALID_SUBSCRIPTION_ID, TelephonyManager.UNKNOWN_CARRIER_ID,
                TelephonyManager.UNKNOWN_CARRIER_ID);
        waitForLastHandlerAction(mSstHandler.getThreadHandler());
        processAllMessages();
    }

    private static String getPlmnFromCellIdentity(final CellIdentity ci) {
@@ -155,7 +129,7 @@ public class DisplayInfoControllerTest extends TelephonyTest {
                new LteVopsSupportInfo(
                        LteVopsSupportInfo.LTE_STATUS_SUPPORTED,
                        LteVopsSupportInfo.LTE_STATUS_SUPPORTED);
        waitForLastHandlerAction(mSstHandler.getThreadHandler());
        processAllMessages();
        NetworkRegistrationInfo dataResult = new NetworkRegistrationInfo(
                NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
                state, dataRat, 0, false, null, cid, getPlmnFromCellIdentity(cid), 1, false, false,
@@ -166,13 +140,13 @@ public class DisplayInfoControllerTest extends TelephonyTest {
                mSst.obtainMessage(
                        ServiceStateTracker.EVENT_POLL_STATE_OPERATOR,
                        new AsyncResult(mSst.mPollingContext, oldOpNamesResult, null)));
        waitForLastHandlerAction(mSstHandler.getThreadHandler());
        processAllMessages();
        // update data reg state to be in service
        mSst.sendMessage(
                mSst.obtainMessage(
                        ServiceStateTracker.EVENT_POLL_STATE_PS_CELLULAR_REGISTRATION,
                        new AsyncResult(mSst.mPollingContext, dataResult, null)));
        waitForLastHandlerAction(mSstHandler.getThreadHandler());
        processAllMessages();
        NetworkRegistrationInfo voiceResult = new NetworkRegistrationInfo(
                NetworkRegistrationInfo.DOMAIN_CS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
                state, voiceRat, 0, false, null, cid, getPlmnFromCellIdentity(cid), false, 0, 0, 0);
@@ -180,7 +154,7 @@ public class DisplayInfoControllerTest extends TelephonyTest {
                mSst.obtainMessage(
                        ServiceStateTracker.EVENT_POLL_STATE_CS_CELLULAR_REGISTRATION,
                        new AsyncResult(mSst.mPollingContext, voiceResult, null)));
        waitForLastHandlerAction(mSstHandler.getThreadHandler());
        processAllMessages();
    }

    @Test
+161 −252

File changed.

Preview size limit exceeded, changes collapsed.

+1 −1
Original line number Diff line number Diff line
@@ -120,6 +120,7 @@ public class DataServiceManagerTest extends TelephonyTest {
        Field field = DataService.class.getDeclaredField("mHandler");
        field.setAccessible(true);
        mDataServiceHandler = (Handler) field.get(mCellularDataService);
        monitorTestableLooper(new TestableLooper(mDataServiceHandler.getLooper()));

        ServiceInfo serviceInfo = new ServiceInfo();
        serviceInfo.packageName = "com.android.phone";
@@ -138,7 +139,6 @@ public class DataServiceManagerTest extends TelephonyTest {
    }

    private void waitAndVerifyResult(Message message, int resultCode) {
        waitForLastHandlerAction(mDataServiceHandler);
        processAllMessages();

        ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class);
+16 −32
Original line number Diff line number Diff line
@@ -22,65 +22,49 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import android.os.AsyncResult;
import android.os.HandlerThread;
import android.os.Message;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;

import com.android.internal.telephony.TelephonyTest;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.ArrayList;
import java.util.List;

@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
public class SimPhonebookRecordCacheTest extends TelephonyTest {
    private static final int EVENT_PHONEBOOK_RECORDS_RECEIVED = 2;

    private SimPhonebookRecordCache mSimPhonebookRecordCacheUt;
    private SimPhonebookRecordHandler mSimPhonebookRecordHandler;

    private class SimPhonebookRecordHandler extends HandlerThread {
        SimPhonebookRecordHandler(String name) {
            super(name);
        }

        @Override
        public void onLooperPrepared() {
            mSimPhonebookRecordCacheUt =
                    new SimPhonebookRecordCache(mContext, 0, mSimulatedCommands);
            setReady(true);
        }

    };

    @Before
    public void setUp() throws Exception {
        super.setUp(getClass().getSimpleName());
        mSimPhonebookRecordHandler = new SimPhonebookRecordHandler(getClass().getSimpleName());
        mSimPhonebookRecordHandler.start();
        waitUntilReady();
        mSimPhonebookRecordCacheUt =
                new SimPhonebookRecordCache(mContext, 0, mSimulatedCommands);
    }

    @After
    public void tearDown() throws Exception {
        mSimPhonebookRecordHandler.quit();
        mSimPhonebookRecordHandler.join();
        mSimPhonebookRecordHandler = null;
        mSimPhonebookRecordCacheUt = null;
        super.tearDown();
    }

    @Test
    public void testSimPhonebookChangedOnBootup() {
        mSimulatedCommands.notifySimPhonebookChanged();
        waitForLastHandlerAction(mSimPhonebookRecordCacheUt);
        processAllMessages();
        AdnCapacity capacity = mSimPhonebookRecordCacheUt.getAdnCapacity();
        AdnCapacity capVerifer = new AdnCapacity(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        assertNotNull(capacity);
        assertTrue(capVerifer.equals(capacity));
        mSimulatedCommands.notifySimPhonebookChanged();
        waitForLastHandlerAction(mSimPhonebookRecordCacheUt);
        processAllMessages();
        assertTrue(capacity != mSimPhonebookRecordCacheUt.getAdnCapacity());
        assertTrue(capVerifer.equals(capacity));
    }
@@ -89,10 +73,10 @@ public class SimPhonebookRecordCacheTest extends TelephonyTest {
    public void testGetPhonebookRecords() {
        assertFalse(mSimPhonebookRecordCacheUt.isLoading());
        mSimulatedCommands.notifySimPhonebookChanged();
        waitForLastHandlerAction(mSimPhonebookRecordCacheUt);
        processAllMessages();
        assertFalse(mSimPhonebookRecordCacheUt.isLoading());
        mSimPhonebookRecordCacheUt.requestLoadAllPbRecords(null);
        waitForLastHandlerAction(mSimPhonebookRecordCacheUt);
        processAllMessages();

        mSimPhonebookRecordCacheUt.clear();

@@ -114,14 +98,14 @@ public class SimPhonebookRecordCacheTest extends TelephonyTest {
        assertFalse(mSimPhonebookRecordCacheUt.isLoading());
        mSimPhonebookRecordCacheUt.requestLoadAllPbRecords(null);
        assertTrue(mSimPhonebookRecordCacheUt.isLoading());
        waitForLastHandlerAction(mSimPhonebookRecordCacheUt);
        processAllMessages();
        assertFalse(mSimPhonebookRecordCacheUt.isLoading());
    }

    @Test
    public void testUpdatePhonebookRecord() {
        mSimulatedCommands.notifySimPhonebookChanged();
        waitForLastHandlerAction(mSimPhonebookRecordCacheUt);
        processAllMessages();
        List<AdnRecord> adnRecords = mSimPhonebookRecordCacheUt.getAdnRecords();
        if (mSimPhonebookRecordCacheUt.ENABLE_INFLATE_WITH_EMPTY_RECORDS) {
            assertEquals(adnRecords.size(), 1); // Max ADN from capacity
@@ -133,7 +117,7 @@ public class SimPhonebookRecordCacheTest extends TelephonyTest {
        AdnRecord newAdn = new AdnRecord(IccConstants.EF_ADN, 1, "AB", "123", null, null);
        // add
        mSimPhonebookRecordCacheUt.updateSimPbAdnBySearch(null, newAdn, null);
        waitForLastHandlerAction(mSimPhonebookRecordCacheUt);
        processAllMessages();
        adnRecords = mSimPhonebookRecordCacheUt.getAdnRecords();
        assertEquals(adnRecords.size(), 1);
        AdnRecord oldAdn = adnRecords.get(0);
@@ -143,7 +127,7 @@ public class SimPhonebookRecordCacheTest extends TelephonyTest {
        // update
        newAdn = new AdnRecord(IccConstants.EF_ADN, 1, "ABCD", "123456789", null, null);
        mSimPhonebookRecordCacheUt.updateSimPbAdnBySearch(oldAdn, newAdn, null);
        waitForLastHandlerAction(mSimPhonebookRecordCacheUt);
        processAllMessages();
        adnRecords = mSimPhonebookRecordCacheUt.getAdnRecords();
        assertEquals(adnRecords.size(), 1);
        oldAdn = adnRecords.get(0);
@@ -153,7 +137,7 @@ public class SimPhonebookRecordCacheTest extends TelephonyTest {
        // Delete
        newAdn = new AdnRecord(IccConstants.EF_ADN, 1, null, null, null, null);
        mSimPhonebookRecordCacheUt.updateSimPbAdnBySearch(oldAdn, newAdn, null);
        waitForLastHandlerAction(mSimPhonebookRecordCacheUt);
        processAllMessages();
        adnRecords = mSimPhonebookRecordCacheUt.getAdnRecords();
        if (mSimPhonebookRecordCacheUt.ENABLE_INFLATE_WITH_EMPTY_RECORDS) {
            assertEquals(adnRecords.size(), 1);