DefaultDialerCacheTest.java revision 2b33df76a3b7b43ae9fde36f73da11cb22954656
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
55    @Mock private DefaultDialerCache.DefaultDialerManagerAdapter mMockDefaultDialerManager;
56
57    public void setUp() throws Exception {
58        super.setUp();
59        mContext = mComponentContextFixture.getTestDouble().getApplicationContext();
60
61        ArgumentCaptor<BroadcastReceiver> receiverCaptor =
62                ArgumentCaptor.forClass(BroadcastReceiver.class);
63
64        mDefaultDialerCache = new DefaultDialerCache(
65                mContext, mMockDefaultDialerManager, new TelecomSystem.SyncRoot() { });
66
67        verify(mContext).registerReceiverAsUser(
68                receiverCaptor.capture(), eq(UserHandle.ALL), any(IntentFilter.class),
69                isNull(String.class), isNull(Handler.class));
70        mPackageChangeReceiver = receiverCaptor.getValue();
71        mDefaultDialerSettingObserver = mDefaultDialerCache.getContentObserver();
72
73        when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER0)))
74                .thenReturn(DIALER1);
75        when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER1)))
76                .thenReturn(DIALER2);
77        when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER2)))
78                .thenReturn(DIALER3);
79    }
80
81    @SmallTest
82    public void testThreeUsers() {
83        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(), DIALER1);
84        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1);
85        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2);
86        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3);
87        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(), DIALER1);
88        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1);
89        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2);
90        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3);
91
92        verify(mMockDefaultDialerManager, times(1))
93                .getDefaultDialerApplication(any(Context.class), eq(USER0));
94        verify(mMockDefaultDialerManager, times(1))
95                .getDefaultDialerApplication(any(Context.class), eq(USER1));
96        verify(mMockDefaultDialerManager, times(1))
97                .getDefaultDialerApplication(any(Context.class), eq(USER2));
98    }
99
100    @SmallTest
101    public void testDialer1PackageChanged() {
102        // Populate the caches first
103        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1);
104        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2);
105        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3);
106
107        Intent packageChangeIntent = new Intent(Intent.ACTION_PACKAGE_CHANGED,
108                Uri.fromParts("package", DIALER1, null));
109        when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER0)))
110                .thenReturn(DIALER2);
111        mPackageChangeReceiver.onReceive(mContext, packageChangeIntent);
112        verify(mMockDefaultDialerManager, times(2))
113                .getDefaultDialerApplication(any(Context.class), eq(USER0));
114        verify(mMockDefaultDialerManager, times(2))
115                .getDefaultDialerApplication(any(Context.class), eq(USER1));
116        verify(mMockDefaultDialerManager, times(2))
117                .getDefaultDialerApplication(any(Context.class), eq(USER2));
118
119        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER2);
120    }
121
122    @SmallTest
123    public void testRandomOtherPackageChanged() {
124        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1);
125        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2);
126        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3);
127
128        Intent packageChangeIntent = new Intent(Intent.ACTION_PACKAGE_CHANGED,
129                Uri.fromParts("package", "red.orange.blue", null));
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
139    @SmallTest
140    public void testPackageRemovedWithoutReplace() {
141        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1);
142        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2);
143        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3);
144
145        Intent packageChangeIntent = new Intent(Intent.ACTION_PACKAGE_REMOVED,
146                Uri.fromParts("package", DIALER1, null));
147        packageChangeIntent.putExtra(Intent.EXTRA_REPLACING, false);
148
149        mPackageChangeReceiver.onReceive(mContext, packageChangeIntent);
150        verify(mMockDefaultDialerManager, times(2))
151                .getDefaultDialerApplication(any(Context.class), eq(USER0));
152        verify(mMockDefaultDialerManager, times(1))
153                .getDefaultDialerApplication(any(Context.class), eq(USER1));
154        verify(mMockDefaultDialerManager, times(1))
155                .getDefaultDialerApplication(any(Context.class), eq(USER2));
156    }
157
158    @SmallTest
159    public void testPackageAdded() {
160        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1);
161        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2);
162        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3);
163
164        Intent packageChangeIntent = new Intent(Intent.ACTION_PACKAGE_ADDED,
165                Uri.fromParts("package", "ppp.qqq.zzz", null));
166
167        mPackageChangeReceiver.onReceive(mContext, packageChangeIntent);
168        verify(mMockDefaultDialerManager, times(2))
169                .getDefaultDialerApplication(any(Context.class), eq(USER0));
170        verify(mMockDefaultDialerManager, times(2))
171                .getDefaultDialerApplication(any(Context.class), eq(USER1));
172        verify(mMockDefaultDialerManager, times(2))
173                .getDefaultDialerApplication(any(Context.class), eq(USER2));
174    }
175
176    @SmallTest
177    public void testPackageRemovedWithReplace() {
178        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1);
179        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2);
180        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3);
181
182        Intent packageChangeIntent = new Intent(Intent.ACTION_PACKAGE_REMOVED,
183                Uri.fromParts("package", DIALER1, null));
184        packageChangeIntent.putExtra(Intent.EXTRA_REPLACING, true);
185
186        mPackageChangeReceiver.onReceive(mContext, packageChangeIntent);
187        verify(mMockDefaultDialerManager, times(1))
188                .getDefaultDialerApplication(any(Context.class), eq(USER0));
189        verify(mMockDefaultDialerManager, times(1))
190                .getDefaultDialerApplication(any(Context.class), eq(USER1));
191        verify(mMockDefaultDialerManager, times(1))
192                .getDefaultDialerApplication(any(Context.class), eq(USER2));
193    }
194
195    @SmallTest
196    public void testDefaultDialerSettingChanged() {
197        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER1);
198        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2);
199        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER3);
200
201        when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER0)))
202                .thenReturn(DIALER2);
203        when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER1)))
204                .thenReturn(DIALER2);
205        when(mMockDefaultDialerManager.getDefaultDialerApplication(any(Context.class), eq(USER2)))
206                .thenReturn(DIALER2);
207        mDefaultDialerSettingObserver.onChange(false);
208
209        verify(mMockDefaultDialerManager, times(2))
210                .getDefaultDialerApplication(any(Context.class), eq(USER0));
211        verify(mMockDefaultDialerManager, times(2))
212                .getDefaultDialerApplication(any(Context.class), eq(USER2));
213        verify(mMockDefaultDialerManager, times(2))
214                .getDefaultDialerApplication(any(Context.class), eq(USER2));
215
216        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER0), DIALER2);
217        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER1), DIALER2);
218        assertEquals(mDefaultDialerCache.getDefaultDialerApplication(USER2), DIALER2);
219    }
220}
221