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