• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.dialer.voicemail;
18 
19 import android.content.ContentUris;
20 import android.content.ContentValues;
21 import android.content.res.AssetFileDescriptor;
22 import android.net.Uri;
23 import android.os.Bundle;
24 import android.os.ParcelFileDescriptor;
25 import android.provider.CallLog;
26 import android.provider.VoicemailContract;
27 import android.test.InstrumentationTestCase;
28 import android.test.mock.MockContentResolver;
29 
30 import com.android.contacts.common.test.mocks.MockContentProvider;
31 import com.android.contacts.common.test.mocks.MockContentProvider.Query;
32 import com.android.dialer.calllog.CallLogQuery;
33 import com.android.dialer.database.VoicemailArchiveContract;
34 import com.android.dialer.util.AsyncTaskExecutors;
35 import com.android.dialer.util.FakeAsyncTaskExecutor;
36 import com.android.dialer.voicemail.VoicemailAsyncTaskUtil.OnGetArchivedVoicemailFilePathListener;
37 import com.android.dialer.voicemail.VoicemailAsyncTaskUtil.OnArchiveVoicemailListener;
38 import com.android.dialer.voicemail.VoicemailAsyncTaskUtil.OnSetVoicemailArchiveStatusListener;
39 
40 import org.junit.Rule;
41 import org.junit.rules.TemporaryFolder;
42 import static org.mockito.Mockito.*;
43 
44 import java.io.FileNotFoundException;
45 import java.io.IOException;
46 
47 public class VoicemailAsyncTaskUtilTest extends InstrumentationTestCase {
48     private static final String TEST_MIME_TYPE = "audio/mp3";
49     private static final String TEST_NUMBER = "+1412555555";
50     private static final String TEST_FILE_PATH = "TEST_PATH";
51     private static final String TEST_TRANSCRIPTION = "TEST_TRANSCRIPTION";
52     private static final long TEST_DATE = 0;
53     private static final long TEST_DURATION = 0;
54     private static final int TEST_SERVER_ID = 1;
55     private static final int TEST_ID = 2;
56     private static final Uri ARCHIVED_VOICEMAIL_URI =
57             VoicemailArchiveContract.VoicemailArchive.buildWithId(TEST_ID);
58     private static final Uri VOICEMAIL_URI = VoicemailContract.Voicemails.CONTENT_URI
59             .buildUpon().appendPath(Integer.toString(TEST_SERVER_ID)).build();
60     private static final String[] CALLLOG_QUERY_PROJECTION = new String[] {
61             CallLog.Calls._ID,
62             CallLog.Calls.NUMBER,
63             CallLog.Calls.DATE,
64             CallLog.Calls.DURATION,
65             CallLog.Calls.TYPE,
66             CallLog.Calls.COUNTRY_ISO,
67             CallLog.Calls.VOICEMAIL_URI,
68             CallLog.Calls.GEOCODED_LOCATION,
69             CallLog.Calls.CACHED_NAME,
70             CallLog.Calls.CACHED_NUMBER_TYPE,
71             CallLog.Calls.CACHED_NUMBER_LABEL,
72             CallLog.Calls.CACHED_LOOKUP_URI,
73             CallLog.Calls.CACHED_MATCHED_NUMBER,
74             CallLog.Calls.CACHED_NORMALIZED_NUMBER,
75             CallLog.Calls.CACHED_PHOTO_ID,
76             CallLog.Calls.CACHED_FORMATTED_NUMBER,
77             CallLog.Calls.IS_READ,
78             CallLog.Calls.NUMBER_PRESENTATION,
79             CallLog.Calls.PHONE_ACCOUNT_COMPONENT_NAME,
80             CallLog.Calls.PHONE_ACCOUNT_ID,
81             CallLog.Calls.FEATURES,
82             CallLog.Calls.DATA_USAGE,
83             CallLog.Calls.TRANSCRIPTION,
84             CallLog.Calls.CACHED_PHOTO_URI
85     };
86     private static final String[] VOICEMAIL_PROJECTION = new String[] {
87             VoicemailContract.Voicemails._ID,
88             VoicemailContract.Voicemails.NUMBER,
89             VoicemailContract.Voicemails.DATE,
90             VoicemailContract.Voicemails.DURATION,
91             VoicemailContract.Voicemails.MIME_TYPE,
92             VoicemailContract.Voicemails.TRANSCRIPTION,
93     };
94 
95     private final MockContentResolver mContentResolver = new MockContentResolver();
96     private final MockContentProvider mArchiveContentProvider = new TestVoicemailContentProvider();
97     private final MockContentProvider mVoicemailContentProvider =
98             new TestVoicemailContentProvider();
99     private final MockContentProvider mCallLogContentProvider = new MockContentProvider();
100     @Rule
101     private final TemporaryFolder mTemporaryFolder = new TemporaryFolder();
102 
103     private VoicemailAsyncTaskUtil mVoicemailAsyncTaskUtil;
104     private FakeAsyncTaskExecutor mFakeAsyncTaskExecutor;
105 
106     @Override
setUp()107     protected void setUp() throws Exception {
108         super.setUp();
109         mFakeAsyncTaskExecutor = new FakeAsyncTaskExecutor(getInstrumentation());
110         AsyncTaskExecutors.setFactoryForTest(mFakeAsyncTaskExecutor.getFactory());
111         mContentResolver.addProvider(VoicemailArchiveContract.AUTHORITY, mArchiveContentProvider);
112         mContentResolver.addProvider(VoicemailContract.AUTHORITY, mVoicemailContentProvider);
113         mContentResolver.addProvider(CallLog.AUTHORITY, mCallLogContentProvider);
114         mVoicemailAsyncTaskUtil = new VoicemailAsyncTaskUtil(mContentResolver);
115     }
116 
117     @Override
tearDown()118     protected void tearDown() throws Exception {
119         AsyncTaskExecutors.setFactoryForTest(null);
120         super.tearDown();
121     }
122 
testGetVoicemailFilePath_VoicemailExists()123     public void testGetVoicemailFilePath_VoicemailExists() throws Throwable {
124         newVoicemailArchiveQuery().withAnyProjection()
125                 .returnRow(getCombinedContentValuesWithData());
126         final OnGetArchivedVoicemailFilePathListener listener =
127                 mock(OnGetArchivedVoicemailFilePathListener.class);
128         runTestOnUiThread(new Runnable() {
129             @Override
130             public void run() {
131                 mVoicemailAsyncTaskUtil.getVoicemailFilePath(listener, ARCHIVED_VOICEMAIL_URI);
132             }
133         });
134         mFakeAsyncTaskExecutor.runTask(VoicemailAsyncTaskUtil.Tasks.GET_VOICEMAIL_FILE_PATH);
135         verify(listener).onGetArchivedVoicemailFilePath(TEST_FILE_PATH);
136         verifyQueries();
137     }
138 
testGetVoicemailFilePath_VoicemailNotExists()139     public void testGetVoicemailFilePath_VoicemailNotExists() throws Throwable {
140         newVoicemailArchiveFakeQuery().withAnyProjection().returnEmptyCursor();
141         final OnGetArchivedVoicemailFilePathListener listener =
142                 mock(OnGetArchivedVoicemailFilePathListener.class);
143         runTestOnUiThread(new Runnable() {
144             @Override
145             public void run() {
146                 mVoicemailAsyncTaskUtil.getVoicemailFilePath(listener, getFakeVoicemailUri());
147             }
148         });
149         mFakeAsyncTaskExecutor.runTask(VoicemailAsyncTaskUtil.Tasks.GET_VOICEMAIL_FILE_PATH);
150         verify(listener).onGetArchivedVoicemailFilePath(null);
151         verifyQueries();
152     }
153 
testSetVoicemailArchiveStatus_VoicemailNotExists()154     public void testSetVoicemailArchiveStatus_VoicemailNotExists() throws Throwable {
155         newVoicemailArchiveNotExistsUpdateQuery(true);
156         final OnSetVoicemailArchiveStatusListener listener =
157                 mock(OnSetVoicemailArchiveStatusListener.class);
158         runTestOnUiThread(new Runnable() {
159             @Override
160             public void run() {
161                 mVoicemailAsyncTaskUtil.setVoicemailArchiveStatus(listener,
162                         getFakeVoicemailUri(), true);
163             }
164         });
165         mFakeAsyncTaskExecutor.runTask(VoicemailAsyncTaskUtil.Tasks.SET_VOICEMAIL_ARCHIVE_STATUS);
166         verify(listener).onSetVoicemailArchiveStatus(false);
167         verifyQueries();
168     }
169 
testSetVoicemailArchiveStatus_VoicemailExists()170     public void testSetVoicemailArchiveStatus_VoicemailExists() throws Throwable {
171         newVoicemailArchiveExistsUpdateQuery(true);
172         final OnSetVoicemailArchiveStatusListener listener =
173                 mock(OnSetVoicemailArchiveStatusListener.class);
174         runTestOnUiThread(new Runnable() {
175             @Override
176             public void run() {
177                 mVoicemailAsyncTaskUtil.setVoicemailArchiveStatus(listener,
178                         ARCHIVED_VOICEMAIL_URI, true);
179             }
180         });
181         mFakeAsyncTaskExecutor.runTask(VoicemailAsyncTaskUtil.Tasks.SET_VOICEMAIL_ARCHIVE_STATUS);
182         verify(listener).onSetVoicemailArchiveStatus(true);
183         verifyQueries();
184     }
185 
testArchiveVoicemailContent_ArchiveNotExists()186     public void testArchiveVoicemailContent_ArchiveNotExists() throws Throwable {
187         newVoicemailArchiveExistsQuery().returnEmptyCursor();
188         newQueryCallLogInfo().returnRow(getCallLogContentValues());
189         newVoicemailQuery().returnRow(getVoicemailContentValues());
190         newVoicemailArchiveInsert();
191         final OnArchiveVoicemailListener listener = mock(OnArchiveVoicemailListener.class);
192         runTestOnUiThread(new Runnable() {
193             @Override
194             public void run() {
195                 mVoicemailAsyncTaskUtil.archiveVoicemailContent(listener, VOICEMAIL_URI);
196             }
197         });
198         mFakeAsyncTaskExecutor.runTask(VoicemailAsyncTaskUtil.Tasks.ARCHIVE_VOICEMAIL_CONTENT);
199         verify(listener).onArchiveVoicemail(ARCHIVED_VOICEMAIL_URI);
200         verifyQueries();
201     }
202 
testArchiveVoicemailContent_ArchiveExists()203     public void testArchiveVoicemailContent_ArchiveExists() throws Throwable {
204         newVoicemailArchiveExistsQuery().returnRow(getCombinedValuesWithId());
205         final OnArchiveVoicemailListener listener = mock(OnArchiveVoicemailListener.class);
206         runTestOnUiThread(new Runnable() {
207             @Override
208             public void run() {
209                 mVoicemailAsyncTaskUtil.archiveVoicemailContent(listener, VOICEMAIL_URI);
210             }
211         });
212         mFakeAsyncTaskExecutor.runTask(VoicemailAsyncTaskUtil.Tasks.ARCHIVE_VOICEMAIL_CONTENT);
213         verify(listener).onArchiveVoicemail(ARCHIVED_VOICEMAIL_URI);
214         verifyQueries();
215     }
216 
testArchiveVoicemailContent_CallLogInfoNotExists()217     public void testArchiveVoicemailContent_CallLogInfoNotExists() throws Throwable {
218         newVoicemailArchiveExistsQuery().returnEmptyCursor();
219         newQueryCallLogInfo().returnEmptyCursor();
220         newVoicemailQuery().returnEmptyCursor();
221         final OnArchiveVoicemailListener listener = mock(OnArchiveVoicemailListener.class);
222         runTestOnUiThread(new Runnable() {
223             @Override
224             public void run() {
225                 mVoicemailAsyncTaskUtil.archiveVoicemailContent(listener, VOICEMAIL_URI);
226             }
227         });
228         mFakeAsyncTaskExecutor.runTask(VoicemailAsyncTaskUtil.Tasks.ARCHIVE_VOICEMAIL_CONTENT);
229         verify(listener).onArchiveVoicemail(null);
230         verifyQueries();
231     }
232 
newVoicemailArchiveQuery()233     private Query newVoicemailArchiveQuery() {
234         return mArchiveContentProvider.expectQuery(ARCHIVED_VOICEMAIL_URI);
235     }
236 
newVoicemailArchiveFakeQuery()237     private Query newVoicemailArchiveFakeQuery() {
238         return mArchiveContentProvider.expectQuery(getFakeVoicemailUri());
239     }
240 
newQueryCallLogInfo()241     private Query newQueryCallLogInfo() {
242         return mCallLogContentProvider.expectQuery(ContentUris.withAppendedId(
243                 CallLog.Calls.CONTENT_URI_WITH_VOICEMAIL, ContentUris.parseId(VOICEMAIL_URI)))
244                 .withProjection(CALLLOG_QUERY_PROJECTION);
245     }
246 
newVoicemailQuery()247     private Query newVoicemailQuery() {
248         return mVoicemailContentProvider.expectQuery(VOICEMAIL_URI).withAnySelection()
249                 .withProjection(VOICEMAIL_PROJECTION);
250     }
251 
newVoicemailArchiveExistsQuery()252     private Query newVoicemailArchiveExistsQuery() {
253         return mArchiveContentProvider.expectQuery(
254                 VoicemailArchiveContract.VoicemailArchive.CONTENT_URI)
255                 .withSelection(VoicemailArchiveContract.VoicemailArchive.SERVER_ID + "="
256                         + ContentUris.parseId(VOICEMAIL_URI), (String[]) null)
257                 .withProjection(VoicemailArchiveContract.VoicemailArchive._ID);
258     }
259 
newVoicemailArchiveInsert()260     private void newVoicemailArchiveInsert() {
261         mArchiveContentProvider.expectInsert(
262                 VoicemailArchiveContract.VoicemailArchive.CONTENT_URI, getCombinedContentValues(),
263                 ARCHIVED_VOICEMAIL_URI);
264     }
265 
newVoicemailArchiveNotExistsUpdateQuery(boolean status)266     private void newVoicemailArchiveNotExistsUpdateQuery(boolean status) {
267         mArchiveContentProvider.expectUpdate(getFakeVoicemailUri(),
268                 getArchiveStatusUpdateValues(status), null, null).returnRowsAffected(0);
269     }
270 
newVoicemailArchiveExistsUpdateQuery(boolean status)271     private void newVoicemailArchiveExistsUpdateQuery(boolean status) {
272         mArchiveContentProvider.expectUpdate(ARCHIVED_VOICEMAIL_URI,
273                 getArchiveStatusUpdateValues(status), null, null).returnRowsAffected(1);
274     }
275 
getCallLogContentValues()276     private static ContentValues getCallLogContentValues() {
277         ContentValues values = new ContentValues();
278         values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.GEOCODED_LOCATION], "");
279         values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.CACHED_NAME], "");
280         values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.COUNTRY_ISO], "");
281         values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.CACHED_NUMBER_TYPE], 0);
282         values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.CACHED_NUMBER_LABEL], "");
283         values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.CACHED_LOOKUP_URI], "");
284         values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.CACHED_MATCHED_NUMBER], "");
285         values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.CACHED_NORMALIZED_NUMBER], "");
286         values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.CACHED_FORMATTED_NUMBER], "");
287         values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.NUMBER_PRESENTATION], 0);
288         values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.ACCOUNT_COMPONENT_NAME], "");
289         values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.ACCOUNT_ID], "");
290         values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.FEATURES], 0);
291         values.put(CALLLOG_QUERY_PROJECTION[23], "");
292         return values;
293     }
294 
getVoicemailContentValues()295     private static ContentValues getVoicemailContentValues() {
296         ContentValues values = new ContentValues();
297         values.put(VoicemailContract.Voicemails.NUMBER, TEST_NUMBER);
298         values.put(VoicemailContract.Voicemails.DATE, TEST_DATE);
299         values.put(VoicemailContract.Voicemails.DURATION, TEST_DURATION);
300         values.put(VoicemailContract.Voicemails.MIME_TYPE, TEST_MIME_TYPE);
301         values.put(VoicemailContract.Voicemails._ID, TEST_SERVER_ID);
302         values.put(VoicemailContract.Voicemails.TRANSCRIPTION, TEST_TRANSCRIPTION);
303         values.put("_data", TEST_FILE_PATH);    // VoicemailContract.Voicemails._DATA
304         return values;
305     }
306 
getCombinedContentValues()307     private static ContentValues getCombinedContentValues() {
308         ContentValues values = new ContentValues();
309         // Call log info
310         values.put(VoicemailArchiveContract.VoicemailArchive.GEOCODED_LOCATION, "");
311         values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_NAME, "");
312         values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_NUMBER_TYPE, 0);
313         values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_NUMBER_LABEL, "");
314         values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_LOOKUP_URI, "");
315         values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_MATCHED_NUMBER, "");
316         values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_NORMALIZED_NUMBER, "");
317         values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_FORMATTED_NUMBER, "");
318         values.put(VoicemailArchiveContract.VoicemailArchive.NUMBER_PRESENTATION, 0);
319         values.put(VoicemailArchiveContract.VoicemailArchive.ACCOUNT_COMPONENT_NAME, "");
320         values.put(VoicemailArchiveContract.VoicemailArchive.ACCOUNT_ID, "");
321         values.put(VoicemailArchiveContract.VoicemailArchive.FEATURES, 0);
322         values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_PHOTO_URI, "");
323         values.put(VoicemailArchiveContract.VoicemailArchive.COUNTRY_ISO, "");
324 
325         // Voicemail content info
326         values.put(VoicemailArchiveContract.VoicemailArchive.NUMBER, TEST_NUMBER);
327         values.put(VoicemailArchiveContract.VoicemailArchive.DATE, TEST_DATE);
328         values.put(VoicemailArchiveContract.VoicemailArchive.DURATION, TEST_DURATION);
329         values.put(VoicemailArchiveContract.VoicemailArchive.MIME_TYPE, TEST_MIME_TYPE);
330         values.put(VoicemailArchiveContract.VoicemailArchive.SERVER_ID, TEST_SERVER_ID);
331         values.put(VoicemailArchiveContract.VoicemailArchive.TRANSCRIPTION, TEST_TRANSCRIPTION);
332 
333         // Custom fields
334         values.put(VoicemailArchiveContract.VoicemailArchive.ARCHIVED, false);
335         return values;
336     }
337 
getCombinedContentValuesWithData()338     private static ContentValues getCombinedContentValuesWithData() {
339         ContentValues values = getCombinedContentValues();
340         values.put(VoicemailArchiveContract.VoicemailArchive._DATA, TEST_FILE_PATH);
341         return values;
342     }
343 
getCombinedValuesWithId()344     private static ContentValues getCombinedValuesWithId() {
345         ContentValues values = getCombinedContentValuesWithData();
346         values.put(VoicemailArchiveContract.VoicemailArchive._ID, TEST_ID);
347         return values;
348     }
349 
getArchiveStatusUpdateValues(boolean status)350     private static ContentValues getArchiveStatusUpdateValues(boolean status) {
351         ContentValues values = new ContentValues();
352         values.put(VoicemailArchiveContract.VoicemailArchive.ARCHIVED, status);
353         return values;
354     }
355 
getFakeVoicemailUri()356     private static Uri getFakeVoicemailUri() {
357         return VoicemailArchiveContract.VoicemailArchive.buildWithId(0);
358     }
359 
verifyQueries()360     private void verifyQueries() {
361         mArchiveContentProvider.verify();
362         mCallLogContentProvider.verify();
363         mVoicemailContentProvider.verify();
364     }
365 
366     private class TestVoicemailContentProvider extends MockContentProvider {
367         @Override
openFile(Uri uri, String mode)368         public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
369             int modeBits = ParcelFileDescriptor.parseMode(mode);
370             try {
371                 return ParcelFileDescriptor.open(mTemporaryFolder.newFile(), modeBits);
372             } catch (IOException e) {
373                 return null;
374             }
375         }
376 
377         @Override
openTypedAssetFile(Uri uri, String mimeTypeFilter, Bundle opts)378         public AssetFileDescriptor openTypedAssetFile(Uri uri, String mimeTypeFilter, Bundle opts) {
379             try {
380                 return new AssetFileDescriptor(openFile(uri, "r"), 0,
381                         AssetFileDescriptor.UNKNOWN_LENGTH);
382             } catch (FileNotFoundException e) {
383                 return null;
384             }
385         }
386     }
387 }
388 
389