Merge "[automerger skipped] Merge "DO NOT MERGE Fix tests which relied on Pacific/Apia DST offset. [O-MR1-CTS]" into oreo-mr1-cts-dev am: 61e0123122 -s ours" into pie-cts-dev am: 9fb91d6a1a -s ours am: b86f5c7e54 -s ours am: 559f60b0d1 -s ours am: 1dd591c76a -s ours am: 58a510bf97 -s ours

am skip reason: subject contains skip directive

Original change: https://android-review.googlesource.com/c/platform/libcore/+/1903514

Change-Id: Ic8c3d1c24d148e4194ee21178c5a3606dec4def3
diff --git a/JavaLibrary.bp b/JavaLibrary.bp
index 8b0ab3b..6731942 100644
--- a/JavaLibrary.bp
+++ b/JavaLibrary.bp
@@ -453,12 +453,13 @@
     name: "core-test-rules",
     visibility: [
         "//art/build/sdk",
+        "//cts/tests/tests/util",
         "//external/conscrypt",
         "//external/conscrypt/apex/tests",
         "//frameworks/base/location/tests/locationtests",
         "//frameworks/base/core/tests/coretests",
         "//frameworks/base/wifi/tests",
-        "//cts/tests/tests/util",
+        "//packages/modules/Wifi/framework/tests",
     ],
     hostdex: true,
     srcs: [
@@ -509,6 +510,8 @@
         "//libcore/benchmarks",
         "//packages/apps/KeyChain/tests",
         "//system/timezone/distro/core",
+        "//packages/modules/Connectivity/tests/cts/net",
+        "//packages/modules/Connectivity/tests/cts/net/api23Test",
     ],
     hostdex: true,
     srcs: ["support/src/test/java/**/*.java"],
diff --git a/harmony-tests/src/test/java/org/apache/harmony/tests/javax/net/ssl/HostnameVerifierTest.java b/harmony-tests/src/test/java/org/apache/harmony/tests/javax/net/ssl/HostnameVerifierTest.java
index 96384ad..44572ab 100644
--- a/harmony-tests/src/test/java/org/apache/harmony/tests/javax/net/ssl/HostnameVerifierTest.java
+++ b/harmony-tests/src/test/java/org/apache/harmony/tests/javax/net/ssl/HostnameVerifierTest.java
@@ -40,104 +40,6 @@
         assertFalse(hv.verify("localhost", session));
     }
 
-    // copied and modified from apache http client test suite.
-    public void testVerify() throws Exception {
-        HostnameVerifier verifier = HttpsURLConnection.getDefaultHostnameVerifier();
-        CertificateFactory cf = CertificateFactory.getInstance("X.509");
-        InputStream in;
-        X509Certificate x509;
-        // CN=foo.com, no subjectAlt
-        in = new ByteArrayInputStream(X509_FOO);
-        x509 = (X509Certificate) cf.generateCertificate(in);
-        mySSLSession session = new mySSLSession(new X509Certificate[] {x509});
-        assertFalse(verifier.verify("foo.com", session));
-        assertFalse(verifier.verify("a.foo.com", session));
-        assertFalse(verifier.verify("bar.com", session));
-
-        // CN=花子.co.jp, no subjectAlt
-        in = new ByteArrayInputStream(X509_HANAKO);
-        x509 = (X509Certificate) cf.generateCertificate(in);
-        session = new mySSLSession(new X509Certificate[] {x509});
-        assertFalse(verifier.verify("\u82b1\u5b50.co.jp", session));
-        assertFalse(verifier.verify("a.\u82b1\u5b50.co.jp", session));
-
-        // CN=foo.com, subjectAlt=bar.com
-        in = new ByteArrayInputStream(X509_FOO_BAR);
-        x509 = (X509Certificate) cf.generateCertificate(in);
-        session = new mySSLSession(new X509Certificate[] {x509});
-        assertFalse(verifier.verify("foo.com", session));
-        assertFalse(verifier.verify("a.foo.com", session));
-        assertTrue(verifier.verify("bar.com", session));
-        assertFalse(verifier.verify("a.bar.com", session));
-
-        // CN=foo.com, subjectAlt=bar.com, subjectAlt=花子.co.jp
-        in = new ByteArrayInputStream(X509_FOO_BAR_HANAKO);
-        x509 = (X509Certificate) cf.generateCertificate(in);
-        session = new mySSLSession(new X509Certificate[] {x509});
-        assertFalse(verifier.verify("foo.com", session));
-        assertFalse(verifier.verify("a.foo.com", session));
-        assertTrue(verifier.verify("bar.com", session));
-        assertFalse(verifier.verify("a.bar.com", session));
-        // The certificate has this name in the altnames section, but OkHostnameVerifier drops
-        // any altnames that are improperly encoded according to RFC 5280, which requires
-        // non-ASCII characters to be encoded in ASCII via Punycode.
-        assertFalse(verifier.verify("\u82b1\u5b50.co.jp", session));
-        assertFalse(verifier.verify("a.\u82b1\u5b50.co.jp", session));
-
-        // no CN, subjectAlt=foo.com
-        in = new ByteArrayInputStream(X509_NO_CNS_FOO);
-        x509 = (X509Certificate) cf.generateCertificate(in);
-        session = new mySSLSession(new X509Certificate[] {x509});
-        assertTrue(verifier.verify("foo.com", session));
-        assertFalse(verifier.verify("a.foo.com", session));
-
-        // CN=foo.com, CN=bar.com, CN=花子.co.jp, no subjectAlt
-        in = new ByteArrayInputStream(X509_THREE_CNS_FOO_BAR_HANAKO);
-        x509 = (X509Certificate) cf.generateCertificate(in);
-        session = new mySSLSession(new X509Certificate[] {x509});
-        assertFalse(verifier.verify("foo.com", session));
-        assertFalse(verifier.verify("a.foo.com", session));
-        assertFalse(verifier.verify("bar.com", session));
-        assertFalse(verifier.verify("a.bar.com", session));
-        assertFalse(verifier.verify("\u82b1\u5b50.co.jp", session));
-        assertFalse(verifier.verify("a.\u82b1\u5b50.co.jp", session));
-
-        // CN=*.foo.com, no subjectAlt
-        in = new ByteArrayInputStream(X509_WILD_FOO);
-        x509 = (X509Certificate) cf.generateCertificate(in);
-        session = new mySSLSession(new X509Certificate[] {x509});
-        assertFalse(verifier.verify("foo.com", session));
-        assertFalse(verifier.verify("www.foo.com", session));
-        assertFalse(verifier.verify("\u82b1\u5b50.foo.com", session));
-        assertFalse(verifier.verify("a.b.foo.com", session));
-
-        // CN=*.co.jp, no subjectAlt
-        in = new ByteArrayInputStream(X509_WILD_CO_JP);
-        x509 = (X509Certificate) cf.generateCertificate(in);
-        session = new mySSLSession(new X509Certificate[] {x509});
-        assertFalse(verifier.verify("foo.co.jp", session));
-        assertFalse(verifier.verify("\u82b1\u5b50.co.jp", session));
-
-        // CN=*.foo.com, subjectAlt=*.bar.com, subjectAlt=花子.co.jp
-        in = new ByteArrayInputStream(X509_WILD_FOO_BAR_HANAKO);
-        x509 = (X509Certificate) cf.generateCertificate(in);
-        session = new mySSLSession(new X509Certificate[] {x509});
-        // try the foo.com variations
-        assertFalse(verifier.verify("foo.com", session));
-        assertFalse(verifier.verify("www.foo.com", session));
-        assertFalse(verifier.verify("\u82b1\u5b50.foo.com", session));
-        assertFalse(verifier.verify("a.b.foo.com", session));
-        assertFalse(verifier.verify("bar.com", session));
-        assertTrue(verifier.verify("www.bar.com", session));
-        assertFalse(verifier.verify("a.b.bar.com", session));
-        // The certificate has this name in the altnames section, but OkHostnameVerifier drops
-        // any altnames that are improperly encoded according to RFC 5280, which requires
-        // non-ASCII characters to be encoded in ASCII via Punycode.
-        assertFalse(verifier.verify("\u82b1\u5b50.bar.com", session));
-        assertFalse(verifier.verify("\u82b1\u5b50.co.jp", session));
-        assertFalse(verifier.verify("a.\u82b1\u5b50.co.jp", session));
-    }
-
     public void testSubjectAlt() throws Exception {
         CertificateFactory cf = CertificateFactory.getInstance("X.509");
         InputStream in = new ByteArrayInputStream(X509_MULTIPLE_SUBJECT_ALT);
diff --git a/luni/src/test/java/libcore/java/text/DateFormatSymbolsTest.java b/luni/src/test/java/libcore/java/text/DateFormatSymbolsTest.java
index 3ea4378..baa3344 100644
--- a/luni/src/test/java/libcore/java/text/DateFormatSymbolsTest.java
+++ b/luni/src/test/java/libcore/java/text/DateFormatSymbolsTest.java
@@ -156,21 +156,40 @@
     }
 
     // http://b/7955614
-    public void test_getZoneStrings_Apia() throws Exception {
+    public void test_getZoneStrings_Apia() {
         String[][] array = DateFormatSymbols.getInstance(Locale.US).getZoneStrings();
+
         for (int i = 0; i < array.length; ++i) {
             String[] row = array[i];
             // Pacific/Apia is somewhat arbitrary; we just want a zone we have to generate
             // "GMT" strings for the short names.
             if (row[0].equals("Pacific/Apia")) {
+                TimeZone apiaTz = TimeZone.getTimeZone("Pacific/Apia");
                 assertEquals("Apia Standard Time", row[1]);
-                assertEquals("GMT+13:00", row[2]);
+                assertEquals(formattedStandardTimeOffset(apiaTz), row[2]);
                 assertEquals("Apia Daylight Time", row[3]);
-                assertEquals("GMT+14:00", row[4]);
+                assertEquals(formattedDstOffset(apiaTz), row[4]);
             }
         }
     }
 
+    private static String formattedStandardTimeOffset(TimeZone tz) {
+        return formattedOffset(tz.getRawOffset());
+    }
+
+    private static String formattedDstOffset(TimeZone tz) {
+        return formattedOffset(tz.getRawOffset() + tz.getDSTSavings());
+    }
+
+    private static String formattedOffset(int offset) {
+        String pattern = "GMT%+d:%02d";
+        int millisInHour = 60 * 60 * 1_000;
+        int hours = offset / millisInHour;
+        int minutes = (offset - hours * millisInHour) / 1_000 / 60;
+
+        return String.format(pattern, hours, minutes);
+    }
+
     public void test_setZoneStrings_checks_dimensions() throws Exception {
         DateFormatSymbols dfs = DateFormatSymbols.getInstance();
         String[][] zoneStrings = dfs.getZoneStrings();
diff --git a/luni/src/test/java/libcore/java/util/TimeZoneTest.java b/luni/src/test/java/libcore/java/util/TimeZoneTest.java
index da4a04f..818e351 100644
--- a/luni/src/test/java/libcore/java/util/TimeZoneTest.java
+++ b/luni/src/test/java/libcore/java/util/TimeZoneTest.java
@@ -319,12 +319,16 @@
     }
 
     // http://b/7955614
-    public void testApia() throws Exception {
+    public void testApia() {
         TimeZone tz = TimeZone.getTimeZone("Pacific/Apia");
         assertEquals("Apia Daylight Time", tz.getDisplayName(true, TimeZone.LONG, Locale.US));
         assertEquals("Apia Standard Time", tz.getDisplayName(false, TimeZone.LONG, Locale.US));
-        assertEquals("GMT+14:00", tz.getDisplayName(true, TimeZone.SHORT, Locale.US));
-        assertEquals("GMT+13:00", tz.getDisplayName(false, TimeZone.SHORT, Locale.US));
+
+        long samoaStandardTime = 1630315635000L; // 30 Aug 2021
+        long samoaDst = 1614504435000L; // 28 Feb 2021
+
+        assertEquals(13 * 60 * 60 * 1_000, tz.getOffset(samoaStandardTime));
+        assertEquals(14 * 60 * 60 * 1_000, tz.getOffset(samoaDst));
     }
 
     private static boolean isGmtString(String s) {
diff --git a/mmodules/intracoreapi/api/intra/current-api.txt b/mmodules/intracoreapi/api/intra/current-api.txt
index 5137a10..f98906f 100644
--- a/mmodules/intracoreapi/api/intra/current-api.txt
+++ b/mmodules/intracoreapi/api/intra/current-api.txt
@@ -58,7 +58,7 @@
 package java.net {
 
   public class Socket implements java.io.Closeable {
-    method public java.io.FileDescriptor getFileDescriptor$();
+    method @libcore.api.IntraCoreApi public java.io.FileDescriptor getFileDescriptor$();
   }
 
 }
@@ -70,11 +70,11 @@
   }
 
   public abstract class CharsetDecoder {
-    ctor protected CharsetDecoder(java.nio.charset.Charset, float, float);
+    ctor @libcore.api.IntraCoreApi protected CharsetDecoder(java.nio.charset.Charset, float, float);
   }
 
   public abstract class CharsetEncoder {
-    ctor protected CharsetEncoder(java.nio.charset.Charset, float, float, byte[], boolean);
+    ctor @libcore.api.IntraCoreApi protected CharsetEncoder(java.nio.charset.Charset, float, float, byte[], boolean);
   }
 
 }
@@ -82,8 +82,8 @@
 package java.security.spec {
 
   public class ECParameterSpec implements java.security.spec.AlgorithmParameterSpec {
-    method public String getCurveName();
-    method public void setCurveName(String);
+    method @libcore.api.IntraCoreApi public String getCurveName();
+    method @libcore.api.IntraCoreApi public void setCurveName(String);
   }
 
 }
@@ -133,18 +133,18 @@
 
 package sun.security.util {
 
-  public interface DerEncoder {
-    method public void derEncode(java.io.OutputStream) throws java.io.IOException;
+  @libcore.api.IntraCoreApi public interface DerEncoder {
+    method @libcore.api.IntraCoreApi public void derEncode(java.io.OutputStream) throws java.io.IOException;
   }
 
 }
 
 package sun.security.x509 {
 
-  public class AlgorithmId implements sun.security.util.DerEncoder java.io.Serializable {
-    method public void derEncode(java.io.OutputStream) throws java.io.IOException;
-    method public static sun.security.x509.AlgorithmId get(String) throws java.security.NoSuchAlgorithmException;
-    method public String getName();
+  @libcore.api.IntraCoreApi public class AlgorithmId implements sun.security.util.DerEncoder java.io.Serializable {
+    method @libcore.api.IntraCoreApi public void derEncode(java.io.OutputStream) throws java.io.IOException;
+    method @libcore.api.IntraCoreApi public static sun.security.x509.AlgorithmId get(String) throws java.security.NoSuchAlgorithmException;
+    method @libcore.api.IntraCoreApi public String getName();
   }
 
 }