aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGoogler <noreply@google.com>2024-04-02 13:12:28 -0700
committerCopybara-Service <copybara-worker@google.com>2024-04-02 13:13:21 -0700
commit36c75fb8a7c511b00def718ae4d7df0c562a52b8 (patch)
tree3abc44424eda9c90f938e16b6c7a19716e834d65
parent4e4c42736629db94c1f9abddb0f8fae3c0f9477b (diff)
downloadrobolectric-36c75fb8a7c511b00def718ae4d7df0c562a52b8.tar.gz
Move AndroidVersions to annotations sub project and always read build.prop directly.
Due to lazy application loading being capable of changing runtime version detection via ShadowBuild. PiperOrigin-RevId: 621272794
-rw-r--r--annotations/build.gradle6
-rw-r--r--annotations/src/main/java/org/robolectric/versioning/AndroidVersionInitTools.java (renamed from shadows/versioning/src/main/java/org/robolectric/versioning/AndroidVersionInitTools.java)0
-rw-r--r--annotations/src/main/java/org/robolectric/versioning/AndroidVersions.java (renamed from shadows/versioning/src/main/java/org/robolectric/versioning/AndroidVersions.java)497
-rw-r--r--annotations/src/test/java/org/robolectric/versioning/AndroidVersionsEdgeCaseTest.java (renamed from shadows/versioning/src/test/java/org/robolectric/versioning/AndroidVersionsEdgeCaseTest.java)0
-rw-r--r--annotations/src/test/java/org/robolectric/versioning/AndroidVersionsTest.java169
-rw-r--r--integration_tests/versioning/build.gradle (renamed from shadows/versioning/build.gradle)1
-rw-r--r--integration_tests/versioning/src/test/java/org/robolectric/versioning/AndroidVersionsTest.java (renamed from shadows/versioning/src/test/java/org/robolectric/versioning/AndroidVersionsTest.java)69
-rw-r--r--integration_tests/versioning/src/test/resources/AndroidManifest.xml (renamed from shadows/versioning/src/test/resources/AndroidManifest.xml)0
-rw-r--r--preinstrumented/build.gradle1
-rw-r--r--processor/build.gradle1
-rw-r--r--shadows/framework/build.gradle1
11 files changed, 572 insertions, 173 deletions
diff --git a/annotations/build.gradle b/annotations/build.gradle
index d8bd113c5..c26efdb25 100644
--- a/annotations/build.gradle
+++ b/annotations/build.gradle
@@ -6,5 +6,11 @@ apply plugin: DeployedRoboJavaModulePlugin
dependencies {
compileOnly libs.findbugs.jsr305
+ compileOnly libs.javax.annotation.api
compileOnly AndroidSdk.MAX_SDK.coordinates
+ testImplementation libs.truth
+ testImplementation libs.junit4
+ testImplementation libs.javax.annotation.api
+ testCompileOnly AndroidSdk.MAX_SDK.coordinates // compile against latest Android SDK
+ testRuntimeOnly AndroidSdk.MAX_SDK.coordinates // run against whatever this JDK supports
}
diff --git a/shadows/versioning/src/main/java/org/robolectric/versioning/AndroidVersionInitTools.java b/annotations/src/main/java/org/robolectric/versioning/AndroidVersionInitTools.java
index 316365b39..316365b39 100644
--- a/shadows/versioning/src/main/java/org/robolectric/versioning/AndroidVersionInitTools.java
+++ b/annotations/src/main/java/org/robolectric/versioning/AndroidVersionInitTools.java
diff --git a/shadows/versioning/src/main/java/org/robolectric/versioning/AndroidVersions.java b/annotations/src/main/java/org/robolectric/versioning/AndroidVersions.java
index e5431eb97..71cc48042 100644
--- a/shadows/versioning/src/main/java/org/robolectric/versioning/AndroidVersions.java
+++ b/annotations/src/main/java/org/robolectric/versioning/AndroidVersions.java
@@ -19,7 +19,7 @@ package org.robolectric.versioning;
import static java.util.Arrays.asList;
import java.io.IOException;
-import java.lang.reflect.Field;
+import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.util.AbstractMap;
@@ -29,12 +29,11 @@ import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.Objects;
import java.util.Properties;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
import javax.annotation.Nullable;
-import org.robolectric.util.Logger;
-import org.robolectric.util.ReflectionHelpers;
/**
* Android versioning is complicated.<br>
@@ -63,17 +62,13 @@ public final class AndroidVersions {
* true if this release has already occurred, false otherwise. If unreleased, the getSdkInt may
* still be that of the prior release.
*/
- public int getSdkInt() {
- return ReflectionHelpers.getStaticField(this.getClass(), "SDK_INT");
- }
+ public abstract int getSdkInt();
/**
* single character short code for the release, multiple characters for minor releases (only
* minor version numbers increment - usually within the same year).
*/
- public String getShortCode() {
- return ReflectionHelpers.getStaticField(this.getClass(), "SHORT_CODE");
- }
+ public abstract String getShortCode();
/**
* true if this release has already occurred, false otherwise. If unreleased, the getSdkInt will
@@ -81,26 +76,22 @@ public final class AndroidVersions {
* including most modern build tools; bazle, soong all are full build systems - and as such
* organizations using them have no concerns.
*/
- public boolean isReleased() {
- return ReflectionHelpers.getStaticField(this.getClass(), "RELEASED");
- }
+ public abstract boolean isReleased();
/** major.minor version number as String. */
- public String getVersion() {
- return ReflectionHelpers.getStaticField(this.getClass(), "VERSION");
- }
+ public abstract String getVersion();
/**
* Implements comparable.
*
* @param other the object to be compared.
* @return 1 if this is greater than other, 0 if equal, -1 if less
- * @throws RuntimeException if other is not an instance of AndroidRelease.
+ * @throws IllegalStateException if other is not an instance of AndroidRelease.
*/
@Override
public int compareTo(AndroidRelease other) {
if (other == null) {
- throw new RuntimeException(
+ throw new IllegalStateException(
"Only "
+ AndroidVersions.class.getName()
+ " should define Releases, illegal class "
@@ -123,21 +114,80 @@ public final class AndroidVersions {
}
}
+ /** A released version of Android */
+ public abstract static class AndroidReleased extends AndroidRelease {
+ @Override
+ public boolean isReleased() {
+ return true;
+ }
+ }
+
+ /** An in-development version of Android */
+ public abstract static class AndroidUnreleased extends AndroidRelease {
+ @Override
+ public boolean isReleased() {
+ return false;
+ }
+ }
+
+ /**
+ * Version: -1 <br>
+ * ShortCode: "" <br>
+ * SDK API Level: "" <br>
+ * release: false <br>
+ */
+ public static final class Unbound extends AndroidUnreleased {
+
+ public static final int SDK_INT = -1;
+
+ public static final String SHORT_CODE = "_";
+
+ public static final String VERSION = "_";
+
+ @Override
+ public int getSdkInt() {
+ return SDK_INT;
+ }
+
+ @Override
+ public String getShortCode() {
+ return SHORT_CODE;
+ }
+
+ @Override
+ public String getVersion() {
+ return VERSION;
+ }
+ }
+
/**
* Version: 4.1 <br>
* ShortCode: J <br>
* SDK API Level: 16 <br>
* release: true <br>
*/
- public static final class J extends AndroidRelease {
+ public static final class J extends AndroidReleased {
public static final int SDK_INT = 16;
- public static final boolean RELEASED = true;
-
public static final String SHORT_CODE = "J";
public static final String VERSION = "4.1";
+
+ @Override
+ public int getSdkInt() {
+ return SDK_INT;
+ }
+
+ @Override
+ public String getShortCode() {
+ return SHORT_CODE;
+ }
+
+ @Override
+ public String getVersion() {
+ return VERSION;
+ }
}
/**
@@ -146,15 +196,28 @@ public final class AndroidVersions {
* SDK API Level: 17 <br>
* release: true <br>
*/
- public static final class JMR1 extends AndroidRelease {
+ public static final class JMR1 extends AndroidReleased {
public static final int SDK_INT = 17;
- public static final boolean RELEASED = true;
-
public static final String SHORT_CODE = "JMR1";
public static final String VERSION = "4.2";
+
+ @Override
+ public int getSdkInt() {
+ return SDK_INT;
+ }
+
+ @Override
+ public String getShortCode() {
+ return SHORT_CODE;
+ }
+
+ @Override
+ public String getVersion() {
+ return VERSION;
+ }
}
/**
@@ -163,15 +226,28 @@ public final class AndroidVersions {
* SDK API Level: 18 <br>
* release: true <br>
*/
- public static final class JMR2 extends AndroidRelease {
+ public static final class JMR2 extends AndroidReleased {
public static final int SDK_INT = 18;
- public static final boolean RELEASED = true;
-
public static final String SHORT_CODE = "JMR2";
public static final String VERSION = "4.3";
+
+ @Override
+ public int getSdkInt() {
+ return SDK_INT;
+ }
+
+ @Override
+ public String getShortCode() {
+ return SHORT_CODE;
+ }
+
+ @Override
+ public String getVersion() {
+ return VERSION;
+ }
}
/**
@@ -180,15 +256,28 @@ public final class AndroidVersions {
* SDK API Level: 19 <br>
* release: true <br>
*/
- public static final class K extends AndroidRelease {
+ public static final class K extends AndroidReleased {
public static final int SDK_INT = 19;
- public static final boolean RELEASED = true;
-
public static final String SHORT_CODE = "K";
public static final String VERSION = "4.4";
+
+ @Override
+ public int getSdkInt() {
+ return SDK_INT;
+ }
+
+ @Override
+ public String getShortCode() {
+ return SHORT_CODE;
+ }
+
+ @Override
+ public String getVersion() {
+ return VERSION;
+ }
}
// Skipping K Watch release, which was 20.
@@ -199,15 +288,28 @@ public final class AndroidVersions {
* SDK API Level: 21 <br>
* release: true <br>
*/
- public static final class L extends AndroidRelease {
+ public static final class L extends AndroidReleased {
public static final int SDK_INT = 21;
- public static final boolean RELEASED = true;
-
public static final String SHORT_CODE = "L";
public static final String VERSION = "5.0";
+
+ @Override
+ public int getSdkInt() {
+ return SDK_INT;
+ }
+
+ @Override
+ public String getShortCode() {
+ return SHORT_CODE;
+ }
+
+ @Override
+ public String getVersion() {
+ return VERSION;
+ }
}
/**
@@ -216,15 +318,28 @@ public final class AndroidVersions {
* SDK API Level: 22 <br>
* release: true <br>
*/
- public static final class LMR1 extends AndroidRelease {
+ public static final class LMR1 extends AndroidReleased {
public static final int SDK_INT = 22;
- public static final boolean RELEASED = true;
-
public static final String SHORT_CODE = "LMR1";
public static final String VERSION = "5.1";
+
+ @Override
+ public int getSdkInt() {
+ return SDK_INT;
+ }
+
+ @Override
+ public String getShortCode() {
+ return SHORT_CODE;
+ }
+
+ @Override
+ public String getVersion() {
+ return VERSION;
+ }
}
/**
@@ -233,15 +348,28 @@ public final class AndroidVersions {
* SDK API Level: 23 <br>
* release: true <br>
*/
- public static final class M extends AndroidRelease {
+ public static final class M extends AndroidReleased {
public static final int SDK_INT = 23;
- public static final boolean RELEASED = true;
-
public static final String SHORT_CODE = "M";
public static final String VERSION = "6.0";
+
+ @Override
+ public int getSdkInt() {
+ return SDK_INT;
+ }
+
+ @Override
+ public String getShortCode() {
+ return SHORT_CODE;
+ }
+
+ @Override
+ public String getVersion() {
+ return VERSION;
+ }
}
/**
@@ -250,15 +378,28 @@ public final class AndroidVersions {
* SDK API Level: 24 <br>
* release: true <br>
*/
- public static final class N extends AndroidRelease {
+ public static final class N extends AndroidReleased {
public static final int SDK_INT = 24;
- public static final boolean RELEASED = true;
-
public static final String SHORT_CODE = "N";
public static final String VERSION = "7.0";
+
+ @Override
+ public int getSdkInt() {
+ return SDK_INT;
+ }
+
+ @Override
+ public String getShortCode() {
+ return SHORT_CODE;
+ }
+
+ @Override
+ public String getVersion() {
+ return VERSION;
+ }
}
/**
@@ -267,15 +408,28 @@ public final class AndroidVersions {
* SDK Framework: 25 <br>
* release: true <br>
*/
- public static final class NMR1 extends AndroidRelease {
+ public static final class NMR1 extends AndroidReleased {
public static final int SDK_INT = 25;
- public static final boolean RELEASED = true;
-
public static final String SHORT_CODE = "NMR1";
- private static final String VERSION = "7.1";
+ public static final String VERSION = "7.1";
+
+ @Override
+ public int getSdkInt() {
+ return SDK_INT;
+ }
+
+ @Override
+ public String getShortCode() {
+ return SHORT_CODE;
+ }
+
+ @Override
+ public String getVersion() {
+ return VERSION;
+ }
}
/**
@@ -284,15 +438,28 @@ public final class AndroidVersions {
* SDK API Level: 26 <br>
* release: true <br>
*/
- public static final class O extends AndroidRelease {
+ public static final class O extends AndroidReleased {
public static final int SDK_INT = 26;
- public static final boolean RELEASED = true;
-
public static final String SHORT_CODE = "O";
public static final String VERSION = "8.0";
+
+ @Override
+ public int getSdkInt() {
+ return SDK_INT;
+ }
+
+ @Override
+ public String getShortCode() {
+ return SHORT_CODE;
+ }
+
+ @Override
+ public String getVersion() {
+ return VERSION;
+ }
}
/**
@@ -301,15 +468,28 @@ public final class AndroidVersions {
* SDK API Level: 27 <br>
* release: true <br>
*/
- public static final class OMR1 extends AndroidRelease {
+ public static final class OMR1 extends AndroidReleased {
public static final int SDK_INT = 27;
- public static final boolean RELEASED = true;
-
public static final String SHORT_CODE = "OMR1";
public static final String VERSION = "8.1";
+
+ @Override
+ public int getSdkInt() {
+ return SDK_INT;
+ }
+
+ @Override
+ public String getShortCode() {
+ return SHORT_CODE;
+ }
+
+ @Override
+ public String getVersion() {
+ return VERSION;
+ }
}
/**
@@ -318,15 +498,28 @@ public final class AndroidVersions {
* SDK API Level: 28 <br>
* release: true <br>
*/
- public static final class P extends AndroidRelease {
+ public static final class P extends AndroidReleased {
public static final int SDK_INT = 28;
- public static final boolean RELEASED = true;
-
public static final String SHORT_CODE = "P";
public static final String VERSION = "9.0";
+
+ @Override
+ public int getSdkInt() {
+ return SDK_INT;
+ }
+
+ @Override
+ public String getShortCode() {
+ return SHORT_CODE;
+ }
+
+ @Override
+ public String getVersion() {
+ return VERSION;
+ }
}
/**
@@ -335,15 +528,28 @@ public final class AndroidVersions {
* SDK API Level: 29 <br>
* release: true <br>
*/
- public static final class Q extends AndroidRelease {
+ public static final class Q extends AndroidReleased {
public static final int SDK_INT = 29;
- public static final boolean RELEASED = true;
-
public static final String SHORT_CODE = "Q";
public static final String VERSION = "10.0";
+
+ @Override
+ public int getSdkInt() {
+ return SDK_INT;
+ }
+
+ @Override
+ public String getShortCode() {
+ return SHORT_CODE;
+ }
+
+ @Override
+ public String getVersion() {
+ return VERSION;
+ }
}
/**
@@ -352,15 +558,28 @@ public final class AndroidVersions {
* SDK API Level: 30 <br>
* release: true <br>
*/
- public static final class R extends AndroidRelease {
+ public static final class R extends AndroidReleased {
public static final int SDK_INT = 30;
- public static final boolean RELEASED = true;
-
public static final String SHORT_CODE = "R";
public static final String VERSION = "11.0";
+
+ @Override
+ public int getSdkInt() {
+ return SDK_INT;
+ }
+
+ @Override
+ public String getShortCode() {
+ return SHORT_CODE;
+ }
+
+ @Override
+ public String getVersion() {
+ return VERSION;
+ }
}
/**
@@ -369,15 +588,28 @@ public final class AndroidVersions {
* SDK API Level: 31 <br>
* release: true <br>
*/
- public static final class S extends AndroidRelease {
+ public static final class S extends AndroidReleased {
public static final int SDK_INT = 31;
- public static final boolean RELEASED = true;
-
public static final String SHORT_CODE = "S";
public static final String VERSION = "12.0";
+
+ @Override
+ public int getSdkInt() {
+ return SDK_INT;
+ }
+
+ @Override
+ public String getShortCode() {
+ return SHORT_CODE;
+ }
+
+ @Override
+ public String getVersion() {
+ return VERSION;
+ }
}
/**
@@ -387,15 +619,28 @@ public final class AndroidVersions {
* release: true <br>
*/
@SuppressWarnings("UPPER_SNAKE_CASE")
- public static final class Sv2 extends AndroidRelease {
+ public static final class Sv2 extends AndroidReleased {
public static final int SDK_INT = 32;
- public static final boolean RELEASED = true;
-
public static final String SHORT_CODE = "Sv2";
public static final String VERSION = "12.1";
+
+ @Override
+ public int getSdkInt() {
+ return SDK_INT;
+ }
+
+ @Override
+ public String getShortCode() {
+ return SHORT_CODE;
+ }
+
+ @Override
+ public String getVersion() {
+ return VERSION;
+ }
}
/**
@@ -404,15 +649,28 @@ public final class AndroidVersions {
* SDK API Level: 33 <br>
* release: true <br>
*/
- public static final class T extends AndroidRelease {
+ public static final class T extends AndroidReleased {
public static final int SDK_INT = 33;
- public static final boolean RELEASED = true;
-
public static final String SHORT_CODE = "T";
public static final String VERSION = "13.0";
+
+ @Override
+ public int getSdkInt() {
+ return SDK_INT;
+ }
+
+ @Override
+ public String getShortCode() {
+ return SHORT_CODE;
+ }
+
+ @Override
+ public String getVersion() {
+ return VERSION;
+ }
}
/**
@@ -421,15 +679,28 @@ public final class AndroidVersions {
* SDK API Level: 34 <br>
* release: false <br>
*/
- public static final class U extends AndroidRelease {
+ public static final class U extends AndroidReleased {
public static final int SDK_INT = 34;
- public static final boolean RELEASED = true;
-
public static final String SHORT_CODE = "U";
public static final String VERSION = "14.0";
+
+ @Override
+ public int getSdkInt() {
+ return SDK_INT;
+ }
+
+ @Override
+ public String getShortCode() {
+ return SHORT_CODE;
+ }
+
+ @Override
+ public String getVersion() {
+ return VERSION;
+ }
}
/**
@@ -438,15 +709,28 @@ public final class AndroidVersions {
* SDK API Level: 34+ <br>
* release: false <br>
*/
- public static final class V extends AndroidRelease {
+ public static final class V extends AndroidUnreleased {
public static final int SDK_INT = 35;
- public static final boolean RELEASED = false;
-
public static final String SHORT_CODE = "V";
public static final String VERSION = "15";
+
+ @Override
+ public int getSdkInt() {
+ return SDK_INT;
+ }
+
+ @Override
+ public String getShortCode() {
+ return SHORT_CODE;
+ }
+
+ @Override
+ public String getVersion() {
+ return VERSION;
+ }
}
/** The current release this process is running on. */
@@ -574,7 +858,7 @@ public final class AndroidVersions {
}
}
if (errors.length() > 0) {
- throw new RuntimeException(
+ throw new IllegalStateException(
errors
.append("Please check the AndroidReleases defined ")
.append("in ")
@@ -587,18 +871,13 @@ public final class AndroidVersions {
public AndroidRelease computeCurrentSdk(
int reportedVersion, String releaseName, String codename, List<String> activeCodeNames) {
- Logger.info("Reported Version: " + reportedVersion);
- Logger.info("Release Name: " + releaseName);
- Logger.info("Code Name: " + codename);
- Logger.info("Active Code Names: " + String.join(",", activeCodeNames));
-
AndroidRelease current = null;
// Special case "REL", which means the build is not a pre-release build.
- if ("REL".equals(codename)) {
+ if (Objects.equals(codename, "REL")) {
// the first letter of the code name equal to the release number.
current = sdkIntToAllReleases.get(reportedVersion);
if (current != null && !current.isReleased()) {
- throw new RuntimeException(
+ throw new IllegalStateException(
"The current sdk "
+ current.getShortCode()
+ " has been released. Please update the contents of "
@@ -657,7 +936,7 @@ public final class AndroidVersions {
.append("contents of current sdk jar to the released version.\n");
}
if (detectedProblems.length() > 0) {
- throw new RuntimeException(detectedProblems.toString());
+ throw new IllegalStateException(detectedProblems.toString());
}
}
}
@@ -670,7 +949,7 @@ public final class AndroidVersions {
* the shortCode, sdkInt, and release information.
*
* <p>All errors are stored and can be reported at once by asking the SdkInformation to throw a
- * runtime exception after it has been populated.
+ * IllegalStateException after it has been populated.
*/
static SdkInformation gatherStaticSdkInformationFromThisClass() {
List<AndroidRelease> allReleases = new ArrayList<>();
@@ -678,7 +957,8 @@ public final class AndroidVersions {
for (Class<?> clazz : AndroidVersions.class.getClasses()) {
if (AndroidRelease.class.isAssignableFrom(clazz)
&& !clazz.isInterface()
- && !Modifier.isAbstract(clazz.getModifiers())) {
+ && !Modifier.isAbstract(clazz.getModifiers())
+ && clazz != Unbound.class) {
try {
AndroidRelease rel = (AndroidRelease) clazz.getDeclaredConstructor().newInstance();
allReleases.add(rel);
@@ -691,7 +971,7 @@ public final class AndroidVersions {
| IllegalArgumentException
| IllegalAccessException
| InvocationTargetException ex) {
- throw new RuntimeException(
+ throw new IllegalStateException(
"Classes "
+ clazz.getName()
+ "should be accessible via "
@@ -731,50 +1011,19 @@ public final class AndroidVersions {
return information.computeCurrentSdk(sdk, release, codename, asList(activeCodeNames));
}
- /**
- * If we are working in android source, this code detects the list of active code names if any.
- */
- private static List<String> getActiveCodeNamesIfAny(Class<?> targetClass) {
- try {
- Field activeCodeFields = targetClass.getDeclaredField("ACTIVE_CODENAMES");
- String[] activeCodeNames = (String[]) activeCodeFields.get(null);
- if (activeCodeNames == null) {
- return new ArrayList<>();
- }
- return asList(activeCodeNames);
- } catch (NoSuchFieldException | IllegalAccessException | IllegalArgumentException ex) {
- return new ArrayList<>();
- }
- }
-
private static final SdkInformation information;
static {
AndroidRelease currentRelease = null;
information = gatherStaticSdkInformationFromThisClass();
try {
- Class<?> buildClass =
- Class.forName("android.os.Build", false, Thread.currentThread().getContextClassLoader());
- System.out.println("build class " + buildClass);
- Class<?> versionClass = null;
- for (Class<?> c : buildClass.getClasses()) {
- if (c.getSimpleName().equals("VERSION")) {
- versionClass = c;
- System.out.println("Version class " + versionClass);
- break;
- }
- }
- if (versionClass != null) {
- // 33, 34, etc....
- int sdkInt = (int) ReflectionHelpers.getStaticField(versionClass, "SDK_INT");
- // Either unset, or 13, 14, etc....
- String release = ReflectionHelpers.getStaticField(versionClass, "RELEASE");
- // Either REL if release is set, or Tiramasu, UpsideDownCake, etc
- String codename = ReflectionHelpers.getStaticField(versionClass, "CODENAME");
- List<String> activeCodeNames = getActiveCodeNamesIfAny(versionClass);
- currentRelease = information.computeCurrentSdk(sdkInt, release, codename, activeCodeNames);
+ InputStream is = AndroidVersions.class.getClassLoader().getResourceAsStream("build.prop");
+ if (is != null) {
+ Properties buildProps = new Properties();
+ buildProps.load(is);
+ currentRelease = computeCurrentSdkFromBuildProps(buildProps);
}
- } catch (ClassNotFoundException | IllegalArgumentException | UnsatisfiedLinkError e) {
+ } catch (IOException ioe) {
// No op, this class should be usable outside of a Robolectric sandbox.
}
CURRENT = currentRelease;
diff --git a/shadows/versioning/src/test/java/org/robolectric/versioning/AndroidVersionsEdgeCaseTest.java b/annotations/src/test/java/org/robolectric/versioning/AndroidVersionsEdgeCaseTest.java
index 95b2c4266..95b2c4266 100644
--- a/shadows/versioning/src/test/java/org/robolectric/versioning/AndroidVersionsEdgeCaseTest.java
+++ b/annotations/src/test/java/org/robolectric/versioning/AndroidVersionsEdgeCaseTest.java
diff --git a/annotations/src/test/java/org/robolectric/versioning/AndroidVersionsTest.java b/annotations/src/test/java/org/robolectric/versioning/AndroidVersionsTest.java
new file mode 100644
index 000000000..670e695a3
--- /dev/null
+++ b/annotations/src/test/java/org/robolectric/versioning/AndroidVersionsTest.java
@@ -0,0 +1,169 @@
+package org.robolectric.versioning;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Check versions information aligns with runtime information. Primarily, selected SDK with
+ * internally detected version number.
+ */
+@RunWith(JUnit4.class)
+public final class AndroidVersionsTest {
+
+ @Test
+ public void testStandardInitializationT() {
+ assertThat(AndroidVersions.T.SDK_INT).isEqualTo(33);
+ assertThat(AndroidVersions.T.SHORT_CODE).isEqualTo("T");
+ assertThat(AndroidVersions.T.VERSION).isEqualTo("13.0");
+ assertThat(new AndroidVersions.T().getSdkInt()).isEqualTo(33);
+ assertThat(new AndroidVersions.T().getShortCode()).isEqualTo("T");
+ assertThat(new AndroidVersions.T().getVersion()).isEqualTo("13.0");
+ assertThat(new AndroidVersions.T().isReleased()).isEqualTo(true);
+ }
+
+ @Test
+ public void testStandardInitializationSv2() {
+ assertThat(AndroidVersions.Sv2.SDK_INT).isEqualTo(32);
+ assertThat(AndroidVersions.Sv2.SHORT_CODE).isEqualTo("Sv2");
+ assertThat(AndroidVersions.Sv2.VERSION).isEqualTo("12.1");
+ assertThat(new AndroidVersions.Sv2().getSdkInt()).isEqualTo(32);
+ assertThat(new AndroidVersions.Sv2().getShortCode()).isEqualTo("Sv2");
+ assertThat(new AndroidVersions.Sv2().getVersion()).isEqualTo("12.1");
+ assertThat(new AndroidVersions.Sv2().isReleased()).isEqualTo(true);
+ }
+
+ @Test
+ public void testStandardInitializationS() {
+ assertThat(AndroidVersions.S.SDK_INT).isEqualTo(31);
+ assertThat(AndroidVersions.S.SHORT_CODE).isEqualTo("S");
+ assertThat(AndroidVersions.S.VERSION).isEqualTo("12.0");
+ assertThat(new AndroidVersions.S().getSdkInt()).isEqualTo(31);
+ assertThat(new AndroidVersions.S().getShortCode()).isEqualTo("S");
+ assertThat(new AndroidVersions.S().getVersion()).isEqualTo("12.0");
+ assertThat(new AndroidVersions.S().isReleased()).isEqualTo(true);
+ }
+
+ @Test
+ public void testStandardInitializationR() {
+ assertThat(AndroidVersions.R.SDK_INT).isEqualTo(30);
+ assertThat(AndroidVersions.R.SHORT_CODE).isEqualTo("R");
+ assertThat(AndroidVersions.R.VERSION).isEqualTo("11.0");
+ assertThat(new AndroidVersions.R().getSdkInt()).isEqualTo(30);
+ assertThat(new AndroidVersions.R().getShortCode()).isEqualTo("R");
+ assertThat(new AndroidVersions.R().getVersion()).isEqualTo("11.0");
+ assertThat(new AndroidVersions.R().isReleased()).isEqualTo(true);
+ }
+
+ @Test
+ public void testStandardInitializationQ() {
+ assertThat(AndroidVersions.Q.SDK_INT).isEqualTo(29);
+ assertThat(AndroidVersions.Q.SHORT_CODE).isEqualTo("Q");
+ assertThat(AndroidVersions.Q.VERSION).isEqualTo("10.0");
+ assertThat(new AndroidVersions.Q().getSdkInt()).isEqualTo(29);
+ assertThat(new AndroidVersions.Q().getShortCode()).isEqualTo("Q");
+ assertThat(new AndroidVersions.Q().getVersion()).isEqualTo("10.0");
+ assertThat(new AndroidVersions.Q().isReleased()).isEqualTo(true);
+ }
+
+ @Test
+ public void testStandardInitializationP() {
+ assertThat(AndroidVersions.P.SDK_INT).isEqualTo(28);
+ assertThat(AndroidVersions.P.SHORT_CODE).isEqualTo("P");
+ assertThat(AndroidVersions.P.VERSION).isEqualTo("9.0");
+ assertThat(new AndroidVersions.P().getSdkInt()).isEqualTo(28);
+ assertThat(new AndroidVersions.P().getShortCode()).isEqualTo("P");
+ assertThat(new AndroidVersions.P().getVersion()).isEqualTo("9.0");
+ assertThat(new AndroidVersions.P().isReleased()).isEqualTo(true);
+ }
+
+ @Test
+ public void testStandardInitializationOMR1() {
+ assertThat(AndroidVersions.OMR1.SDK_INT).isEqualTo(27);
+ assertThat(AndroidVersions.OMR1.SHORT_CODE).isEqualTo("OMR1");
+ assertThat(AndroidVersions.OMR1.VERSION).isEqualTo("8.1");
+ assertThat(new AndroidVersions.OMR1().getSdkInt()).isEqualTo(27);
+ assertThat(new AndroidVersions.OMR1().getShortCode()).isEqualTo("OMR1");
+ assertThat(new AndroidVersions.OMR1().getVersion()).isEqualTo("8.1");
+ assertThat(new AndroidVersions.OMR1().isReleased()).isEqualTo(true);
+ }
+
+ @Test
+ public void testStandardInitializationO() {
+ assertThat(AndroidVersions.O.SDK_INT).isEqualTo(26);
+ assertThat(AndroidVersions.O.SHORT_CODE).isEqualTo("O");
+ assertThat(AndroidVersions.O.VERSION).isEqualTo("8.0");
+ assertThat(new AndroidVersions.O().getSdkInt()).isEqualTo(26);
+ assertThat(new AndroidVersions.O().getShortCode()).isEqualTo("O");
+ assertThat(new AndroidVersions.O().getVersion()).isEqualTo("8.0");
+ assertThat(new AndroidVersions.O().isReleased()).isEqualTo(true);
+ }
+
+ @Test
+ public void testStandardInitializationNMR1() {
+ assertThat(AndroidVersions.NMR1.SDK_INT).isEqualTo(25);
+ assertThat(AndroidVersions.NMR1.SHORT_CODE).isEqualTo("NMR1");
+ assertThat(AndroidVersions.NMR1.VERSION).isEqualTo("7.1");
+ assertThat(new AndroidVersions.NMR1().getSdkInt()).isEqualTo(25);
+ assertThat(new AndroidVersions.NMR1().getShortCode()).isEqualTo("NMR1");
+ assertThat(new AndroidVersions.NMR1().getVersion()).isEqualTo("7.1");
+ assertThat(new AndroidVersions.NMR1().isReleased()).isEqualTo(true);
+ }
+
+ @Test
+ public void testStandardInitializationN() {
+ assertThat(AndroidVersions.N.SDK_INT).isEqualTo(24);
+ assertThat(AndroidVersions.N.SHORT_CODE).isEqualTo("N");
+ assertThat(AndroidVersions.N.VERSION).isEqualTo("7.0");
+ assertThat(new AndroidVersions.N().getSdkInt()).isEqualTo(24);
+ assertThat(new AndroidVersions.N().getShortCode()).isEqualTo("N");
+ assertThat(new AndroidVersions.N().getVersion()).isEqualTo("7.0");
+ assertThat(new AndroidVersions.N().isReleased()).isEqualTo(true);
+ }
+
+ @Test
+ public void testStandardInitializationM() {
+ assertThat(AndroidVersions.M.SDK_INT).isEqualTo(23);
+ assertThat(AndroidVersions.M.SHORT_CODE).isEqualTo("M");
+ assertThat(AndroidVersions.M.VERSION).isEqualTo("6.0");
+ assertThat(new AndroidVersions.M().getSdkInt()).isEqualTo(23);
+ assertThat(new AndroidVersions.M().getShortCode()).isEqualTo("M");
+ assertThat(new AndroidVersions.M().getVersion()).isEqualTo("6.0");
+ assertThat(new AndroidVersions.M().isReleased()).isEqualTo(true);
+ }
+
+ @Test
+ public void testStandardInitializationLMR1() {
+ assertThat(AndroidVersions.LMR1.SDK_INT).isEqualTo(22);
+ assertThat(AndroidVersions.LMR1.SHORT_CODE).isEqualTo("LMR1");
+ assertThat(AndroidVersions.LMR1.VERSION).isEqualTo("5.1");
+ assertThat(new AndroidVersions.LMR1().getSdkInt()).isEqualTo(22);
+ assertThat(new AndroidVersions.LMR1().getShortCode()).isEqualTo("LMR1");
+ assertThat(new AndroidVersions.LMR1().getVersion()).isEqualTo("5.1");
+ assertThat(new AndroidVersions.LMR1().isReleased()).isEqualTo(true);
+ }
+
+ @Test
+ public void testStandardInitializationL() {
+ assertThat(AndroidVersions.L.SDK_INT).isEqualTo(21);
+ assertThat(AndroidVersions.L.SHORT_CODE).isEqualTo("L");
+ assertThat(AndroidVersions.L.VERSION).isEqualTo("5.0");
+ assertThat(new AndroidVersions.L().getSdkInt()).isEqualTo(21);
+ assertThat(new AndroidVersions.L().getShortCode()).isEqualTo("L");
+ assertThat(new AndroidVersions.L().getVersion()).isEqualTo("5.0");
+ assertThat(new AndroidVersions.L().isReleased()).isEqualTo(true);
+ }
+
+ @Test
+ public void testStandardInitializationK() {
+ assertThat(AndroidVersions.K.SDK_INT).isEqualTo(19);
+ assertThat(AndroidVersions.K.SHORT_CODE).isEqualTo("K");
+ assertThat(AndroidVersions.K.VERSION).isEqualTo("4.4");
+ assertThat(new AndroidVersions.K().getSdkInt()).isEqualTo(19);
+ assertThat(new AndroidVersions.K().getShortCode()).isEqualTo("K");
+ assertThat(new AndroidVersions.K().getVersion()).isEqualTo("4.4");
+ assertThat(new AndroidVersions.K().isReleased()).isEqualTo(true);
+ }
+}
diff --git a/shadows/versioning/build.gradle b/integration_tests/versioning/build.gradle
index 68a8fb769..8ae425b51 100644
--- a/shadows/versioning/build.gradle
+++ b/integration_tests/versioning/build.gradle
@@ -9,7 +9,6 @@ configurations {
}
dependencies {
- api project(":shadowapi")
compileOnly AndroidSdk.MAX_SDK.coordinates // compile against latest Android SDK (AndroidSdk.s.coordinates) { force = true }
testImplementation project(":robolectric")
testImplementation libs.truth
diff --git a/shadows/versioning/src/test/java/org/robolectric/versioning/AndroidVersionsTest.java b/integration_tests/versioning/src/test/java/org/robolectric/versioning/AndroidVersionsTest.java
index 4666c6a0e..09b394a1a 100644
--- a/shadows/versioning/src/test/java/org/robolectric/versioning/AndroidVersionsTest.java
+++ b/integration_tests/versioning/src/test/java/org/robolectric/versioning/AndroidVersionsTest.java
@@ -2,12 +2,11 @@ package org.robolectric.versioning;
import static com.google.common.truth.Truth.assertThat;
-import android.os.Build.VERSION;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
-import org.robolectric.versioning.AndroidVersions.T;
+import org.robolectric.shadows.ShadowBuild;
/**
* Check versions information aligns with runtime information. Primarily, selected SDK with
@@ -17,11 +16,17 @@ import org.robolectric.versioning.AndroidVersions.T;
public final class AndroidVersionsTest {
@Test
- @Config(sdk = T.SDK_INT)
+ @Config(sdk = 33)
+ public void ignoreShadowBuildValues() {
+ ShadowBuild.setVersionCodename("_*&^%%&");
+ assertThat(AndroidVersions.T.SDK_INT).isEqualTo(33);
+ assertThat(AndroidVersions.CURRENT.getShortCode()).isEqualTo("T");
+ }
+
+ @Test
+ @Config(sdk = 33)
public void testStandardInitializationT() {
- assertThat(VERSION.SDK_INT).isEqualTo(33);
- assertThat(VERSION.RELEASE).isEqualTo("13");
- assertThat(VERSION.CODENAME).isEqualTo("REL");
+ assertThat(AndroidVersions.T.SDK_INT).isEqualTo(33);
assertThat(AndroidVersions.T.SHORT_CODE).isEqualTo("T");
assertThat(new AndroidVersions.T().getVersion()).isEqualTo("13.0");
assertThat(AndroidVersions.CURRENT.getShortCode()).isEqualTo("T");
@@ -30,9 +35,7 @@ public final class AndroidVersionsTest {
@Test
@Config(sdk = 32)
public void testStandardInitializationSv2() {
- assertThat(VERSION.SDK_INT).isEqualTo(32);
- assertThat(VERSION.RELEASE).isEqualTo("12");
- assertThat(VERSION.CODENAME).isEqualTo("REL");
+ assertThat(AndroidVersions.Sv2.SDK_INT).isEqualTo(32);
assertThat(AndroidVersions.Sv2.SHORT_CODE).isEqualTo("Sv2");
assertThat(new AndroidVersions.Sv2().getVersion()).isEqualTo("12.1");
assertThat(AndroidVersions.CURRENT.getShortCode()).isEqualTo("Sv2");
@@ -41,9 +44,7 @@ public final class AndroidVersionsTest {
@Test
@Config(sdk = 31)
public void testStandardInitializationS() {
- assertThat(VERSION.SDK_INT).isEqualTo(31);
- assertThat(VERSION.RELEASE).isEqualTo("12");
- assertThat(VERSION.CODENAME).isEqualTo("REL");
+ assertThat(AndroidVersions.S.SDK_INT).isEqualTo(31);
assertThat(AndroidVersions.S.SHORT_CODE).isEqualTo("S");
assertThat(new AndroidVersions.S().getVersion()).isEqualTo("12.0");
assertThat(AndroidVersions.CURRENT.getShortCode()).isEqualTo("S");
@@ -52,9 +53,7 @@ public final class AndroidVersionsTest {
@Test
@Config(sdk = 30)
public void testStandardInitializationR() {
- assertThat(VERSION.SDK_INT).isEqualTo(30);
- assertThat(VERSION.RELEASE).isEqualTo("11");
- assertThat(VERSION.CODENAME).isEqualTo("REL");
+ assertThat(AndroidVersions.R.SDK_INT).isEqualTo(30);
assertThat(AndroidVersions.R.SHORT_CODE).isEqualTo("R");
assertThat(new AndroidVersions.R().getVersion()).isEqualTo("11.0");
assertThat(AndroidVersions.CURRENT.getShortCode()).isEqualTo("R");
@@ -63,9 +62,7 @@ public final class AndroidVersionsTest {
@Test
@Config(sdk = 29)
public void testStandardInitializationQ() {
- assertThat(VERSION.SDK_INT).isEqualTo(29);
- assertThat(VERSION.RELEASE).isEqualTo("10");
- assertThat(VERSION.CODENAME).isEqualTo("REL");
+ assertThat(AndroidVersions.Q.SDK_INT).isEqualTo(29);
assertThat(AndroidVersions.Q.SHORT_CODE).isEqualTo("Q");
assertThat(new AndroidVersions.Q().getVersion()).isEqualTo("10.0");
assertThat(AndroidVersions.CURRENT.getShortCode()).isEqualTo("Q");
@@ -74,9 +71,7 @@ public final class AndroidVersionsTest {
@Test
@Config(sdk = 28)
public void testStandardInitializationP() {
- assertThat(VERSION.SDK_INT).isEqualTo(28);
- assertThat(VERSION.RELEASE).isEqualTo("9");
- assertThat(VERSION.CODENAME).isEqualTo("REL");
+ assertThat(AndroidVersions.P.SDK_INT).isEqualTo(28);
assertThat(AndroidVersions.P.SHORT_CODE).isEqualTo("P");
assertThat(new AndroidVersions.P().getVersion()).isEqualTo("9.0");
assertThat(AndroidVersions.CURRENT.getShortCode()).isEqualTo("P");
@@ -85,9 +80,7 @@ public final class AndroidVersionsTest {
@Test
@Config(sdk = 27)
public void testStandardInitializationOMR1() {
- assertThat(VERSION.SDK_INT).isEqualTo(27);
- assertThat(VERSION.RELEASE).isEqualTo("8.1.0");
- assertThat(VERSION.CODENAME).isEqualTo("REL");
+ assertThat(AndroidVersions.OMR1.SDK_INT).isEqualTo(27);
assertThat(AndroidVersions.OMR1.SHORT_CODE).isEqualTo("OMR1");
assertThat(new AndroidVersions.OMR1().getVersion()).isEqualTo("8.1");
assertThat(AndroidVersions.CURRENT.getShortCode()).isEqualTo("OMR1");
@@ -96,9 +89,7 @@ public final class AndroidVersionsTest {
@Test
@Config(sdk = 26)
public void testStandardInitializationO() {
- assertThat(VERSION.SDK_INT).isEqualTo(26);
- assertThat(VERSION.RELEASE).isEqualTo("8.0.0");
- assertThat(VERSION.CODENAME).isEqualTo("REL");
+ assertThat(AndroidVersions.O.SDK_INT).isEqualTo(26);
assertThat(AndroidVersions.O.SHORT_CODE).isEqualTo("O");
assertThat(new AndroidVersions.O().getVersion()).isEqualTo("8.0");
assertThat(AndroidVersions.CURRENT.getShortCode()).isEqualTo("O");
@@ -107,9 +98,7 @@ public final class AndroidVersionsTest {
@Test
@Config(sdk = 25)
public void testStandardInitializationNMR1() {
- assertThat(VERSION.SDK_INT).isEqualTo(25);
- assertThat(VERSION.RELEASE).isEqualTo("7.1");
- assertThat(VERSION.CODENAME).isEqualTo("REL");
+ assertThat(AndroidVersions.NMR1.SDK_INT).isEqualTo(25);
assertThat(AndroidVersions.NMR1.SHORT_CODE).isEqualTo("NMR1");
assertThat(new AndroidVersions.NMR1().getVersion()).isEqualTo("7.1");
assertThat(AndroidVersions.CURRENT.getShortCode()).isEqualTo("NMR1");
@@ -118,9 +107,7 @@ public final class AndroidVersionsTest {
@Test
@Config(sdk = 24)
public void testStandardInitializationN() {
- assertThat(VERSION.SDK_INT).isEqualTo(24);
- assertThat(VERSION.RELEASE).isEqualTo("7.0");
- assertThat(VERSION.CODENAME).isEqualTo("REL");
+ assertThat(AndroidVersions.N.SDK_INT).isEqualTo(24);
assertThat(AndroidVersions.N.SHORT_CODE).isEqualTo("N");
assertThat(new AndroidVersions.N().getVersion()).isEqualTo("7.0");
assertThat(AndroidVersions.CURRENT.getShortCode()).isEqualTo("N");
@@ -129,9 +116,7 @@ public final class AndroidVersionsTest {
@Test
@Config(sdk = 23)
public void testStandardInitializationM() {
- assertThat(VERSION.SDK_INT).isEqualTo(23);
- assertThat(VERSION.RELEASE).isEqualTo("6.0.1");
- assertThat(VERSION.CODENAME).isEqualTo("REL");
+ assertThat(AndroidVersions.M.SDK_INT).isEqualTo(23);
assertThat(AndroidVersions.M.SHORT_CODE).isEqualTo("M");
assertThat(new AndroidVersions.M().getVersion()).isEqualTo("6.0");
assertThat(AndroidVersions.CURRENT.getShortCode()).isEqualTo("M");
@@ -140,9 +125,7 @@ public final class AndroidVersionsTest {
@Test
@Config(sdk = 22)
public void testStandardInitializationLMR1() {
- assertThat(VERSION.SDK_INT).isEqualTo(22);
- assertThat(VERSION.RELEASE).isEqualTo("5.1.1");
- assertThat(VERSION.CODENAME).isEqualTo("REL");
+ assertThat(AndroidVersions.LMR1.SDK_INT).isEqualTo(22);
assertThat(AndroidVersions.LMR1.SHORT_CODE).isEqualTo("LMR1");
assertThat(new AndroidVersions.LMR1().getVersion()).isEqualTo("5.1");
assertThat(AndroidVersions.CURRENT.getShortCode()).isEqualTo("LMR1");
@@ -151,9 +134,7 @@ public final class AndroidVersionsTest {
@Test
@Config(sdk = 21)
public void testStandardInitializationL() {
- assertThat(VERSION.SDK_INT).isEqualTo(21);
- assertThat(VERSION.RELEASE).isEqualTo("5.0.2");
- assertThat(VERSION.CODENAME).isEqualTo("REL");
+ assertThat(AndroidVersions.L.SDK_INT).isEqualTo(21);
assertThat(AndroidVersions.L.SHORT_CODE).isEqualTo("L");
assertThat(new AndroidVersions.L().getVersion()).isEqualTo("5.0");
assertThat(AndroidVersions.CURRENT.getShortCode()).isEqualTo("L");
@@ -162,9 +143,7 @@ public final class AndroidVersionsTest {
@Test
@Config(sdk = 19)
public void testStandardInitializationK() {
- assertThat(VERSION.SDK_INT).isEqualTo(19);
- assertThat(VERSION.RELEASE).isEqualTo("4.4");
- assertThat(VERSION.CODENAME).isEqualTo("REL");
+ assertThat(AndroidVersions.K.SDK_INT).isEqualTo(19);
assertThat(AndroidVersions.K.SHORT_CODE).isEqualTo("K");
assertThat(new AndroidVersions.K().getVersion()).isEqualTo("4.4");
assertThat(AndroidVersions.CURRENT.getShortCode()).isEqualTo("K");
diff --git a/shadows/versioning/src/test/resources/AndroidManifest.xml b/integration_tests/versioning/src/test/resources/AndroidManifest.xml
index 65383ac0b..65383ac0b 100644
--- a/shadows/versioning/src/test/resources/AndroidManifest.xml
+++ b/integration_tests/versioning/src/test/resources/AndroidManifest.xml
diff --git a/preinstrumented/build.gradle b/preinstrumented/build.gradle
index 673d55d9c..8e6481622 100644
--- a/preinstrumented/build.gradle
+++ b/preinstrumented/build.gradle
@@ -19,7 +19,6 @@ java {
dependencies {
implementation libs.guava
implementation project(":sandbox")
- implementation project(":shadows:versioning")
testImplementation libs.junit4
testImplementation libs.mockito
diff --git a/processor/build.gradle b/processor/build.gradle
index 063720748..695bc8182 100644
--- a/processor/build.gradle
+++ b/processor/build.gradle
@@ -37,7 +37,6 @@ tasks.named("classes").configure { task ->
dependencies {
api project(":annotations")
api project(":shadowapi")
- implementation project(":shadows:versioning")
compileOnly libs.findbugs.jsr305
api libs.asm
diff --git a/shadows/framework/build.gradle b/shadows/framework/build.gradle
index bc4915528..492f86502 100644
--- a/shadows/framework/build.gradle
+++ b/shadows/framework/build.gradle
@@ -51,7 +51,6 @@ dependencies {
api project(":pluginapi")
api project(":sandbox")
api project(":shadowapi")
- api project(":shadows:versioning")
api project(":utils")
api project(":utils:reflector")