Don't use locale for lowercasing of META-INF and file extension
Bug: b/281774632
Change-Id: Ifb3da363da6dd0ca9bc97791f92a60f4a3599355
diff --git a/src/main/java/com/android/tools/r8/utils/FileUtils.java b/src/main/java/com/android/tools/r8/utils/FileUtils.java
index 5fc14e9..347e254 100644
--- a/src/main/java/com/android/tools/r8/utils/FileUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/FileUtils.java
@@ -38,17 +38,17 @@
System.getProperty("java.vm.name").equalsIgnoreCase("Dalvik");
public static boolean isDexFile(Path path) {
- String name = path.getFileName().toString().toLowerCase();
+ String name = StringUtils.toLowerCase(path.getFileName().toString());
return name.endsWith(DEX_EXTENSION);
}
public static boolean isVDexFile(Path path) {
- String name = path.getFileName().toString().toLowerCase();
+ String name = StringUtils.toLowerCase(path.getFileName().toString());
return name.endsWith(VDEX_EXTENSION);
}
public static boolean isClassFile(String path) {
- String name = path.toLowerCase();
+ String name = StringUtils.toLowerCase(path);
// Android does not support Java 9 module, thus skip module-info.
if (name.equals(MODULE_INFO_CLASS)) {
return false;
@@ -61,32 +61,32 @@
}
public static boolean isJarFile(Path path) {
- String name = path.getFileName().toString().toLowerCase();
+ String name = StringUtils.toLowerCase(path.getFileName().toString());
return name.endsWith(JAR_EXTENSION);
}
public static boolean isZipFile(Path path) {
- String name = path.getFileName().toString().toLowerCase();
+ String name = StringUtils.toLowerCase(path.getFileName().toString());
return name.endsWith(ZIP_EXTENSION);
}
public static boolean isApkFile(Path path) {
- String name = path.getFileName().toString().toLowerCase();
+ String name = StringUtils.toLowerCase(path.getFileName().toString());
return name.endsWith(APK_EXTENSION);
}
public static boolean isAarFile(Path path) {
- String name = path.getFileName().toString().toLowerCase();
+ String name = StringUtils.toLowerCase(path.getFileName().toString());
return name.endsWith(AAR_EXTENSION);
}
public static boolean isJavaFile(Path path) {
- String name = path.getFileName().toString().toLowerCase();
+ String name = StringUtils.toLowerCase(path.getFileName().toString());
return name.endsWith(JAVA_EXTENSION);
}
public static boolean isArchive(Path path) {
- String name = path.getFileName().toString().toLowerCase();
+ String name = StringUtils.toLowerCase(path.getFileName().toString());
return name.endsWith(APK_EXTENSION)
|| name.endsWith(JAR_EXTENSION)
|| name.endsWith(ZIP_EXTENSION)
@@ -159,7 +159,7 @@
}
public static boolean isClassesDexFile(Path file) {
- String name = file.getFileName().toString().toLowerCase();
+ String name = StringUtils.toLowerCase(file.getFileName().toString());
if (!name.startsWith("classes") || !name.endsWith(DEX_EXTENSION)) {
return false;
}
diff --git a/src/main/java/com/android/tools/r8/utils/StringUtils.java b/src/main/java/com/android/tools/r8/utils/StringUtils.java
index 9885ab6..c38b351 100644
--- a/src/main/java/com/android/tools/r8/utils/StringUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/StringUtils.java
@@ -12,6 +12,7 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.function.Consumer;
@@ -480,4 +481,8 @@
if (i2 == -1) return i1;
return Math.min(i1, i2);
}
+
+ public static String toLowerCase(String s) {
+ return s.toLowerCase(Locale.ROOT);
+ }
}
diff --git a/src/main/java/com/android/tools/r8/utils/ZipUtils.java b/src/main/java/com/android/tools/r8/utils/ZipUtils.java
index 82952de..2ad1774 100644
--- a/src/main/java/com/android/tools/r8/utils/ZipUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ZipUtils.java
@@ -235,7 +235,7 @@
}
public static boolean isClassFile(String entry) {
- String name = entry.toLowerCase();
+ String name = StringUtils.toLowerCase(entry);
if (name.endsWith(MODULE_INFO_CLASS)) {
return false;
}
diff --git a/src/test/java/com/android/tools/r8/locale/TurkishLocaleMultiReleaseJarTest.java b/src/test/java/com/android/tools/r8/locale/TurkishLocaleMultiReleaseJarTest.java
index 9dd0da6..d5edd80 100644
--- a/src/test/java/com/android/tools/r8/locale/TurkishLocaleMultiReleaseJarTest.java
+++ b/src/test/java/com/android/tools/r8/locale/TurkishLocaleMultiReleaseJarTest.java
@@ -3,8 +3,6 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.locale;
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.D8;
@@ -13,9 +11,11 @@
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
import com.android.tools.r8.ToolHelper.ProcessResult;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.StringUtils;
import com.android.tools.r8.utils.ZipUtils.ZipBuilder;
import com.google.common.collect.ImmutableList;
import java.nio.file.Path;
@@ -51,7 +51,8 @@
"--lib",
ToolHelper.getAndroidJar(AndroidApiLevel.U).toAbsolutePath().toString(),
buildMultiReleaseJarWithUpperCaseMetaInf(workingDir).toString()));
- checkResult(result);
+ assertEquals(0, result.exitCode);
+ runArtOnClassesDotDex(workingDir);
}
@Test
@@ -74,7 +75,8 @@
ProcessResult result =
ToolHelper.forkJavaWithJavaOptions(
workingDir, ImmutableList.of("-Duser.language=tr"), R8.class, builder.build());
- checkResult(result);
+ assertEquals(0, result.exitCode);
+ runArtOnClassesDotDex(workingDir);
}
private Path buildMultiReleaseJarWithUpperCaseMetaInf(Path dir) throws Exception {
@@ -94,11 +96,15 @@
return jar;
}
- private void checkResult(ProcessResult result) {
- assertEquals(1, result.exitCode);
- assertThat(
- result.stderr,
- containsString("Type " + TestClass.class.getTypeName() + " is defined multiple times"));
+ private void runArtOnClassesDotDex(Path dir) throws Exception {
+ if (parameters.getRuntime().isCf()) {
+ return;
+ }
+ ArtCommandBuilder builder = new ArtCommandBuilder(parameters.getRuntime().asDex().getVm());
+ builder.appendClasspath(dir.resolve("classes.dex").toAbsolutePath().toString());
+ builder.setMainClass(TestClass.class.getTypeName());
+ String stdout = ToolHelper.runArt(builder);
+ assertEquals(StringUtils.lines("Hello, world!"), stdout);
}
static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/locale/TurkishLocaleZipFileInputTest.java b/src/test/java/com/android/tools/r8/locale/TurkishLocaleZipFileInputTest.java
index 14a330e..c215eba 100644
--- a/src/test/java/com/android/tools/r8/locale/TurkishLocaleZipFileInputTest.java
+++ b/src/test/java/com/android/tools/r8/locale/TurkishLocaleZipFileInputTest.java
@@ -3,8 +3,6 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.locale;
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.D8;
@@ -13,9 +11,11 @@
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
import com.android.tools.r8.ToolHelper.ProcessResult;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.StringUtils;
import com.android.tools.r8.utils.ZipUtils.ZipBuilder;
import com.google.common.collect.ImmutableList;
import java.nio.file.Path;
@@ -51,7 +51,8 @@
"--lib",
ToolHelper.getAndroidJar(AndroidApiLevel.U).toAbsolutePath().toString(),
buildZipWithUpperCaseExtension(workingDir).toString()));
- checkResult(result);
+ assertEquals(0, result.exitCode);
+ runArtOnClassesDotDex(workingDir);
}
@Test
@@ -78,7 +79,8 @@
ImmutableList.of("-Duser.language=tr"),
R8.class,
builder.build());
- checkResult(result);
+ assertEquals(0, result.exitCode);
+ runArtOnClassesDotDex(workingDir);
}
private Path buildZipWithUpperCaseExtension(Path dir) throws Exception {
@@ -91,9 +93,15 @@
return jar;
}
- private void checkResult(ProcessResult result) {
- assertEquals(1, result.exitCode);
- assertThat(result.stderr, containsString("Unsupported source file type"));
+ private void runArtOnClassesDotDex(Path dir) throws Exception {
+ if (parameters.getRuntime().isCf()) {
+ return;
+ }
+ ArtCommandBuilder builder = new ArtCommandBuilder(parameters.getRuntime().asDex().getVm());
+ builder.appendClasspath(dir.resolve("classes.dex").toAbsolutePath().toString());
+ builder.setMainClass(TestClass.class.getTypeName());
+ String stdout = ToolHelper.runArt(builder);
+ assertEquals(StringUtils.lines("Hello, world!"), stdout);
}
static class TestClass {