1c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko/* 2c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko * Copyright (C) 2016 The Android Open Source Project 3c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko * 4c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko * Licensed under the Apache License, Version 2.0 (the "License"); 5c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko * you may not use this file except in compliance with the License. 6c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko * You may obtain a copy of the License at 7c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko * 8c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko * http://www.apache.org/licenses/LICENSE-2.0 9c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko * 10c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko * Unless required by applicable law or agreed to in writing, software 11c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko * distributed under the License is distributed on an "AS IS" BASIS, 12c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko * See the License for the specific language governing permissions and 14c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko * limitations under the License. 15c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko */ 16c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 17c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenkopackage com.android.internal.telephony.uicc; 18c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 19fab72cdd47510766a6e6c1ebaa32d9a948e5bde1Jeff Davidsonimport static org.junit.Assert.assertEquals; 20fab72cdd47510766a6e6c1ebaa32d9a948e5bde1Jeff Davidsonimport static org.mockito.Mockito.any; 21fab72cdd47510766a6e6c1ebaa32d9a948e5bde1Jeff Davidsonimport static org.mockito.Mockito.anyInt; 22fab72cdd47510766a6e6c1ebaa32d9a948e5bde1Jeff Davidsonimport static org.mockito.Mockito.anyObject; 23fab72cdd47510766a6e6c1ebaa32d9a948e5bde1Jeff Davidsonimport static org.mockito.Mockito.eq; 24fab72cdd47510766a6e6c1ebaa32d9a948e5bde1Jeff Davidsonimport static org.mockito.Mockito.never; 25fab72cdd47510766a6e6c1ebaa32d9a948e5bde1Jeff Davidsonimport static org.mockito.Mockito.times; 26fab72cdd47510766a6e6c1ebaa32d9a948e5bde1Jeff Davidsonimport static org.mockito.Mockito.verify; 27fab72cdd47510766a6e6c1ebaa32d9a948e5bde1Jeff Davidsonimport static org.mockito.Mockito.when; 28fab72cdd47510766a6e6c1ebaa32d9a948e5bde1Jeff Davidson 29c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenkoimport android.content.Context; 30c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenkoimport android.content.Intent; 31c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenkoimport android.content.res.Resources; 32c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenkoimport android.os.Looper; 33c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenkoimport android.os.Message; 34c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenkoimport android.telephony.TelephonyManager; 35c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenkoimport android.test.suitebuilder.annotation.SmallTest; 36c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 37c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenkoimport com.android.internal.R; 38c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenkoimport com.android.internal.telephony.TelephonyIntents; 39c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenkoimport com.android.internal.telephony.TelephonyTest; 40c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenkoimport com.android.internal.telephony.uicc.IccCardStatus.CardState; 41c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 42c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenkoimport org.junit.After; 43c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenkoimport org.junit.Before; 44c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenkoimport org.junit.Test; 45c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenkoimport org.mockito.ArgumentCaptor; 46c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenkoimport org.mockito.Mock; 47c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenkoimport org.mockito.MockitoAnnotations; 48c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 49c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenkopublic class UiccStateChangedLauncherTest extends TelephonyTest { 50c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko private static final String TAG = UiccStateChangedLauncherTest.class.getName(); 51c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko private static final int CARD_COUNT = 1; 52c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko private static final String PROVISIONING_PACKAGE_NAME = "test.provisioning.package"; 53c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 54c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko @Mock 55c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko private Context mContext; 56c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko @Mock 57c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko private Resources mResources; 58c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 59c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko private IccCardStatus makeCardStatus(CardState state) { 60c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko IccCardStatus status = new IccCardStatus(); 61c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko status.setCardState(state.ordinal()); 62c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko status.mApplications = new IccCardApplicationStatus[0]; 63c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko status.mCdmaSubscriptionAppIndex = -1; 64c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko status.mGsmUmtsSubscriptionAppIndex = -1; 65c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko status.mImsSubscriptionAppIndex = -1; 66c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko return status; 67c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko } 68c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 69c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko @Before 70c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko public void setUp() throws Exception { 71c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko super.setUp(TAG); 72c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 73c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko MockitoAnnotations.initMocks(this); 74c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko when(mContext.getResources()).thenReturn(mResources); 75c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko when(TelephonyManager.getDefault().getPhoneCount()).thenReturn(CARD_COUNT); 76c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko } 77c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 78c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko @After 79c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko public void tearDown() throws Exception { 80c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko super.tearDown(); 81c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko } 82c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 83c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko @Test @SmallTest 84c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko public void testProvisioningPackageSet() { 85c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko // deviceProvisioningPackage is set. 86c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko when(mResources.getString(eq(R.string.config_deviceProvisioningPackage))) 87c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko .thenReturn(PROVISIONING_PACKAGE_NAME); 88c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 89c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko if (Looper.myLooper() == null) { 90c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko Looper.prepare(); 91c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko } 92c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 93c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko UiccStateChangedLauncher uiccLauncher = 94c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko new UiccStateChangedLauncher(mContext, UiccController.getInstance()); 95c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko ArgumentCaptor<Integer> integerArgumentCaptor = ArgumentCaptor.forClass(Integer.class); 96c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko verify(UiccController.getInstance(), times(1)).registerForIccChanged(eq(uiccLauncher), 97c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko integerArgumentCaptor.capture(), 98c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko anyObject()); 99c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko Message msg = Message.obtain(); 100c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko msg.what = integerArgumentCaptor.getValue(); 101c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 102c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko // The first broadcast should be sent after initialization. 1037aac0858ed9535dbb56baa34f00879bc6b9e960bAmit Mahajan UiccCard card = new UiccCard(mContext, mSimulatedCommands, 10498a7a2b7cd8e0c4ea787e434ed9c6c6d5ddf8d5fAmit Mahajan makeCardStatus(CardState.CARDSTATE_PRESENT), 0 /* phoneId */, new Object()); 1057aac0858ed9535dbb56baa34f00879bc6b9e960bAmit Mahajan when(UiccController.getInstance().getUiccCardForPhone(0)).thenReturn(card); 106c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko uiccLauncher.handleMessage(msg); 107c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 108c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(Intent.class); 109c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 110c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko // Amount of sent broadcasts to the device provisioning package. 111c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko int broadcast_count = 1; 112c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko verify(mContext, times(broadcast_count)).sendBroadcast(intentArgumentCaptor.capture()); 113c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko assertEquals(PROVISIONING_PACKAGE_NAME, intentArgumentCaptor.getValue().getPackage()); 114c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko assertEquals(TelephonyIntents.ACTION_SIM_STATE_CHANGED, 115c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko intentArgumentCaptor.getValue().getAction()); 116c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 117c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko // Card state's changed to restricted. Broadcast should be sent. 1187aac0858ed9535dbb56baa34f00879bc6b9e960bAmit Mahajan card.update(mContext, mSimulatedCommands, 1197aac0858ed9535dbb56baa34f00879bc6b9e960bAmit Mahajan makeCardStatus(CardState.CARDSTATE_RESTRICTED)); 120c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko uiccLauncher.handleMessage(msg); 121c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 122c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko broadcast_count++; 123c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko verify(mContext, times(broadcast_count)).sendBroadcast(intentArgumentCaptor.capture()); 124c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko assertEquals(PROVISIONING_PACKAGE_NAME, intentArgumentCaptor.getValue().getPackage()); 125c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko assertEquals(TelephonyIntents.ACTION_SIM_STATE_CHANGED, 126c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko intentArgumentCaptor.getValue().getAction()); 127c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 128c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko // Nothing's changed. Broadcast should not be sent. 129c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko uiccLauncher.handleMessage(msg); 130c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko verify(mContext, times(broadcast_count)).sendBroadcast(any(Intent.class)); 131c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 132c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko // Card state's changed from restricted. Broadcast should be sent. 1337aac0858ed9535dbb56baa34f00879bc6b9e960bAmit Mahajan card.update(mContext, mSimulatedCommands, 1347aac0858ed9535dbb56baa34f00879bc6b9e960bAmit Mahajan makeCardStatus(CardState.CARDSTATE_PRESENT)); 135c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko uiccLauncher.handleMessage(msg); 136c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 137c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko broadcast_count++; 138c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko verify(mContext, times(broadcast_count)).sendBroadcast(intentArgumentCaptor.capture()); 139c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko assertEquals(PROVISIONING_PACKAGE_NAME, intentArgumentCaptor.getValue().getPackage()); 140c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko assertEquals(TelephonyIntents.ACTION_SIM_STATE_CHANGED, 141c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko intentArgumentCaptor.getValue().getAction()); 142c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko } 143c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 144c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko @Test @SmallTest 145c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko public void testProvisioningPackageUnset() { 146c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko // deviceProvisionigPackage is not set. 147c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko when(mResources.getString(eq(R.string.config_deviceProvisioningPackage))) 148c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko .thenReturn(null); 149c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 150c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko if (Looper.myLooper() == null) { 151c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko Looper.prepare(); 152c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko } 153c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko 154c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko UiccStateChangedLauncher uiccLauncher = 155c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko new UiccStateChangedLauncher(mContext, UiccController.getInstance()); 156c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko verify(UiccController.getInstance(), never()).registerForIccChanged(eq(uiccLauncher), 157c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko anyInt(), anyObject()); 158c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko } 159c556e9a3149b6cbd4517fe02aae11689ec5a4e03Polina Bondarenko} 160