/* * Copyright (C) 2006 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; import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; import com.android.internal.telephony.MccTable; import com.android.internal.telephony.mocks.SubscriptionControllerMock; import com.android.internal.telephony.mocks.TelephonyRegistryMock; import android.content.Context; import android.os.AsyncResult; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; import android.telephony.Rlog; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; public class SubscriptionMonitorTest extends AndroidTestCase { private final static String LOG_TAG = "SubscriptionMonitorTest"; static void failAndStack(String str) { fail(str + "\n" + SubscriptionMonitorTest.stack()); } static String stack() { StringBuilder sb = new StringBuilder(); for(StackTraceElement e : Thread.currentThread().getStackTrace()) { sb.append(e.toString()).append("\n"); } return sb.toString(); } private static class TestHandler extends Handler { public final static int SUBSCRIPTION_CHANGED = 1; public final static int DEFAULT_SUBSCRIPTION_CHANGED = 2; public final static int IN_IDLE = 3; HandlerThread handlerThread; public TestHandler(Looper looper) { super(looper); } public void die() { if(handlerThread != null) { handlerThread.quit(); handlerThread = null; } } public void blockTilIdle() { Object lock = new Object(); synchronized (lock) { Message msg = this.obtainMessage(IN_IDLE, lock); msg.sendToTarget(); try { lock.wait(); } catch (InterruptedException e) {} } } public static TestHandler makeHandler() { final HandlerThread handlerThread = new HandlerThread("TestHandler"); handlerThread.start(); final TestHandler result = new TestHandler(handlerThread.getLooper()); result.handlerThread = handlerThread; return result; } private boolean objectEquals(Object o1, Object o2) { if (o1 == null) return (o2 == null); return o1.equals(o2); } private void failAndStack(String str) { SubscriptionMonitorTest.failAndStack(str); } @Override public void handleMessage(Message msg) { switch (msg.what) { case SUBSCRIPTION_CHANGED: { AsyncResult ar = (AsyncResult)(msg.obj); if (objectEquals(ar.userObj, mSubscriptionChangedObject.get()) == false) { failAndStack("Subscription Changed object is incorrect!"); } mSubscriptionChangedCount.incrementAndGet(); Rlog.d(LOG_TAG, "SUBSCRIPTION_CHANGED, inc to " + mSubscriptionChangedCount.get()); break; } case DEFAULT_SUBSCRIPTION_CHANGED: { AsyncResult ar = (AsyncResult)(msg.obj); if (objectEquals(ar.userObj, mDefaultSubscriptionChangedObject.get()) == false) { failAndStack("Default Subscription Changed object is incorrect!"); } mDefaultSubscriptionChangedCount.incrementAndGet(); Rlog.d(LOG_TAG, "DEFAULT_SUBSCRIPTION_CHANGED, inc to " + mDefaultSubscriptionChangedCount.get()); break; } case IN_IDLE: { Object lock = msg.obj; synchronized (lock) { lock.notify(); } break; } } } private final AtomicInteger mSubscriptionChangedCount = new AtomicInteger(0); private final AtomicReference<Object> mSubscriptionChangedObject = new AtomicReference<Object>(); private final AtomicInteger mDefaultSubscriptionChangedCount = new AtomicInteger(0); private final AtomicReference<Object> mDefaultSubscriptionChangedObject = new AtomicReference<Object>(); public void reset() { mSubscriptionChangedCount.set(0); mSubscriptionChangedObject.set(null); mDefaultSubscriptionChangedCount.set(0); mDefaultSubscriptionChangedObject.set(null); } public void setSubscriptionChangedObject(Object o) { mSubscriptionChangedObject.set(o); } public void setDefaultSubscriptionChangedObject(Object o) { mDefaultSubscriptionChangedObject.set(o); } public int getSubscriptionChangedCount() { return mSubscriptionChangedCount.get(); } public int getDefaultSubscriptionChangedCount() { return mDefaultSubscriptionChangedCount.get(); } } /** * Register and unregister normally. * Verify register worked by causing an event. * Verify unregister by causing another event. */ @SmallTest public void testRegister() throws Exception { final int numPhones = 2; final ContextFixture contextFixture = new ContextFixture(); final Context context = contextFixture.getTestDouble(); ITelephonyRegistry.Stub telRegistry = new TelephonyRegistryMock(); SubscriptionControllerMock subController = new SubscriptionControllerMock(context, telRegistry, numPhones); SubscriptionMonitor testedSubMonitor = new SubscriptionMonitor(telRegistry, context, subController, numPhones); TestHandler testHandler = TestHandler.makeHandler(); Object subChangedObject = new Object(); testHandler.setSubscriptionChangedObject(subChangedObject); Object defaultSubChangedObject = new Object(); testHandler.setDefaultSubscriptionChangedObject(defaultSubChangedObject); // try events before registering subController.setDefaultDataSubId(0); subController.setSlotSubId(0, 0); if (testHandler.getSubscriptionChangedCount() != 0) { fail("pretest of SubscriptionChangedCount"); } if (testHandler.getDefaultSubscriptionChangedCount() != 0) { fail("pretest of DefaultSubscriptionChangedCount"); } testedSubMonitor.registerForSubscriptionChanged(0, testHandler, TestHandler.SUBSCRIPTION_CHANGED, subChangedObject); testHandler.blockTilIdle(); if (testHandler.getSubscriptionChangedCount() != 1) { fail("test1 of SubscriptionChangedCount"); } if (testHandler.getDefaultSubscriptionChangedCount() != 0) { fail("test1 of DefaultSubscriptionChangedCount"); } testedSubMonitor.registerForDefaultDataSubscriptionChanged(0, testHandler, TestHandler.DEFAULT_SUBSCRIPTION_CHANGED, defaultSubChangedObject); testHandler.blockTilIdle(); if (testHandler.getSubscriptionChangedCount() != 1) { fail("test2 of SubscriptionChangedCount"); } if (testHandler.getDefaultSubscriptionChangedCount() != 1) { fail("test2 of DefaultSubscriptionChangedCount"); } subController.setDefaultDataSubId(1); testHandler.blockTilIdle(); if (testHandler.getSubscriptionChangedCount() != 1) { fail("test3 of SubscriptionChangedCount, " + testHandler.getSubscriptionChangedCount() + " vs 1"); } if (testHandler.getDefaultSubscriptionChangedCount() != 2) { fail("test3 of DefaultSubscriptionChangedCount, " + testHandler.getDefaultSubscriptionChangedCount() + " vs 2"); } subController.setSlotSubId(0, 1); testHandler.blockTilIdle(); if (testHandler.getSubscriptionChangedCount() != 2) { fail("test4 of SubscriptionChangedCount"); } if (testHandler.getDefaultSubscriptionChangedCount() != 3) { fail("test4 of DefaultSubscriptionChangedCount"); } testedSubMonitor.unregisterForDefaultDataSubscriptionChanged(0, testHandler); subController.setSlotSubId(0, 0); testHandler.blockTilIdle(); if (testHandler.getSubscriptionChangedCount() != 3) { fail("test5 of SubscriptionChangedCount, " + testHandler.getSubscriptionChangedCount() + " vs 3"); } if (testHandler.getDefaultSubscriptionChangedCount() != 3) { fail("test5 of DefaultSubscriptionChangedCount, " + testHandler.getDefaultSubscriptionChangedCount() + " vs 3"); } testedSubMonitor.unregisterForSubscriptionChanged(0, testHandler); subController.setSlotSubId(0, 1); subController.setDefaultDataSubId(0); testHandler.blockTilIdle(); if (testHandler.getSubscriptionChangedCount() != 3) { fail("test6 of SubscriptionChangedCount, " + testHandler.getSubscriptionChangedCount() + " vs 3"); } if (testHandler.getDefaultSubscriptionChangedCount() != 3) { fail("test6 of DefaultSubscriptionChangedCount, " + testHandler.getDefaultSubscriptionChangedCount() + " vs 3"); } testHandler.die(); } /** * Bad register/unregisters * * Try phoneId that doesn't exist. * Cause an event and verify don't get notified. * Try to unregister multiple times. */ @SmallTest public void testBadRegister() throws Exception { final int numPhones = 2; final ContextFixture contextFixture = new ContextFixture(); final Context context = contextFixture.getTestDouble(); ITelephonyRegistry.Stub telRegistry = new TelephonyRegistryMock(); SubscriptionControllerMock subController = new SubscriptionControllerMock(context, telRegistry, numPhones); SubscriptionMonitor testedSubMonitor = new SubscriptionMonitor(telRegistry, context, subController, numPhones); TestHandler testHandler = TestHandler.makeHandler(); Object subChangedObject = new Object(); testHandler.setSubscriptionChangedObject(subChangedObject); Object defaultSubChangedObject = new Object(); testHandler.setDefaultSubscriptionChangedObject(defaultSubChangedObject); try { testedSubMonitor.registerForSubscriptionChanged(-1, testHandler, TestHandler.SUBSCRIPTION_CHANGED, subChangedObject); fail("IllegalArgumentException expected with bad phoneId"); } catch (IllegalArgumentException e) {} try { testedSubMonitor.registerForDefaultDataSubscriptionChanged(-1, testHandler, TestHandler.DEFAULT_SUBSCRIPTION_CHANGED, defaultSubChangedObject); fail("IllegalArgumentException expected with bad phoneId"); } catch (IllegalArgumentException e) {} try { testedSubMonitor.registerForSubscriptionChanged(numPhones, testHandler, TestHandler.SUBSCRIPTION_CHANGED, subChangedObject); fail("IllegalArgumentException expected with bad phoneId"); } catch (IllegalArgumentException e) {} try { testedSubMonitor.registerForDefaultDataSubscriptionChanged(numPhones, testHandler, TestHandler.DEFAULT_SUBSCRIPTION_CHANGED, defaultSubChangedObject); fail("IllegalArgumentException expected with bad phoneId"); } catch (IllegalArgumentException e) {} subController.setDefaultDataSubId(0); subController.setSlotSubId(0, 0); if (testHandler.getSubscriptionChangedCount() != 0) { fail("getSubscriptionChangedCount reported non-zero!"); } if (testHandler.getDefaultSubscriptionChangedCount() != 0) { fail("getDefaultSubscriptionChangedCount reported non-zero!"); } testHandler.die(); } /** * Try to force spurious notifications - register/unregister in tight loop with * events happening in the unregistered gap. */ @SmallTest public void testSpuriousNotifications() throws Exception { final int numPhones = 2; final ContextFixture contextFixture = new ContextFixture(); final Context context = contextFixture.getTestDouble(); ITelephonyRegistry.Stub telRegistry = new TelephonyRegistryMock(); SubscriptionControllerMock subController = new SubscriptionControllerMock(context, telRegistry, numPhones); SubscriptionMonitor testedSubMonitor = new SubscriptionMonitor(telRegistry, context, subController, numPhones); TestHandler testHandler = TestHandler.makeHandler(); Object subChangedObject = new Object(); testHandler.setSubscriptionChangedObject(subChangedObject); Object defaultSubChangedObject = new Object(); testHandler.setDefaultSubscriptionChangedObject(defaultSubChangedObject); final int PHONE_ID = 0; final int FIRST_SUB_ID = 0; final int SECOND_SUB_ID = 1; testedSubMonitor.registerForSubscriptionChanged(PHONE_ID, testHandler, TestHandler.SUBSCRIPTION_CHANGED, subChangedObject); testedSubMonitor.registerForDefaultDataSubscriptionChanged(PHONE_ID, testHandler, TestHandler.DEFAULT_SUBSCRIPTION_CHANGED, defaultSubChangedObject); final int LOOP_COUNT = 1000; for (int i = 0; i < LOOP_COUNT; i++) { testedSubMonitor.unregisterForSubscriptionChanged(PHONE_ID, testHandler); testedSubMonitor.unregisterForDefaultDataSubscriptionChanged(PHONE_ID, testHandler); subController.setDefaultDataSubId(FIRST_SUB_ID); subController.setSlotSubId(PHONE_ID, FIRST_SUB_ID); subController.setDefaultDataSubId(SECOND_SUB_ID); subController.setSlotSubId(PHONE_ID, SECOND_SUB_ID); testedSubMonitor.registerForSubscriptionChanged(PHONE_ID, testHandler, TestHandler.SUBSCRIPTION_CHANGED, subChangedObject); testedSubMonitor.registerForDefaultDataSubscriptionChanged(PHONE_ID, testHandler, TestHandler.DEFAULT_SUBSCRIPTION_CHANGED, defaultSubChangedObject); } testHandler.blockTilIdle(); // should get one for every registration if (testHandler.getSubscriptionChangedCount() != 1 + LOOP_COUNT) { fail("getSubscriptionChangedCount reported " + testHandler.getSubscriptionChangedCount() + " != " + (1 + LOOP_COUNT)); } if (testHandler.getDefaultSubscriptionChangedCount() != 1 + LOOP_COUNT) { fail("getDefaultSubscriptionChangedCount reported " + testHandler.getDefaultSubscriptionChangedCount() + " != " + (1 + LOOP_COUNT)); } testHandler.die(); } /** * Test duplicate registrations - both should survive * Also test duplicate unreg - shouldn't crash.. */ @SmallTest public void testMultiRegUnregistration() throws Exception { final int numPhones = 2; final ContextFixture contextFixture = new ContextFixture(); final Context context = contextFixture.getTestDouble(); ITelephonyRegistry.Stub telRegistry = new TelephonyRegistryMock(); SubscriptionControllerMock subController = new SubscriptionControllerMock(context, telRegistry, numPhones); SubscriptionMonitor testedSubMonitor = new SubscriptionMonitor(telRegistry, context, subController, numPhones); TestHandler testHandler = TestHandler.makeHandler(); Object subChangedObject = new Object(); testHandler.setSubscriptionChangedObject(subChangedObject); Object defaultSubChangedObject = new Object(); testHandler.setDefaultSubscriptionChangedObject(defaultSubChangedObject); final int PHONE_ID = 0; final int FIRST_SUB_ID = 0; final int SECOND_SUB_ID = 1; testedSubMonitor.registerForSubscriptionChanged(PHONE_ID, testHandler, TestHandler.SUBSCRIPTION_CHANGED, subChangedObject); testedSubMonitor.registerForDefaultDataSubscriptionChanged(PHONE_ID, testHandler, TestHandler.DEFAULT_SUBSCRIPTION_CHANGED, defaultSubChangedObject); testedSubMonitor.registerForSubscriptionChanged(PHONE_ID, testHandler, TestHandler.SUBSCRIPTION_CHANGED, subChangedObject); testedSubMonitor.registerForDefaultDataSubscriptionChanged(PHONE_ID, testHandler, TestHandler.DEFAULT_SUBSCRIPTION_CHANGED, defaultSubChangedObject); subController.setDefaultDataSubId(FIRST_SUB_ID); subController.setSlotSubId(PHONE_ID, FIRST_SUB_ID); subController.setDefaultDataSubId(SECOND_SUB_ID); subController.setSlotSubId(PHONE_ID, SECOND_SUB_ID); testHandler.blockTilIdle(); // should get 1 for each registration and 4 for the two events if (testHandler.getSubscriptionChangedCount() != 6) { fail("getSubscriptionChangedCount reported " + testHandler.getSubscriptionChangedCount() + " != 6"); } // 2 for the 2 registrations, 2 for the single event in the first cluster (2 listeners) // 2 for the setDefatulDataSub in the second cluster (lost data sub) // 2 for the setSlotSubId (regain default) if (testHandler.getDefaultSubscriptionChangedCount() != 8) { fail("getDefaultSubscriptionChangedCount reported " + testHandler.getDefaultSubscriptionChangedCount() + " != 8"); } testedSubMonitor.unregisterForSubscriptionChanged(PHONE_ID, testHandler); testedSubMonitor.unregisterForDefaultDataSubscriptionChanged(PHONE_ID, testHandler); testedSubMonitor.unregisterForSubscriptionChanged(PHONE_ID, testHandler); testedSubMonitor.unregisterForDefaultDataSubscriptionChanged(PHONE_ID, testHandler); testHandler.die(); } /** * Try event flood while registered - verify receive all. */ @SmallTest public void testEventFloodNotifications() throws Exception { final int numPhones = 2; final ContextFixture contextFixture = new ContextFixture(); final Context context = contextFixture.getTestDouble(); ITelephonyRegistry.Stub telRegistry = new TelephonyRegistryMock(); SubscriptionControllerMock subController = new SubscriptionControllerMock(context, telRegistry, numPhones); SubscriptionMonitor testedSubMonitor = new SubscriptionMonitor(telRegistry, context, subController, numPhones); TestHandler testHandler = TestHandler.makeHandler(); Object subChangedObject = new Object(); testHandler.setSubscriptionChangedObject(subChangedObject); Object defaultSubChangedObject = new Object(); testHandler.setDefaultSubscriptionChangedObject(defaultSubChangedObject); final int PHONE_ID = 0; final int FIRST_SUB_ID = 0; final int SECOND_SUB_ID = 1; testedSubMonitor.registerForSubscriptionChanged(PHONE_ID, testHandler, TestHandler.SUBSCRIPTION_CHANGED, subChangedObject); testedSubMonitor.registerForDefaultDataSubscriptionChanged(PHONE_ID, testHandler, TestHandler.DEFAULT_SUBSCRIPTION_CHANGED, defaultSubChangedObject); final int LOOP_COUNT = 1; for (int i = 0; i < LOOP_COUNT; i++) { subController.setDefaultDataSubId(FIRST_SUB_ID); subController.setSlotSubId(PHONE_ID, FIRST_SUB_ID); subController.setDefaultDataSubId(SECOND_SUB_ID); subController.setSlotSubId(PHONE_ID, SECOND_SUB_ID); } testHandler.blockTilIdle(); // should get one for registration + 2 per loop if (testHandler.getSubscriptionChangedCount() != 1 + (2 * LOOP_COUNT)) { fail("getSubscriptionChangedCount reported " + testHandler.getSubscriptionChangedCount() + " != " + (1 + (2 * LOOP_COUNT))); } // should get one for registration + 3 for first loop + 4 for subsequent loops if (testHandler.getDefaultSubscriptionChangedCount() != (4 * LOOP_COUNT)) { fail("getDefaultSubscriptionChangedCount reported " + testHandler.getDefaultSubscriptionChangedCount() + " != " + (4 * LOOP_COUNT)); } testHandler.die(); } /** * Try tests with no default set */ @SmallTest public void testNoDefaultNotifications() throws Exception { final int numPhones = 2; final ContextFixture contextFixture = new ContextFixture(); final Context context = contextFixture.getTestDouble(); ITelephonyRegistry.Stub telRegistry = new TelephonyRegistryMock(); SubscriptionControllerMock subController = new SubscriptionControllerMock(context, telRegistry, numPhones); SubscriptionMonitor testedSubMonitor = new SubscriptionMonitor(telRegistry, context, subController, numPhones); TestHandler testHandler = TestHandler.makeHandler(); Object subChangedObject = new Object(); testHandler.setSubscriptionChangedObject(subChangedObject); Object defaultSubChangedObject = new Object(); testHandler.setDefaultSubscriptionChangedObject(defaultSubChangedObject); final int PHONE_ID = 0; final int FIRST_SUB_ID = 0; final int SECOND_SUB_ID = 1; subController.setDefaultDataSubId(INVALID_SUBSCRIPTION_ID); subController.setSlotSubId(PHONE_ID, FIRST_SUB_ID); testedSubMonitor.registerForSubscriptionChanged(PHONE_ID, testHandler, TestHandler.SUBSCRIPTION_CHANGED, subChangedObject); testedSubMonitor.registerForDefaultDataSubscriptionChanged(PHONE_ID, testHandler, TestHandler.DEFAULT_SUBSCRIPTION_CHANGED, defaultSubChangedObject); subController.setSlotSubId(PHONE_ID, SECOND_SUB_ID); subController.setSlotSubId(PHONE_ID, FIRST_SUB_ID); testHandler.blockTilIdle(); if (testHandler.getSubscriptionChangedCount() != 3) { fail("getSubscriptionChangedCount reported " + testHandler.getSubscriptionChangedCount() + " != 3"); } if (testHandler.getDefaultSubscriptionChangedCount() != 1) { fail("getDefaultSubscriptionChangedCount reported " + testHandler.getDefaultSubscriptionChangedCount() + " != 1"); } testHandler.die(); } @SmallTest public void testNoSubChange() throws Exception { String TAG = "testNoSubChange"; final int numPhones = 2; final ContextFixture contextFixture = new ContextFixture(); final Context context = contextFixture.getTestDouble(); ITelephonyRegistry.Stub telRegistry = new TelephonyRegistryMock(); SubscriptionControllerMock subController = new SubscriptionControllerMock(context, telRegistry, numPhones); SubscriptionMonitor testedSubMonitor = new SubscriptionMonitor(telRegistry, context, subController, numPhones); TestHandler testHandler = TestHandler.makeHandler(); Object subChangedObject = new Object(); testHandler.setSubscriptionChangedObject(subChangedObject); Object defaultSubChangedObject = new Object(); testHandler.setDefaultSubscriptionChangedObject(defaultSubChangedObject); final int PHONE_ID = 0; final int FIRST_SUB_ID = 0; final int SECOND_SUB_ID = 1; testHandler.blockTilIdle(); Rlog.d(TAG, "1"); testedSubMonitor.registerForSubscriptionChanged(PHONE_ID, testHandler, TestHandler.SUBSCRIPTION_CHANGED, subChangedObject); testHandler.blockTilIdle(); Rlog.d(TAG, "2"); testedSubMonitor.registerForDefaultDataSubscriptionChanged(PHONE_ID, testHandler, TestHandler.DEFAULT_SUBSCRIPTION_CHANGED, defaultSubChangedObject); testHandler.blockTilIdle(); Rlog.d(TAG, "3"); subController.setSlotSubId(PHONE_ID, FIRST_SUB_ID); testHandler.blockTilIdle(); Rlog.d(TAG, "4"); subController.setDefaultDataSubId(FIRST_SUB_ID); testHandler.blockTilIdle(); Rlog.d(TAG, "5"); if (testHandler.getSubscriptionChangedCount() != 2) { fail("getSubscriptionChangedCount reported " + testHandler.getSubscriptionChangedCount() + " != 2"); } // 1 gained for reg and 1 for the setting above if (testHandler.getDefaultSubscriptionChangedCount() != 2) { fail("getDefaultSubscriptionChangedCount reported " + testHandler.getDefaultSubscriptionChangedCount() + " != 2"); } Rlog.d(TAG, "6"); // cause a notification that subscription info changed subController.notifySubscriptionInfoChanged(); testHandler.blockTilIdle(); Rlog.d(TAG, "7"); if (testHandler.getSubscriptionChangedCount() != 2) { fail("getSubscriptionChangedCount reported " + testHandler.getSubscriptionChangedCount() + " != 2"); } if (testHandler.getDefaultSubscriptionChangedCount() != 2) { fail("getDefaultSubscriptionChangedCount reported " + testHandler.getDefaultSubscriptionChangedCount() + " != 2"); } // now change the default - should cause a default notification (we lost the default) subController.setDefaultDataSubId(SECOND_SUB_ID); testHandler.blockTilIdle(); Rlog.d(TAG, "8"); if (testHandler.getSubscriptionChangedCount() != 2) { fail("getSubscriptionChangedCount reported " + testHandler.getSubscriptionChangedCount() + " != 2"); } if (testHandler.getDefaultSubscriptionChangedCount() != 3) { fail("getDefaultSubscriptionChangedCount reported " + testHandler.getDefaultSubscriptionChangedCount() + " != 3"); } testHandler.die(); } /** * Try setting the subIds first and then the default subId and verify we get all our * notifications. */ @SmallTest public void testSubBeforeDefaultNotifications() throws Exception { final int numPhones = 2; final ContextFixture contextFixture = new ContextFixture(); final Context context = contextFixture.getTestDouble(); ITelephonyRegistry.Stub telRegistry = new TelephonyRegistryMock(); SubscriptionControllerMock subController = new SubscriptionControllerMock(context, telRegistry, numPhones); SubscriptionMonitor testedSubMonitor = new SubscriptionMonitor(telRegistry, context, subController, numPhones); TestHandler testHandler = TestHandler.makeHandler(); Object subChangedObject = new Object(); testHandler.setSubscriptionChangedObject(subChangedObject); Object defaultSubChangedObject = new Object(); testHandler.setDefaultSubscriptionChangedObject(defaultSubChangedObject); final int PHONE_ID = 0; final int SECOND_PHONE_ID = 1; final int FIRST_SUB_ID = 0; final int SECOND_SUB_ID = 1; testedSubMonitor.registerForSubscriptionChanged(PHONE_ID, testHandler, TestHandler.SUBSCRIPTION_CHANGED, subChangedObject); testedSubMonitor.registerForDefaultDataSubscriptionChanged(PHONE_ID, testHandler, TestHandler.DEFAULT_SUBSCRIPTION_CHANGED, defaultSubChangedObject); subController.setSlotSubId(PHONE_ID, -2); subController.setSlotSubId(SECOND_PHONE_ID, -3); testHandler.blockTilIdle(); // should get one for registration and 1 for the change if (testHandler.getSubscriptionChangedCount() != 2) { fail("test1 " + testHandler.getSubscriptionChangedCount() + " != 2"); } // should get one for registration if (testHandler.getDefaultSubscriptionChangedCount() != 1) { fail("test2 " + testHandler.getDefaultSubscriptionChangedCount() + " != 1"); } subController.setDefaultDataSubId(FIRST_SUB_ID); testHandler.blockTilIdle(); // no change if (testHandler.getSubscriptionChangedCount() != 2) { fail("test3 " + testHandler.getSubscriptionChangedCount() + " != 2"); } if (testHandler.getDefaultSubscriptionChangedCount() != 1) { fail("test4 " + testHandler.getDefaultSubscriptionChangedCount() + " != 1"); } subController.setSlotSubId(PHONE_ID, FIRST_SUB_ID); testHandler.blockTilIdle(); // should get one more default-change-notification if (testHandler.getSubscriptionChangedCount() != 3) { fail("test5 " + testHandler.getSubscriptionChangedCount() + " != 3"); } if (testHandler.getDefaultSubscriptionChangedCount() != 2) { fail("test6 " + testHandler.getDefaultSubscriptionChangedCount() + " != 2"); } subController.setDefaultDataSubId(SECOND_SUB_ID); testHandler.blockTilIdle(); // should get one more default-change-notification if (testHandler.getSubscriptionChangedCount() != 3) { fail("test7 " + testHandler.getSubscriptionChangedCount() + " != 3"); } if (testHandler.getDefaultSubscriptionChangedCount() != 3) { fail("test8 " + testHandler.getDefaultSubscriptionChangedCount() + " != 3"); } subController.setDefaultDataSubId(FIRST_SUB_ID); testHandler.blockTilIdle(); // should get one more default-change-notification if (testHandler.getSubscriptionChangedCount() != 3) { fail("test9 " + testHandler.getSubscriptionChangedCount() + " != 3"); } if (testHandler.getDefaultSubscriptionChangedCount() != 4) { fail("test10 " + testHandler.getDefaultSubscriptionChangedCount() + " != 4"); } testHandler.die(); } /** * It turns out when we swap sims on a single sim we do something like: * Phone[0] subId 1 -> -2 * Phone[0] subId -2 -> 2 * Default change 1 -> 2 * Try that and verify we get all the subId and default changes we expect. */ @SmallTest public void testSimSwapNotifications() throws Exception { final int numPhones = 1; final ContextFixture contextFixture = new ContextFixture(); final Context context = contextFixture.getTestDouble(); ITelephonyRegistry.Stub telRegistry = new TelephonyRegistryMock(); SubscriptionControllerMock subController = new SubscriptionControllerMock(context, telRegistry, numPhones); SubscriptionMonitor testedSubMonitor = new SubscriptionMonitor(telRegistry, context, subController, numPhones); TestHandler testHandler = TestHandler.makeHandler(); Object subChangedObject = new Object(); testHandler.setSubscriptionChangedObject(subChangedObject); Object defaultSubChangedObject = new Object(); testHandler.setDefaultSubscriptionChangedObject(defaultSubChangedObject); final int PHONE_ID = 0; final int FIRST_SUB_ID = 0; final int SECOND_SUB_ID = 1; testedSubMonitor.registerForSubscriptionChanged(PHONE_ID, testHandler, TestHandler.SUBSCRIPTION_CHANGED, subChangedObject); testedSubMonitor.registerForDefaultDataSubscriptionChanged(PHONE_ID, testHandler, TestHandler.DEFAULT_SUBSCRIPTION_CHANGED, defaultSubChangedObject); subController.setSlotSubId(PHONE_ID, -2); testHandler.blockTilIdle(); // should get one for registration and 1 for the change if (testHandler.getSubscriptionChangedCount() != 2) { fail("test1 " + testHandler.getSubscriptionChangedCount() + " != 2"); } // should get one for registration if (testHandler.getDefaultSubscriptionChangedCount() != 1) { fail("test2 " + testHandler.getDefaultSubscriptionChangedCount() + " != 1"); } subController.setSlotSubId(PHONE_ID, FIRST_SUB_ID); testHandler.blockTilIdle(); if (testHandler.getSubscriptionChangedCount() != 3) { fail("test3 " + testHandler.getSubscriptionChangedCount() + " != 3"); } subController.setDefaultDataSubId(FIRST_SUB_ID); testHandler.blockTilIdle(); if (testHandler.getDefaultSubscriptionChangedCount() != 2) { fail("test4 " + testHandler.getDefaultSubscriptionChangedCount() + " != 2"); } // ok - now for the sim swap subController.setSlotSubId(PHONE_ID, -2); testHandler.blockTilIdle(); if (testHandler.getDefaultSubscriptionChangedCount() != 3) { fail("test5 " + testHandler.getDefaultSubscriptionChangedCount() + " != 3"); } if (testHandler.getSubscriptionChangedCount() != 4) { fail("test6 " + testHandler.getSubscriptionChangedCount() + " != 4"); } subController.setSlotSubId(PHONE_ID, SECOND_SUB_ID); testHandler.blockTilIdle(); if (testHandler.getSubscriptionChangedCount() != 5) { fail("test7 " + testHandler.getSubscriptionChangedCount() + " != 5"); } subController.setDefaultDataSubId(SECOND_SUB_ID); testHandler.blockTilIdle(); if (testHandler.getDefaultSubscriptionChangedCount() != 4) { fail("test8 " + testHandler.getDefaultSubscriptionChangedCount() + " != 4"); } // no change if (testHandler.getSubscriptionChangedCount() != 5) { fail("test9 " + testHandler.getSubscriptionChangedCount() + " != 5"); } testHandler.die(); } }