1 /* 2 * Copyright (C) 2016 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.server.telecom.tests; 18 19 import android.content.BroadcastReceiver; 20 import android.content.Context; 21 import android.content.Intent; 22 import android.content.IntentFilter; 23 import android.database.ContentObserver; 24 import android.net.Uri; 25 import android.os.Handler; 26 import android.os.UserHandle; 27 import android.test.suitebuilder.annotation.SmallTest; 28 29 import com.android.server.telecom.DefaultDialerCache; 30 import com.android.server.telecom.TelecomSystem; 31 32 import org.junit.Before; 33 import org.junit.Test; 34 import org.junit.runner.RunWith; 35 import org.junit.runners.JUnit4; 36 import org.mockito.ArgumentCaptor; 37 import org.mockito.Mock; 38 39 import static org.junit.Assert.assertEquals; 40 import static org.mockito.Matchers.any; 41 import static org.mockito.Matchers.eq; 42 import static org.mockito.Matchers.isNull; 43 import static org.mockito.Mockito.times; 44 import static org.mockito.Mockito.verify; 45 import static org.mockito.Mockito.when; 46 47 @RunWith(JUnit4.class) 48 public class DefaultDialerCacheTest extends TelecomTestCase { 49 50 private static final String DIALER1 = "com.android.dialer"; 51 private static final String DIALER2 = "xyz.abc.dialer"; 52 private static final String DIALER3 = "aaa.bbb.ccc.ddd"; 53 private static final int USER0 = 0; 54 private static final int USER1 = 1; 55 private static final int USER2 = 2; 56 57 private DefaultDialerCache mDefaultDialerCache; 58 private ContentObserver mDefaultDialerSettingObserver; 59 private BroadcastReceiver mPackageChangeReceiver; 60 private BroadcastReceiver mUserRemovedReceiver; 61 62 @Mock private DefaultDialerCache.DefaultDialerManagerAdapter mMockDefaultDialerManager; 63 64 @Override 65 @Before 66 public void setUp() throws Exception { 67 super.setUp(); 68 mContext = mComponentContextFixture.getTestDouble().getApplicationContext(); 69 70 ArgumentCaptor<BroadcastReceiver> packageReceiverCaptor = 71 ArgumentCaptor.forClass(BroadcastReceiver.class); 72 73 mDefaultDialerCache = new DefaultDialerCache( 74 mContext, mMockDefaultDialerManager, new TelecomSystem.SyncRoot() { }); 75 76 verify(mContext, times(2)).registerReceiverAsUser( 77 packageReceiverCaptor.capture(), eq(UserHandle.ALL), any(IntentFilter.class), 78 isNull(String.class), isNull(Handler.class)); 79 // Receive the first receiver that was captured, the package change receiver. 80 mPackageChangeReceiver = packageReceiverCaptor.getAllValues().get(0); 81 82 ArgumentCaptor<BroadcastReceiver> userRemovedReceiverCaptor = 83 ArgumentCaptor.forClass(BroadcastReceiver.class); 84 verify(mContext).registerReceiver( 85 userRemovedReceiverCaptor.capture(), any(IntentFilter.class)); 86 mUserRemovedReceiver = userRemovedReceiverCaptor.getAllValues().get(0); 87 88 mDefaultDialerSettingObserver = mDefaultDialerCache.getContentObserver(); 89 90 when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER0))) 91 .thenReturn(DIALER1); 92 when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER1))) 93 .thenReturn(DIALER2); 94 when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER2))) 95 .thenReturn(DIALER3); 96 } 97 98 @SmallTest 99 @Test 100 public void testThreeUsers() { 101 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(), DIALER1); 102 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1); 103 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2); 104 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3); 105 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(), DIALER1); 106 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1); 107 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2); 108 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3); 109 110 verify(mMockDefaultDialerManager, times(1)) 111 .getDefaultDialerApplication(any(Context.class), eq(USER0)); 112 verify(mMockDefaultDialerManager, times(1)) 113 .getDefaultDialerApplication(any(Context.class), eq(USER1)); 114 verify(mMockDefaultDialerManager, times(1)) 115 .getDefaultDialerApplication(any(Context.class), eq(USER2)); 116 } 117 118 @SmallTest 119 @Test 120 public void testDialer1PackageChanged() { 121 // Populate the caches first 122 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1); 123 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2); 124 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3); 125 126 Intent packageChangeIntent = new Intent(Intent.ACTION_PACKAGE_CHANGED, 127 Uri.fromParts("package", DIALER1, null)); 128 when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER0))) 129 .thenReturn(DIALER2); 130 mPackageChangeReceiver.onReceive(mContext, packageChangeIntent); 131 verify(mMockDefaultDialerManager, times(2)) 132 .getDefaultDialerApplication(any(Context.class), eq(USER0)); 133 verify(mMockDefaultDialerManager, times(2)) 134 .getDefaultDialerApplication(any(Context.class), eq(USER1)); 135 verify(mMockDefaultDialerManager, times(2)) 136 .getDefaultDialerApplication(any(Context.class), eq(USER2)); 137 138 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER2); 139 } 140 141 @SmallTest 142 @Test 143 public void testRandomOtherPackageChanged() { 144 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1); 145 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2); 146 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3); 147 148 Intent packageChangeIntent = new Intent(Intent.ACTION_PACKAGE_CHANGED, 149 Uri.fromParts("package", "red.orange.blue", null)); 150 mPackageChangeReceiver.onReceive(mContext, packageChangeIntent); 151 verify(mMockDefaultDialerManager, times(2)) 152 .getDefaultDialerApplication(any(Context.class), eq(USER0)); 153 verify(mMockDefaultDialerManager, times(2)) 154 .getDefaultDialerApplication(any(Context.class), eq(USER1)); 155 verify(mMockDefaultDialerManager, times(2)) 156 .getDefaultDialerApplication(any(Context.class), eq(USER2)); 157 } 158 159 @SmallTest 160 @Test 161 public void testUserRemoved() { 162 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1); 163 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2); 164 165 Intent userRemovalIntent = new Intent(Intent.ACTION_USER_REMOVED); 166 userRemovalIntent.putExtra(Intent.EXTRA_USER_HANDLE, USER0); 167 mUserRemovedReceiver.onReceive(mContext, userRemovalIntent); 168 169 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1); 170 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2); 171 172 verify(mMockDefaultDialerManager, times(2)) 173 .getDefaultDialerApplication(any(Context.class), eq(USER0)); 174 verify(mMockDefaultDialerManager, times(1)) 175 .getDefaultDialerApplication(any(Context.class), eq(USER1)); 176 } 177 178 @SmallTest 179 @Test 180 public void testPackageRemovedWithoutReplace() { 181 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1); 182 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2); 183 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3); 184 185 Intent packageChangeIntent = new Intent(Intent.ACTION_PACKAGE_REMOVED, 186 Uri.fromParts("package", DIALER1, null)); 187 packageChangeIntent.putExtra(Intent.EXTRA_REPLACING, false); 188 189 mPackageChangeReceiver.onReceive(mContext, packageChangeIntent); 190 verify(mMockDefaultDialerManager, times(2)) 191 .getDefaultDialerApplication(any(Context.class), eq(USER0)); 192 verify(mMockDefaultDialerManager, times(1)) 193 .getDefaultDialerApplication(any(Context.class), eq(USER1)); 194 verify(mMockDefaultDialerManager, times(1)) 195 .getDefaultDialerApplication(any(Context.class), eq(USER2)); 196 } 197 198 @SmallTest 199 @Test 200 public void testPackageAdded() { 201 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1); 202 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2); 203 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3); 204 205 Intent packageChangeIntent = new Intent(Intent.ACTION_PACKAGE_ADDED, 206 Uri.fromParts("package", "ppp.qqq.zzz", null)); 207 208 mPackageChangeReceiver.onReceive(mContext, packageChangeIntent); 209 verify(mMockDefaultDialerManager, times(2)) 210 .getDefaultDialerApplication(any(Context.class), eq(USER0)); 211 verify(mMockDefaultDialerManager, times(2)) 212 .getDefaultDialerApplication(any(Context.class), eq(USER1)); 213 verify(mMockDefaultDialerManager, times(2)) 214 .getDefaultDialerApplication(any(Context.class), eq(USER2)); 215 } 216 217 @SmallTest 218 @Test 219 public void testPackageRemovedWithReplace() { 220 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1); 221 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2); 222 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3); 223 224 Intent packageChangeIntent = new Intent(Intent.ACTION_PACKAGE_REMOVED, 225 Uri.fromParts("package", DIALER1, null)); 226 packageChangeIntent.putExtra(Intent.EXTRA_REPLACING, true); 227 228 mPackageChangeReceiver.onReceive(mContext, packageChangeIntent); 229 verify(mMockDefaultDialerManager, times(1)) 230 .getDefaultDialerApplication(any(Context.class), eq(USER0)); 231 verify(mMockDefaultDialerManager, times(1)) 232 .getDefaultDialerApplication(any(Context.class), eq(USER1)); 233 verify(mMockDefaultDialerManager, times(1)) 234 .getDefaultDialerApplication(any(Context.class), eq(USER2)); 235 } 236 237 @SmallTest 238 @Test 239 public void testDefaultDialerSettingChanged() { 240 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1); 241 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2); 242 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3); 243 244 when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER0))) 245 .thenReturn(DIALER2); 246 when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER1))) 247 .thenReturn(DIALER2); 248 when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER2))) 249 .thenReturn(DIALER2); 250 mDefaultDialerSettingObserver.onChange(false); 251 252 verify(mMockDefaultDialerManager, times(2)) 253 .getDefaultDialerApplication(any(Context.class), eq(USER0)); 254 verify(mMockDefaultDialerManager, times(2)) 255 .getDefaultDialerApplication(any(Context.class), eq(USER2)); 256 verify(mMockDefaultDialerManager, times(2)) 257 .getDefaultDialerApplication(any(Context.class), eq(USER2)); 258 259 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER2); 260 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2); 261 assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER2); 262 } 263 } 264