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

Commit c21dd6b7 authored by Sarah Chin's avatar Sarah Chin
Browse files

Remove Thread.sleep in Telephony unittests

Removed method watiForHandlerActionDelayed
Replaced waitForMs with TestableLooper where possible

Bug: 138886216
Test: atest TelephonyFrameworksTests
Change-Id: I33309a4d253a48bc3904fb7b980ea068b4e83177
parent 3fc4039c
Loading
Loading
Loading
Loading
+0 −14
Original line number Diff line number Diff line
@@ -743,7 +743,6 @@ public abstract class TelephonyTest {
                "mContentProvider", providerHolder, iContentProvider);
    }

    // TODO(b/138886216): remove method after refactor
    protected final void waitForHandlerAction(Handler h, long timeoutMillis) {
        final CountDownLatch lock = new CountDownLatch(1);
        h.post(lock::countDown);
@@ -782,19 +781,6 @@ public abstract class TelephonyTest {
        assertTrue("Handler was not empty before timeout elapsed", timeoutCount < 5);
    }

    // TODO(b/138886216): remove method after refactor
    protected final void waitForHandlerActionDelayed(Handler h, long timeoutMillis, long delayMs) {
        final CountDownLatch lock = new CountDownLatch(1);
        h.postDelayed(lock::countDown, delayMs);
        while (lock.getCount() > 0) {
            try {
                lock.await(timeoutMillis, TimeUnit.MILLISECONDS);
            } catch (InterruptedException e) {
                // do nothing
            }
        }
    }

    protected final EmergencyNumber getTestEmergencyNumber() {
        return SAMPLE_EMERGENCY_NUMBER;
    }
+33 −41
Original line number Diff line number Diff line
@@ -16,8 +16,6 @@

package com.android.internal.telephony.dataconnection;

import static com.android.internal.telephony.TelephonyTestUtils.waitForMs;

import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
@@ -35,13 +33,14 @@ import android.net.StringNetworkSpecifier;
import android.os.AsyncResult;
import android.os.Binder;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Messenger;
import android.telephony.AccessNetworkConstants;
import android.telephony.Rlog;
import android.telephony.data.ApnSetting;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;

import androidx.test.filters.FlakyTest;

@@ -60,11 +59,14 @@ import com.android.internal.telephony.mocks.TelephonyRegistryMock;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;

import java.lang.reflect.Field;
import java.util.ArrayList;

@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
public class TelephonyNetworkFactoryTest extends TelephonyTest {
    private final static String LOG_TAG = "TelephonyNetworkFactoryTest";

@@ -79,9 +81,7 @@ public class TelephonyNetworkFactoryTest extends TelephonyTest {
    private PhoneSwitcherMock mPhoneSwitcherMock;
    private SubscriptionControllerMock mSubscriptionControllerMock;
    private SubscriptionMonitorMock mSubscriptionMonitorMock;
    private HandlerThread mHandlerThread;
    private ConnectivityServiceMock mConnectivityServiceMock;
    private Looper mLooper;
    private final ArrayList<NetworkRequest> mNetworkRequestList = new ArrayList<>();

    private TelephonyNetworkFactory mTelephonyNetworkFactoryUT;
@@ -112,10 +112,6 @@ public class TelephonyNetworkFactoryTest extends TelephonyTest {
        super.setUp(getClass().getSimpleName());
        replaceInstance(RadioConfig.class, "sRadioConfig", null, mMockRadioConfig);

        mHandlerThread = new HandlerThread("TelephonyNetworkFactoryTest");
        mHandlerThread.start();
        mLooper = mHandlerThread.getLooper();

        mContextFixture.putStringArrayResource(com.android.internal.R.array.networkAttributes,
                new String[]{"wifi,1,1,1,-1,true", "mobile,0,0,0,-1,true",
                        "mobile_mms,2,0,2,60000,true", "mobile_supl,3,0,2,60000,true",
@@ -151,9 +147,6 @@ public class TelephonyNetworkFactoryTest extends TelephonyTest {
    @After
    public void tearDown() throws Exception {
        mConnectivityServiceMock.die();
        mLooper.quit();
        mHandlerThread.quit();
        mHandlerThread.join();
        super.tearDown();
    }

@@ -166,15 +159,17 @@ public class TelephonyNetworkFactoryTest extends TelephonyTest {
                mTelephonyRegistryMock, numberOfPhones);
        mSubscriptionMonitorMock = new SubscriptionMonitorMock(numberOfPhones);
        mPhoneSwitcherMock = new PhoneSwitcherMock(
                numberOfPhones, mLooper, mSubscriptionControllerMock);
                numberOfPhones, Looper.myLooper(), mSubscriptionControllerMock);
        mSubscriptionMonitorMock = new SubscriptionMonitorMock(numberOfPhones);

        replaceInstance(SubscriptionController.class, "sInstance", null,
                mSubscriptionControllerMock);
        replaceInstance(PhoneSwitcher.class, "sPhoneSwitcher", null, mPhoneSwitcherMock);

        mTelephonyNetworkFactoryUT = new TelephonyNetworkFactory(mSubscriptionMonitorMock, mLooper,
                mPhone);
        mTelephonyNetworkFactoryUT = new TelephonyNetworkFactory(mSubscriptionMonitorMock,
                Looper.myLooper(), mPhone);
        monitorTestableLooper(new TestableLooper(
                mConnectivityServiceMock.getHandlerThread().getLooper()));
    }

    /**
@@ -198,52 +193,52 @@ public class TelephonyNetworkFactoryTest extends TelephonyTest {

        log("addDefaultRequest");
        mConnectivityServiceMock.addDefaultRequest();
        waitForMs(250);
        processAllMessages();
        assertEquals(0, mNetworkRequestList.size());

        log("setPhoneActive true: phoneId = " + phoneId);
        mPhoneSwitcherMock.setPhoneActive(phoneId, true);
        waitForMs(250);
        processAllMessages();
        assertEquals(1, mNetworkRequestList.size());

        log("makeSubSpecificInternetRequest: subId = " + subId);
        NetworkRequest subSpecificDefault = makeSubSpecificInternetRequest(subId);
        waitForMs(250);
        processAllMessages();
        assertEquals(2, mNetworkRequestList.size());

        log("setPhoneActive false: phoneId = " + phoneId);
        mPhoneSwitcherMock.setPhoneActive(phoneId, false);
        waitForMs(250);
        processAllMessages();
        assertEquals(0, mNetworkRequestList.size());

        log("makeSubSpecificInternetRequest: subId = " + subId);
        NetworkRequest subSpecificMms = makeSubSpecificMmsRequest(subId);
        waitForMs(250);
        processAllMessages();
        assertEquals(0, mNetworkRequestList.size());

        log("setPhoneActive true: phoneId = " + phoneId);
        mPhoneSwitcherMock.setPhoneActive(phoneId, true);
        waitForMs(250);
        processAllMessages();
        assertEquals(3, mNetworkRequestList.size());

        log("releaseNetworkRequest: subSpecificDefault = " + subSpecificDefault);
        mConnectivityServiceMock.releaseNetworkRequest(subSpecificDefault);
        waitForMs(250);
        processAllMessages();
        assertEquals(2, mNetworkRequestList.size());

        log("setPhoneActive false: phoneId = " + phoneId);
        mPhoneSwitcherMock.setPhoneActive(phoneId, false);
        waitForMs(250);
        processAllMessages();
        assertEquals(0, mNetworkRequestList.size());

        log("releaseNetworkRequest: subSpecificMms = " + subSpecificMms);
        mConnectivityServiceMock.releaseNetworkRequest(subSpecificMms);
        waitForMs(250);
        processAllMessages();
        assertEquals(0, mNetworkRequestList.size());

        log("setPhoneActive true: phoneId = " + phoneId);
        mPhoneSwitcherMock.setPhoneActive(phoneId, true);
        waitForMs(250);
        processAllMessages();
        assertEquals(1, mNetworkRequestList.size());
    }

@@ -267,50 +262,48 @@ public class TelephonyNetworkFactoryTest extends TelephonyTest {
        mSubscriptionControllerMock.setDefaultDataSubId(subId);
        mSubscriptionControllerMock.setSlotSubId(phoneId, subId);
        mSubscriptionMonitorMock.notifySubscriptionChanged(phoneId);
        waitForMs(250);

        processAllMessages();
        assertEquals(0, mNetworkRequestList.size());

        mPhoneSwitcherMock.setPhoneActive(phoneId, true);
        waitForMs(250);
        processAllMessages();
        assertEquals(0, mNetworkRequestList.size());

        mConnectivityServiceMock.addDefaultRequest();
        waitForMs(250);
        processAllMessages();
        assertEquals(1, mNetworkRequestList.size());

        mSubscriptionControllerMock.setSlotSubId(altPhoneId, altSubId);
        waitForMs(250);
        processAllMessages();
        assertEquals(1, mNetworkRequestList.size());

        mPhoneSwitcherMock.setPreferredDataPhoneId(altPhoneId);
        mSubscriptionControllerMock.setDefaultDataSubId(altSubId);
        mPhoneSwitcherMock.notifyActivePhoneChange(phoneId);

        waitForMs(250);
        processAllMessages();
        assertEquals(0, mNetworkRequestList.size());

        makeSubSpecificMmsRequest(subId);
        waitForMs(250);
        processAllMessages();
        assertEquals(1, mNetworkRequestList.size());

        mSubscriptionControllerMock.setSlotSubId(phoneId, unusedSubId);
        mSubscriptionMonitorMock.notifySubscriptionChanged(phoneId);
        waitForMs(250);
        processAllMessages();
        assertEquals(0, mNetworkRequestList.size());

        makeSubSpecificInternetRequest(subId);
        waitForMs(250);
        processAllMessages();
        assertEquals(0, mNetworkRequestList.size());

        mSubscriptionControllerMock.setSlotSubId(phoneId, subId);
        mSubscriptionMonitorMock.notifySubscriptionChanged(phoneId);
        waitForMs(250);
        processAllMessages();

        mSubscriptionControllerMock.setDefaultDataSubId(subId);
        mPhoneSwitcherMock.setPreferredDataPhoneId(phoneId);
        mPhoneSwitcherMock.notifyActivePhoneChange(phoneId);
        waitForMs(250);
        processAllMessages();
        assertEquals(3, mNetworkRequestList.size());
    }

@@ -330,8 +323,7 @@ public class TelephonyNetworkFactoryTest extends TelephonyTest {
        mConnectivityServiceMock.addDefaultRequest();

        makeSubSpecificMmsRequest(0);

        waitForMs(100);
        processAllMessages();

        Field f = TelephonyNetworkFactory.class.getDeclaredField("mInternalHandler");
        f.setAccessible(true);
@@ -343,7 +335,7 @@ public class TelephonyNetworkFactoryTest extends TelephonyTest {
                AccessNetworkConstants.TRANSPORT_TYPE_WLAN, handoverCallback);
        AsyncResult ar = new AsyncResult(null, hp, null);
        h.sendMessage(h.obtainMessage(5, ar));
        waitForMs(100);
        processAllMessages();

        doReturn(AccessNetworkConstants.TRANSPORT_TYPE_WLAN).when(mTransportManager)
                .getCurrentTransport(anyInt());
@@ -352,6 +344,6 @@ public class TelephonyNetworkFactoryTest extends TelephonyTest {
                handoverCallback);
        ar = new AsyncResult(null, hp, null);
        h.sendMessage(h.obtainMessage(5, ar));
        waitForMs(100);
        processAllMessages();
    }
}
+9 −7
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.internal.telephony.imsphone;

import static com.android.internal.telephony.TelephonyTestUtils.waitForMs;

import android.os.HandlerThread;
import android.os.ParcelFileDescriptor;
import android.telecom.Connection;
@@ -114,8 +116,8 @@ public class ImsRttTextHandlerTest extends TelephonyTest {
        // make sure at it hasn't been sent.
        Assert.assertEquals("", mNetworkWriter.getContents());
        // Wait for 300ms
        waitForHandlerActionDelayed(mRttTextHandler, TEST_TIMEOUT,
                ImsRttTextHandler.MAX_BUFFERING_DELAY_MILLIS + 100);
        waitForMs(ImsRttTextHandler.MAX_BUFFERING_DELAY_MILLIS + 100);
        waitForHandlerAction(mRttTextHandler, TEST_TIMEOUT);
        // make sure that it has been sent and check that it's correct
        Assert.assertEquals("abcd", mNetworkWriter.getContents());
    }
@@ -141,7 +143,7 @@ public class ImsRttTextHandlerTest extends TelephonyTest {
        Assert.assertEquals("", mNetworkWriter.getContents());

        // Send the second part
        Thread.sleep(10);
        waitForMs(10);
        // Register a read notifier
        readNotifier = new CountDownLatch(1);
        mRttTextHandler.setReadNotifier(readNotifier);
@@ -176,7 +178,7 @@ public class ImsRttTextHandlerTest extends TelephonyTest {
        for (char c : characters) {
            mPipeToHandler.write(String.valueOf(c));
            mPipeToHandler.flush();
            Thread.sleep(10);
            waitForMs(10);
        }
        waitForHandlerAction(mRttTextHandler, TEST_TIMEOUT);
        waitForHandlerAction(mRttTextHandler, TEST_TIMEOUT);
@@ -194,19 +196,19 @@ public class ImsRttTextHandlerTest extends TelephonyTest {
            String toSend = new String(characters, i, Math.min(3, characters.length - i));
            mPipeToHandler.write(toSend);
            mPipeToHandler.flush();
            Thread.sleep(10);
            waitForMs(10);
        }
        waitForHandlerAction(mRttTextHandler, TEST_TIMEOUT);
        waitForHandlerAction(mRttTextHandler, TEST_TIMEOUT);

        // Wait one second and see how many characters are sent in that time.
        int numCharsSoFar = mNetworkWriter.getContents().length();
        Thread.sleep(1000);
        waitForMs(1000);
        int numCharsInOneSec = mNetworkWriter.getContents().length() - numCharsSoFar;
        Assert.assertTrue(numCharsInOneSec <= ImsRttTextHandler.MAX_CODEPOINTS_PER_SECOND);

        // Wait 5 seconds for all the chars to make it through
        Thread.sleep(5000);
        waitForMs(5000);
        Assert.assertEquals(LONG_TEXT, mNetworkWriter.getContents());
    }

+5 −2
Original line number Diff line number Diff line
@@ -106,14 +106,17 @@ public class ConnectivityServiceMock {
        mTrackerHandler = new NetworkStateTrackerHandler(mHandlerThread.getLooper());
    }

    public void die() throws Exception {
    public void die() {
        // clean up threads/handlers
        if (mHandlerThread != null) {
            mHandlerThread.quit();
            mHandlerThread.join();
        }
    }

    public HandlerThread getHandlerThread() {
        return mHandlerThread;
    }

    private class InternalHandler extends Handler {
        public InternalHandler(Looper looper) {
            super(looper);