diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9683ca2ca7..56b26743f9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -17,7 +17,7 @@ androidx-fragment = "1.6.1" okhttp-min-sdk-version = "21" kotlin-compiler-extension = "1.5.5" androidx-benchmark = "1.5.0-alpha05" -compile-sdk-version = "36" +compile-sdk-version = "37" androidx-multidex = "2.0.1" autoservice = "1.0-rc3" autoservice-annotations = "1.0.1" @@ -55,7 +55,7 @@ mockwebserver = "3.0.0-RC1" okhttp2 = "2.7.5" okhttp3 = "3.10.0" okhttp4 = "4.10.0" -robolectric = "4.11.1" +robolectric = "4.16" rx-android = "1.2.1" rx-java = "1.3.8" svg = "1.2.1" diff --git a/integration/sqljournaldiskcache/build.gradle.kts b/integration/sqljournaldiskcache/build.gradle.kts index 09ce9083ec..359cd56d84 100644 --- a/integration/sqljournaldiskcache/build.gradle.kts +++ b/integration/sqljournaldiskcache/build.gradle.kts @@ -1,32 +1,30 @@ -plugins { - id("com.android.library") -} +plugins { id("com.android.library") } android { - namespace = "com.bumptech.glide.integration.sqljournaldiskcache" + namespace = "com.bumptech.glide.integration.sqljournaldiskcache" - compileSdk = libs.versions.compile.sdk.version.get().toInt() + compileSdk = libs.versions.compile.sdk.version.get().toInt() - defaultConfig { minSdk = libs.versions.min.sdk.version.get().toInt() } + defaultConfig { minSdk = libs.versions.min.sdk.version.get().toInt() } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } } dependencies { - implementation(project(":library")) - implementation(libs.errorprone.annotations) + implementation(project(":library")) + implementation(libs.errorprone.annotations) - testImplementation(libs.guava.testlib) - testImplementation(libs.truth) - testImplementation(libs.junit) - testImplementation(libs.mockito.core) - testImplementation(libs.robolectric) - testImplementation(libs.androidx.test.core) - testImplementation(libs.androidx.junit) - testImplementation(libs.androidx.test.runner) + testImplementation(libs.guava.testlib) + testImplementation(libs.truth) + testImplementation(libs.junit) + testImplementation(libs.mockito.core) + testImplementation(libs.robolectric) + testImplementation(libs.androidx.test.core) + testImplementation(libs.androidx.junit) + testImplementation(libs.androidx.test.runner) } apply(from = "${rootProject.projectDir}/scripts/upload.gradle.kts") diff --git a/integration/sqljournaldiskcache/src/test/java/com/bumptech/glide/integration/sqljournaldiskcache/JournaledLruDiskCacheTest.java b/integration/sqljournaldiskcache/src/test/java/com/bumptech/glide/integration/sqljournaldiskcache/JournaledLruDiskCacheTest.java index 1406df814e..0fdf0f392d 100644 --- a/integration/sqljournaldiskcache/src/test/java/com/bumptech/glide/integration/sqljournaldiskcache/JournaledLruDiskCacheTest.java +++ b/integration/sqljournaldiskcache/src/test/java/com/bumptech/glide/integration/sqljournaldiskcache/JournaledLruDiskCacheTest.java @@ -3,7 +3,6 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; -import static org.robolectric.Shadows.shadowOf; import android.content.Context; import android.os.Looper; @@ -20,6 +19,8 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.robolectric.shadow.api.Shadow; +import org.robolectric.shadows.ShadowLooper; @RunWith(AndroidJUnit4.class) public class JournaledLruDiskCacheTest { @@ -322,7 +323,7 @@ public void eviction_removesFirstPutFile() { // Eviction is triggered by posts. private static void onIdleWorkerThread() { - shadowOf(Looper.getMainLooper()).idle(); + ((ShadowLooper) Shadow.extract(Looper.getMainLooper())).idle(); } @Test diff --git a/library/test/src/test/java/com/bumptech/glide/load/data/mediastore/ThumbnailStreamOpenerTest.java b/library/test/src/test/java/com/bumptech/glide/load/data/mediastore/ThumbnailStreamOpenerTest.java index bdda77a451..e2cd0450a6 100644 --- a/library/test/src/test/java/com/bumptech/glide/load/data/mediastore/ThumbnailStreamOpenerTest.java +++ b/library/test/src/test/java/com/bumptech/glide/load/data/mediastore/ThumbnailStreamOpenerTest.java @@ -1,6 +1,7 @@ package com.bumptech.glide.load.data.mediastore; import static com.bumptech.glide.RobolectricConstants.ROBOLECTRIC_SDK; +import static com.bumptech.glide.testutil.CustomShadows.shadowOf; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; @@ -32,7 +33,6 @@ import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; -import org.robolectric.Shadows; import org.robolectric.annotation.Config; import org.robolectric.fakes.RoboCursor; @@ -91,7 +91,7 @@ public void testClosesCursor() throws FileNotFoundException { @Test public void testReturnsOpenedInputStreamWhenFileFound() throws FileNotFoundException { InputStream expected = new ByteArrayInputStream(new byte[0]); - Shadows.shadowOf(ApplicationProvider.getApplicationContext().getContentResolver()) + shadowOf(ApplicationProvider.getApplicationContext().getContentResolver()) .registerInputStream(harness.uri, expected); assertEquals(expected, harness.get().open(harness.uri)); } @@ -108,7 +108,7 @@ public void testVideoQueryReturnsVideoCursor() { ThumbFetcher.VideoThumbnailQuery query = new ThumbFetcher.VideoThumbnailQuery(getContentResolver()); RoboCursor testCursor = new RoboCursor(); - Shadows.shadowOf(ApplicationProvider.getApplicationContext().getContentResolver()) + shadowOf(ApplicationProvider.getApplicationContext().getContentResolver()) .setCursor(queryUri, testCursor); assertEquals(testCursor, query.query(harness.uri)); } @@ -119,7 +119,7 @@ public void testImageQueryReturnsImageCursor() { ThumbFetcher.ImageThumbnailQuery query = new ThumbFetcher.ImageThumbnailQuery(getContentResolver()); RoboCursor testCursor = new RoboCursor(); - Shadows.shadowOf(ApplicationProvider.getApplicationContext().getContentResolver()) + shadowOf(ApplicationProvider.getApplicationContext().getContentResolver()) .setCursor(queryUri, testCursor); assertEquals(testCursor, query.query(harness.uri)); } diff --git a/library/test/src/test/java/com/bumptech/glide/load/engine/ActiveResourcesTest.java b/library/test/src/test/java/com/bumptech/glide/load/engine/ActiveResourcesTest.java index 96a70eae2f..6377496b4e 100644 --- a/library/test/src/test/java/com/bumptech/glide/load/engine/ActiveResourcesTest.java +++ b/library/test/src/test/java/com/bumptech/glide/load/engine/ActiveResourcesTest.java @@ -1,5 +1,6 @@ package com.bumptech.glide.load.engine; +import static com.bumptech.glide.testutil.CustomShadows.shadowOf; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -25,7 +26,6 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; -import org.robolectric.Shadows; @RunWith(RobolectricTestRunner.class) public class ActiveResourcesTest { @@ -375,7 +375,7 @@ private void waitForLatch(CountDownLatch latch) { } catch (InterruptedException e) { throw new RuntimeException(e); } - Shadows.shadowOf(Looper.getMainLooper()).runToEndOfTasks(); + shadowOf(Looper.getMainLooper()).runToEndOfTasks(); } private CountDownLatch getLatchForClearedRef() { diff --git a/library/test/src/test/java/com/bumptech/glide/load/engine/EngineJobTest.java b/library/test/src/test/java/com/bumptech/glide/load/engine/EngineJobTest.java index 9229d600e9..71cf8e9d79 100644 --- a/library/test/src/test/java/com/bumptech/glide/load/engine/EngineJobTest.java +++ b/library/test/src/test/java/com/bumptech/glide/load/engine/EngineJobTest.java @@ -4,6 +4,7 @@ import static com.bumptech.glide.tests.Util.anyResource; import static com.bumptech.glide.tests.Util.isADataSource; import static com.bumptech.glide.tests.Util.mockResource; +import static com.bumptech.glide.testutil.CustomShadows.shadowOf; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; @@ -37,7 +38,6 @@ import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.robolectric.RobolectricTestRunner; -import org.robolectric.Shadows; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowLooper; @@ -255,7 +255,7 @@ public void testDoesNotNotifyCancelledIfReceivedException() { @Test public void testReleasesResourceIfCancelledOnReady() { Looper looper = harness.mainHandler.getLooper(); - Shadows.shadowOf(looper).pause(); + shadowOf(looper).pause(); final EngineJob job = harness.getJob(); job.start(harness.decodeJob); diff --git a/library/test/src/test/java/com/bumptech/glide/load/engine/ResourceRecyclerTest.java b/library/test/src/test/java/com/bumptech/glide/load/engine/ResourceRecyclerTest.java index 94767b4d8e..aea2eec04d 100644 --- a/library/test/src/test/java/com/bumptech/glide/load/engine/ResourceRecyclerTest.java +++ b/library/test/src/test/java/com/bumptech/glide/load/engine/ResourceRecyclerTest.java @@ -2,6 +2,7 @@ import static com.bumptech.glide.RobolectricConstants.ROBOLECTRIC_SDK; import static com.bumptech.glide.tests.Util.mockResource; +import static com.bumptech.glide.testutil.CustomShadows.shadowOf; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -13,7 +14,6 @@ import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.robolectric.RobolectricTestRunner; -import org.robolectric.Shadows; import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) @@ -30,7 +30,7 @@ public void setUp() { @Test public void recycle_withoutForceNextFrame_recyclesResourceSynchronously() { Resource resource = mockResource(); - Shadows.shadowOf(Looper.getMainLooper()).pause(); + shadowOf(Looper.getMainLooper()).pause(); recycler.recycle(resource, /* forceNextFrame= */ false); verify(resource).recycle(); } @@ -38,10 +38,10 @@ public void recycle_withoutForceNextFrame_recyclesResourceSynchronously() { @Test public void recycle_withForceNextFrame_postsRecycle() { Resource resource = mockResource(); - Shadows.shadowOf(Looper.getMainLooper()).pause(); + shadowOf(Looper.getMainLooper()).pause(); recycler.recycle(resource, /* forceNextFrame= */ true); verify(resource, never()).recycle(); - Shadows.shadowOf(Looper.getMainLooper()).runToEndOfTasks(); + shadowOf(Looper.getMainLooper()).runToEndOfTasks(); verify(resource).recycle(); } @@ -60,14 +60,14 @@ public Void answer(InvocationOnMock invocationOnMock) throws Throwable { .when(parent) .recycle(); - Shadows.shadowOf(Looper.getMainLooper()).pause(); + shadowOf(Looper.getMainLooper()).pause(); recycler.recycle(parent, /* forceNextFrame= */ false); verify(parent).recycle(); verify(child, never()).recycle(); - Shadows.shadowOf(Looper.getMainLooper()).runOneTask(); + shadowOf(Looper.getMainLooper()).runOneTask(); verify(child).recycle(); } diff --git a/library/test/src/test/java/com/bumptech/glide/load/engine/cache/MemorySizeCalculatorTest.java b/library/test/src/test/java/com/bumptech/glide/load/engine/cache/MemorySizeCalculatorTest.java index 67c4f20e2a..748c069d5a 100644 --- a/library/test/src/test/java/com/bumptech/glide/load/engine/cache/MemorySizeCalculatorTest.java +++ b/library/test/src/test/java/com/bumptech/glide/load/engine/cache/MemorySizeCalculatorTest.java @@ -1,5 +1,6 @@ package com.bumptech.glide.load.engine.cache; +import static com.bumptech.glide.testutil.CustomShadows.shadowOf; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -16,7 +17,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; -import org.robolectric.Shadows; import org.robolectric.annotation.Config; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; @@ -42,7 +42,7 @@ public void tearDown() { @Test public void testDefaultMemoryCacheSizeIsTwiceScreenSize() { - Shadows.shadowOf(harness.activityManager).setMemoryClass(getLargeEnoughMemoryClass()); + shadowOf(harness.activityManager).setMemoryClass(getLargeEnoughMemoryClass()); float memoryCacheSize = harness.getCalculator().getMemoryCacheSize(); @@ -52,7 +52,7 @@ public void testDefaultMemoryCacheSizeIsTwiceScreenSize() { @Test public void testCanSetCustomMemoryCacheSize() { harness.memoryCacheScreens = 9.5f; - Shadows.shadowOf(harness.activityManager).setMemoryClass(getLargeEnoughMemoryClass()); + shadowOf(harness.activityManager).setMemoryClass(getLargeEnoughMemoryClass()); float memoryCacheSize = harness.getCalculator().getMemoryCacheSize(); @@ -64,7 +64,7 @@ public void testDefaultMemoryCacheSizeIsLimitedByMemoryClass() { final int memoryClassBytes = Math.round(harness.getScreenSize() * harness.memoryCacheScreens * harness.sizeMultiplier); - Shadows.shadowOf(harness.activityManager).setMemoryClass(memoryClassBytes / (1024 * 1024)); + shadowOf(harness.activityManager).setMemoryClass(memoryClassBytes / (1024 * 1024)); float memoryCacheSize = harness.getCalculator().getMemoryCacheSize(); @@ -73,7 +73,7 @@ public void testDefaultMemoryCacheSizeIsLimitedByMemoryClass() { @Test public void testDefaultBitmapPoolSize() { - Shadows.shadowOf(harness.activityManager).setMemoryClass(getLargeEnoughMemoryClass()); + shadowOf(harness.activityManager).setMemoryClass(getLargeEnoughMemoryClass()); float bitmapPoolSize = harness.getCalculator().getBitmapPoolSize(); @@ -83,7 +83,7 @@ public void testDefaultBitmapPoolSize() { @Test public void testCanSetCustomBitmapPoolSize() { harness.bitmapPoolScreens = 2f; - Shadows.shadowOf(harness.activityManager).setMemoryClass(getLargeEnoughMemoryClass()); + shadowOf(harness.activityManager).setMemoryClass(getLargeEnoughMemoryClass()); float bitmapPoolSize = harness.getCalculator().getBitmapPoolSize(); @@ -95,7 +95,7 @@ public void testDefaultBitmapPoolSizeIsLimitedByMemoryClass() { final int memoryClassBytes = Math.round(harness.getScreenSize() * harness.bitmapPoolScreens * harness.sizeMultiplier); - Shadows.shadowOf(harness.activityManager).setMemoryClass(memoryClassBytes / (1024 * 1024)); + shadowOf(harness.activityManager).setMemoryClass(memoryClassBytes / (1024 * 1024)); int bitmapPoolSize = harness.getCalculator().getBitmapPoolSize(); @@ -110,7 +110,7 @@ public void testCumulativePoolAndMemoryCacheSizeAreLimitedByMemoryClass() { harness.getScreenSize() * (harness.bitmapPoolScreens + harness.memoryCacheScreens) * harness.sizeMultiplier); - Shadows.shadowOf(harness.activityManager).setMemoryClass(memoryClassBytes / (1024 * 1024)); + shadowOf(harness.activityManager).setMemoryClass(memoryClassBytes / (1024 * 1024)); int memoryCacheSize = harness.getCalculator().getMemoryCacheSize(); int bitmapPoolSize = harness.getCalculator().getBitmapPoolSize(); @@ -121,7 +121,7 @@ public void testCumulativePoolAndMemoryCacheSizeAreLimitedByMemoryClass() { @Test public void testCumulativePoolAndMemoryCacheSizesAreSmallerOnLowMemoryDevices() { - Shadows.shadowOf(harness.activityManager).setMemoryClass(getLargeEnoughMemoryClass() / 2); + shadowOf(harness.activityManager).setMemoryClass(getLargeEnoughMemoryClass() / 2); final int normalMemoryCacheSize = harness.getCalculator().getMemoryCacheSize(); final int normalBitmapPoolSize = harness.getCalculator().getBitmapPoolSize(); diff --git a/library/test/src/test/java/com/bumptech/glide/load/resource/bitmap/TransformationUtilsTest.java b/library/test/src/test/java/com/bumptech/glide/load/resource/bitmap/TransformationUtilsTest.java index 7e707c8db3..e9b07713b0 100644 --- a/library/test/src/test/java/com/bumptech/glide/load/resource/bitmap/TransformationUtilsTest.java +++ b/library/test/src/test/java/com/bumptech/glide/load/resource/bitmap/TransformationUtilsTest.java @@ -1,5 +1,6 @@ package com.bumptech.glide.load.resource.bitmap; +import static com.bumptech.glide.testutil.CustomShadows.shadowOf; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -28,7 +29,6 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; -import org.robolectric.Shadows; import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) @@ -366,7 +366,7 @@ public void testRotateImage() { assertThat(ninety.getPixel(1, 0)).isEqualTo(Color.BLUE); } else { // Use legacy shadow APIs - assertThat(Shadows.shadowOf(ninety).getDescription()).contains("rotate=90.0"); + assertThat(shadowOf(ninety).getDescription()).contains("rotate=90.0"); } assertEquals(toRotate.getWidth(), toRotate.getHeight()); } diff --git a/library/test/src/test/java/com/bumptech/glide/manager/DefaultConnectivityMonitorFactoryTest.java b/library/test/src/test/java/com/bumptech/glide/manager/DefaultConnectivityMonitorFactoryTest.java index 3d1a7b58a2..d0a19caae1 100644 --- a/library/test/src/test/java/com/bumptech/glide/manager/DefaultConnectivityMonitorFactoryTest.java +++ b/library/test/src/test/java/com/bumptech/glide/manager/DefaultConnectivityMonitorFactoryTest.java @@ -1,9 +1,9 @@ package com.bumptech.glide.manager; import static com.bumptech.glide.RobolectricConstants.ROBOLECTRIC_SDK; +import static com.bumptech.glide.testutil.CustomShadows.shadowOf; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.mock; -import static org.robolectric.Shadows.shadowOf; import android.app.Application; import androidx.test.core.app.ApplicationProvider; diff --git a/library/test/src/test/java/com/bumptech/glide/manager/DefaultConnectivityMonitorTest.java b/library/test/src/test/java/com/bumptech/glide/manager/DefaultConnectivityMonitorTest.java index b206eebf84..324cbacfdc 100644 --- a/library/test/src/test/java/com/bumptech/glide/manager/DefaultConnectivityMonitorTest.java +++ b/library/test/src/test/java/com/bumptech/glide/manager/DefaultConnectivityMonitorTest.java @@ -1,11 +1,11 @@ package com.bumptech.glide.manager; +import static com.bumptech.glide.testutil.CustomShadows.shadowOf; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; -import static org.robolectric.Shadows.shadowOf; import static org.robolectric.annotation.LooperMode.Mode.LEGACY; import android.app.Application; diff --git a/library/test/src/test/java/com/bumptech/glide/manager/RequestManagerRetrieverTest.java b/library/test/src/test/java/com/bumptech/glide/manager/RequestManagerRetrieverTest.java index 4e56768051..75cb28c895 100644 --- a/library/test/src/test/java/com/bumptech/glide/manager/RequestManagerRetrieverTest.java +++ b/library/test/src/test/java/com/bumptech/glide/manager/RequestManagerRetrieverTest.java @@ -2,10 +2,12 @@ import static com.bumptech.glide.RobolectricConstants.ROBOLECTRIC_SDK; import static com.bumptech.glide.tests.BackgroundUtil.testInBackground; +import static com.bumptech.glide.testutil.CustomShadows.shadowOf; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; import static org.robolectric.annotation.LooperMode.Mode.LEGACY; @@ -36,7 +38,6 @@ import org.mockito.Mockito; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; -import org.robolectric.Shadows; import org.robolectric.android.controller.ActivityController; import org.robolectric.annotation.Config; import org.robolectric.annotation.LooperMode; @@ -67,7 +68,7 @@ public void setUp() { public void tearDown() { Util.setSdkVersionInt(initialSdkVersion); - Shadows.shadowOf(Looper.getMainLooper()).runToEndOfTasks(); + shadowOf(Looper.getMainLooper()).runToEndOfTasks(); } @Test @@ -187,21 +188,21 @@ private void helpTestSupportCanGetRequestManagerFromDetachedFragment() { } @SuppressWarnings("deprecation") - @Test(expected = IllegalArgumentException.class) + @Test public void testThrowsIfFragmentNotAttached() { android.app.Fragment fragment = new android.app.Fragment(); - retriever.get(fragment); + assertThrows(IllegalArgumentException.class, () -> retriever.get(fragment)); } - @Test(expected = NullPointerException.class) + @Test public void testThrowsIfSupportFragmentNotAttached() { Fragment fragment = new Fragment(); - retriever.get(fragment); + assertThrows(NullPointerException.class, () -> retriever.get(fragment)); } - @Test(expected = IllegalArgumentException.class) + @Test public void testThrowsIfGivenNullContext() { - retriever.get((Context) null); + assertThrows(IllegalArgumentException.class, () -> retriever.get((Context) null)); } @Test @@ -276,7 +277,7 @@ public void testCanCallGetInOnAttachToWindowInFragmentInViewPager() { // to the main thread here to work around an issue caused by a recursive method call so we // need (and reasonably // expect) our message to not run immediately - Shadows.shadowOf(Looper.getMainLooper()).pause(); + shadowOf(Looper.getMainLooper()).pause(); Robolectric.buildActivity(Issue117Activity.class).create().start().resume().visible(); } @@ -308,7 +309,7 @@ public void testDoesNotThrowIfAskedToGetManagerForFragmentPreJellyBeanMr1() { @Test public void get_beforeActivityIsCreated_returnsSameRequestManagerAsAfterActivityIsCreated() { - ShadowLooper shadowLooper = Shadows.shadowOf(Looper.getMainLooper()); + ShadowLooper shadowLooper = shadowOf(Looper.getMainLooper()); shadowLooper.pause(); ActivityController controller = Robolectric.buildActivity(FragmentActivity.class); @@ -327,7 +328,7 @@ public void get_beforeActivityIsCreated_returnsSameRequestManagerAsAfterActivity @Test public void get_onDetachedFragment_returnsSameRequestManagerAsAfterFragmentIsAttached() { - ShadowLooper shadowLooper = Shadows.shadowOf(Looper.getMainLooper()); + ShadowLooper shadowLooper = shadowOf(Looper.getMainLooper()); shadowLooper.pause(); ActivityController controller = Robolectric.buildActivity(FragmentActivity.class); diff --git a/library/test/src/test/java/com/bumptech/glide/request/target/PreloadTargetTest.java b/library/test/src/test/java/com/bumptech/glide/request/target/PreloadTargetTest.java index cf94ccdbca..41adfafd0e 100644 --- a/library/test/src/test/java/com/bumptech/glide/request/target/PreloadTargetTest.java +++ b/library/test/src/test/java/com/bumptech/glide/request/target/PreloadTargetTest.java @@ -1,12 +1,12 @@ package com.bumptech.glide.request.target; import static com.bumptech.glide.RobolectricConstants.ROBOLECTRIC_SDK; +import static com.bumptech.glide.testutil.CustomShadows.shadowOf; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.robolectric.Shadows.shadowOf; import android.os.Looper; import com.bumptech.glide.RequestManager; diff --git a/library/test/src/test/java/com/bumptech/glide/request/target/ViewTargetTest.java b/library/test/src/test/java/com/bumptech/glide/request/target/ViewTargetTest.java index 31b113878d..a083e98f7c 100644 --- a/library/test/src/test/java/com/bumptech/glide/request/target/ViewTargetTest.java +++ b/library/test/src/test/java/com/bumptech/glide/request/target/ViewTargetTest.java @@ -1,6 +1,7 @@ package com.bumptech.glide.request.target; import static com.bumptech.glide.RobolectricConstants.ROBOLECTRIC_SDK; +import static com.bumptech.glide.testutil.CustomShadows.shadowOf; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; @@ -42,7 +43,6 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; -import org.robolectric.Shadows; import org.robolectric.annotation.Config; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; @@ -447,11 +447,11 @@ private void setDisplayDimens(Integer width, Integer height) { ApplicationProvider.getApplicationContext().getSystemService(Context.WINDOW_SERVICE); Display display = Preconditions.checkNotNull(windowManager).getDefaultDisplay(); if (width != null) { - Shadows.shadowOf(display).setWidth(width); + shadowOf(display).setWidth(width); } if (height != null) { - Shadows.shadowOf(display).setHeight(height); + shadowOf(display).setHeight(height); } } diff --git a/library/test/src/test/java/com/bumptech/glide/signature/AndroidResourceSignatureTest.java b/library/test/src/test/java/com/bumptech/glide/signature/AndroidResourceSignatureTest.java index 1a1155a659..df98a2bd41 100644 --- a/library/test/src/test/java/com/bumptech/glide/signature/AndroidResourceSignatureTest.java +++ b/library/test/src/test/java/com/bumptech/glide/signature/AndroidResourceSignatureTest.java @@ -1,5 +1,6 @@ package com.bumptech.glide.signature; +import static com.bumptech.glide.testutil.CustomShadows.shadowOf; import static org.junit.Assert.assertNotNull; import android.content.Context; @@ -13,7 +14,6 @@ import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; -import org.robolectric.Shadows; import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) @@ -68,7 +68,7 @@ public void testKeyForSignatureDiffersByNightMode() { @Test public void testMissingPackageInfo() throws NameNotFoundException { // Make getPackageInfo throw NameNotFoundException. - Shadows.shadowOf(context.getPackageManager()).removePackage(context.getPackageName()); + shadowOf(context.getPackageManager()).removePackage(context.getPackageName()); Key key = AndroidResourceSignature.obtain(context); assertNotNull(key); diff --git a/testutil/build.gradle.kts b/testutil/build.gradle.kts index 74f35e07c5..e21c3b29a2 100644 --- a/testutil/build.gradle.kts +++ b/testutil/build.gradle.kts @@ -1,29 +1,24 @@ -plugins { - id("com.android.library") -} +plugins { id("com.android.library") } android { - namespace = "com.bumptech.glide.testutil" - compileSdk = libs.versions.compile.sdk.version.get().toInt() + namespace = "com.bumptech.glide.testutil" + compileSdk = libs.versions.compile.sdk.version.get().toInt() - defaultConfig { - minSdk = libs.versions.min.sdk.version.get().toInt() - } + defaultConfig { minSdk = libs.versions.min.sdk.version.get().toInt() } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } } dependencies { - implementation(libs.truth) - implementation(project(":library")) - api(libs.androidx.annotation) - api(libs.androidx.core) - api(libs.androidx.test.core) + implementation(libs.truth) + implementation(project(":library")) + api(libs.androidx.annotation) + api(libs.androidx.core) + api(libs.androidx.test.core) + implementation(libs.robolectric) } -tasks.withType().configureEach { - exclude("**/google3/**") -} \ No newline at end of file +tasks.withType().configureEach { exclude("**/google3/**") } diff --git a/testutil/src/main/java/com/bumptech/glide/testutil/CustomShadows.java b/testutil/src/main/java/com/bumptech/glide/testutil/CustomShadows.java new file mode 100644 index 0000000000..c521cf04f4 --- /dev/null +++ b/testutil/src/main/java/com/bumptech/glide/testutil/CustomShadows.java @@ -0,0 +1,60 @@ +package com.bumptech.glide.testutil; + +import android.app.ActivityManager; +import android.content.ContentResolver; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.net.ConnectivityManager; +import android.os.Looper; +import android.view.Display; +import android.view.View; +import org.robolectric.shadow.api.Shadow; +import org.robolectric.shadows.ShadowActivityManager; +import org.robolectric.shadows.ShadowBitmap; +import org.robolectric.shadows.ShadowConnectivityManager; +import org.robolectric.shadows.ShadowContentResolver; +import org.robolectric.shadows.ShadowDisplay; +import org.robolectric.shadows.ShadowLooper; +import org.robolectric.shadows.ShadowPackageManager; +import org.robolectric.shadows.ShadowView; + +/** + * Custom shadows helper to avoid using {@link org.robolectric.Shadows} which references removed + * APIs (like FingerprintManager) and causes compilation failures. + */ +public final class CustomShadows { + + private CustomShadows() {} + + public static ShadowLooper shadowOf(Looper looper) { + return (ShadowLooper) Shadow.extract(looper); + } + + public static ShadowDisplay shadowOf(Display display) { + return (ShadowDisplay) Shadow.extract(display); + } + + public static ShadowView shadowOf(View view) { + return (ShadowView) Shadow.extract(view); + } + + public static ShadowActivityManager shadowOf(ActivityManager activityManager) { + return (ShadowActivityManager) Shadow.extract(activityManager); + } + + public static ShadowContentResolver shadowOf(ContentResolver contentResolver) { + return (ShadowContentResolver) Shadow.extract(contentResolver); + } + + public static ShadowBitmap shadowOf(Bitmap bitmap) { + return (ShadowBitmap) Shadow.extract(bitmap); + } + + public static ShadowPackageManager shadowOf(PackageManager packageManager) { + return (ShadowPackageManager) Shadow.extract(packageManager); + } + + public static ShadowConnectivityManager shadowOf(ConnectivityManager connectivityManager) { + return (ShadowConnectivityManager) Shadow.extract(connectivityManager); + } +} diff --git a/third_party/gif_decoder/src/test/java/com/bumptech/glide/gifdecoder/GifDecoderTest.java b/third_party/gif_decoder/src/test/java/com/bumptech/glide/gifdecoder/GifDecoderTest.java index ac9fadedac..802a017b2c 100644 --- a/third_party/gif_decoder/src/test/java/com/bumptech/glide/gifdecoder/GifDecoderTest.java +++ b/third_party/gif_decoder/src/test/java/com/bumptech/glide/gifdecoder/GifDecoderTest.java @@ -12,7 +12,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; -import org.robolectric.Shadows; import org.robolectric.annotation.Config; /** Tests for {@link com.bumptech.glide.gifdecoder.GifDecoder}. */ @@ -175,9 +174,7 @@ private static class MockProvider implements GifDecoder.BitmapProvider { @NonNull @Override public Bitmap obtain(int width, int height, Bitmap.Config config) { - Bitmap result = Bitmap.createBitmap(width, height, config); - Shadows.shadowOf(result).setMutable(true); - return result; + return Bitmap.createBitmap(width, height, config); } @Override