Home | History | Annotate | Download | only in tests
      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