/** * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.telephony.dataconnection; import android.os.PersistableBundle; import android.telephony.CarrierConfigManager; import android.test.suitebuilder.annotation.SmallTest; import com.android.internal.telephony.RetryManager; import com.android.internal.telephony.SubscriptionController; import com.android.internal.telephony.TelephonyTest; import com.android.internal.telephony.uicc.UiccController; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.ArrayList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** * APN retry manager tests */ public class RetryManagerTest extends TelephonyTest { // This is the real APN data for the Japanese carrier NTT Docomo. private ApnSetting mApn1 = new ApnSetting( 2163, // id "44010", // numeric "sp-mode", // name "spmode.ne.jp", // apn "", // proxy "", // port "", // mmsc "", // mmsproxy "", // mmsport "", // user "", // password -1, // authtype new String[]{"default", "supl"}, // types "IP", // protocol "IP", // roaming_protocol true, // carrier_enabled 0, // bearer 0, // bearer_bitmask 0, // profile_id false, // modem_cognitive 0, // max_conns 0, // wait_time 0, // max_conns_time 0, // mtu "", // mvno_type ""); // mnvo_match_data private ApnSetting mApn2 = new ApnSetting( 2164, // id "44010", // numeric "mopera U", // name "mopera.net", // apn "", // proxy "", // port "", // mmsc "", // mmsproxy "", // mmsport "", // user "", // password -1, // authtype new String[]{"default", "supl"}, // types "IP", // protocol "IP", // roaming_protocol true, // carrier_enabled 0, // bearer 0, // bearer_bitmask 0, // profile_id false, // modem_cognitive 0, // max_conns 0, // wait_time 0, // max_conns_time 0, // mtu "", // mvno_type ""); // mnvo_match_data private ApnSetting mApn3 = new ApnSetting( 2165, // id "44010", // numeric "b-mobile for Nexus", // name "bmobile.ne.jp", // apn "", // proxy "", // port "", // mmsc "", // mmsproxy "", // mmsport "", // user "", // password 3, // authtype new String[]{"default", "supl"}, // types "IP", // protocol "IP", // roaming_protocol true, // carrier_enabled 0, // bearer 0, // bearer_bitmask 0, // profile_id false, // modem_cognitive 0, // max_conns 0, // wait_time 0, // max_conns_time 0, // mtu "", // mvno_type ""); // mnvo_match_data private PersistableBundle mBundle; @Before public void setUp() throws Exception { super.setUp(getClass().getSimpleName()); mBundle = mContextFixture.getCarrierConfigBundle(); replaceInstance(SubscriptionController.class, "sInstance", null, mSubscriptionController); replaceInstance(UiccController.class, "mInstance", null, mUiccController); } @After public void tearDown() throws Exception { super.tearDown(); } /** * Test the behavior of a retry manager with no waiting APNs set. */ @Test @SmallTest public void testRetryManagerEmpty() throws Exception { mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{"default:2000"}); RetryManager rm = new RetryManager(mPhone, "default"); long delay = rm.getDelayForNextApn(false); assertEquals(RetryManager.NO_RETRY, delay); ApnSetting nextApn = rm.getNextApnSetting(); assertTrue(nextApn == null); delay = rm.getDelayForNextApn(false); assertEquals(RetryManager.NO_RETRY, delay); } /** * Test the basic retry scenario where only one APN and no retry configured. */ @Test @SmallTest public void testRetryManagerOneApnNoRetry() throws Exception { mBundle.putStringArray( CarrierConfigManager.KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{"default:"}); ArrayList<ApnSetting> waitingApns = new ArrayList<ApnSetting>(); waitingApns.add(new ApnSetting(mApn1)); RetryManager rm = new RetryManager(mPhone, "default"); rm.setWaitingApns(waitingApns); ApnSetting nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); long delay = rm.getDelayForNextApn(false); assertEquals(RetryManager.NO_RETRY, delay); } /** * Test the basic retry scenario where only one APN with two retries configured. */ @Test @SmallTest public void testRetryManagerOneApnTwoRetries() throws Exception { mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{"supl:2000,3000"}); ArrayList<ApnSetting> waitingApns = new ArrayList<ApnSetting>(); waitingApns.add(new ApnSetting(mApn1)); RetryManager rm = new RetryManager(mPhone, "supl"); rm.setWaitingApns(waitingApns); ApnSetting nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); long delay = rm.getDelayForNextApn(false); assertEquals(2000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(3000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(RetryManager.NO_RETRY, delay); // No matter how many times we call getNextApnSetting, it should always return the next APN // with NO_RETRY because we've already reached the maximum retry count. nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(RetryManager.NO_RETRY, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(RetryManager.NO_RETRY, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(RetryManager.NO_RETRY, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(RetryManager.NO_RETRY, delay); } /** * Test the basic retry scenario where two waiting APNs with one retry configured. */ @Test @SmallTest public void testRetryManagerTwoApnsOneRetry() throws Exception { mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{"others:2000"}); ArrayList<ApnSetting> waitingApns = new ArrayList<ApnSetting>(); waitingApns.add(new ApnSetting(mApn1)); waitingApns.add(new ApnSetting(mApn2)); RetryManager rm = new RetryManager(mPhone, "default"); rm.setWaitingApns(waitingApns); ApnSetting nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); long delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(2000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(RetryManager.NO_RETRY, delay); } /** * Test the basic retry scenario where two waiting APNs with two retries configured. */ @Test @SmallTest public void testRetryManagerTwoApnsTwoRetries() throws Exception { mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{"dun:2000,5000"}); ArrayList<ApnSetting> waitingApns = new ArrayList<ApnSetting>(); waitingApns.add(new ApnSetting(mApn1)); waitingApns.add(new ApnSetting(mApn2)); RetryManager rm = new RetryManager(mPhone, "dun"); rm.setWaitingApns(waitingApns); ApnSetting nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); long delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(2000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(5000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(RetryManager.NO_RETRY, delay); } /** * Test the basic retry scenario where two mms APNs with two retries configured. */ @Test @SmallTest public void testRetryManagerTwoMmsApnsTwoRetries() throws Exception { mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{"mms: 3000,6000"}); ArrayList<ApnSetting> waitingApns = new ArrayList<ApnSetting>(); waitingApns.add(new ApnSetting(mApn1)); waitingApns.add(new ApnSetting(mApn2)); RetryManager rm = new RetryManager(mPhone, "mms"); rm.setWaitingApns(waitingApns); ApnSetting nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); long delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(3000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(6000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(RetryManager.NO_RETRY, delay); } /** * Test the permanent fail scenario with one APN configured. */ @Test @SmallTest public void testRetryManagerApnPermanentFailed() throws Exception { mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{"fota:1000,4000,7000"}); ArrayList<ApnSetting> waitingApns = new ArrayList<ApnSetting>(); ApnSetting apn = new ApnSetting(mApn1); waitingApns.add(apn); RetryManager rm = new RetryManager(mPhone, "fota"); rm.setWaitingApns(waitingApns); ApnSetting nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); long delay = rm.getDelayForNextApn(false); assertEquals(1000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(4000, delay); rm.markApnPermanentFailed(apn); nextApn = rm.getNextApnSetting(); assertTrue(nextApn == null); } /** * Test the permanent fail scenario with two APNs configured. */ @Test @SmallTest public void testRetryManagerApnPermanentFailedWithTwoApns() throws Exception { mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{"xyz : 1000,4000,7000"}); ArrayList<ApnSetting> waitingApns = new ArrayList<ApnSetting>(); ApnSetting myApn1 = new ApnSetting(mApn1); ApnSetting myApn2 = new ApnSetting(mApn2); waitingApns.add(myApn1); waitingApns.add(myApn2); RetryManager rm = new RetryManager(mPhone, "xyz"); rm.setWaitingApns(waitingApns); ApnSetting nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); long delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(1000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); rm.markApnPermanentFailed(myApn1); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(4000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(7000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(RetryManager.NO_RETRY, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(RetryManager.NO_RETRY, delay); } /** * Test the permanent fail scenario with three APNs configured. */ @Test @SmallTest public void testRetryManagerApnPermanentFailedWithThreeApns() throws Exception { mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{"default:2000:2000,3000:3000", "ims:1000,4000"}); ArrayList<ApnSetting> waitingApns = new ArrayList<ApnSetting>(); ApnSetting myApn1 = new ApnSetting(mApn1); ApnSetting myApn2 = new ApnSetting(mApn2); ApnSetting myApn3 = new ApnSetting(mApn3); waitingApns.add(myApn1); waitingApns.add(myApn2); waitingApns.add(myApn3); RetryManager rm = new RetryManager(mPhone, "ims"); rm.setWaitingApns(waitingApns); ApnSetting nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); long delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); rm.markApnPermanentFailed(myApn2); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn3)); delay = rm.getDelayForNextApn(false); assertEquals(1000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn3)); delay = rm.getDelayForNextApn(false); assertEquals(4000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn3)); delay = rm.getDelayForNextApn(false); assertEquals(RetryManager.NO_RETRY, delay); } /** * Test the permanent fail scenario with two APN all failed */ @Test @SmallTest public void testRetryManagerApnPermanentFailedAll() throws Exception { mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{"default:1000,4000,7000,9000", "mms:1234,4123"}); ArrayList<ApnSetting> waitingApns = new ArrayList<ApnSetting>(); ApnSetting myApn1 = new ApnSetting(mApn1); ApnSetting myApn2 = new ApnSetting(mApn2); waitingApns.add(myApn1); waitingApns.add(myApn2); RetryManager rm = new RetryManager(mPhone, "default"); rm.setWaitingApns(waitingApns); ApnSetting nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); long delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(1000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); rm.markApnPermanentFailed(myApn1); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(4000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(7000, delay); rm.markApnPermanentFailed(myApn2); nextApn = rm.getNextApnSetting(); assertTrue(nextApn == null); nextApn = rm.getNextApnSetting(); assertTrue(nextApn == null); } /** * Test the randomized delay scenario. */ @Test @SmallTest public void testRetryManagerDelayWithRandomization() throws Exception { mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{"default:default_randomization=1000,3000:2000,6000:3000,10000"}); ArrayList<ApnSetting> waitingApns = new ArrayList<ApnSetting>(); waitingApns.add(new ApnSetting(mApn1)); RetryManager rm = new RetryManager(mPhone, "default"); rm.setWaitingApns(waitingApns); ApnSetting nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); long delay = rm.getDelayForNextApn(false); assertTrue(delay >= 3000 && delay < 5000); // 3s + 2s rand nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertTrue(delay >= 6000 && delay < 9000); // 6s + 3s rand nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertTrue(delay >= 10000 && delay < 11000); // 10s + 1s default rand nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(RetryManager.NO_RETRY, delay); } /** * Test the retry forever scenario */ @Test @SmallTest public void testRetryManagerRetryForever() throws Exception { mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{"default:max_retries=infinite,1000,2000"}); ArrayList<ApnSetting> waitingApns = new ArrayList<ApnSetting>(); waitingApns.add(new ApnSetting(mApn1)); waitingApns.add(new ApnSetting(mApn2)); RetryManager rm = new RetryManager(mPhone, "default"); rm.setWaitingApns(waitingApns); ApnSetting nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); long delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(1000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(2000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(2000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(2000, delay); } /** * Test the explicit max retry scenario. */ @Test @SmallTest public void testRetryManagerExplicitMaxRetry() throws Exception { mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{"hipri: max_retries=4,1000,2000"}); ArrayList<ApnSetting> waitingApns = new ArrayList<ApnSetting>(); waitingApns.add(new ApnSetting(mApn1)); waitingApns.add(new ApnSetting(mApn2)); RetryManager rm = new RetryManager(mPhone, "hipri"); rm.setWaitingApns(waitingApns); ApnSetting nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); long delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(1000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(2000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(2000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(2000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(RetryManager.NO_RETRY, delay); } /** * Test the fail fast scenario. */ @Test @SmallTest public void testRetryManagerFailFast() throws Exception { mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{"default:1000,5000"}); mBundle.putLong(CarrierConfigManager.KEY_CARRIER_DATA_CALL_APN_DELAY_FASTER_LONG, 2000); ArrayList<ApnSetting> waitingApns = new ArrayList<ApnSetting>(); waitingApns.add(new ApnSetting(mApn1)); waitingApns.add(new ApnSetting(mApn2)); RetryManager rm = new RetryManager(mPhone, "default"); rm.setWaitingApns(waitingApns); ApnSetting nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); long delay = rm.getDelayForNextApn(true); assertEquals(2000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(true); assertEquals(1000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(true); assertEquals(2000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(true); assertEquals(2000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(true); assertEquals(RetryManager.NO_RETRY, delay); } /** * Test the permanent fail scenario with two APN all failed and then reset */ @Test @SmallTest public void testRetryManagerApnPermanentFailedAllAndThenReset() throws Exception { mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{"dun:1000,4000,7000,9000"}); ArrayList<ApnSetting> waitingApns = new ArrayList<ApnSetting>(); ApnSetting myApn1 = new ApnSetting(mApn1); ApnSetting myApn2 = new ApnSetting(mApn2); waitingApns.add(myApn1); waitingApns.add(myApn2); RetryManager rm = new RetryManager(mPhone, "dun"); rm.setWaitingApns(waitingApns); ApnSetting nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); long delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(1000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); rm.markApnPermanentFailed(myApn1); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(4000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(7000, delay); rm.markApnPermanentFailed(myApn2); nextApn = rm.getNextApnSetting(); assertTrue(nextApn == null); nextApn = rm.getNextApnSetting(); assertTrue(nextApn == null); // reset the retry manager ApnSetting myApn3 = new ApnSetting(mApn3); waitingApns.clear(); waitingApns.add(myApn3); mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{"dun:3000,8000"}); rm.setWaitingApns(waitingApns); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn3)); delay = rm.getDelayForNextApn(false); assertEquals(3000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn3)); delay = rm.getDelayForNextApn(false); assertEquals(8000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn3)); delay = rm.getDelayForNextApn(false); assertEquals(RetryManager.NO_RETRY, delay); } /** * Test the scenario where modem suggests retry the current APN once */ @Test @SmallTest public void testRetryManagerModemSuggestedRetryOnce() throws Exception { mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{"others:1000,4000,7000,9000"}); ArrayList<ApnSetting> waitingApns = new ArrayList<ApnSetting>(); ApnSetting myApn1 = new ApnSetting(mApn1); ApnSetting myApn2 = new ApnSetting(mApn2); waitingApns.add(myApn1); waitingApns.add(myApn2); RetryManager rm = new RetryManager(mPhone, "mms"); rm.setWaitingApns(waitingApns); ApnSetting nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); long delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(1000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); // Modem suggests retrying the current APN rm.setModemSuggestedDelay(2500); delay = rm.getDelayForNextApn(false); assertEquals(2500, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); rm.setModemSuggestedDelay(RetryManager.NO_SUGGESTED_RETRY_DELAY); delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); // Modem suggests retrying the current APN rm.setModemSuggestedDelay(30000); delay = rm.getDelayForNextApn(false); assertEquals(30000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); rm.setModemSuggestedDelay(RetryManager.NO_SUGGESTED_RETRY_DELAY); delay = rm.getDelayForNextApn(false); assertEquals(4000, delay); } /** * Test the scenario where modem suggests not retrying */ @Test @SmallTest public void testRetryManagerModemSuggestedNoRetry() throws Exception { mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{"default:1000,4000,7000,9000"}); ArrayList<ApnSetting> waitingApns = new ArrayList<ApnSetting>(); ApnSetting myApn1 = new ApnSetting(mApn1); ApnSetting myApn2 = new ApnSetting(mApn2); waitingApns.add(myApn1); waitingApns.add(myApn2); RetryManager rm = new RetryManager(mPhone, "default"); rm.setWaitingApns(waitingApns); ApnSetting nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); long delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(1000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); // Modem suggests retrying the current APN rm.setModemSuggestedDelay(2500); delay = rm.getDelayForNextApn(false); assertEquals(2500, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); rm.setModemSuggestedDelay(RetryManager.NO_RETRY); delay = rm.getDelayForNextApn(false); assertEquals(RetryManager.NO_RETRY, delay); } /** * Test the scenario where modem suggests the same retry for too many times */ @Test @SmallTest public void testRetryManagerModemSuggestedRetryTooManyTimes() throws Exception { mBundle.putStringArray(CarrierConfigManager.KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{"mms:2000,3000", "default:1000,4000,7000,9000"}); ArrayList<ApnSetting> waitingApns = new ArrayList<ApnSetting>(); ApnSetting myApn1 = new ApnSetting(mApn1); ApnSetting myApn2 = new ApnSetting(mApn2); waitingApns.add(myApn1); waitingApns.add(myApn2); RetryManager rm = new RetryManager(mPhone, "default"); rm.setWaitingApns(waitingApns); ApnSetting nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); long delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); delay = rm.getDelayForNextApn(false); assertEquals(1000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); rm.setModemSuggestedDelay(2500); delay = rm.getDelayForNextApn(false); assertEquals(2500, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); rm.setModemSuggestedDelay(2500); delay = rm.getDelayForNextApn(false); assertEquals(2500, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); rm.setModemSuggestedDelay(2500); delay = rm.getDelayForNextApn(false); assertEquals(2500, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn1)); rm.setModemSuggestedDelay(2500); delay = rm.getDelayForNextApn(false); assertEquals(20000, delay); nextApn = rm.getNextApnSetting(); assertTrue(nextApn.equals(mApn2)); rm.setModemSuggestedDelay(RetryManager.NO_SUGGESTED_RETRY_DELAY); delay = rm.getDelayForNextApn(false); assertEquals(4000, delay); } }