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