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