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