From 7a8a3dd15ed4964bab2c451eee64d7ef2d1d34d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Muller?= Date: Tue, 4 Mar 2025 09:35:58 +0100 Subject: [PATCH] Migrate Robolectric's deprecated code to the recommended alternatives - Add `:libraries:robolectric-base` to the list of Gradle modules to load. - Add missing jUnit dependency to `:libraries:robolectric-base`. - Replace `BuckRobolectricTestRunner#getAppManifest(Config)` with `BuckRobolectricTestRunner#getManifestFactory(Config)`. The former is no longer public, and the recommended alternative is to use a custom `ManifestFactory`. - Create `BuckManifestFactory` to provide custom information for the creation of `AndroidManifest`. --- libraries/robolectric-base/build.gradle | 1 + .../com/uber/okbuck/BuckManifestFactory.java | 47 +++++++++++++++++++ .../okbuck/BuckRobolectricTestRunner.java | 47 +++---------------- settings.gradle | 1 + 4 files changed, 55 insertions(+), 41 deletions(-) create mode 100644 libraries/robolectric-base/src/main/java/com/uber/okbuck/BuckManifestFactory.java diff --git a/libraries/robolectric-base/build.gradle b/libraries/robolectric-base/build.gradle index e1b7f796f..7d6e3ca20 100644 --- a/libraries/robolectric-base/build.gradle +++ b/libraries/robolectric-base/build.gradle @@ -2,4 +2,5 @@ apply plugin: "java-library" dependencies { implementation deps.test.robolectric + implementation deps.test.junit } diff --git a/libraries/robolectric-base/src/main/java/com/uber/okbuck/BuckManifestFactory.java b/libraries/robolectric-base/src/main/java/com/uber/okbuck/BuckManifestFactory.java new file mode 100644 index 000000000..c0571cb1f --- /dev/null +++ b/libraries/robolectric-base/src/main/java/com/uber/okbuck/BuckManifestFactory.java @@ -0,0 +1,47 @@ +package com.uber.okbuck; + +import org.robolectric.annotation.Config; +import org.robolectric.internal.ManifestFactory; +import org.robolectric.internal.ManifestIdentifier; +import org.robolectric.res.Fs; + +import java.io.File; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.ListIterator; +import java.util.Set; + +public class BuckManifestFactory implements ManifestFactory { + + private final String buckManifest; + private final String buckResourcesProperty; + + public BuckManifestFactory(String buckManifest, String buckResourcesProperty) { + this.buckManifest = buckManifest; + this.buckResourcesProperty = buckResourcesProperty; + } + + @Override + public ManifestIdentifier identify(Config config) { + final List buckResources = + Arrays.asList(buckResourcesProperty.split(File.pathSeparator)); + + final String packageName = config.packageName(); + final Path res = Fs.fromUrl(buckResources.get(buckResources.size() - 1)); + final Path assets = Fs.fromUrl(buckResources.get(buckResources.size() - 1)); + final Path manifest = Fs.fromUrl(buckManifest); + + final Set libraries = new LinkedHashSet<>(); + ListIterator it = buckResources.listIterator(buckResources.size()); + while (it.hasPrevious()) { + libraries.add(new ManifestIdentifier(packageName, manifest, Fs.fromUrl(it.previous()), assets, + Collections.emptyList())); + } + + return new ManifestIdentifier(packageName, manifest, res, assets, new ArrayList<>(libraries)); + } +} diff --git a/libraries/robolectric-base/src/main/java/com/uber/okbuck/BuckRobolectricTestRunner.java b/libraries/robolectric-base/src/main/java/com/uber/okbuck/BuckRobolectricTestRunner.java index 187d5ced6..2aadc5abb 100644 --- a/libraries/robolectric-base/src/main/java/com/uber/okbuck/BuckRobolectricTestRunner.java +++ b/libraries/robolectric-base/src/main/java/com/uber/okbuck/BuckRobolectricTestRunner.java @@ -1,24 +1,14 @@ package com.uber.okbuck; -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.ListIterator; import org.junit.runners.model.InitializationError; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; -import org.robolectric.manifest.AndroidManifest; -import org.robolectric.res.Fs; -import org.robolectric.res.FsFile; -import org.robolectric.res.ResourcePath; +import org.robolectric.internal.ManifestFactory; /** * The example test runner only runs robolectric tests with buck. If you want to run unit tests with * both gradle and buck, you can use the example test runner and create a hybrid with robolectric's - * {@link org.robolectric.RobolectricGradleTestRunner}. + * {@link org.robolectric.RobolectricTestRunner}. */ public class BuckRobolectricTestRunner extends RobolectricTestRunner { @@ -30,39 +20,14 @@ public BuckRobolectricTestRunner(Class testClass) throws InitializationError } @Override - protected AndroidManifest getAppManifest(Config config) { + protected ManifestFactory getManifestFactory(Config config) { String buckManifest = System.getProperty(ROBOLECTRIC_MANIFEST); String buckResourcesProperty = System.getProperty(ROBOLECTRIC_RESOURCE_DIRECTORIES); if (buckManifest != null && buckResourcesProperty != null) { - final List buckResources = - Arrays.asList(buckResourcesProperty.split(File.pathSeparator)); - - final FsFile res = Fs.fileFromPath(buckResources.get(buckResources.size() - 1)); - final FsFile assets = Fs.fileFromPath(buckResources.get(buckResources.size() - 1)); - final FsFile manifest = Fs.fileFromPath(buckManifest); - - return new AndroidManifest(manifest, res, assets, config.packageName()) { - - @Override - public List getIncludedResourcePaths() { - Collection resourcePaths = new LinkedHashSet<>(); - resourcePaths.add(super.getResourcePath()); - - ListIterator it = buckResources.listIterator(buckResources.size()); - while (it.hasPrevious()) { - resourcePaths.add( - new ResourcePath( - getRClass(), - getPackageName(), - Fs.fileFromPath(it.previous()), - getAssetsDirectory())); - } - return new ArrayList<>(resourcePaths); - } - }; - } else { - return null; + return new BuckManifestFactory(buckManifest, buckResourcesProperty); } + + return super.getManifestFactory(config); } } diff --git a/settings.gradle b/settings.gradle index 556a9ffb7..efd85414c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -14,6 +14,7 @@ include "libraries:kotlinandroidlibrary" include "libraries:kotlinlibrary" include "libraries:lintErrorLibrary" include "libraries:parcelable" +include "libraries:robolectric-base" include "libraries:scalalibrary" include "manifest-merger-cli" include "plugin"