Merge "libjavacore: Implement JNI_OnUnload for icu"
diff --git a/expectations/taggedtests.txt b/expectations/taggedtests.txt
index 20825fa..cc2a4d6 100644
--- a/expectations/taggedtests.txt
+++ b/expectations/taggedtests.txt
@@ -9,6 +9,8 @@
   names: [
     /* libcore tests that take over 15 minutes on device because of DHParametersHelper.generateSafePrimes */
     "org.apache.harmony.crypto.tests.javax.crypto.func.KeyAgreementFunctionalTest",
+    "org.apache.harmony.crypto.tests.javax.crypto.interfaces.DHPrivateKeyTest",
+    "org.apache.harmony.crypto.tests.javax.crypto.interfaces.DHPublicKeyTest",
     /* non-AOSP tests http://b/8027066 */
     "java.util.EnumSet.EnumSetBash",
     "java.io.PipedInputStream.CloseAndAvailableRC",
diff --git a/include/LocalArray.h b/include/LocalArray.h
deleted file mode 100644
index 2ab708a..0000000
--- a/include/LocalArray.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef LOCAL_ARRAY_H_included
-#define LOCAL_ARRAY_H_included
-
-#include <cstddef>
-#include <new>
-
-/**
- * A fixed-size array with a size hint. That number of bytes will be allocated
- * on the stack, and used if possible, but if more bytes are requested at
- * construction time, a buffer will be allocated on the heap (and deallocated
- * by the destructor).
- *
- * The API is intended to be a compatible subset of C++0x's std::array.
- */
-template <size_t STACK_BYTE_COUNT>
-class LocalArray {
-public:
-    /**
-     * Allocates a new fixed-size array of the given size. If this size is
-     * less than or equal to the template parameter STACK_BYTE_COUNT, an
-     * internal on-stack buffer will be used. Otherwise a heap buffer will
-     * be allocated.
-     */
-    LocalArray(size_t desiredByteCount) : mSize(desiredByteCount) {
-        if (desiredByteCount > STACK_BYTE_COUNT) {
-            mPtr = new char[mSize];
-        } else {
-            mPtr = &mOnStackBuffer[0];
-        }
-    }
-
-    /**
-     * Frees the heap-allocated buffer, if there was one.
-     */
-    ~LocalArray() {
-        if (mPtr != &mOnStackBuffer[0]) {
-            delete[] mPtr;
-        }
-    }
-
-    // Capacity.
-    size_t size() { return mSize; }
-    bool empty() { return mSize == 0; }
-
-    // Element access.
-    char& operator[](size_t n) { return mPtr[n]; }
-    const char& operator[](size_t n) const { return mPtr[n]; }
-
-private:
-    char mOnStackBuffer[STACK_BYTE_COUNT];
-    char* mPtr;
-    size_t mSize;
-
-    // Disallow copy and assignment.
-    LocalArray(const LocalArray&);
-    void operator=(const LocalArray&);
-};
-
-#endif // LOCAL_ARRAY_H_included
diff --git a/luni/src/main/native/org_apache_harmony_xml_ExpatParser.cpp b/luni/src/main/native/org_apache_harmony_xml_ExpatParser.cpp
index 820bda62..e27af69 100644
--- a/luni/src/main/native/org_apache_harmony_xml_ExpatParser.cpp
+++ b/luni/src/main/native/org_apache_harmony_xml_ExpatParser.cpp
@@ -19,7 +19,6 @@
 #include "JNIHelp.h"
 #include "JniConstants.h"
 #include "JniException.h"
-#include "LocalArray.h"
 #include "ScopedLocalRef.h"
 #include "ScopedPrimitiveArray.h"
 #include "ScopedStringChars.h"
@@ -33,6 +32,8 @@
 #include <string.h>
 #include <expat.h>
 
+#include <android-base/stringprintf.h>
+
 #define BUCKET_COUNT 128
 
 /**
@@ -519,9 +520,8 @@
         }
 
         // return prefix + ":" + localName
-        ::LocalArray<1024> qName(strlen(mPrefix) + 1 + strlen(mLocalName) + 1);
-        snprintf(&qName[0], qName.size(), "%s:%s", mPrefix, mLocalName);
-        return internString(mEnv, mParsingContext, &qName[0]);
+        auto qName = android::base::StringPrintf("%s:%s", mPrefix, mLocalName);
+        return internString(mEnv, mParsingContext, qName.c_str());
     }
 
     /**
diff --git a/luni/src/test/java/libcore/java/net/DatagramSocketTest.java b/luni/src/test/java/libcore/java/net/DatagramSocketTest.java
index 85526cc..86d9c58 100644
--- a/luni/src/test/java/libcore/java/net/DatagramSocketTest.java
+++ b/luni/src/test/java/libcore/java/net/DatagramSocketTest.java
@@ -21,6 +21,7 @@
 import java.lang.reflect.Field;
 import java.net.DatagramPacket;
 import java.net.DatagramSocket;
+import java.net.DatagramSocketImpl;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.SocketException;
@@ -97,4 +98,22 @@
       assertEquals(i, s.getTrafficClass());
     }
   }
+
+  // Socket should become connected even if impl.connect() failed and threw exception.
+  public void test_b31218085() throws Exception {
+    final int port = 9999;
+
+    try (DatagramSocket s = new DatagramSocket()) {
+      // Set fd of DatagramSocket to null, forcing impl.connect() to throw.
+      Field f = DatagramSocket.class.getDeclaredField("impl");
+      f.setAccessible(true);
+      DatagramSocketImpl impl = (DatagramSocketImpl) f.get(s);
+      f = DatagramSocketImpl.class.getDeclaredField("fd");
+      f.setAccessible(true);
+      f.set(impl, null);
+
+      s.connect(InetAddress.getLocalHost(), port);
+      assertTrue(s.isConnected());
+    }
+  }
 }
diff --git a/luni/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/interfaces/DHPublicKeyTest.java b/luni/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/interfaces/DHPublicKeyTest.java
index 61680fe..bc7b338 100644
--- a/luni/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/interfaces/DHPublicKeyTest.java
+++ b/luni/src/test/java/org/apache/harmony/crypto/tests/javax/crypto/interfaces/DHPublicKeyTest.java
@@ -22,29 +22,26 @@
 
 package org.apache.harmony.crypto.tests.javax.crypto.interfaces;
 
-import org.junit.Test;
+import junit.framework.TestCase;
 
 import java.math.BigInteger;
 import java.security.KeyPair;
 import java.security.KeyPairGenerator;
+
+import javax.crypto.interfaces.DHKey;
 import javax.crypto.interfaces.DHPublicKey;
 import javax.crypto.spec.DHParameterSpec;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
 
 /**
  * Tests for <code>DHPublicKey</code> class field
  *
  */
-public class DHPublicKeyTest {
+public class DHPublicKeyTest extends TestCase {
 
     /**
      * Test for <code>serialVersionUID</code> field
      */
-    @Test
     public void testField() {
         checkDHPublicKey key = new checkDHPublicKey();
         assertEquals("Incorrect serialVersionUID",
@@ -52,7 +49,6 @@
                 -6628103563352519193L);
     }
 
-    @Test(timeout = 30 * 60 * 1000) // http://b/30741591
     public void test_getParams() throws Exception {
         KeyPairGenerator kg = KeyPairGenerator.getInstance("DH");
         kg.initialize(1024);
diff --git a/ojluni/src/main/java/java/lang/invoke/MethodHandleStatics.java b/ojluni/src/main/java/java/lang/invoke/MethodHandleStatics.java
index 6928c22..17d7882 100644
--- a/ojluni/src/main/java/java/lang/invoke/MethodHandleStatics.java
+++ b/ojluni/src/main/java/java/lang/invoke/MethodHandleStatics.java
@@ -25,8 +25,6 @@
 
 package java.lang.invoke;
 
-import java.security.AccessController;
-import java.security.PrivilegedAction;
 import sun.misc.Unsafe;
 
 /**
@@ -41,56 +39,8 @@
 
     static final Unsafe UNSAFE = Unsafe.getUnsafe();
 
-    static final boolean DEBUG_METHOD_HANDLE_NAMES;
-    static final boolean DUMP_CLASS_FILES;
-    static final boolean TRACE_INTERPRETER;
-    static final boolean TRACE_METHOD_LINKAGE;
-    static final int COMPILE_THRESHOLD;
-    static final int DONT_INLINE_THRESHOLD;
-    static final int PROFILE_LEVEL;
-    static final boolean PROFILE_GWT;
-    static final int CUSTOMIZE_THRESHOLD;
-
-    static {
-        final Object[] values = new Object[9];
-        AccessController.doPrivileged(new PrivilegedAction<Void>() {
-                public Void run() {
-                    values[0] = Boolean.getBoolean("java.lang.invoke.MethodHandle.DEBUG_NAMES");
-                    values[1] = Boolean.getBoolean("java.lang.invoke.MethodHandle.DUMP_CLASS_FILES");
-                    values[2] = Boolean.getBoolean("java.lang.invoke.MethodHandle.TRACE_INTERPRETER");
-                    values[3] = Boolean.getBoolean("java.lang.invoke.MethodHandle.TRACE_METHOD_LINKAGE");
-                    values[4] = Integer.getInteger("java.lang.invoke.MethodHandle.COMPILE_THRESHOLD", 0);
-                    values[5] = Integer.getInteger("java.lang.invoke.MethodHandle.DONT_INLINE_THRESHOLD", 30);
-                    values[6] = Integer.getInteger("java.lang.invoke.MethodHandle.PROFILE_LEVEL", 0);
-                    values[7] = Boolean.parseBoolean(System.getProperty("java.lang.invoke.MethodHandle.PROFILE_GWT", "true"));
-                    values[8] = Integer.getInteger("java.lang.invoke.MethodHandle.CUSTOMIZE_THRESHOLD", 127);
-                    return null;
-                }
-            });
-        DEBUG_METHOD_HANDLE_NAMES = (Boolean) values[0];
-        DUMP_CLASS_FILES          = (Boolean) values[1];
-        TRACE_INTERPRETER         = (Boolean) values[2];
-        TRACE_METHOD_LINKAGE      = (Boolean) values[3];
-        COMPILE_THRESHOLD         = (Integer) values[4];
-        DONT_INLINE_THRESHOLD     = (Integer) values[5];
-        PROFILE_LEVEL             = (Integer) values[6];
-        PROFILE_GWT               = (Boolean) values[7];
-        CUSTOMIZE_THRESHOLD       = (Integer) values[8];
-
-        if (CUSTOMIZE_THRESHOLD < -1 || CUSTOMIZE_THRESHOLD > 127) {
-            throw newInternalError("CUSTOMIZE_THRESHOLD should be in [-1...127] range");
-        }
-    }
-
-    /** Tell if any of the debugging switches are turned on.
-     *  If this is the case, it is reasonable to perform extra checks or save extra information.
-     */
-    /*non-public*/ static boolean debugEnabled() {
-        return (DEBUG_METHOD_HANDLE_NAMES |
-                DUMP_CLASS_FILES |
-                TRACE_INTERPRETER |
-                TRACE_METHOD_LINKAGE);
-    }
+    // Android-changed: Remove debugging related static fields. They are unused and have
+    // no equivalent on Android.
 
     // Android-changed: Temporarily hide methods that operate on MethodHandles until the
     // MethodHandle class is imported.
diff --git a/ojluni/src/main/java/java/net/DatagramSocket.java b/ojluni/src/main/java/java/net/DatagramSocket.java
index 6f2c95c..4e03f8f 100755
--- a/ojluni/src/main/java/java/net/DatagramSocket.java
+++ b/ojluni/src/main/java/java/net/DatagramSocket.java
@@ -172,10 +172,11 @@
                 // connection will be emulated by DatagramSocket
                 connectState = ST_CONNECTED_NO_IMPL;
           }*/
-          getImpl().connect(address, port);
 
           // socket is now connected by the impl
           connectState = ST_CONNECTED;
+          getImpl().connect(address, port);
+
           // Do we need to filter some packets?
           int avail = getImpl().dataAvailable();
           if (avail == -1) {
diff --git a/ojluni/src/main/java/javax/net/ssl/SSLEngine.java b/ojluni/src/main/java/javax/net/ssl/SSLEngine.java
index f460d5f..47783a0 100644
--- a/ojluni/src/main/java/javax/net/ssl/SSLEngine.java
+++ b/ojluni/src/main/java/javax/net/ssl/SSLEngine.java
@@ -498,14 +498,14 @@
  *             <td>9&ndash;22</td>
  *             <td></td>
  *         </tr>
- *         <tr>
+ *         <tr class="deprecated">
  *             <td>SSL_RSA_WITH_RC4_128_MD5</td>
- *             <td>9+</td>
+ *             <td>9&ndash;TBD</td>
  *             <td>9&ndash;19</td>
  *         </tr>
- *         <tr>
+ *         <tr class="deprecated">
  *             <td>SSL_RSA_WITH_RC4_128_SHA</td>
- *             <td>9+</td>
+ *             <td>9&ndash;TBD</td>
  *             <td>9&ndash;23</td>
  *         </tr>
  *         <tr class="deprecated">
@@ -718,9 +718,9 @@
  *             <td>20&ndash;22</td>
  *             <td></td>
  *         </tr>
- *         <tr>
+ *         <tr class="deprecated">
  *             <td>TLS_ECDHE_ECDSA_WITH_RC4_128_SHA</td>
- *             <td>20+</td>
+ *             <td>20&ndash;TBD</td>
  *             <td>20&ndash;23</td>
  *         </tr>
  *         <tr>
@@ -783,9 +783,9 @@
  *             <td>20&ndash;22</td>
  *             <td></td>
  *         </tr>
- *         <tr>
+ *         <tr class="deprecated">
  *             <td>TLS_ECDHE_RSA_WITH_RC4_128_SHA</td>
- *             <td>20+</td>
+ *             <td>20&ndash;TBD</td>
  *             <td>20&ndash;23</td>
  *         </tr>
  *         <tr class="deprecated">
@@ -933,9 +933,9 @@
  *             <td>21+</td>
  *             <td>21+</td>
  *         </tr>
- *         <tr>
+ *         <tr class="deprecated">
  *             <td>TLS_PSK_WITH_RC4_128_SHA</td>
- *             <td>21+</td>
+ *             <td>21&ndash;TBD</td>
  *             <td></td>
  *         </tr>
  *         <tr class="deprecated">
diff --git a/ojluni/src/main/java/javax/net/ssl/SSLSocket.java b/ojluni/src/main/java/javax/net/ssl/SSLSocket.java
index 3ee7f8c..4dd8b9e 100644
--- a/ojluni/src/main/java/javax/net/ssl/SSLSocket.java
+++ b/ojluni/src/main/java/javax/net/ssl/SSLSocket.java
@@ -313,14 +313,14 @@
  *             <td>9&ndash;22</td>
  *             <td></td>
  *         </tr>
- *         <tr>
+ *         <tr class="deprecated">
  *             <td>SSL_RSA_WITH_RC4_128_MD5</td>
- *             <td>9+</td>
+ *             <td>9&ndash;TBD</td>
  *             <td>9&ndash;19</td>
  *         </tr>
- *         <tr>
+ *         <tr class="deprecated">
  *             <td>SSL_RSA_WITH_RC4_128_SHA</td>
- *             <td>9+</td>
+ *             <td>9&ndash;TBD</td>
  *             <td>9&ndash;23</td>
  *         </tr>
  *         <tr class="deprecated">
@@ -458,9 +458,9 @@
  *             <td>11&ndash;22</td>
  *             <td></td>
  *         </tr>
- *         <tr>
+ *         <tr class="deprecated">
  *             <td>TLS_ECDHE_ECDSA_WITH_RC4_128_SHA</td>
- *             <td>11+</td>
+ *             <td>11&ndash;TBD</td>
  *             <td>11&ndash;23</td>
  *         </tr>
  *         <tr>
@@ -518,9 +518,9 @@
  *             <td>11&ndash;22</td>
  *             <td></td>
  *         </tr>
- *         <tr>
+ *         <tr class="deprecated">
  *             <td>TLS_ECDHE_RSA_WITH_RC4_128_SHA</td>
- *             <td>11+</td>
+ *             <td>11&ndash;TBD</td>
  *             <td>11&ndash;23</td>
  *         </tr>
  *         <tr class="deprecated">
@@ -663,9 +663,9 @@
  *             <td>21+</td>
  *             <td>21+</td>
  *         </tr>
- *         <tr>
+ *         <tr class="deprecated">
  *             <td>TLS_PSK_WITH_RC4_128_SHA</td>
- *             <td>21+</td>
+ *             <td>21&ndash;TBD</td>
  *             <td></td>
  *         </tr>
  *         <tr>
@@ -848,16 +848,16 @@
  *             <td>1&ndash;8</td>
  *             <td>1&ndash;8</td>
  *         </tr>
- *         <tr>
+ *         <tr class="deprecated">
  *             <td>RC4-MD5</td>
  *             <td>SSL_RSA_WITH_RC4_128_MD5</td>
- *             <td>1+</td>
+ *             <td>1&ndash;TBD</td>
  *             <td>1&ndash;19</td>
  *         </tr>
- *         <tr>
+ *         <tr class="deprecated">
  *             <td>RC4-SHA</td>
  *             <td>SSL_RSA_WITH_RC4_128_SHA</td>
- *             <td>1+</td>
+ *             <td>1&ndash;TBD</td>
  *             <td>1&ndash;23</td>
  *         </tr>
  *     </tbody>
diff --git a/support/src/test/java/libcore/java/security/StandardNames.java b/support/src/test/java/libcore/java/security/StandardNames.java
index d2f8b67..c9546e2 100644
--- a/support/src/test/java/libcore/java/security/StandardNames.java
+++ b/support/src/test/java/libcore/java/security/StandardNames.java
@@ -735,11 +735,7 @@
         addBoth(   "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA");
         addBoth(   "TLS_RSA_WITH_AES_128_CBC_SHA");
         addBoth(   "TLS_DHE_RSA_WITH_AES_128_CBC_SHA");
-        addBoth(   "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA");
-        addBoth(   "TLS_ECDHE_RSA_WITH_RC4_128_SHA");
-        addBoth(   "SSL_RSA_WITH_RC4_128_SHA");
         addBoth(   "SSL_RSA_WITH_3DES_EDE_CBC_SHA");
-        addBoth(   "SSL_RSA_WITH_RC4_128_MD5");
 
         // TLSv1.2 cipher suites
         addBoth(   "TLS_RSA_WITH_AES_128_CBC_SHA256");
@@ -762,7 +758,6 @@
         addOpenSsl("TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256");
 
         // Pre-Shared Key (PSK) cipher suites
-        addOpenSsl("TLS_PSK_WITH_RC4_128_SHA");
         addOpenSsl("TLS_PSK_WITH_AES_128_CBC_SHA");
         addOpenSsl("TLS_PSK_WITH_AES_256_CBC_SHA");
         addOpenSsl("TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA");
@@ -801,6 +796,12 @@
         addRi(     "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256");
         addNeither("TLS_DHE_DSS_WITH_AES_256_GCM_SHA384");
 
+        // Android does not have RC4 support
+        addRi(     "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA");
+        addRi(     "TLS_ECDHE_RSA_WITH_RC4_128_SHA");
+        addRi(     "SSL_RSA_WITH_RC4_128_SHA");
+        addRi(     "SSL_RSA_WITH_RC4_128_MD5");
+
         // Dropped
         addNeither("SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA");
         addNeither("SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA");