diff --git a/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowContentResolver.java b/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowContentResolver.java index 9c1f7ecf682..b86e9220ddf 100644 --- a/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowContentResolver.java +++ b/robolectric-shadows/shadows-core/src/main/java/org/robolectric/shadows/ShadowContentResolver.java @@ -10,6 +10,7 @@ import android.content.IContentProvider; import android.content.OperationApplicationException; import android.content.PeriodicSync; +import android.content.pm.ProviderInfo; import android.content.res.AssetFileDescriptor; import android.database.ContentObserver; import android.database.Cursor; @@ -573,6 +574,9 @@ public final AssetFileDescriptor openTypedAssetFileDescriptor(Uri uri, String mi private static ContentProvider createAndInitialize(ContentProviderData providerData) { try { ContentProvider provider = (ContentProvider) Class.forName(providerData.getClassName()).newInstance(); + ProviderInfo providerInfo = new ProviderInfo(); + providerInfo.authority = providerData.getAuthority(); + provider.attachInfo(RuntimeEnvironment.application, providerInfo); provider.onCreate(); return provider; } catch (InstantiationException | ClassNotFoundException | IllegalAccessException e) { diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowContentResolverTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowContentResolverTest.java index 29546a4fdf1..de056d14adb 100644 --- a/robolectric/src/test/java/org/robolectric/shadows/ShadowContentResolverTest.java +++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowContentResolverTest.java @@ -30,9 +30,9 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.Shadows; import org.robolectric.TestRunners; +import org.robolectric.fakes.BaseCursor; import org.robolectric.manifest.AndroidManifest; import org.robolectric.manifest.ContentProviderData; -import org.robolectric.fakes.BaseCursor; import org.robolectric.util.ReflectionHelpers; import java.io.ByteArrayInputStream; @@ -47,7 +47,9 @@ import static android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.robolectric.Shadows.shadowOf; @RunWith(TestRunners.MultiApiWithDefaults.class) @@ -697,6 +699,22 @@ public void getProvider_shouldNotReturnAnyProviderWhenManifestIsNull() { assertThat(ShadowContentResolver.getProvider(Uri.parse("content://"))).isNull(); } + @Test + public void getProvider_shouldSetAuthority() throws RemoteException { + AndroidManifest manifest = ShadowApplication.getInstance().getAppManifest(); + ContentProviderData testProviderData = new ContentProviderData("org.robolectric.shadows.ShadowContentResolverTest$TestContentProvider", AUTHORITY); + try { + manifest.getContentProviders().add(testProviderData); + Uri uri = Uri.parse("content://" + AUTHORITY + "/shadows"); + ContentProvider provider = ShadowContentResolver.getProvider(uri); + // unfortunately, there is no direct way of testing if authority is set or not + // however, it's checked in ContentProvider.Transport method calls (validateIncomingUri), so it's the closest we can test against + provider.getIContentProvider().getType(uri); // should not throw + } finally { + manifest.getContentProviders().remove(testProviderData); + } + } + static class QueryParamTrackingCursor extends BaseCursor { public Uri uri; public String[] projection;