CTS tests for non-system locales and matching pseduolocales

This adds test for matching pseudolocales (they are not considering
matching the language itself, just the literal pseudolocale), and the
new getNonSystemLocales() method in AssetManager.

Bug: 25800576
Bug: 26236938
Change-Id: Ie1bd63763b0b320fa30a7206fcb3d662f39f07b6
diff --git a/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java b/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java
index 21a8682..fe98b72 100644
--- a/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java
+++ b/tests/tests/content/src/android/content/res/cts/AssetManagerTest.java
@@ -32,6 +32,8 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.util.Arrays;
+import java.util.HashSet;
 
 
 public class AssetManagerTest extends AndroidTestCase{
@@ -115,6 +117,50 @@
 
     }
 
+
+    public void testGetNonSystemLocales() {
+        // This is the list of locales built into this test package. It is basically the locales
+        // specified in the Android.mk files (assuming they have corresponding resources), plus the
+        // special case for Filipino.
+        final String KNOWN_LOCALES[] = {
+            "cs",
+            "fa-IR",
+            "fil",
+            "fil-PH",
+            "fr",
+            "fr-FR",
+            "kok",
+            "kok-419",
+            "kok-419-variant",
+            "kok-IN",
+            "kok-Knda",
+            "kok-Knda-419",
+            "kok-Knda-419-variant",
+            "kok-variant",
+            "tgl",
+            "tgl-PH",
+            "xx",
+            "xx-YY"
+        };
+
+        final HashSet<String> KNOWN_LOCALES_SET =
+                new HashSet<String>(Arrays.asList(KNOWN_LOCALES));
+
+        final String PSEUDO_OR_EMPTY_LOCALES[] = {
+            "",
+            "en-XA",
+            "ar-XB"
+        };
+
+        String locales[] = mAssets.getNonSystemLocales();
+        HashSet<String> localesSet = new HashSet<String>(Arrays.asList(locales));
+        for (String l : PSEUDO_OR_EMPTY_LOCALES) {
+            localesSet.remove(l);
+        }
+
+        assertEquals(KNOWN_LOCALES_SET, localesSet);
+    }
+
     private void assertContextEquals(final String expect, final InputStream inputStream)
             throws IOException {
         final BufferedReader bf = new BufferedReader(new InputStreamReader(inputStream));
diff --git a/tests/tests/util/src/android/util/cts/LocaleListTest.java b/tests/tests/util/src/android/util/cts/LocaleListTest.java
index f824aa8..ccf6475 100644
--- a/tests/tests/util/src/android/util/cts/LocaleListTest.java
+++ b/tests/tests/util/src/android/util/cts/LocaleListTest.java
@@ -325,4 +325,36 @@
                 Locale.forLanguageTag("hr-HR"),
                 LocaleList.forLanguageTags("hr-HR,sr-Latn-ME").getFirstMatch(oneSerbianAsset));
     }
+
+    public void testGetFirstMatch_LtrPseudoLocale() {
+        String[] onePseudoLocale = {"en-XA"};
+        // "en-XA" matches itself
+        assertEquals(
+                Locale.forLanguageTag("en-XA"),
+                LocaleList.forLanguageTags("sr,en-XA").getFirstMatch(onePseudoLocale));
+
+        // "en-XA" doesn't match "en" or "en-US"
+        assertEquals(
+                Locale.forLanguageTag("sr"),
+                LocaleList.forLanguageTags("sr,en").getFirstMatch(onePseudoLocale));
+        assertEquals(
+                Locale.forLanguageTag("sr"),
+                LocaleList.forLanguageTags("sr,en-US").getFirstMatch(onePseudoLocale));
+    }
+
+    public void testGetFirstMatch_RtlPseudoLocale() {
+        String[] onePseudoLocale = {"ar-XB"};
+        // "ar-XB" matches itself
+        assertEquals(
+                Locale.forLanguageTag("ar-XB"),
+                LocaleList.forLanguageTags("sr,ar-XB").getFirstMatch(onePseudoLocale));
+
+        // "ar-XB" doesn't match "ar" or "ar-EG"
+        assertEquals(
+                Locale.forLanguageTag("sr"),
+                LocaleList.forLanguageTags("sr,ar").getFirstMatch(onePseudoLocale));
+        assertEquals(
+                Locale.forLanguageTag("sr"),
+                LocaleList.forLanguageTags("sr,ar-EG").getFirstMatch(onePseudoLocale));
+    }
 }