aboutsummaryrefslogtreecommitdiff
path: root/resources
diff options
context:
space:
mode:
authorAng Li <ihcinihsdk@google.com>2024-05-08 19:44:19 +0000
committerAng Li <ihcinihsdk@google.com>2024-05-08 19:45:17 +0000
commitd9a379a034c79f278e3f4f5ce4ae61f55baae691 (patch)
tree9b3ab586b33552f7346a35e83656da0023d3501c /resources
parentd6c31415fb5e85e7cbfd17d94c7a8dd2dccf022c (diff)
parentd383d4befadcc1aab1fab39adfc50cda3a7f02ce (diff)
downloadrobolectric-d9a379a034c79f278e3f4f5ce4ae61f55baae691.tar.gz
Merge branch 'upstream-google' into some_merge
Bug: 339459903 Test: mma Merged-In: I7ee2de434aac767aa009bb0367580618690cb786 Change-Id: I7ee2de434aac767aa009bb0367580618690cb786
Diffstat (limited to 'resources')
-rw-r--r--resources/src/main/java/org/robolectric/res/android/CppAssetManager2.java5
-rw-r--r--resources/src/main/java/org/robolectric/res/android/DataType.java4
-rw-r--r--resources/src/main/java/org/robolectric/res/android/DynamicRefTable.java14
-rw-r--r--resources/src/test/java/org/robolectric/res/android/DataTypeTest.java23
-rw-r--r--resources/src/test/java/org/robolectric/res/android/DynamicRefTableTest.java23
5 files changed, 65 insertions, 4 deletions
diff --git a/resources/src/main/java/org/robolectric/res/android/CppAssetManager2.java b/resources/src/main/java/org/robolectric/res/android/CppAssetManager2.java
index 803f82363..92280825e 100644
--- a/resources/src/main/java/org/robolectric/res/android/CppAssetManager2.java
+++ b/resources/src/main/java/org/robolectric/res/android/CppAssetManager2.java
@@ -885,7 +885,10 @@ public class CppAssetManager2 {
out_value.set(device_value.copy());
// Convert the package ID to the runtime assigned package ID.
- entry.get().dynamic_ref_table.lookupResourceValue(out_value);
+ int err = entry.get().dynamic_ref_table.lookupResourceValue(out_value);
+ if (err != NO_ERROR) {
+ return K_INVALID_COOKIE;
+ }
out_selected_config.set(new ResTable_config(entry.get().config));
out_flags.set(entry.get().type_flags);
diff --git a/resources/src/main/java/org/robolectric/res/android/DataType.java b/resources/src/main/java/org/robolectric/res/android/DataType.java
index 30938926a..b238544b6 100644
--- a/resources/src/main/java/org/robolectric/res/android/DataType.java
+++ b/resources/src/main/java/org/robolectric/res/android/DataType.java
@@ -70,6 +70,8 @@ public enum DataType {
}
public static DataType fromCode(byte code) {
- return Preconditions.checkNotNull(FROM_BYTE.get(code), "Unknown resource type: %s", code);
+ DataType type = FROM_BYTE.get(code);
+ Preconditions.checkArgument(type != null, "Unknown resource type: %s", code);
+ return type;
}
}
diff --git a/resources/src/main/java/org/robolectric/res/android/DynamicRefTable.java b/resources/src/main/java/org/robolectric/res/android/DynamicRefTable.java
index 0604116be..537a9f2f2 100644
--- a/resources/src/main/java/org/robolectric/res/android/DynamicRefTable.java
+++ b/resources/src/main/java/org/robolectric/res/android/DynamicRefTable.java
@@ -1,7 +1,9 @@
package org.robolectric.res.android;
-// transliterated from https://android.googlesource.com/platform/frameworks/base/+/android-9.0.0_r12/include/androidfw/ResourceTypes.h
+// transliterated from
+// https://android.googlesource.com/platform/frameworks/base/+/android-9.0.0_r12/include/androidfw/ResourceTypes.h
+import static org.robolectric.res.android.Errors.BAD_TYPE;
import static org.robolectric.res.android.Errors.NO_ERROR;
import static org.robolectric.res.android.Errors.UNKNOWN_ERROR;
import static org.robolectric.res.android.ResTable.APP_PACKAGE_ID;
@@ -145,7 +147,15 @@ public class DynamicRefTable
int lookupResourceValue(Ref<Res_value> value) {
byte resolvedType = DataType.REFERENCE.code();
Res_value inValue = value.get();
- switch (DataType.fromCode(inValue.dataType)) {
+
+ DataType dataType;
+ try {
+ dataType = DataType.fromCode(inValue.dataType);
+ } catch (IllegalArgumentException e) {
+ return BAD_TYPE;
+ }
+
+ switch (dataType) {
case ATTRIBUTE:
resolvedType = DataType.ATTRIBUTE.code();
// fallthrough
diff --git a/resources/src/test/java/org/robolectric/res/android/DataTypeTest.java b/resources/src/test/java/org/robolectric/res/android/DataTypeTest.java
new file mode 100644
index 000000000..3dea9d35e
--- /dev/null
+++ b/resources/src/test/java/org/robolectric/res/android/DataTypeTest.java
@@ -0,0 +1,23 @@
+package org.robolectric.res.android;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertThrows;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public final class DataTypeTest {
+
+ @Test
+ public void fromCode_shouldThrowExceptionForInvalidCode() {
+ assertThrows(IllegalArgumentException.class, () -> DataType.fromCode(99));
+ }
+
+ @Test
+ public void fromCode_shouldReturnCorrectDataTypeForValidCode() {
+ assertThat(DataType.fromCode(0)).isEqualTo(DataType.NULL);
+ assertThat(DataType.fromCode(3)).isEqualTo(DataType.STRING);
+ }
+}
diff --git a/resources/src/test/java/org/robolectric/res/android/DynamicRefTableTest.java b/resources/src/test/java/org/robolectric/res/android/DynamicRefTableTest.java
new file mode 100644
index 000000000..f03578626
--- /dev/null
+++ b/resources/src/test/java/org/robolectric/res/android/DynamicRefTableTest.java
@@ -0,0 +1,23 @@
+package org.robolectric.res.android;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.robolectric.res.android.Errors.BAD_TYPE;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.robolectric.res.android.ResourceTypes.Res_value;
+
+@RunWith(JUnit4.class)
+public final class DynamicRefTableTest {
+
+ private static final Ref<Res_value> RES_VALUE_OF_BAD_TYPE =
+ new Ref<>(new Res_value(/* dataType= */ (byte) 99, /* data= */ 0));
+
+ @Test
+ public void lookupResourceValue_returnsBadTypeIfTypeOutOfEnumRange() {
+ DynamicRefTable pseudoRefTable =
+ new DynamicRefTable(/* packageId= */ (byte) 0, /* appAsLib= */ true);
+ assertThat(pseudoRefTable.lookupResourceValue(RES_VALUE_OF_BAD_TYPE)).isEqualTo(BAD_TYPE);
+ }
+}