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 13c9f3a..a30633e 100644
--- a/src/main/java/com/android/tools/r8/utils/FileUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/FileUtils.java
@@ -37,17 +37,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;
@@ -60,32 +60,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)
@@ -150,7 +150,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 69cef74..5cbcc5c 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.function.Function;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -395,4 +396,8 @@
     }
     return stringToCapitalize.substring(0, 1).toUpperCase() + stringToCapitalize.substring(1);
   }
+
+  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 3e066a4..3153bab 100644
--- a/src/main/java/com/android/tools/r8/utils/ZipUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ZipUtils.java
@@ -230,7 +230,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 {