1fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo/* 2fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo * Copyright (C) 2017 The Android Open Source Project 3fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo * 4fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo * Licensed under the Apache License, Version 2.0 (the "License"); 5fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo * you may not use this file except in compliance with the License. 6fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo * You may obtain a copy of the License at 7fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo * 8fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo * http://www.apache.org/licenses/LICENSE-2.0 9fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo * 10fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo * Unless required by applicable law or agreed to in writing, software 11fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo * distributed under the License is distributed on an "AS IS" BASIS, 12fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo * See the License for the specific language governing permissions and 14fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo * limitations under the License. 15fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo */ 16fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo 17fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzopackage com.android.bluetooth.pbapclient; 18fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo 19fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzoimport android.accounts.Account; 20fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzoimport android.content.res.Resources; 21fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzoimport android.database.Cursor; 22fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzoimport android.provider.CallLog.Calls; 23fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzoimport android.test.AndroidTestCase; 24fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo 25fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzoimport java.io.IOException; 26fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzoimport java.io.InputStream; 27fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo 28fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzoimport org.junit.Before; 29fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzoimport org.junit.Test; 30fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo 31fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzopublic class PbapParserTest extends AndroidTestCase { 32fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo private Account mAccount; 33fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo private Resources testResources; 34fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo private static final String mTestAccountName = "PBAPTESTACCOUNT"; 35fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo private static final String mTestPackageName = "com.android.bluetooth.tests"; 36fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo 37fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo @Before 38fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo public void setUp() { 39fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo mAccount = new Account(mTestAccountName, 40fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo mContext.getString(com.android.bluetooth.R.string.pbap_account_type)); 41fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo try { 42fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo testResources = 43fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo mContext.getPackageManager().getResourcesForApplication(mTestPackageName); 44fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo } catch (Exception e) { 45fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo fail("Setup Failure Unable to get resources" + e.toString()); 46fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo } 47fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo } 48fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo 49fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo // testNoTimestamp should parse 1 poorly formed vcard and not crash. 50fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo @Test 51fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo public void testNoTimestamp() throws IOException { 52fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo InputStream fileStream; 53fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo fileStream = testResources.openRawResource( 54fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo com.android.bluetooth.tests.R.raw.no_timestamp_call_log); 55fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo BluetoothPbapVcardList pbapVCardList = new BluetoothPbapVcardList( 56fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo mAccount, fileStream, PbapClientConnectionHandler.VCARD_TYPE_30); 57fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo assertEquals(1, pbapVCardList.getCount()); 58fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo CallLogPullRequest processor = 59fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo new CallLogPullRequest(mContext, PbapClientConnectionHandler.MCH_PATH); 60fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo processor.setResults(pbapVCardList.getList()); 61fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo 62fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo // Verify that these entries aren't in the call log to start. 63fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo assertFalse(verifyCallLog("555-0001", null, "3")); 64fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo 65fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo // Finish processing the data and verify entries were added to the call log. 66fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo processor.onPullComplete(); 67fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo assertTrue(verifyCallLog("555-0001", null, "3")); 68fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo } 69fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo 70fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo // testMissedCall should parse one phonecall correctly. 71fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo @Test 72fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo public void testMissedCall() throws IOException { 73fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo InputStream fileStream; 74fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo fileStream = 75fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo testResources.openRawResource(com.android.bluetooth.tests.R.raw.single_missed_call); 76fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo BluetoothPbapVcardList pbapVCardList = new BluetoothPbapVcardList( 77fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo mAccount, fileStream, PbapClientConnectionHandler.VCARD_TYPE_30); 78fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo assertEquals(1, pbapVCardList.getCount()); 79fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo CallLogPullRequest processor = 80fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo new CallLogPullRequest(mContext, PbapClientConnectionHandler.MCH_PATH); 81fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo processor.setResults(pbapVCardList.getList()); 82fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo 83fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo // Verify that these entries aren't in the call log to start. 84fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo assertFalse(verifyCallLog("555-0002", "1483232460000", "3")); 85fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo 86fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo // Finish processing the data and verify entries were added to the call log. 87fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo processor.onPullComplete(); 88fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo assertTrue(verifyCallLog("555-0002", "1483232460000", "3")); 89fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo } 90fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo 91fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo // testUnknownCall should parse two calls with no phone number. 92fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo @Test 93fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo public void testUnknownCall() throws IOException { 94fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo InputStream fileStream; 95fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo fileStream = testResources.openRawResource( 96fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo com.android.bluetooth.tests.R.raw.unknown_number_call); 97fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo BluetoothPbapVcardList pbapVCardList = new BluetoothPbapVcardList( 98fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo mAccount, fileStream, PbapClientConnectionHandler.VCARD_TYPE_30); 99fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo assertEquals(2, pbapVCardList.getCount()); 100fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo CallLogPullRequest processor = 101fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo new CallLogPullRequest(mContext, PbapClientConnectionHandler.MCH_PATH); 102fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo processor.setResults(pbapVCardList.getList()); 103fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo 104fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo // Verify that these entries aren't in the call log to start. 105fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo assertFalse(verifyCallLog("", "1483232520000", "3")); 106fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo assertFalse(verifyCallLog("", "1483232580000", "3")); 107fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo 108fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo // Finish processing the data and verify entries were added to the call log. 109fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo processor.onPullComplete(); 110fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo assertTrue(verifyCallLog("", "1483232520000", "3")); 111fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo assertTrue(verifyCallLog("", "1483232580000", "3")); 112fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo } 113fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo 114fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo // Find Entries in call log with type matching number and date. 115fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo // If number or date is null it will match any number or date respectively. 116fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo boolean verifyCallLog(String number, String date, String type) { 117fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo String[] query = new String[] {Calls.NUMBER, Calls.DATE, Calls.TYPE}; 118fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo Cursor cursor = mContext.getContentResolver().query(Calls.CONTENT_URI, query, 119fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo Calls.TYPE + "= " + type, null, Calls.DATE + ", " + Calls.NUMBER); 120fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo if (cursor != null) { 121fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo while (cursor.moveToNext()) { 122fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo String foundNumber = cursor.getString(cursor.getColumnIndex(Calls.NUMBER)); 123fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo String foundDate = cursor.getString(cursor.getColumnIndex(Calls.DATE)); 124fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo if ((number == null || number.equals(foundNumber)) 125fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo && (date == null || date.equals(foundDate))) { 126fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo return true; 127fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo } 128fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo } 129fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo cursor.close(); 130fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo } 131fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo return false; 132fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo } 133fe53cbf450c60ff0cadb5220d51403ceff27043bJoseph Pirozzo} 134