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

Commit 26fcb83f authored by Daniel Bright's avatar Daniel Bright Committed by Automerger Merge Worker
Browse files

Merge "Change eq method for connection reuse w\ dun apn" into rvc-d1-dev am: b711bc75

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/opt/telephony/+/12084885

Change-Id: Ida85290de1b4553f31e9c1d282d611f5348ec5ac
parents b59d9999 b711bc75
Loading
Loading
Loading
Loading
+14 −19
Original line number Original line Diff line number Diff line
@@ -2398,7 +2398,9 @@ public class DcTracker extends Handler {
                log("apnSetting: " + apnSetting);
                log("apnSetting: " + apnSetting);
                if (dunSettings != null && dunSettings.size() > 0) {
                if (dunSettings != null && dunSettings.size() > 0) {
                    for (ApnSetting dunSetting : dunSettings) {
                    for (ApnSetting dunSetting : dunSettings) {
                        if (dunSetting.equals(apnSetting)) {
                        //This ignore network type as a check which is ok because that's checked
                        //when calculating dun candidates.
                        if (areCompatible(dunSetting, apnSetting)) {
                            if (curDc.isActive()) {
                            if (curDc.isActive()) {
                                if (DBG) {
                                if (DBG) {
                                    log("checkForCompatibleDataConnection:"
                                    log("checkForCompatibleDataConnection:"
@@ -4385,22 +4387,6 @@ public class DcTracker extends Handler {
        }
        }
    }
    }


    private boolean containsAllApns(List<ApnSetting> oldApnList, List<ApnSetting> newApnList) {
        for (ApnSetting newApnSetting : newApnList) {
            boolean canHandle = false;
            for (ApnSetting oldApnSetting : oldApnList) {
                // Make sure at least one of the APN from old list can cover the new APN
                if (oldApnSetting.equals(newApnSetting,
                        mPhone.getServiceState().getDataRoamingFromRegistration())) {
                    canHandle = true;
                    break;
                }
            }
            if (!canHandle) return false;
        }
        return true;
    }

    private void cleanUpConnectionsOnUpdatedApns(boolean detach, String reason) {
    private void cleanUpConnectionsOnUpdatedApns(boolean detach, String reason) {
        if (DBG) log("cleanUpConnectionsOnUpdatedApns: detach=" + detach);
        if (DBG) log("cleanUpConnectionsOnUpdatedApns: detach=" + detach);
        if (mAllApnSettings.isEmpty()) {
        if (mAllApnSettings.isEmpty()) {
@@ -4419,8 +4405,7 @@ public class DcTracker extends Handler {
                            apnContext.getApnType(), getDataRat());
                            apnContext.getApnType(), getDataRat());
                    apnContext.setWaitingApns(waitingApns);
                    apnContext.setWaitingApns(waitingApns);
                    for (ApnSetting apnSetting : waitingApns) {
                    for (ApnSetting apnSetting : waitingApns) {
                        if (apnSetting.equals(apnContext.getApnSetting(),
                        if (areCompatible(apnSetting, apnContext.getApnSetting())) {
                                mPhone.getServiceState().getDataRoamingFromRegistration())) {
                            cleanupRequired = false;
                            cleanupRequired = false;
                            break;
                            break;
                        }
                        }
@@ -5175,4 +5160,14 @@ public class DcTracker extends Handler {
    public void unregisterForPhysicalLinkStateChanged(Handler h) {
    public void unregisterForPhysicalLinkStateChanged(Handler h) {
        mDcc.unregisterForPhysicalLinkStateChanged(h);
        mDcc.unregisterForPhysicalLinkStateChanged(h);
    }
    }

    // We use a specialized equals function in Apn setting when checking if an active
    // data connection is still legitimate to use against a different apn setting.
    // This method is extracted to a function to ensure that any future changes to this check will
    // be applied to both cleanUpConnectionsOnUpdatedApns and checkForCompatibleDataConnection.
    // Fix for b/158908392.
    private boolean areCompatible(ApnSetting apnSetting1, ApnSetting apnSetting2) {
        return apnSetting1.equals(apnSetting2,
                mPhone.getServiceState().getDataRoamingFromRegistration());
    }
}
}
+95 −15
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@ import static com.android.internal.telephony.dataconnection.ApnSettingTest.creat
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.any;
@@ -109,9 +110,11 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashMap;
import java.util.List;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Objects;
import java.util.Optional;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;


public class DcTrackerTest extends TelephonyTest {
public class DcTrackerTest extends TelephonyTest {
    public static final String FAKE_APN1 = "FAKE APN 1";
    public static final String FAKE_APN1 = "FAKE APN 1";
@@ -197,6 +200,18 @@ public class DcTrackerTest extends TelephonyTest {
    private class ApnSettingContentProvider extends MockContentProvider {
    private class ApnSettingContentProvider extends MockContentProvider {
        private int mPreferredApnSet = 0;
        private int mPreferredApnSet = 0;


        private String mFakeApn1Types = "default,supl";

        private int mRowIdOffset = 0;

        public void setFakeApn1Types(String apnTypes) {
            mFakeApn1Types = apnTypes;
        }

        public void setRowIdOffset(int rowIdOffset) {
            mRowIdOffset = rowIdOffset;
        }

        @Override
        @Override
        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
                            String sortOrder) {
                            String sortOrder) {
@@ -241,7 +256,7 @@ public class DcTrackerTest extends TelephonyTest {
                                    Telephony.Carriers.SKIP_464XLAT});
                                    Telephony.Carriers.SKIP_464XLAT});


                    mc.addRow(new Object[]{
                    mc.addRow(new Object[]{
                            2163,                   // id
                            2163 + mRowIdOffset,    // id
                            FAKE_PLMN,              // numeric
                            FAKE_PLMN,              // numeric
                            "sp-mode",              // name
                            "sp-mode",              // name
                            FAKE_APN1,              // apn
                            FAKE_APN1,              // apn
@@ -253,7 +268,7 @@ public class DcTrackerTest extends TelephonyTest {
                            "",                     // user
                            "",                     // user
                            "",                     // password
                            "",                     // password
                            -1,                     // authtype
                            -1,                     // authtype
                            "default,supl",         // types
                            mFakeApn1Types,         // types
                            "IP",                   // protocol
                            "IP",                   // protocol
                            "IP",                   // roaming_protocol
                            "IP",                   // roaming_protocol
                            1,                      // carrier_enabled
                            1,                      // carrier_enabled
@@ -274,7 +289,7 @@ public class DcTrackerTest extends TelephonyTest {
                    });
                    });


                    mc.addRow(new Object[]{
                    mc.addRow(new Object[]{
                            2164,                   // id
                            2164 + mRowIdOffset,    // id
                            FAKE_PLMN,              // numeric
                            FAKE_PLMN,              // numeric
                            "mopera U",             // name
                            "mopera U",             // name
                            FAKE_APN2,              // apn
                            FAKE_APN2,              // apn
@@ -307,7 +322,7 @@ public class DcTrackerTest extends TelephonyTest {
                    });
                    });


                    mc.addRow(new Object[]{
                    mc.addRow(new Object[]{
                            2165,                   // id
                            2165 + mRowIdOffset,    // id
                            FAKE_PLMN,              // numeric
                            FAKE_PLMN,              // numeric
                            "b-mobile for Nexus",   // name
                            "b-mobile for Nexus",   // name
                            FAKE_APN3,              // apn
                            FAKE_APN3,              // apn
@@ -340,7 +355,7 @@ public class DcTrackerTest extends TelephonyTest {
                    });
                    });


                    mc.addRow(new Object[]{
                    mc.addRow(new Object[]{
                            2166,                   // id
                            2166 + mRowIdOffset,    // id
                            FAKE_PLMN,              // numeric
                            FAKE_PLMN,              // numeric
                            "sp-mode ehrpd",        // name
                            "sp-mode ehrpd",        // name
                            FAKE_APN4,              // apn
                            FAKE_APN4,              // apn
@@ -373,7 +388,7 @@ public class DcTrackerTest extends TelephonyTest {
                    });
                    });


                    mc.addRow(new Object[]{
                    mc.addRow(new Object[]{
                            2167,                   // id
                            2167 + mRowIdOffset,    // id
                            FAKE_PLMN,              // numeric
                            FAKE_PLMN,              // numeric
                            "b-mobile for Nexus",   // name
                            "b-mobile for Nexus",   // name
                            FAKE_APN5,              // apn
                            FAKE_APN5,              // apn
@@ -406,7 +421,7 @@ public class DcTrackerTest extends TelephonyTest {
                    });
                    });


                    mc.addRow(new Object[]{
                    mc.addRow(new Object[]{
                            2168,                   // id
                            2168 + mRowIdOffset,    // id
                            FAKE_PLMN,              // numeric
                            FAKE_PLMN,              // numeric
                            "sp-mode",              // name
                            "sp-mode",              // name
                            FAKE_APN6,              // apn
                            FAKE_APN6,              // apn
@@ -621,20 +636,32 @@ public class DcTrackerTest extends TelephonyTest {
    }
    }


    private void sendInitializationEvents() {
    private void sendInitializationEvents() {
        logd("Sending EVENT_CARRIER_CONFIG_CHANGED");
        sendCarrierConfigChanged("");

        sendSimStateUpdated("");

        sendEventDataConnectionAttached("");

        waitForMs(200);
    }

    private void sendCarrierConfigChanged(String messagePrefix) {
        logd(messagePrefix + "Sending EVENT_CARRIER_CONFIG_CHANGED");
        mDct.sendEmptyMessage(DctConstants.EVENT_CARRIER_CONFIG_CHANGED);
        mDct.sendEmptyMessage(DctConstants.EVENT_CARRIER_CONFIG_CHANGED);
        waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler());
        waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler());
    }


        logd("Sending EVENT_SIM_STATE_UPDATED");
    private void sendSimStateUpdated(String messagePrefix) {
        logd(messagePrefix + "Sending EVENT_SIM_STATE_UPDATED");
        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_SIM_STATE_UPDATED,
        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_SIM_STATE_UPDATED,
                TelephonyManager.SIM_STATE_LOADED, 0));
                TelephonyManager.SIM_STATE_LOADED, 0));
        waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler());
        waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler());
    }


        logd("Sending EVENT_DATA_CONNECTION_ATTACHED");
    private void sendEventDataConnectionAttached(String messagePrefix) {
        logd(messagePrefix + "Sending EVENT_DATA_CONNECTION_ATTACHED");
        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null));
        mDct.sendMessage(mDct.obtainMessage(DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null));
        waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler());
        waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler());

        waitForMs(200);
    }
    }


    // Test the unmetered APN setup when data is disabled.
    // Test the unmetered APN setup when data is disabled.
@@ -1339,9 +1366,7 @@ public class DcTrackerTest extends TelephonyTest {
    @Test
    @Test
    @SmallTest
    @SmallTest
    public void testFetchDunApnWithPreferredApnSet() {
    public void testFetchDunApnWithPreferredApnSet() {
        logd("Sending EVENT_CARRIER_CONFIG_CHANGED");
        sendCarrierConfigChanged("testFetchDunApnWithPreferredApnSet: ");
        mDct.sendEmptyMessage(DctConstants.EVENT_CARRIER_CONFIG_CHANGED);
        waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler());


        // apnSetId=1
        // apnSetId=1
        String dunApnString1 = "[ApnSettingV5]HOT mobile PC,pc.hotm,,,,,,,,,440,10,,DUN,,,true,"
        String dunApnString1 = "[ApnSettingV5]HOT mobile PC,pc.hotm,,,,,,,,,440,10,,DUN,,,true,"
@@ -1387,6 +1412,61 @@ public class DcTrackerTest extends TelephonyTest {
                Settings.Global.TETHER_DUN_APN, null);
                Settings.Global.TETHER_DUN_APN, null);
    }
    }


    // This tests simulates the race case where the sim status change event is triggered, the
    // default data connection is attached, and then the carrier config gets changed which bumps
    // the database id which we want to ignore when cleaning up connections and matching against
    // the dun APN.  Tests b/158908392.
    @Test
    @SmallTest
    public void testCheckForCompatibleDataConnectionWithDunWhenIdsChange() throws Exception {
        //Set dun as a support apn type of FAKE_APN1
        mApnSettingContentProvider.setFakeApn1Types("default,supl,dun");

        // Enable the default apn
        mSimulatedCommands.setDataCallResult(true, createSetupDataCallResult());
        mDct.enableApn(ApnSetting.TYPE_DEFAULT, DcTracker.REQUEST_TYPE_NORMAL, null);
        waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler());

        //Load the sim and attach the data connection without firing the carrier changed event
        final String logMsgPrefix = "testCheckForCompatibleDataConnectionWithDunWhenIdsChange: ";
        sendSimStateUpdated(logMsgPrefix);
        sendEventDataConnectionAttached(logMsgPrefix);
        waitForMs(200);

        // Confirm that FAKE_APN1 comes up as a dun candidate
        ApnSetting dunApn = mDct.fetchDunApns().get(0);
        assertEquals(dunApn.getApnName(), FAKE_APN1);
        Map<Integer, ApnContext> apnContexts = mDct.getApnContexts()
                .stream().collect(Collectors.toMap(ApnContext::getApnTypeBitmask, x -> x));

        //Double check that the default apn content is connected while the dun apn context is not
        assertEquals(apnContexts.get(ApnSetting.TYPE_DEFAULT).getState(),
                DctConstants.State.CONNECTED);
        assertNotEquals(apnContexts.get(ApnSetting.TYPE_DUN).getState(),
                DctConstants.State.CONNECTED);


        //Change the row ids the same way as what happens when we have old apn values in the
        //carrier table
        mApnSettingContentProvider.setRowIdOffset(100);
        sendCarrierConfigChanged(logMsgPrefix);
        waitForMs(200);

        mDct.enableApn(ApnSetting.TYPE_DUN, DcTracker.REQUEST_TYPE_NORMAL, null);
        waitForLastHandlerAction(mDcTrackerTestHandler.getThreadHandler());

        Map<Integer, ApnContext> apnContextsAfterRowIdsChanged = mDct.getApnContexts()
                .stream().collect(Collectors.toMap(ApnContext::getApnTypeBitmask, x -> x));

        //Make sure that the data connection used earlier wasn't cleaned up and still in use.
        assertEquals(apnContexts.get(ApnSetting.TYPE_DEFAULT).getDataConnection(),
                apnContextsAfterRowIdsChanged.get(ApnSetting.TYPE_DEFAULT).getDataConnection());

        //Check that the DUN is using the same active data connection
        assertEquals(apnContexts.get(ApnSetting.TYPE_DEFAULT).getDataConnection(),
                apnContextsAfterRowIdsChanged.get(ApnSetting.TYPE_DUN).getDataConnection());
    }

    // Test oos
    // Test oos
    @Test
    @Test
    @SmallTest
    @SmallTest