Skip to content

Commit

Permalink
Attach ContentProvider's info before creation, set authority field (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
karlicoss authored and jongerrish committed May 21, 2016
1 parent 6dd82fc commit c3bbc6f
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 2 deletions.
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down
Expand Up @@ -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;
Expand All @@ -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)
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit c3bbc6f

Please sign in to comment.