1 /* 2 * Copyright (C) 2012 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.contacts.database; 18 19 import android.database.Cursor; 20 import android.net.Uri; 21 import android.test.InstrumentationTestCase; 22 import android.test.mock.MockContentProvider; 23 import android.test.mock.MockContentResolver; 24 25 import androidx.test.filters.SmallTest; 26 27 import java.util.concurrent.CountDownLatch; 28 import java.util.concurrent.TimeUnit; 29 30 /** 31 * Unit test for {@link NoNullCursorAsyncQueryHandler} 32 */ 33 @SmallTest 34 public class NoNullCursorAsyncQueryHandlerTest extends InstrumentationTestCase { 35 36 private MockContentResolver mMockContentResolver; 37 38 private static final String AUTHORITY = "com.android.contacts.common.unittest"; 39 private static final Uri URI = Uri.parse("content://" + AUTHORITY); 40 private static final String[] PROJECTION = new String[]{"column1", "column2"}; 41 42 @Override setUp()43 public void setUp() throws Exception { 44 super.setUp(); 45 mMockContentResolver = new MockContentResolver(); 46 final MockContentProvider mMockContentProvider = new MockContentProvider() { 47 @Override 48 public Cursor query(Uri uri, String[] projection, String selection, 49 String[] selectionArgs, 50 String sortOrder) { 51 return null; 52 } 53 }; 54 55 mMockContentResolver.addProvider(AUTHORITY, mMockContentProvider); 56 } 57 testCursorIsNotNull()58 public void testCursorIsNotNull() throws Throwable { 59 60 final CountDownLatch latch = new CountDownLatch(1); 61 final ObjectHolder<Cursor> cursorHolder = ObjectHolder.newInstance(); 62 final ObjectHolder<Boolean> ranHolder = ObjectHolder.newInstance(false); 63 64 runTestOnUiThread(new Runnable() { 65 66 @Override 67 public void run() { 68 69 NoNullCursorAsyncQueryHandler handler = new NoNullCursorAsyncQueryHandler( 70 mMockContentResolver) { 71 @Override 72 protected void onNotNullableQueryComplete(int token, Object cookie, 73 Cursor cursor) { 74 cursorHolder.obj = cursor; 75 ranHolder.obj = true; 76 latch.countDown(); 77 } 78 }; 79 handler.startQuery(1, null, URI, PROJECTION, null, null, null); 80 } 81 }); 82 83 latch.await(5, TimeUnit.SECONDS); 84 assertFalse(cursorHolder.obj == null); 85 assertTrue(ranHolder.obj); 86 } 87 testCursorContainsCorrectCookies()88 public void testCursorContainsCorrectCookies() throws Throwable { 89 final ObjectHolder<Boolean> ranHolder = ObjectHolder.newInstance(false); 90 final CountDownLatch latch = new CountDownLatch(1); 91 final ObjectHolder<Object> cookieHolder = ObjectHolder.newInstance(); 92 final String cookie = "TEST COOKIE"; 93 runTestOnUiThread(new Runnable() { 94 @Override 95 public void run() { 96 final NoNullCursorAsyncQueryHandler handler = new NoNullCursorAsyncQueryHandler( 97 mMockContentResolver) { 98 @Override 99 protected void onNotNullableQueryComplete(int token, Object cookie, 100 Cursor cursor) { 101 ranHolder.obj = true; 102 cookieHolder.obj = cookie; 103 latch.countDown(); 104 } 105 }; 106 handler.startQuery(1, cookie, URI, PROJECTION, null, null, null); 107 } 108 }); 109 110 latch.await(5, TimeUnit.SECONDS); 111 assertSame(cookie, cookieHolder.obj); 112 assertTrue(ranHolder.obj); 113 } 114 testCursorContainsCorrectColumns()115 public void testCursorContainsCorrectColumns() throws Throwable { 116 final ObjectHolder<Boolean> ranHolder = ObjectHolder.newInstance(false); 117 final CountDownLatch latch = new CountDownLatch(1); 118 final ObjectHolder<Cursor> cursorHolder = ObjectHolder.newInstance(); 119 final String cookie = "TEST COOKIE"; 120 runTestOnUiThread(new Runnable() { 121 @Override 122 public void run() { 123 final NoNullCursorAsyncQueryHandler handler = new NoNullCursorAsyncQueryHandler( 124 mMockContentResolver) { 125 @Override 126 protected void onNotNullableQueryComplete(int token, Object cookie, 127 Cursor cursor) { 128 ranHolder.obj = true; 129 cursorHolder.obj = cursor; 130 latch.countDown(); 131 } 132 }; 133 handler.startQuery(1, cookie, URI, PROJECTION, null, null, null); 134 } 135 }); 136 137 latch.await(5, TimeUnit.SECONDS); 138 assertSame(PROJECTION, cursorHolder.obj.getColumnNames()); 139 assertTrue(ranHolder.obj); 140 } 141 142 private static class ObjectHolder<T> { 143 public T obj; 144 newInstance()145 public static <E> ObjectHolder<E> newInstance() { 146 return new ObjectHolder<E>(); 147 } 148 newInstance(E value)149 public static <E> ObjectHolder<E> newInstance(E value) { 150 ObjectHolder<E> holder = new ObjectHolder<E>(); 151 holder.obj = value; 152 return holder; 153 } 154 } 155 } 156