Guard against null cursor when querying SIM
Test: ran GoogleContactsTests
Bug 33272160
Change-Id: I177e63d489b566d55aa2009af2728279a8aea297
diff --git a/src/com/android/contacts/database/SimContactDaoImpl.java b/src/com/android/contacts/database/SimContactDaoImpl.java
index b54f272..be6b323 100644
--- a/src/com/android/contacts/database/SimContactDaoImpl.java
+++ b/src/com/android/contacts/database/SimContactDaoImpl.java
@@ -274,6 +274,10 @@
private ArrayList<SimContact> loadFrom(Uri uri) {
synchronized (SIM_READ_LOCK) {
final Cursor cursor = mResolver.query(uri, null, null, null, null);
+ if (cursor == null) {
+ // Assume null means there are no SIM contacts.
+ return new ArrayList<>(0);
+ }
try {
return loadFromCursor(cursor);
diff --git a/tests/src/com/android/contacts/database/SimContactDaoTests.java b/tests/src/com/android/contacts/database/SimContactDaoTests.java
index 8e6edef..18a3f09 100644
--- a/tests/src/com/android/contacts/database/SimContactDaoTests.java
+++ b/tests/src/com/android/contacts/database/SimContactDaoTests.java
@@ -26,14 +26,19 @@
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import android.content.ContentProvider;
import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.Context;
import android.content.OperationApplicationException;
import android.database.Cursor;
+import android.net.Uri;
+import android.os.CancellationSignal;
import android.os.RemoteException;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email;
@@ -701,6 +706,27 @@
.loadContactsForSim(new SimCard("123", "carrier", "sim", null, "us"));
assertTrue(result.isEmpty());
}
+
+ @Test
+ public void returnsEmptyListForNullCursor() {
+ mContext = mock(MockContext.class);
+ final MockContentResolver mockResolver = new MockContentResolver();
+ final ContentProvider mockProvider = mock(android.test.mock.MockContentProvider.class);
+ when(mockProvider.query(any(Uri.class), any(String[].class), anyString(),
+ any(String[].class), anyString()))
+ .thenReturn(null);
+ when(mockProvider.query(any(Uri.class), any(String[].class), anyString(),
+ any(String[].class), anyString(), any(CancellationSignal.class)))
+ .thenReturn(null);
+
+ mockResolver.addProvider("icc", mockProvider);
+ when(mContext.getContentResolver()).thenReturn(mockResolver);
+
+ final SimContactDao sut = SimContactDao.create(mContext);
+ final List<SimContact> result = sut
+ .loadContactsForSim(new SimCard("123", "carrier", "sim", null, "us"));
+ assertTrue(result.isEmpty());
+ }
}
@LargeTest