• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.phone;
18 
19 import static junit.framework.Assert.assertEquals;
20 
21 import static org.mockito.ArgumentMatchers.anyInt;
22 import static org.mockito.ArgumentMatchers.anyString;
23 import static org.mockito.Mockito.doReturn;
24 
25 import android.content.Context;
26 import android.content.SharedPreferences;
27 import android.os.PersistableBundle;
28 import android.telephony.ims.feature.MmTelFeature;
29 import android.telephony.ims.feature.RcsFeature;
30 import android.telephony.ims.stub.ImsRegistrationImplBase;
31 import android.util.Log;
32 
33 import androidx.test.InstrumentationRegistry;
34 import androidx.test.filters.SmallTest;
35 
36 import org.junit.After;
37 import org.junit.Before;
38 import org.junit.Test;
39 import org.mockito.Mock;
40 import org.mockito.MockitoAnnotations;
41 
42 import java.io.File;
43 import java.io.FileInputStream;
44 import java.io.FileNotFoundException;
45 import java.io.IOException;
46 
47 /**
48  * Unit Test for ImsProvisioningLoader.
49  */
50 public class ImsProvisioningLoaderTest {
51     private static final String LOG_TAG = ImsProvisioningLoaderTest.class.getSimpleName();
52 
53     private static final int IMS_FEATURE_MMTEL = ImsProvisioningLoader.IMS_FEATURE_MMTEL;
54     private static final int IMS_FEATURE_RCS = ImsProvisioningLoader.IMS_FEATURE_RCS;
55 
56     private static final int TECH_LTE = ImsRegistrationImplBase.REGISTRATION_TECH_LTE;
57     private static final int TECH_IWLAN = ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN;
58     private static final int TECH_NEW = Integer.MAX_VALUE;
59 
60     private static final int CAPA_VOICE = MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE;
61     private static final int CAPA_VIDEO = MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO;
62     private static final int CAPA_UT = MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_UT;
63     private static final int CAPA_PRESENCE =
64             RcsFeature.RcsImsCapabilities.CAPABILITY_TYPE_PRESENCE_UCE;
65     private static final int CAPA_NEW = Integer.MAX_VALUE;
66 
67     private static final int STATUS_NOT_PROVISIONED = ImsProvisioningLoader.STATUS_NOT_PROVISIONED;
68     private static final int STATUS_PROVISIONED = ImsProvisioningLoader.STATUS_PROVISIONED;
69 
70     private static final int SUB_ID_1 = 111111;
71     private static final int SUB_ID_2 = 222222;
72 
73     @Mock
74     Context mContext;
75     @Mock
76     SharedPreferences mSharedPreferences;
77     private ImsProvisioningLoader mImsProvisioningLoader;
78 
79     @Before
setUp()80     public void setUp() throws Exception {
81         MockitoAnnotations.initMocks(this);
82         doReturn(mSharedPreferences).when(mContext).getSharedPreferences(anyString(), anyInt());
83         doReturn(InstrumentationRegistry.getTargetContext().getFilesDir()).when(
84                 mContext).getFilesDir();
85 
86         mImsProvisioningLoader = new ImsProvisioningLoader(mContext);
87     }
88 
89     @After
tearDown()90     public void tearDown() throws Exception {
91         if (mImsProvisioningLoader != null) {
92             mImsProvisioningLoader.clear();
93         }
94         deleteXml(SUB_ID_1, mContext);
95         deleteXml(SUB_ID_2, mContext);
96     }
97 
98     @Test
99     @SmallTest
testSetProvisioningStatus_ExistFeature()100     public void testSetProvisioningStatus_ExistFeature() {
101         // Set MMTEL IWLAN VOICE to STATUS_PROVISIONED
102         String[] info =
103                 new String[]{IMS_FEATURE_MMTEL + "," + TECH_IWLAN + "," + CAPA_VOICE + "," + getInt(
104                         true)};
105         mImsProvisioningLoader.setProvisioningToXml(SUB_ID_1, new PersistableBundle(), info);
106 
107         int curValue = mImsProvisioningLoader.getProvisioningStatus(SUB_ID_1, IMS_FEATURE_MMTEL,
108                 CAPA_VOICE, TECH_IWLAN);
109         assertEquals(getXmlContents(SUB_ID_1), getInt(true), curValue);
110 
111         // Change MMTEL IWLAN VOICE provisioning status
112         boolean saveResult = mImsProvisioningLoader.setProvisioningStatus(SUB_ID_1,
113                 IMS_FEATURE_MMTEL, CAPA_VOICE, TECH_IWLAN, false);
114         curValue = mImsProvisioningLoader.getProvisioningStatus(SUB_ID_1,
115                 IMS_FEATURE_MMTEL, CAPA_VOICE, TECH_IWLAN);
116         assertEquals(getXmlContents(SUB_ID_1), true, saveResult);
117         assertEquals(getXmlContents(SUB_ID_1), getInt(false), curValue);
118 
119         // If set to the same provisioning status,  don't save it.
120         saveResult = mImsProvisioningLoader.setProvisioningStatus(SUB_ID_1,
121                 IMS_FEATURE_MMTEL, CAPA_VOICE, TECH_IWLAN, false);
122         curValue = mImsProvisioningLoader.getProvisioningStatus(SUB_ID_1,
123                 IMS_FEATURE_MMTEL, CAPA_VOICE, TECH_IWLAN);
124         assertEquals(getXmlContents(SUB_ID_1), false, saveResult);
125         assertEquals(getXmlContents(SUB_ID_1), getInt(false), curValue);
126     }
127 
128     @Test
129     @SmallTest
testSetProvisioningStatus_NewFeature()130     public void testSetProvisioningStatus_NewFeature() {
131         // Set new capability
132         // Return true as a result to setProvisioningStatus()
133         boolean saveResult = mImsProvisioningLoader.setProvisioningStatus(SUB_ID_1,
134                 IMS_FEATURE_MMTEL, CAPA_NEW, TECH_LTE, true);
135         int curValue = mImsProvisioningLoader.getProvisioningStatus(SUB_ID_1,
136                 IMS_FEATURE_MMTEL, CAPA_NEW, TECH_LTE);
137         assertEquals(getXmlContents(SUB_ID_1), true, saveResult);
138         assertEquals(getXmlContents(SUB_ID_1), getInt(true), curValue);
139 
140         // Set new tech
141         saveResult = mImsProvisioningLoader.setProvisioningStatus(SUB_ID_1,
142                 IMS_FEATURE_MMTEL, CAPA_VOICE, TECH_NEW, false);
143         curValue = mImsProvisioningLoader.getProvisioningStatus(SUB_ID_1,
144                 IMS_FEATURE_MMTEL, CAPA_VOICE, TECH_NEW);
145         assertEquals(getXmlContents(SUB_ID_1), true, saveResult);
146         assertEquals(getXmlContents(SUB_ID_1), getInt(false), curValue);
147     }
148 
149     @Test
150     @SmallTest
testSetProvisioningStatus_DifferentSim()151     public void testSetProvisioningStatus_DifferentSim() {
152         // Check whether the provisioning status does not change even if SIM is changed
153         // Sub id 2, set provisioning status
154         boolean prevValue = getBooleanFromProvisioningStatus(SUB_ID_2,
155                 IMS_FEATURE_RCS, CAPA_PRESENCE, TECH_IWLAN);
156         boolean saveResult = mImsProvisioningLoader.setProvisioningStatus(
157                 SUB_ID_2, IMS_FEATURE_RCS, CAPA_PRESENCE, TECH_IWLAN, !prevValue);
158         int curValue = mImsProvisioningLoader.getProvisioningStatus(SUB_ID_2,
159                 IMS_FEATURE_RCS, CAPA_PRESENCE, TECH_IWLAN);
160         assertEquals(getXmlContents(SUB_ID_2), true, saveResult);
161         assertEquals(getXmlContents(SUB_ID_2), getInt(!prevValue), curValue);
162 
163         // Sub id 1, set other provisioned status
164         mImsProvisioningLoader.setProvisioningStatus(
165                 SUB_ID_1, IMS_FEATURE_RCS, CAPA_PRESENCE, TECH_IWLAN, prevValue);
166 
167         // Sub id 2, check the previous provisioning status isn't changed
168         curValue = mImsProvisioningLoader.getProvisioningStatus(SUB_ID_2,
169                 IMS_FEATURE_RCS, CAPA_PRESENCE, TECH_IWLAN);
170         assertEquals(getXmlContents(SUB_ID_2), getInt(!prevValue), curValue);
171     }
172 
173     @Test
174     @SmallTest
testGetProvisioningStatus_UtProvisioningStatusIsExistInPref()175     public void testGetProvisioningStatus_UtProvisioningStatusIsExistInPref() {
176         // Ut provisioning status exists in preference
177         doReturn(1).when(mSharedPreferences).getInt(anyString(), anyInt());
178         int curValue = mImsProvisioningLoader.getProvisioningStatus(SUB_ID_1,
179                 IMS_FEATURE_MMTEL, CAPA_UT, TECH_LTE);
180         assertEquals(getXmlContents(SUB_ID_1), getInt(true), curValue);
181     }
182 
183     @Test
184     @SmallTest
testGetProvisioningStatus_ExistXml()185     public void testGetProvisioningStatus_ExistXml() {
186         // Set MMTEL LTE VOICE to STATUS_PROVISIONED, MMTEL LTE VIDEO to STATUS_NOT_PROVISIONED
187         String[] info =
188                 new String[]{IMS_FEATURE_MMTEL + "," + TECH_LTE + "," + CAPA_VOICE + "," + getInt(
189                         true),
190                         IMS_FEATURE_MMTEL + "," + TECH_LTE + "," + CAPA_VIDEO + "," + getInt(
191                                 false)};
192         mImsProvisioningLoader.setProvisioningToXml(SUB_ID_1, new PersistableBundle(), info);
193 
194         int curValue = mImsProvisioningLoader.getProvisioningStatus(SUB_ID_1,
195                 IMS_FEATURE_MMTEL, CAPA_VOICE, TECH_LTE);
196         assertEquals(getXmlContents(SUB_ID_1), getInt(true), curValue);
197 
198         curValue = mImsProvisioningLoader.getProvisioningStatus(SUB_ID_1,
199                 IMS_FEATURE_MMTEL, CAPA_VIDEO, TECH_LTE);
200         assertEquals(getXmlContents(SUB_ID_1), getInt(false), curValue);
201     }
202 
getBooleanFromProvisioningStatus(int subId, int imsFeature, int capa, int tech)203     private boolean getBooleanFromProvisioningStatus(int subId, int imsFeature, int capa,
204             int tech) {
205         // Return provisioning status to bool
206         return mImsProvisioningLoader.getProvisioningStatus(
207                 subId, imsFeature, capa, tech) == STATUS_PROVISIONED ? true
208                 : false;
209     }
210 
getInt(boolean isProvisioned)211     private int getInt(boolean isProvisioned) {
212         return isProvisioned ? STATUS_PROVISIONED : STATUS_NOT_PROVISIONED;
213     }
214 
deleteXml(int subId, Context context)215     private void deleteXml(int subId, Context context) {
216         String fileName = getFileName(subId);
217         File file = null;
218         try {
219             file = new File(context.getFilesDir(), fileName);
220         } catch (Exception e) {
221             logd(e.toString());
222         }
223         file.delete();
224     }
225 
getXmlContents(int subId)226     private String getXmlContents(int subId) {
227         String fileName = getFileName(subId);
228 
229         File file = null;
230         FileInputStream inFile = null;
231         StringBuilder readString = new StringBuilder();
232         readString.append("file name " + fileName + "\n");
233         byte[] buffer = new byte[1024];
234         int n = 0;
235         try {
236             file = new File(mContext.getFilesDir(), fileName);
237             inFile = new FileInputStream(file);
238             while ((n = inFile.read(buffer)) != -1) {
239                 readString.append(new String(buffer, 0, n));
240             }
241             inFile.close();
242         } catch (FileNotFoundException e) {
243             logd(e.toString());
244 
245         } catch (IOException e) {
246             logd(e.toString());
247         }
248         return readString.toString();
249     }
250 
getFileName(int subId)251     private String getFileName(int subId) {
252         // Resulting name is imsprovisioningstatus_{subId}.xml
253         return "imsprovisioningstatus_" + subId + ".xml";
254     }
255 
logd(String contents)256     private static void logd(String contents) {
257         Log.d(LOG_TAG, contents);
258     }
259 
260 }
261