diff options
author | Ang Li <ihcinihsdk@google.com> | 2024-05-08 19:44:19 +0000 |
---|---|---|
committer | Ang Li <ihcinihsdk@google.com> | 2024-05-08 19:45:17 +0000 |
commit | d9a379a034c79f278e3f4f5ce4ae61f55baae691 (patch) | |
tree | 9b3ab586b33552f7346a35e83656da0023d3501c /resources | |
parent | d6c31415fb5e85e7cbfd17d94c7a8dd2dccf022c (diff) | |
parent | d383d4befadcc1aab1fab39adfc50cda3a7f02ce (diff) | |
download | robolectric-d9a379a034c79f278e3f4f5ce4ae61f55baae691.tar.gz |
Merge branch 'upstream-google' into some_merge
Bug: 339459903
Test: mma
Merged-In: I7ee2de434aac767aa009bb0367580618690cb786
Change-Id: I7ee2de434aac767aa009bb0367580618690cb786
Diffstat (limited to 'resources')
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); + } +} |