UiccCardTest.java revision 9bf2a9297d37cdba05b023189c7a10357d8b0eee
19bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu/*
29bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu * Copyright (C) 2015 The Android Open Source Project
39bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu *
49bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu * Licensed under the Apache License, Version 2.0 (the "License");
59bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu * you may not use this file except in compliance with the License.
69bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu * You may obtain a copy of the License at
79bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu *
89bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu *      http://www.apache.org/licenses/LICENSE-2.0
99bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu *
109bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu * Unless required by applicable law or agreed to in writing, software
119bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu * distributed under the License is distributed on an "AS IS" BASIS,
129bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu * See the License for the specific language governing permissions and
149bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu * limitations under the License.
159bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu */
169bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxupackage com.android.internal.telephony;
179bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
189bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport android.os.Handler;
199bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport android.os.HandlerThread;
209bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport android.os.Message;
219bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport android.test.suitebuilder.annotation.SmallTest;
229bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
239bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport org.junit.After;
249bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport org.junit.Before;
259bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport org.junit.Test;
269bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport android.util.Log;
279bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport com.android.internal.telephony.cat.CatService;
289bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport com.android.internal.telephony.test.SimulatedCommands;
299bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport com.android.internal.telephony.uicc.IccCardApplicationStatus;
309bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport com.android.internal.telephony.uicc.IccCardStatus;
319bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport com.android.internal.telephony.uicc.UiccCard;
329bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport org.mockito.ArgumentCaptor;
339bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport org.mockito.Mock;
349bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport static org.mockito.Mockito.*;
359bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
369bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport org.mockito.MockitoAnnotations;
379bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
389bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport java.lang.reflect.Field;
399bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport static org.junit.Assert.assertEquals;
409bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport static org.junit.Assert.assertFalse;
419bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport static org.junit.Assert.assertNull;
429bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport static org.junit.Assert.assertTrue;
439bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
449bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport com.android.internal.telephony.test.SimulatedCommandsVerifier;
459bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport com.android.internal.telephony.uicc.IccIoResult;
469bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
479bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxupublic class UiccCardTest {
489bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private UiccCard mUicccard;
499bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
509bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    public UiccCardTest() {
519bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        super();
529bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    }
539bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
549bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private IccIoResult mIccIoResult;
559bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private SimulatedCommands mSimulatedCommands;
569bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private ContextFixture mContextFixture;
579bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private Object mLock = new Object();
589bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private boolean mReady;
599bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private UiccCardHandlerThread mTestHandlerThread;
609bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private Handler mHandler;
619bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private static final String TAG = "UiccCardTest";
629bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private static final int UICCCARD_UPDATE_CARD_STATE_EVENT = 1;
639bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private static final int UICCCARD_UPDATE_CARD_APPLICATION_EVENT = 2;
649bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private static final int UICCCARD_CARRIER_PRIVILEDGE_LOADED_EVENT = 3;
659bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private static final int UICCCARD_ABSENT = 4;
669bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
679bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    @Mock
689bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private CatService mCAT;
699bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    @Mock
709bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private SubscriptionController mSubscriptionController;
719bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    @Mock
729bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private SimulatedCommandsVerifier mSimulatedCommandsVerifier;
739bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    @Mock
749bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private IccCardStatus mIccCardStatus;
759bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    @Mock
769bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private Handler mMockedHandler;
779bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
789bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
799bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private class UiccCardHandlerThread extends HandlerThread {
809bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
819bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        private UiccCardHandlerThread(String name) {
829bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu            super(name);
839bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        }
849bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
859bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        @Override
869bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        public void onLooperPrepared() {
879bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu            mUicccard = new UiccCard(mContextFixture.getTestDouble(),
889bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                                     mSimulatedCommands, mIccCardStatus);
899bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu            /* create a custom handler for the Handler Thread */
909bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu            mHandler = new Handler(mTestHandlerThread.getLooper()) {
919bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                @Override
929bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                public void handleMessage(Message msg) {
939bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                    switch (msg.what) {
949bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                        case UICCCARD_UPDATE_CARD_STATE_EVENT:
959bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                            /* Upon handling this event, new CarrierPrivilegeRule
969bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                            will be created with the looper of HandlerThread */
979bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                            logd("Update UICC Card State");
989bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                            mUicccard.update(mContextFixture.getTestDouble(),
999bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                                    mSimulatedCommands, mIccCardStatus);
1009bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                            setReadyFlag(true);
1019bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                            break;
1029bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                        case UICCCARD_UPDATE_CARD_APPLICATION_EVENT:
1039bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                            logd("Update UICC Card Applications");
1049bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                            mUicccard.update(mContextFixture.getTestDouble(),
1059bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                                    mSimulatedCommands, mIccCardStatus);
1069bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                            setReadyFlag(true);
1079bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                            break;
1089bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                        default:
1099bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                            logd("Unknown Event " + msg.what);
1109bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                    }
1119bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                }
1129bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu            };
1139bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
1149bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu            setReadyFlag(true);
1159bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu            logd("create UiccCard");
1169bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        }
1179bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    }
1189bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
1199bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private void waitUntilReady() {
1209bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        while (true) {
1219bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu            synchronized (mLock) {
1229bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                if (mReady) {
1239bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                    break;
1249bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                }
1259bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu            }
1269bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        }
1279bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    }
1289bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
1299bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private void setReadyFlag(boolean val) {
1309bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        synchronized (mLock) {
1319bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu            mReady = val;
1329bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        }
1339bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    }
1349bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
1359bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private IccCardApplicationStatus composeUiccApplicationStatus(
1369bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu            IccCardApplicationStatus.AppType appType,
1379bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu            IccCardApplicationStatus.AppState appState, String aid) {
1389bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        IccCardApplicationStatus mIccCardAppStatus = new IccCardApplicationStatus();
1399bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mIccCardAppStatus.aid = aid;
1409bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mIccCardAppStatus.app_type = appType;
1419bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mIccCardAppStatus.app_state = appState;
1429bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mIccCardAppStatus.pin1 = mIccCardAppStatus.pin2 =
1439bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                IccCardStatus.PinState.PINSTATE_ENABLED_VERIFIED;
1449bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        return mIccCardAppStatus;
1459bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    }
1469bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
1479bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    @Before
1489bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    public void setUp() throws Exception {
1499bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        MockitoAnnotations.initMocks(this);
1509bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mContextFixture = new ContextFixture();
1519bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        /* initially there are no application available */
1529bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mIccCardStatus.mApplications = new IccCardApplicationStatus[]{};
1539bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mIccCardStatus.mCdmaSubscriptionAppIndex =
1549bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                mIccCardStatus.mImsSubscriptionAppIndex =
1559bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                        mIccCardStatus.mGsmUmtsSubscriptionAppIndex = -1;
1569bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mSimulatedCommands = new SimulatedCommands();
1579bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        Field field = SubscriptionController.class.getDeclaredField("sInstance");
1589bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        field.setAccessible(true);
1599bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        field.set(null, mSubscriptionController);
1609bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        field = SimulatedCommandsVerifier.class.getDeclaredField("sInstance");
1619bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        field.setAccessible(true);
1629bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        field.set(null, mSimulatedCommandsVerifier);
1639bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mIccIoResult = new IccIoResult(0x90, 0x00, IccUtils.hexStringToBytes("FF40"));
1649bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mSimulatedCommands.setIccIoResultForApduLogicalChannel(mIccIoResult);
1659bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        /* starting the Handler Thread */
1669bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        setReadyFlag(false);
1679bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mTestHandlerThread = new UiccCardHandlerThread(TAG);
1689bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mTestHandlerThread.start();
1699bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
1709bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        waitUntilReady();
1719bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        field = UiccCard.class.getDeclaredField("mCatService");
1729bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        field.setAccessible(true);
1739bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        field.set(mUicccard, mCAT);
1749bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    }
1759bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
1769bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    @Test
1779bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    @SmallTest
1789bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    public void tesUiccCartdInfoSanity() {
1799bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        /* before update sanity test */
1809bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        assertEquals(mUicccard.getNumApplications(), 0);
1819bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        assertNull(mUicccard.getCardState());
1829bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        assertNull(mUicccard.getUniversalPinState());
1839bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        assertNull(mUicccard.getOperatorBrandOverride());
1849bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        /* CarrierPrivilegeRule equals null, return true */
1859bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        assertTrue(mUicccard.areCarrierPriviligeRulesLoaded());
1869bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        for (IccCardApplicationStatus.AppType mAppType :
1879bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                IccCardApplicationStatus.AppType.values()) {
1889bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu            assertFalse(mUicccard.isApplicationOnIcc(mAppType));
1899bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        }
1909bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    }
1919bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
1929bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    @Test @SmallTest
1939bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    public void testUpdateUiccCardApplication() {
1949bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        /* update app status and index */
1959bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        IccCardApplicationStatus cdmaApp = composeUiccApplicationStatus(
1969bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                IccCardApplicationStatus.AppType.APPTYPE_CSIM,
1979bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                IccCardApplicationStatus.AppState.APPSTATE_UNKNOWN, "0xA0");
1989bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        IccCardApplicationStatus imsApp = composeUiccApplicationStatus(
1999bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                IccCardApplicationStatus.AppType.APPTYPE_ISIM,
2009bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                IccCardApplicationStatus.AppState.APPSTATE_UNKNOWN, "0xA1");
2019bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        IccCardApplicationStatus umtsApp = composeUiccApplicationStatus(
2029bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                IccCardApplicationStatus.AppType.APPTYPE_USIM,
2039bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                IccCardApplicationStatus.AppState.APPSTATE_UNKNOWN, "0xA2");
2049bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mIccCardStatus.mApplications = new IccCardApplicationStatus[]{cdmaApp, imsApp, umtsApp};
2059bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mIccCardStatus.mCdmaSubscriptionAppIndex = 0;
2069bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mIccCardStatus.mImsSubscriptionAppIndex = 1;
2079bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mIccCardStatus.mGsmUmtsSubscriptionAppIndex = 2;
2089bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        Message mCardUpdate = mHandler.obtainMessage(UICCCARD_UPDATE_CARD_APPLICATION_EVENT);
2099bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        setReadyFlag(false);
2109bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mCardUpdate.sendToTarget();
2119bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
2129bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        waitUntilReady();
2139bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
2149bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        assertEquals(mUicccard.getNumApplications(), 3);
2159bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        assertTrue(mUicccard.isApplicationOnIcc(IccCardApplicationStatus.AppType.APPTYPE_CSIM));
2169bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        assertTrue(mUicccard.isApplicationOnIcc(IccCardApplicationStatus.AppType.APPTYPE_ISIM));
2179bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        assertTrue(mUicccard.isApplicationOnIcc(IccCardApplicationStatus.AppType.APPTYPE_USIM));
2189bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    }
2199bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
2209bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    @Test @SmallTest
2219bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    public void testUpdateUiccCardState() {
2229bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        int mChannelId = 1;
2239bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        /* set card as present */
2249bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mIccCardStatus.mCardState = IccCardStatus.CardState.CARDSTATE_PRESENT;
2259bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        /* Mock open Channel ID 1 */
2269bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mSimulatedCommands.setOpenChannelId(mChannelId);
2279bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        Message mCardUpdate = mHandler.obtainMessage(UICCCARD_UPDATE_CARD_STATE_EVENT);
2289bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        setReadyFlag(false);
2299bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mCardUpdate.sendToTarget();
2309bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        /* try to create a new CarrierPrivilege, loading state -> loaded state */
2319bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        /* wait till the async result and message delay */
2329bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        waitUntilReady();
2339bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
2349bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        assertFalse(mUicccard.areCarrierPriviligeRulesLoaded());
2359bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        assertEquals(mUicccard.getCardState(),
2369bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                IccCardStatus.CardState.CARDSTATE_PRESENT);
2379bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
2389bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        TelephonyTestUtils.waitForMs(50);
2399bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
2409bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        assertTrue(mUicccard.areCarrierPriviligeRulesLoaded());
2419bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        verify(mSimulatedCommandsVerifier, times(1)).iccOpenLogicalChannel(isA(String.class),
2429bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                isA(Message.class));
2439bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        verify(mSimulatedCommandsVerifier, times(1)).iccTransmitApduLogicalChannel(
2449bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                eq(mChannelId), anyInt(), anyInt(), anyInt(), anyInt(), anyInt(), anyString(),
2459bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                isA(Message.class)
2469bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        );
2479bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    }
2489bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
2499bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    @Test @SmallTest
2509bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    public void testUpdateUiccCardPinState() {
2519bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mIccCardStatus.mUniversalPinState = IccCardStatus.PinState.PINSTATE_ENABLED_VERIFIED;
2529bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mUicccard.update(mContextFixture.getTestDouble(), mSimulatedCommands, mIccCardStatus);
2539bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        assertEquals(mUicccard.getUniversalPinState(),
2549bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                IccCardStatus.PinState.PINSTATE_ENABLED_VERIFIED);
2559bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    }
2569bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
2579bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    @Test @SmallTest
2589bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    public void testCarrierPriviledgeLoadedListener() {
2599bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mUicccard.registerForCarrierPrivilegeRulesLoaded(mMockedHandler,
2609bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                UICCCARD_CARRIER_PRIVILEDGE_LOADED_EVENT, null);
2619bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        ArgumentCaptor<Message> mCaptorMessage = ArgumentCaptor.forClass(Message.class);
2629bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        ArgumentCaptor<Long>    mCaptorLong = ArgumentCaptor.forClass(Long.class);
2639bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        testUpdateUiccCardState();
2649bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        verify(mMockedHandler, atLeast(1)).sendMessageDelayed(mCaptorMessage.capture(),
2659bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                mCaptorLong.capture());
2669bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        assertEquals(UICCCARD_CARRIER_PRIVILEDGE_LOADED_EVENT, mCaptorMessage.getValue().what);
2679bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    }
2689bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
2699bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    @Test @SmallTest
2709bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    public void testCardAbsentListener() {
2719bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mUicccard.registerForAbsent(mMockedHandler, UICCCARD_ABSENT, null);
2729bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        /* assume hotswap capable, avoid bootup on card removal */
2739bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mContextFixture.putBooleanResource(com.android.internal.R.bool.config_hotswapCapable, true);
2749bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mSimulatedCommands.setRadioPower(true, null);
2759bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
2769bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        /* Mock Card State transition from card_present to card_absent */
2779bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        logd("UICC Card Present update");
2789bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mIccCardStatus.mCardState = IccCardStatus.CardState.CARDSTATE_PRESENT;
2799bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        Message mCardUpdate = mHandler.obtainMessage(UICCCARD_UPDATE_CARD_STATE_EVENT);
2809bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mCardUpdate.sendToTarget();
2819bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        TelephonyTestUtils.waitForMs(50);
2829bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
2839bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        logd("UICC Card absent update");
2849bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mIccCardStatus.mCardState = IccCardStatus.CardState.CARDSTATE_ABSENT;
2859bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        mUicccard.update(mContextFixture.getTestDouble(), mSimulatedCommands, mIccCardStatus);
2869bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        TelephonyTestUtils.waitForMs(50);
2879bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
2889bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        ArgumentCaptor<Message> mCaptorMessage = ArgumentCaptor.forClass(Message.class);
2899bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        ArgumentCaptor<Long>    mCaptorLong = ArgumentCaptor.forClass(Long.class);
2909bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        verify(mMockedHandler, atLeast(1)).sendMessageDelayed(mCaptorMessage.capture(),
2919bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu                                                             mCaptorLong.capture());
2929bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        assertEquals(UICCCARD_ABSENT, mCaptorMessage.getValue().what);
2939bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    }
2949bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
2959bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    private static void logd(String s) {
2969bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu        Log.d(TAG, s);
2979bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu    }
2989bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu
2999bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu}
300