19bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu/* 29c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu * Copyright (C) 2016 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 */ 169a2d68f18b4441404eaa4d1cb45d9b457915b234fionaxupackage com.android.internal.telephony.uicc; 179bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu 18fab72cdd47510766a6e6c1ebaa32d9a948e5bde1Jeff Davidsonimport static com.android.internal.telephony.TelephonyTestUtils.waitForMs; 19fab72cdd47510766a6e6c1ebaa32d9a948e5bde1Jeff Davidson 20fab72cdd47510766a6e6c1ebaa32d9a948e5bde1Jeff Davidsonimport static org.junit.Assert.assertEquals; 21fab72cdd47510766a6e6c1ebaa32d9a948e5bde1Jeff Davidsonimport static org.junit.Assert.assertFalse; 22fab72cdd47510766a6e6c1ebaa32d9a948e5bde1Jeff Davidsonimport static org.junit.Assert.assertNull; 23fab72cdd47510766a6e6c1ebaa32d9a948e5bde1Jeff Davidson 249bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport android.os.Handler; 259bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport android.os.HandlerThread; 269bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport android.os.Message; 279bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport android.test.suitebuilder.annotation.SmallTest; 289bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu 29fab72cdd47510766a6e6c1ebaa32d9a948e5bde1Jeff Davidsonimport com.android.internal.telephony.TelephonyTest; 30fab72cdd47510766a6e6c1ebaa32d9a948e5bde1Jeff Davidson 319bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport org.junit.After; 329bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport org.junit.Before; 339bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport org.junit.Test; 349bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxuimport org.mockito.Mock; 359bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu 369c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yupublic class UiccCardTest extends TelephonyTest { 379bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu private UiccCard mUicccard; 389bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu 399bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu public UiccCardTest() { 409bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu super(); 419bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu } 429bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu 439bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu private IccIoResult mIccIoResult; 449c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu 459bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu private UiccCardHandlerThread mTestHandlerThread; 469bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu private Handler mHandler; 479bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu private static final int UICCCARD_UPDATE_CARD_STATE_EVENT = 1; 489bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu private static final int UICCCARD_UPDATE_CARD_APPLICATION_EVENT = 2; 499bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu private static final int UICCCARD_CARRIER_PRIVILEDGE_LOADED_EVENT = 3; 509bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu 519bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu @Mock 529bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu private IccCardStatus mIccCardStatus; 539bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu @Mock 549bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu private Handler mMockedHandler; 559bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu 569bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu 579bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu private class UiccCardHandlerThread extends HandlerThread { 589bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu 599bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu private UiccCardHandlerThread(String name) { 609bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu super(name); 619bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu } 629bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu 639bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu @Override 649bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu public void onLooperPrepared() { 659bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu mUicccard = new UiccCard(mContextFixture.getTestDouble(), 6698a7a2b7cd8e0c4ea787e434ed9c6c6d5ddf8d5fAmit Mahajan mSimulatedCommands, mIccCardStatus, 0 /* phoneId */, 6798a7a2b7cd8e0c4ea787e434ed9c6c6d5ddf8d5fAmit Mahajan new Object()); 689bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu /* create a custom handler for the Handler Thread */ 699bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu mHandler = new Handler(mTestHandlerThread.getLooper()) { 709bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu @Override 719bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu public void handleMessage(Message msg) { 729bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu switch (msg.what) { 739bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu case UICCCARD_UPDATE_CARD_STATE_EVENT: 749bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu /* Upon handling this event, new CarrierPrivilegeRule 759bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu will be created with the looper of HandlerThread */ 769bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu logd("Update UICC Card State"); 779bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu mUicccard.update(mContextFixture.getTestDouble(), 789bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu mSimulatedCommands, mIccCardStatus); 799c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu setReady(true); 809bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu break; 819bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu case UICCCARD_UPDATE_CARD_APPLICATION_EVENT: 829bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu logd("Update UICC Card Applications"); 839bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu mUicccard.update(mContextFixture.getTestDouble(), 849bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu mSimulatedCommands, mIccCardStatus); 859c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu setReady(true); 869bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu break; 879bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu default: 889bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu logd("Unknown Event " + msg.what); 899bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu } 909bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu } 919bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu }; 929bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu 939c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu setReady(true); 949bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu logd("create UiccCard"); 959bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu } 969bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu } 979bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu 989bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu private IccCardApplicationStatus composeUiccApplicationStatus( 999bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu IccCardApplicationStatus.AppType appType, 1009bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu IccCardApplicationStatus.AppState appState, String aid) { 1019bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu IccCardApplicationStatus mIccCardAppStatus = new IccCardApplicationStatus(); 1029bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu mIccCardAppStatus.aid = aid; 1039bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu mIccCardAppStatus.app_type = appType; 1049bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu mIccCardAppStatus.app_state = appState; 1059bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu mIccCardAppStatus.pin1 = mIccCardAppStatus.pin2 = 1069bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu IccCardStatus.PinState.PINSTATE_ENABLED_VERIFIED; 1079bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu return mIccCardAppStatus; 1089bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu } 1099bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu 1109bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu @Before 1119bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu public void setUp() throws Exception { 1129c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu 1139c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu super.setUp(getClass().getSimpleName()); 1149bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu /* initially there are no application available */ 1159bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu mIccCardStatus.mApplications = new IccCardApplicationStatus[]{}; 1169bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu mIccCardStatus.mCdmaSubscriptionAppIndex = 1179bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu mIccCardStatus.mImsSubscriptionAppIndex = 1189bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu mIccCardStatus.mGsmUmtsSubscriptionAppIndex = -1; 119b8d6fafa17b6be739a61e6fa90cbb186875d0bb0Amit Mahajan mIccCardStatus.mCardState = IccCardStatus.CardState.CARDSTATE_PRESENT; 1209c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu 1219bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu mIccIoResult = new IccIoResult(0x90, 0x00, IccUtils.hexStringToBytes("FF40")); 1229bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu mSimulatedCommands.setIccIoResultForApduLogicalChannel(mIccIoResult); 1239bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu /* starting the Handler Thread */ 1243caa000d2f0643c50bf74d85a3e6672e484e25e1Amit Mahajan mTestHandlerThread = new UiccCardHandlerThread(getClass().getSimpleName()); 1259bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu mTestHandlerThread.start(); 1269bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu 1279bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu waitUntilReady(); 1289c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu } 1299c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu 1309c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu @After 1319c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu public void tearDown() throws Exception { 13216fb750132532b5d3012576fa52805e3546551f7Jack Yu mTestHandlerThread.quit(); 1339c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu super.tearDown(); 1349bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu } 1359bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu 1369bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu @Test 1379bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu @SmallTest 1389bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu public void tesUiccCartdInfoSanity() { 1399bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu /* before update sanity test */ 140703e603fecd2a07e232afe1e2b277fd0a786237bfionaxu assertEquals(0, mUicccard.getNumApplications()); 141b8d6fafa17b6be739a61e6fa90cbb186875d0bb0Amit Mahajan assertEquals(IccCardStatus.CardState.CARDSTATE_PRESENT, mUicccard.getCardState()); 1429bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu assertNull(mUicccard.getUniversalPinState()); 1439bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu assertNull(mUicccard.getOperatorBrandOverride()); 144b8d6fafa17b6be739a61e6fa90cbb186875d0bb0Amit Mahajan /* UiccProfile mock should return false */ 145b8d6fafa17b6be739a61e6fa90cbb186875d0bb0Amit Mahajan assertFalse(mUicccard.areCarrierPriviligeRulesLoaded()); 1469bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu for (IccCardApplicationStatus.AppType mAppType : 1479bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu IccCardApplicationStatus.AppType.values()) { 1489bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu assertFalse(mUicccard.isApplicationOnIcc(mAppType)); 1499bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu } 1509bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu } 1519bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu 1529bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu @Test @SmallTest 1539bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu public void testUpdateUiccCardState() { 1549bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu int mChannelId = 1; 1559bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu /* set card as present */ 1569bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu mIccCardStatus.mCardState = IccCardStatus.CardState.CARDSTATE_PRESENT; 1579bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu /* Mock open Channel ID 1 */ 1589bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu mSimulatedCommands.setOpenChannelId(mChannelId); 1599bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu Message mCardUpdate = mHandler.obtainMessage(UICCCARD_UPDATE_CARD_STATE_EVENT); 1609c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu setReady(false); 1619bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu mCardUpdate.sendToTarget(); 1629bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu /* try to create a new CarrierPrivilege, loading state -> loaded state */ 1639bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu /* wait till the async result and message delay */ 1649bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu waitUntilReady(); 1659bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu 166703e603fecd2a07e232afe1e2b277fd0a786237bfionaxu assertEquals(IccCardStatus.CardState.CARDSTATE_PRESENT, mUicccard.getCardState()); 1679bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu 168703e603fecd2a07e232afe1e2b277fd0a786237bfionaxu waitForMs(50); 1699bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu 170b8d6fafa17b6be739a61e6fa90cbb186875d0bb0Amit Mahajan /* todo: This part should move to UiccProfileTest 1719bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu assertTrue(mUicccard.areCarrierPriviligeRulesLoaded()); 172dff5ca22c114b183d8811f2ea2ec5fb6a0b2121fCassie verify(mSimulatedCommandsVerifier, times(2)).iccOpenLogicalChannel(isA(String.class), 17310d75a759b897da1077e3aa21ced4c46698c5552Ajay Nambi anyInt(), isA(Message.class)); 174dff5ca22c114b183d8811f2ea2ec5fb6a0b2121fCassie verify(mSimulatedCommandsVerifier, times(2)).iccTransmitApduLogicalChannel( 1759bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu eq(mChannelId), anyInt(), anyInt(), anyInt(), anyInt(), anyInt(), anyString(), 1769bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu isA(Message.class) 1779bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu ); 178b8d6fafa17b6be739a61e6fa90cbb186875d0bb0Amit Mahajan */ 1799bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu } 1809bf2a9297d37cdba05b023189c7a10357d8b0eeefionaxu} 181