/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License */ package com.android.dialer.database; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.DatabaseUtils; import android.net.Uri; import android.test.ProviderTestCase2; import android.test.suitebuilder.annotation.MediumTest; @MediumTest public class FilteredNumberProviderTest extends ProviderTestCase2 { private ContentResolver mResolver; private static final String TIME_ZONE_AMERICA_LOS_ANGELES = "America/Los_Angeles"; private static final String DEFAULT_TIMEZONE = TIME_ZONE_AMERICA_LOS_ANGELES; private static final String DEFAULT_COUNTRY_ISO = "US"; private static final String TEST_NUMBER = "234567890"; private static final String TEST_NORMALIZED_NUMBER = "+1234567890"; private static final long TEST_TIME = 1439936706; public FilteredNumberProviderTest () { super(TestFilteredNumberProvider.class, FilteredNumberContract.AUTHORITY); } @Override protected void setUp() throws Exception { super.setUp(); mResolver = getMockContentResolver(); } public void testInsert() { // Insert row Uri uri = mResolver.insert( FilteredNumberContract.FilteredNumber.CONTENT_URI, getTestValues(null)); assertNotNull(uri); long id = ContentUris.parseId(uri); assertTrue(id > 0); } public void testQuery() { Cursor cursor = mResolver.query( FilteredNumberContract.FilteredNumber.CONTENT_URI, null, null, null, null); assertNotNull(cursor); assertEquals(cursor.getCount(), 0); cursor.close(); } public void testInsertAndQuery() { // Insert row ContentValues testValues = getTestValues(null); Uri uri = mResolver.insert(FilteredNumberContract.FilteredNumber.CONTENT_URI, testValues); // Query Cursor cursor = mResolver.query(uri, null, null, null, null); assertNotNull(cursor); assertEquals(cursor.getCount(), 1); cursor.moveToFirst(); assertCursorValues(cursor, testValues); cursor.close(); } public void testIllegalUri() { try { mResolver.query( Uri.withAppendedPath( FilteredNumberContract.FilteredNumber.CONTENT_URI, "ILLEGAL"), null, null, null, null); fail("Expecting exception but none was thrown."); } catch (IllegalArgumentException e) { } } public void testQueryWithId() { // Insert row ContentValues testValues = getTestValues(null); Uri uri = mResolver.insert(FilteredNumberContract.FilteredNumber.CONTENT_URI, testValues); long id = ContentUris.parseId(uri); // Query Cursor cursor = mResolver.query( ContentUris.withAppendedId( FilteredNumberContract.FilteredNumber.CONTENT_URI, id), null, null, null, null); assertNotNull(cursor); assertEquals(cursor.getCount(), 1); cursor.moveToFirst(); assertCursorValues(cursor, testValues); cursor.close(); } public void testDelete() { // Insert row Uri uri = mResolver.insert( FilteredNumberContract.FilteredNumber.CONTENT_URI, getTestValues(null)); long id = ContentUris.parseId(uri); // Delete row int rows = mResolver.delete( FilteredNumberContract.FilteredNumber.CONTENT_URI, FilteredNumberContract.FilteredNumberColumns._ID + " = ?", new String[]{Long.toString(id)}); assertEquals(rows, 1); // Query Cursor cursor = mResolver.query(uri, null, null, null, null); assertNotNull(cursor); assertEquals(cursor.getCount(), 0); cursor.close(); } public void testUpdate() { // Insert row Uri uri = mResolver.insert( FilteredNumberContract.FilteredNumber.CONTENT_URI, getTestValues(null)); // Update row ContentValues v = new ContentValues(); v.put(FilteredNumberContract.FilteredNumberColumns.TIMES_FILTERED, 3); v.put(FilteredNumberContract.FilteredNumberColumns.LAST_TIME_FILTERED, TEST_TIME); int rows = mResolver.update(FilteredNumberContract.FilteredNumber.CONTENT_URI, v, FilteredNumberContract.FilteredNumberColumns.NORMALIZED_NUMBER + " = ?", new String[]{TEST_NORMALIZED_NUMBER}); assertEquals(rows, 1); ContentValues expected = getTestValues(TEST_TIME); expected.put(FilteredNumberContract.FilteredNumberColumns.TIMES_FILTERED, 3); expected.put(FilteredNumberContract.FilteredNumberColumns.LAST_TIME_FILTERED, TEST_TIME); // Re-query Cursor cursor = mResolver.query(uri, null, null, null, null); assertNotNull(cursor); assertEquals(cursor.getCount(), 1); cursor.moveToFirst(); assertCursorValues(cursor, expected); cursor.close(); } public void testInsertDefaultValues() { // Insert row ContentValues v = getTestValues(null); Uri uri = mResolver.insert(FilteredNumberContract.FilteredNumber.CONTENT_URI, v); assertNotNull(uri); long id = ContentUris.parseId(uri); assertTrue(id > 0); // Query Cursor cursor = mResolver.query(uri, null, null, null, null); assertNotNull(cursor); assertEquals(cursor.getCount(), 1); int creationTimeIndex = cursor.getColumnIndex(FilteredNumberContract.FilteredNumberColumns.CREATION_TIME); cursor.moveToFirst(); assertEquals(cursor.getLong(creationTimeIndex), TEST_TIME); cursor.close(); } @Override protected void tearDown() throws Exception { getProvider().closeDb(); super.tearDown(); } private ContentValues getTestValues(Long timeNow) { ContentValues v = new ContentValues(); v.putNull(FilteredNumberContract.FilteredNumberColumns._ID); v.put(FilteredNumberContract.FilteredNumberColumns.NORMALIZED_NUMBER, TEST_NORMALIZED_NUMBER); v.put(FilteredNumberContract.FilteredNumberColumns.NUMBER, TEST_NUMBER); v.put(FilteredNumberContract.FilteredNumberColumns.COUNTRY_ISO, DEFAULT_COUNTRY_ISO); v.put(FilteredNumberContract.FilteredNumberColumns.TIMES_FILTERED, 0); v.putNull(FilteredNumberContract.FilteredNumberColumns.LAST_TIME_FILTERED); v.put(FilteredNumberContract.FilteredNumberColumns.CREATION_TIME, timeNow); v.put(FilteredNumberContract.FilteredNumberColumns.SOURCE, 1); v.put(FilteredNumberContract.FilteredNumberColumns.TYPE, 1); return v; } private void assertCursorValues(Cursor cursor, ContentValues expectedValues) { ContentValues v = new ContentValues(); DatabaseUtils.cursorRowToContentValues(cursor, v); v.remove(FilteredNumberContract.FilteredNumberColumns._ID); expectedValues.remove(FilteredNumberContract.FilteredNumberColumns._ID); assertEquals(v.toString(), expectedValues.toString()); } public static class TestFilteredNumberProvider extends FilteredNumberProvider { private DialerDatabaseHelper mDialerDatabaseHelper; @Override protected DialerDatabaseHelper getDatabaseHelper(Context context) { if (mDialerDatabaseHelper == null) { mDialerDatabaseHelper = DialerDatabaseHelper.getNewInstanceForTest(context); } return mDialerDatabaseHelper; } protected void closeDb() { mDialerDatabaseHelper.close(); } @Override protected long getCurrentTimeMs() { return TEST_TIME; } } }