Merge "Change assert to assertTrue"
diff --git a/JavaLibrary.mk b/JavaLibrary.mk
index 7ca09bc..dfb0aaa 100644
--- a/JavaLibrary.mk
+++ b/JavaLibrary.mk
@@ -127,6 +127,23 @@
 LOCAL_REQUIRED_MODULES := tzdata
 include $(BUILD_JAVA_LIBRARY)
 
+# A library that exists to satisfy javac when
+# compiling source code that contains lambdas.
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := $(openjdk_lambda_stub_files)
+LOCAL_NO_STANDARD_LIBRARIES := true
+LOCAL_JAVACFLAGS := $(local_javac_flags)
+LOCAL_DX_FLAGS := --core-library
+LOCAL_MODULE_TAGS := optional
+LOCAL_JAVA_LANGUAGE_VERSION := 1.8
+LOCAL_MODULE := core-lambda-stubs
+LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/JavaLibrary.mk
+LOCAL_JAVA_LIBRARIES := core-all
+LOCAL_NOTICE_FILE := $(LOCAL_PATH)/ojluni/NOTICE
+LOCAL_CORE_LIBRARY := true
+LOCAL_UNINSTALLABLE_MODULE := true
+include $(BUILD_JAVA_LIBRARY)
+
 ifeq ($(LIBCORE_SKIP_TESTS),)
 # A guaranteed unstripped version of core-oj and core-libart. This is required for ART testing in
 # preopted configurations. See b/24535627.
@@ -170,9 +187,10 @@
 LOCAL_SRC_FILES := $(test_src_files)
 LOCAL_JAVA_RESOURCE_DIRS := $(test_resource_dirs)
 LOCAL_NO_STANDARD_LIBRARIES := true
-LOCAL_JAVA_LIBRARIES := core-oj core-libart okhttp core-junit bouncycastle mockito-target
+LOCAL_JAVA_LIBRARIES := core-oj core-libart core-lambda-stubs okhttp core-junit bouncycastle mockito-target
 LOCAL_STATIC_JAVA_LIBRARIES := core-tests-support sqlite-jdbc mockwebserver nist-pkix-tests
 LOCAL_JAVACFLAGS := $(local_javac_flags)
+LOCAL_JAVA_LANGUAGE_VERSION := 1.8
 LOCAL_MODULE := core-tests
 LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/JavaLibrary.mk
 include $(BUILD_STATIC_JAVA_LIBRARY)
@@ -262,16 +280,32 @@
 LOCAL_REQUIRED_MODULES := tzdata-host
 include $(BUILD_HOST_DALVIK_JAVA_LIBRARY)
 
+# A library that exists to satisfy javac when
+# compiling source code that contains lambdas.
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := $(openjdk_lambda_stub_files)
+LOCAL_NO_STANDARD_LIBRARIES := true
+LOCAL_JAVACFLAGS := $(local_javac_flags)
+LOCAL_DX_FLAGS := --core-library
+LOCAL_MODULE_TAGS := optional
+LOCAL_JAVA_LANGUAGE_VERSION := 1.8
+LOCAL_MODULE := core-lambda-stubs-hostdex
+LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/JavaLibrary.mk
+LOCAL_JAVA_LIBRARIES := core-all-hostdex
+LOCAL_CORE_LIBRARY := true
+include $(BUILD_HOST_DALVIK_JAVA_LIBRARY)
+
 # Make the core-tests library.
 ifeq ($(LIBCORE_SKIP_TESTS),)
     include $(CLEAR_VARS)
     LOCAL_SRC_FILES := $(test_src_files)
     LOCAL_JAVA_RESOURCE_DIRS := $(test_resource_dirs)
     LOCAL_NO_STANDARD_LIBRARIES := true
-    LOCAL_JAVA_LIBRARIES := core-oj-hostdex core-libart-hostdex okhttp-hostdex bouncycastle-hostdex core-junit-hostdex core-tests-support-hostdex mockito-api-hostdex
+    LOCAL_JAVA_LIBRARIES := core-oj-hostdex core-libart-hostdex core-lambda-stubs-hostdex okhttp-hostdex bouncycastle-hostdex core-junit-hostdex core-tests-support-hostdex mockito-api-hostdex
     LOCAL_STATIC_JAVA_LIBRARIES := sqlite-jdbc-host mockwebserver-host nist-pkix-tests-host
     LOCAL_JAVACFLAGS := $(local_javac_flags)
     LOCAL_MODULE_TAGS := optional
+    LOCAL_JAVA_LANGUAGE_VERSION := 1.8
     LOCAL_MODULE := core-tests-hostdex
     LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/JavaLibrary.mk
     include $(BUILD_HOST_DALVIK_JAVA_LIBRARY)
diff --git a/luni/src/test/java/libcore/java/util/ObjectsTest.java b/luni/src/test/java/libcore/java/util/ObjectsTest.java
index 0701108..735f6c5 100644
--- a/luni/src/test/java/libcore/java/util/ObjectsTest.java
+++ b/luni/src/test/java/libcore/java/util/ObjectsTest.java
@@ -18,6 +18,7 @@
 
 import java.util.Arrays;
 import java.util.Objects;
+import java.util.function.Supplier;
 
 public class ObjectsTest extends junit.framework.TestCase {
   public static final class Hello {
@@ -103,6 +104,32 @@
     }
   }
 
+  public void test_requireNonNull_T_Supplier() throws Exception {
+    Hello h = new Hello();
+    assertEquals(h, Objects.requireNonNull(h, () -> "test"));
+    try {
+      Objects.requireNonNull(null, () -> "message");
+      fail();
+    } catch (NullPointerException expected) {
+      assertEquals("message", expected.getMessage());
+    }
+
+    // The supplier is unexpectedly null.
+    try {
+      Objects.requireNonNull(null, (Supplier<String>) null);
+      fail();
+    } catch (NullPointerException expected) {
+    }
+
+    // The message returned by the supplier is null.
+    try {
+      Objects.requireNonNull(null, () -> null);
+      fail();
+    } catch (NullPointerException expected) {
+      assertEquals(null, expected.getMessage());
+    }
+  }
+
   public void test_toString_Object() throws Exception {
     assertEquals("hello", Objects.toString(new Hello()));
     assertEquals("null", Objects.toString(null));
@@ -113,4 +140,14 @@
     assertEquals("world", Objects.toString(null, "world"));
     assertEquals(null, Objects.toString(null, null));
   }
+
+  public void test_isNull() throws Exception {
+    assertTrue(Objects.isNull(null));
+    assertFalse(Objects.isNull(new Hello()));
+  }
+
+  public void test_nonNull() throws Exception {
+    assertFalse(Objects.nonNull(null));
+    assertTrue(Objects.nonNull(new Hello()));
+  }
 }
diff --git a/luni/src/test/java/libcore/java/util/function/BiConsumerTest.java b/luni/src/test/java/libcore/java/util/function/BiConsumerTest.java
new file mode 100644
index 0000000..4709138
--- /dev/null
+++ b/luni/src/test/java/libcore/java/util/function/BiConsumerTest.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+package libcore.java.util.function;
+
+import junit.framework.TestCase;
+
+import java.util.function.BiConsumer;
+
+public class BiConsumerTest extends TestCase {
+
+  public void testAndThen() throws Exception {
+    BiConsumer<String, StringBuilder> one = (s, t) -> t.append("one").append(s);
+    BiConsumer<String, StringBuilder> two = (s, t) -> t.append("two").append(s);
+
+    StringBuilder sb = new StringBuilder();
+    one.andThen(two).accept("z", sb);
+    assertEquals("oneztwoz", sb.toString());
+
+    sb.setLength(0);
+    two.andThen(one).accept("z", sb);
+    assertEquals("twozonez", sb.toString());
+  }
+
+  public void testAndThen_null() throws Exception {
+    BiConsumer<String, StringBuilder> one = (s, t) -> t.append("one").append(s);
+    try {
+      one.andThen(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+}
diff --git a/luni/src/test/java/libcore/java/util/function/BiFunctionTest.java b/luni/src/test/java/libcore/java/util/function/BiFunctionTest.java
new file mode 100644
index 0000000..04e365a
--- /dev/null
+++ b/luni/src/test/java/libcore/java/util/function/BiFunctionTest.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+package libcore.java.util.function;
+
+import junit.framework.TestCase;
+
+import java.util.function.BiFunction;
+import java.util.function.Function;
+
+public class BiFunctionTest extends TestCase {
+
+  public void testAndThen() throws Exception {
+    BiFunction<Integer, Integer, Integer> add = (x, y) -> x + y;
+    Function<Integer, String> toString = i -> Integer.toString(i);
+    assertEquals("4", add.andThen(toString).apply(2, 2));
+  }
+
+  public void testAndThen_nullFunction() throws Exception {
+    BiFunction<Integer, Integer, Integer> add = (x, y) -> x + y;
+    try {
+      add.andThen(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+
+  public void testAndThen_nullResult() throws Exception {
+    BiFunction<Integer, Integer, Integer> toNull = (x, y) -> null;
+    Function<Integer, String> assertNull = i -> { assertNull(i); return "ok"; };
+    assertEquals("ok", toNull.andThen(assertNull).apply(2, 2));
+  }
+}
diff --git a/luni/src/test/java/libcore/java/util/function/BiPredicateTest.java b/luni/src/test/java/libcore/java/util/function/BiPredicateTest.java
new file mode 100644
index 0000000..6060f28
--- /dev/null
+++ b/luni/src/test/java/libcore/java/util/function/BiPredicateTest.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+package libcore.java.util.function;
+
+import junit.framework.TestCase;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.BiPredicate;
+
+public class BiPredicateTest extends TestCase {
+
+  public void testAnd() throws Exception {
+    Object arg1 = "one";
+    Object arg2 = "two";
+    AtomicBoolean alwaysTrueInvoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysTrue2Invoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysFalseInvoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysFalse2Invoked = new AtomicBoolean(false);
+    AtomicBoolean[] invocationState = {
+        alwaysTrueInvoked, alwaysTrue2Invoked, alwaysFalseInvoked, alwaysFalse2Invoked };
+
+    BiPredicate<Object, Object> alwaysTrue =
+        (x, y) -> { alwaysTrueInvoked.set(true); assertSame(arg1, x); assertSame(arg2, y); return true; };
+    BiPredicate<Object, Object> alwaysTrue2 =
+        (x, y) -> { alwaysTrue2Invoked.set(true); assertSame(arg1, x); assertSame(arg2, y); return true; };
+    BiPredicate<Object, Object> alwaysFalse =
+        (x, y) -> { alwaysFalseInvoked.set(true); assertSame(arg1, x); assertSame(arg2, y); return false; };
+    BiPredicate<Object, Object> alwaysFalse2 =
+        (x, y) -> { alwaysFalse2Invoked.set(true); assertSame(arg1, x); assertSame(arg2, y); return false; };
+
+    // true && true
+    resetToFalse(invocationState);
+    assertTrue(alwaysTrue.and(alwaysTrue2).test(arg1, arg2));
+    assertTrue(alwaysTrueInvoked.get() && alwaysTrue2Invoked.get());
+
+    // true && false
+    resetToFalse(invocationState);
+    assertFalse(alwaysTrue.and(alwaysFalse).test(arg1, arg2));
+    assertTrue(alwaysTrueInvoked.get() && alwaysFalseInvoked.get());
+
+    // false && false
+    resetToFalse(invocationState);
+    assertFalse(alwaysFalse.and(alwaysFalse2).test(arg1, arg2));
+    assertTrue(alwaysFalseInvoked.get() && !alwaysFalse2Invoked.get());
+
+    // false && true
+    resetToFalse(invocationState);
+    assertFalse(alwaysFalse.and(alwaysTrue).test(arg1, arg2));
+    assertTrue(alwaysFalseInvoked.get() && !alwaysTrueInvoked.get());
+  }
+
+  public void testAnd_null() throws Exception {
+    BiPredicate<Object, Object> alwaysTrue = (x, y) -> true;
+    try {
+      alwaysTrue.and(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+
+  public void testNegate() throws Exception {
+    Object arg1 = "one";
+    Object arg2 = "two";
+    BiPredicate<Object, Object> alwaysTrue =
+        (x, y) -> { assertSame(arg1, x); assertSame(arg2, y); return true; };
+    assertFalse(alwaysTrue.negate().test(arg1, arg2));
+
+    BiPredicate<Object, Object> alwaysFalse =
+        (x, y) -> { assertSame(arg1, x); assertSame(arg2, y); return false; };
+    assertTrue(alwaysFalse.negate().test(arg1, arg2));
+  }
+
+  public void testOr() throws Exception {
+    Object arg1 = "one";
+    Object arg2 = "two";
+    AtomicBoolean alwaysTrueInvoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysTrue2Invoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysFalseInvoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysFalse2Invoked = new AtomicBoolean(false);
+    AtomicBoolean[] invocationState = {
+        alwaysTrueInvoked, alwaysTrue2Invoked, alwaysFalseInvoked, alwaysFalse2Invoked };
+
+    BiPredicate<Object, Object> alwaysTrue =
+        (x, y) -> { alwaysTrueInvoked.set(true); assertSame(arg1, x); assertSame(arg2, y); return true; };
+    BiPredicate<Object, Object> alwaysTrue2 =
+        (x, y) -> { alwaysTrue2Invoked.set(true); assertSame(arg1, x); assertSame(arg2, y); return true; };
+    BiPredicate<Object, Object> alwaysFalse =
+        (x, y) -> { alwaysFalseInvoked.set(true); assertSame(arg1, x); assertSame(arg2, y); return false; };
+    BiPredicate<Object, Object> alwaysFalse2 =
+        (x, y) -> { alwaysFalse2Invoked.set(true); assertSame(arg1, x); assertSame(arg2, y); return false; };
+
+    // true || true
+    resetToFalse(invocationState);
+    assertTrue(alwaysTrue.or(alwaysTrue2).test(arg1, arg2));
+    assertTrue(alwaysTrueInvoked.get() && !alwaysTrue2Invoked.get());
+
+    // true || false
+    resetToFalse(invocationState);
+    assertTrue(alwaysTrue.or(alwaysFalse).test(arg1, arg2));
+    assertTrue(alwaysTrueInvoked.get() && !alwaysFalseInvoked.get());
+
+    // false || false
+    resetToFalse(invocationState);
+    assertFalse(alwaysFalse.or(alwaysFalse2).test(arg1, arg2));
+    assertTrue(alwaysFalseInvoked.get() && alwaysFalse2Invoked.get());
+
+    // false || true
+    resetToFalse(invocationState);
+    assertTrue(alwaysFalse.or(alwaysTrue).test(arg1, arg2));
+    assertTrue(alwaysFalseInvoked.get() && alwaysTrueInvoked.get());
+  }
+
+  public void testOr_null() throws Exception {
+    BiPredicate<Object, Object> alwaysTrue = (x, y) -> true;
+    try {
+      alwaysTrue.or(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+
+  private static void resetToFalse(AtomicBoolean... toResets) {
+    for (AtomicBoolean toReset : toResets) {
+      toReset.set(false);
+    }
+  }
+}
diff --git a/luni/src/test/java/libcore/java/util/function/BinaryOperatorTest.java b/luni/src/test/java/libcore/java/util/function/BinaryOperatorTest.java
new file mode 100644
index 0000000..e3be671
--- /dev/null
+++ b/luni/src/test/java/libcore/java/util/function/BinaryOperatorTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+package libcore.java.util.function;
+
+import junit.framework.TestCase;
+
+import java.util.Comparator;
+import java.util.function.BinaryOperator;
+
+public class BinaryOperatorTest extends TestCase {
+
+  public void testMinBy() throws Exception {
+    Comparator<String> stringComparator = String::compareTo;
+    assertEquals("a", BinaryOperator.minBy(stringComparator).apply("a", "b"));
+  }
+
+  public void testMinBy_null() throws Exception {
+    try {
+      BinaryOperator.minBy(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+
+  public void testMaxBy() throws Exception {
+    Comparator<String> stringComparator = String::compareTo;
+    assertEquals("b", BinaryOperator.maxBy(stringComparator).apply("a", "b"));
+  }
+
+  public void testMaxBy_null() throws Exception {
+    try {
+      BinaryOperator.maxBy(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+}
diff --git a/luni/src/test/java/libcore/java/util/function/ConsumerTest.java b/luni/src/test/java/libcore/java/util/function/ConsumerTest.java
new file mode 100644
index 0000000..7cd4db6
--- /dev/null
+++ b/luni/src/test/java/libcore/java/util/function/ConsumerTest.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+package libcore.java.util.function;
+
+import junit.framework.TestCase;
+
+import java.util.function.Consumer;
+
+public class ConsumerTest extends TestCase {
+
+  public void testAndThen() throws Exception {
+    Consumer<StringBuilder> sweet = s -> s.append("sweet");
+    Consumer<StringBuilder> dude = s -> s.append("dude");
+
+    StringBuilder sb = new StringBuilder();
+    sweet.andThen(dude).accept(sb);
+    assertEquals("sweetdude", sb.toString());
+
+    sb.setLength(0);
+    dude.andThen(sweet).accept(sb);
+    assertEquals("dudesweet", sb.toString());
+  }
+
+  public void testAndThen_null() throws Exception {
+    Consumer<StringBuilder> one = s -> s.append("one");
+    try {
+      one.andThen(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+}
diff --git a/luni/src/test/java/libcore/java/util/function/DoubleConsumerTest.java b/luni/src/test/java/libcore/java/util/function/DoubleConsumerTest.java
new file mode 100644
index 0000000..0931b11
--- /dev/null
+++ b/luni/src/test/java/libcore/java/util/function/DoubleConsumerTest.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+package libcore.java.util.function;
+
+import junit.framework.TestCase;
+
+import java.util.function.DoubleConsumer;
+
+public class DoubleConsumerTest extends TestCase {
+
+  public void testAndThen() throws Exception {
+    StringBuilder sb = new StringBuilder();
+    DoubleConsumer one = d -> sb.append("one:" + d + ",");
+    DoubleConsumer two = d -> sb.append("two:" + d);
+
+    one.andThen(two).accept(1.0d);
+    assertEquals("one:1.0,two:1.0", sb.toString());
+  }
+
+  public void testAndThen_null() throws Exception {
+    DoubleConsumer one = s -> {};
+    try {
+      one.andThen(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+}
diff --git a/luni/src/test/java/libcore/java/util/function/DoublePredicateTest.java b/luni/src/test/java/libcore/java/util/function/DoublePredicateTest.java
new file mode 100644
index 0000000..45bf5da
--- /dev/null
+++ b/luni/src/test/java/libcore/java/util/function/DoublePredicateTest.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+package libcore.java.util.function;
+
+import junit.framework.TestCase;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.DoublePredicate;
+
+public class DoublePredicateTest extends TestCase {
+
+  public void testAnd() throws Exception {
+    double arg = 5.0d;
+
+    AtomicBoolean alwaysTrueInvoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysTrue2Invoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysFalseInvoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysFalse2Invoked = new AtomicBoolean(false);
+    AtomicBoolean[] invocationState = {
+        alwaysTrueInvoked, alwaysTrue2Invoked, alwaysFalseInvoked, alwaysFalse2Invoked };
+
+    DoublePredicate alwaysTrue =
+        x -> { alwaysTrueInvoked.set(true); assertEquals(x, arg); return true; };
+    DoublePredicate alwaysTrue2 =
+        x -> { alwaysTrue2Invoked.set(true); assertEquals(x, arg); return true; };
+    DoublePredicate alwaysFalse =
+        x -> { alwaysFalseInvoked.set(true); assertEquals(x, arg); return false; };
+    DoublePredicate alwaysFalse2 =
+        x -> { alwaysFalse2Invoked.set(true); assertEquals(x, arg); return false; };
+
+    // true && true
+    resetToFalse(invocationState);
+    assertTrue(alwaysTrue.and(alwaysTrue2).test(arg));
+    assertTrue(alwaysTrueInvoked.get() && alwaysTrue2Invoked.get());
+
+    // true && false
+    resetToFalse(invocationState);
+    assertFalse(alwaysTrue.and(alwaysFalse).test(arg));
+    assertTrue(alwaysTrueInvoked.get() && alwaysFalseInvoked.get());
+
+    // false && false
+    resetToFalse(invocationState);
+    assertFalse(alwaysFalse.and(alwaysFalse2).test(arg));
+    assertTrue(alwaysFalseInvoked.get() && !alwaysFalse2Invoked.get());
+
+    // false && true
+    resetToFalse(invocationState);
+    assertFalse(alwaysFalse.and(alwaysTrue).test(arg));
+    assertTrue(alwaysFalseInvoked.get() && !alwaysTrueInvoked.get());
+  }
+
+  public void testAnd_null() throws Exception {
+    DoublePredicate alwaysTrue = x -> true;
+    try {
+      alwaysTrue.and(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+
+  public void testNegate() throws Exception {
+    double arg = 5.0d;
+    DoublePredicate alwaysTrue = x -> { assertEquals(x, arg); return true; };
+    assertFalse(alwaysTrue.negate().test(arg));
+
+    DoublePredicate alwaysFalse = x -> { assertEquals(x, arg); return false; };
+    assertTrue(alwaysFalse.negate().test(arg));
+  }
+
+  public void testOr() throws Exception {
+    double arg = 5.0d;
+
+    AtomicBoolean alwaysTrueInvoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysTrue2Invoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysFalseInvoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysFalse2Invoked = new AtomicBoolean(false);
+    AtomicBoolean[] invocationState = {
+        alwaysTrueInvoked, alwaysTrue2Invoked, alwaysFalseInvoked, alwaysFalse2Invoked };
+
+    DoublePredicate alwaysTrue =
+        x -> { alwaysTrueInvoked.set(true); assertEquals(x, arg); return true; };
+    DoublePredicate alwaysTrue2 =
+        x -> { alwaysTrue2Invoked.set(true); assertEquals(x, arg); return true; };
+    DoublePredicate alwaysFalse =
+        x -> { alwaysFalseInvoked.set(true); assertEquals(x, arg); return false; };
+    DoublePredicate alwaysFalse2 =
+        x -> { alwaysFalse2Invoked.set(true); assertEquals(x, arg); return false; };
+
+    // true || true
+    resetToFalse(invocationState);
+    assertTrue(alwaysTrue.or(alwaysTrue2).test(arg));
+    assertTrue(alwaysTrueInvoked.get() && !alwaysTrue2Invoked.get());
+
+    // true || false
+    resetToFalse(invocationState);
+    assertTrue(alwaysTrue.or(alwaysFalse).test(arg));
+    assertTrue(alwaysTrueInvoked.get() && !alwaysFalseInvoked.get());
+
+    // false || false
+    resetToFalse(invocationState);
+    assertFalse(alwaysFalse.or(alwaysFalse2).test(arg));
+    assertTrue(alwaysFalseInvoked.get() && alwaysFalse2Invoked.get());
+
+    // false || true
+    resetToFalse(invocationState);
+    assertTrue(alwaysFalse.or(alwaysTrue).test(arg));
+    assertTrue(alwaysFalseInvoked.get() && alwaysTrueInvoked.get());
+  }
+
+  public void testOr_null() throws Exception {
+    DoublePredicate alwaysTrue = x -> true;
+    try {
+      alwaysTrue.or(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+
+  private static void resetToFalse(AtomicBoolean... toResets) {
+    for (AtomicBoolean toReset : toResets) {
+      toReset.set(false);
+    }
+  }
+}
diff --git a/luni/src/test/java/libcore/java/util/function/DoubleUnaryOperatorTest.java b/luni/src/test/java/libcore/java/util/function/DoubleUnaryOperatorTest.java
new file mode 100644
index 0000000..65cfb96
--- /dev/null
+++ b/luni/src/test/java/libcore/java/util/function/DoubleUnaryOperatorTest.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+package libcore.java.util.function;
+
+import junit.framework.TestCase;
+
+import java.util.Comparator;
+import java.util.function.BinaryOperator;
+import java.util.function.DoubleUnaryOperator;
+
+public class DoubleUnaryOperatorTest extends TestCase {
+
+  public void testIdentity() throws Exception {
+    assertEquals(1.0d, DoubleUnaryOperator.identity().applyAsDouble(1.0d));
+    assertEquals(Double.NaN, DoubleUnaryOperator.identity().applyAsDouble(Double.NaN));
+    assertEquals(Double.NEGATIVE_INFINITY,
+        DoubleUnaryOperator.identity().applyAsDouble(Double.NEGATIVE_INFINITY));
+    assertEquals(Double.MAX_VALUE,
+        DoubleUnaryOperator.identity().applyAsDouble(Double.MAX_VALUE));
+  }
+
+  public void testCompose() throws Exception {
+    DoubleUnaryOperator plusOne = x -> x + 1.0d;
+    DoubleUnaryOperator twice = x -> 2 *x;
+    assertEquals(11.0d, plusOne.compose(twice).applyAsDouble(5.0d));
+  }
+
+  public void testCompose_null() throws Exception {
+    DoubleUnaryOperator plusOne = x -> x + 1.0d;
+    try {
+      plusOne.compose(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+
+  public void testAndThen() throws Exception {
+    DoubleUnaryOperator plusOne = x -> x + 1.0d;
+    DoubleUnaryOperator twice = x -> 2 *x;
+    assertEquals(12.0d, plusOne.andThen(twice).applyAsDouble(5.0d));
+  }
+
+  public void testAndThen_null() throws Exception {
+    DoubleUnaryOperator plusOne = x -> x + 1.0d;
+    try {
+      plusOne.andThen(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+}
diff --git a/luni/src/test/java/libcore/java/util/function/FunctionTest.java b/luni/src/test/java/libcore/java/util/function/FunctionTest.java
new file mode 100644
index 0000000..e364c11
--- /dev/null
+++ b/luni/src/test/java/libcore/java/util/function/FunctionTest.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+package libcore.java.util.function;
+
+import junit.framework.TestCase;
+
+import java.util.function.Function;
+
+public class FunctionTest extends TestCase {
+
+  public void testIdentity() throws Exception {
+    Object o = new Object();
+    assertSame(o, Function.identity().apply(o));
+    assertNull(Function.identity().apply(null));
+  }
+
+  public void testCompose() throws Exception {
+    Function<Double, Double> plusOne = x -> x + 1.0d;
+    Function<Double, Double> twice = x -> 2 *x;
+    assertEquals(11.0d, plusOne.compose(twice).apply(5.0d));
+  }
+
+  public void testCompose_null() throws Exception {
+    Function<Double, Double> plusOne = x -> x + 1.0d;
+    try {
+      plusOne.compose(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+
+  public void testAndThen() throws Exception {
+    Function<Double, Double> plusOne = x -> x + 1.0d;
+    Function<Double, Double> twice = x -> 2 *x;
+    assertEquals(12.0d, plusOne.andThen(twice).apply(5.0d));
+  }
+
+  public void testAndThen_null() throws Exception {
+    Function<Double, Double> plusOne = x -> x + 1.0d;
+    try {
+      plusOne.andThen(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+}
diff --git a/luni/src/test/java/libcore/java/util/function/IntConsumerTest.java b/luni/src/test/java/libcore/java/util/function/IntConsumerTest.java
new file mode 100644
index 0000000..de04664
--- /dev/null
+++ b/luni/src/test/java/libcore/java/util/function/IntConsumerTest.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+package libcore.java.util.function;
+
+import junit.framework.TestCase;
+
+import java.util.function.IntConsumer;
+
+public class IntConsumerTest extends TestCase {
+
+  public void testAndThen() throws Exception {
+    StringBuilder sb = new StringBuilder();
+    IntConsumer one = i -> sb.append("one:" + i + ",");
+    IntConsumer two = i -> sb.append("two:" + i);
+
+    one.andThen(two).accept(1);
+    assertEquals("one:1,two:1", sb.toString());
+  }
+
+  public void testAndThen_null() throws Exception {
+    IntConsumer one = s -> {};
+    try {
+      one.andThen(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+}
diff --git a/luni/src/test/java/libcore/java/util/function/IntPredicateTest.java b/luni/src/test/java/libcore/java/util/function/IntPredicateTest.java
new file mode 100644
index 0000000..63a670f
--- /dev/null
+++ b/luni/src/test/java/libcore/java/util/function/IntPredicateTest.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+package libcore.java.util.function;
+
+import junit.framework.TestCase;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.IntPredicate;
+
+public class IntPredicateTest extends TestCase {
+
+  public void testAnd() throws Exception {
+    int arg = 5;
+
+    AtomicBoolean alwaysTrueInvoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysTrue2Invoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysFalseInvoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysFalse2Invoked = new AtomicBoolean(false);
+    AtomicBoolean[] invocationState = {
+        alwaysTrueInvoked, alwaysTrue2Invoked, alwaysFalseInvoked, alwaysFalse2Invoked };
+
+    IntPredicate alwaysTrue =
+        x -> { alwaysTrueInvoked.set(true); assertEquals(x, arg); return true; };
+    IntPredicate alwaysTrue2 =
+        x -> { alwaysTrue2Invoked.set(true); assertEquals(x, arg); return true; };
+    IntPredicate alwaysFalse =
+        x -> { alwaysFalseInvoked.set(true); assertEquals(x, arg); return false; };
+    IntPredicate alwaysFalse2 =
+        x -> { alwaysFalse2Invoked.set(true); assertEquals(x, arg); return false; };
+
+    // true && true
+    resetToFalse(invocationState);
+    assertTrue(alwaysTrue.and(alwaysTrue2).test(arg));
+    assertTrue(alwaysTrueInvoked.get() && alwaysTrue2Invoked.get());
+
+    // true && false
+    resetToFalse(invocationState);
+    assertFalse(alwaysTrue.and(alwaysFalse).test(arg));
+    assertTrue(alwaysTrueInvoked.get() && alwaysFalseInvoked.get());
+
+    // false && false
+    resetToFalse(invocationState);
+    assertFalse(alwaysFalse.and(alwaysFalse2).test(arg));
+    assertTrue(alwaysFalseInvoked.get() && !alwaysFalse2Invoked.get());
+
+    // false && true
+    resetToFalse(invocationState);
+    assertFalse(alwaysFalse.and(alwaysTrue).test(arg));
+    assertTrue(alwaysFalseInvoked.get() && !alwaysTrueInvoked.get());
+  }
+
+  public void testAnd_null() throws Exception {
+    IntPredicate alwaysTrue = x -> true;
+    try {
+      alwaysTrue.and(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+
+  public void testNegate() throws Exception {
+    int arg = 5;
+    IntPredicate alwaysTrue = x -> { assertEquals(x, arg); return true; };
+    assertFalse(alwaysTrue.negate().test(arg));
+
+    IntPredicate alwaysFalse = x -> { assertEquals(x, arg); return false; };
+    assertTrue(alwaysFalse.negate().test(arg));
+  }
+
+  public void testOr() throws Exception {
+    int arg = 5;
+
+    AtomicBoolean alwaysTrueInvoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysTrue2Invoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysFalseInvoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysFalse2Invoked = new AtomicBoolean(false);
+    AtomicBoolean[] invocationState = {
+        alwaysTrueInvoked, alwaysTrue2Invoked, alwaysFalseInvoked, alwaysFalse2Invoked };
+
+    IntPredicate alwaysTrue =
+        x -> { alwaysTrueInvoked.set(true); assertEquals(x, arg); return true; };
+    IntPredicate alwaysTrue2 =
+        x -> { alwaysTrue2Invoked.set(true); assertEquals(x, arg); return true; };
+    IntPredicate alwaysFalse =
+        x -> { alwaysFalseInvoked.set(true); assertEquals(x, arg); return false; };
+    IntPredicate alwaysFalse2 =
+        x -> { alwaysFalse2Invoked.set(true); assertEquals(x, arg); return false; };
+
+    // true || true
+    resetToFalse(invocationState);
+    assertTrue(alwaysTrue.or(alwaysTrue2).test(arg));
+    assertTrue(alwaysTrueInvoked.get() && !alwaysTrue2Invoked.get());
+
+    // true || false
+    resetToFalse(invocationState);
+    assertTrue(alwaysTrue.or(alwaysFalse).test(arg));
+    assertTrue(alwaysTrueInvoked.get() && !alwaysFalseInvoked.get());
+
+    // false || false
+    resetToFalse(invocationState);
+    assertFalse(alwaysFalse.or(alwaysFalse2).test(arg));
+    assertTrue(alwaysFalseInvoked.get() && alwaysFalse2Invoked.get());
+
+    // false || true
+    resetToFalse(invocationState);
+    assertTrue(alwaysFalse.or(alwaysTrue).test(arg));
+    assertTrue(alwaysFalseInvoked.get() && alwaysTrueInvoked.get());
+  }
+
+  public void testOr_null() throws Exception {
+    IntPredicate alwaysTrue = x -> true;
+    try {
+      alwaysTrue.or(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+
+  private static void resetToFalse(AtomicBoolean... toResets) {
+    for (AtomicBoolean toReset : toResets) {
+      toReset.set(false);
+    }
+  }
+}
diff --git a/luni/src/test/java/libcore/java/util/function/IntUnaryOperatorTest.java b/luni/src/test/java/libcore/java/util/function/IntUnaryOperatorTest.java
new file mode 100644
index 0000000..043ec1d
--- /dev/null
+++ b/luni/src/test/java/libcore/java/util/function/IntUnaryOperatorTest.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+package libcore.java.util.function;
+
+import junit.framework.TestCase;
+
+import java.util.function.IntUnaryOperator;
+
+public class IntUnaryOperatorTest extends TestCase {
+
+  public void testIdentity() throws Exception {
+    assertEquals(1, IntUnaryOperator.identity().applyAsInt(1));
+    assertEquals(Integer.MAX_VALUE, IntUnaryOperator.identity().applyAsInt(Integer.MAX_VALUE));
+  }
+
+  public void testCompose() throws Exception {
+    IntUnaryOperator plusOne = x -> x + 1;
+    IntUnaryOperator twice = x -> 2 *x;
+    assertEquals(11, plusOne.compose(twice).applyAsInt(5));
+  }
+
+  public void testCompose_null() throws Exception {
+    IntUnaryOperator plusOne = x -> x + 1;
+    try {
+      plusOne.compose(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+
+  public void testAndThen() throws Exception {
+    IntUnaryOperator plusOne = x -> x + 1;
+    IntUnaryOperator twice = x -> 2 *x;
+    assertEquals(12, plusOne.andThen(twice).applyAsInt(5));
+  }
+
+  public void testAndThen_null() throws Exception {
+    IntUnaryOperator plusOne = x -> x + 1;
+    try {
+      plusOne.andThen(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+}
diff --git a/luni/src/test/java/libcore/java/util/function/LongConsumerTest.java b/luni/src/test/java/libcore/java/util/function/LongConsumerTest.java
new file mode 100644
index 0000000..d1aad73
--- /dev/null
+++ b/luni/src/test/java/libcore/java/util/function/LongConsumerTest.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+package libcore.java.util.function;
+
+import junit.framework.TestCase;
+
+import java.util.function.LongConsumer;
+
+public class LongConsumerTest extends TestCase {
+
+  public void testAndThen() throws Exception {
+    StringBuilder sb = new StringBuilder();
+    LongConsumer one = l -> sb.append("one:" + l + ",");
+    LongConsumer two = l -> sb.append("two:" + l);
+
+    one.andThen(two).accept(1L);
+    assertEquals("one:1,two:1", sb.toString());
+  }
+
+  public void testAndThen_null() throws Exception {
+    LongConsumer one = s -> {};
+    try {
+      one.andThen(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+}
diff --git a/luni/src/test/java/libcore/java/util/function/LongPredicateTest.java b/luni/src/test/java/libcore/java/util/function/LongPredicateTest.java
new file mode 100644
index 0000000..a875799
--- /dev/null
+++ b/luni/src/test/java/libcore/java/util/function/LongPredicateTest.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+package libcore.java.util.function;
+
+import junit.framework.TestCase;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.LongPredicate;
+
+public class LongPredicateTest extends TestCase {
+
+  public void testAnd() throws Exception {
+    AtomicBoolean alwaysTrueInvoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysTrue2Invoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysFalseInvoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysFalse2Invoked = new AtomicBoolean(false);
+    AtomicBoolean[] invocationState = {
+        alwaysTrueInvoked, alwaysTrue2Invoked, alwaysFalseInvoked, alwaysFalse2Invoked };
+
+    LongPredicate alwaysTrue = x -> { alwaysTrueInvoked.set(true); return true; };
+    LongPredicate alwaysTrue2 = x -> { alwaysTrue2Invoked.set(true); return true; };
+    LongPredicate alwaysFalse = x -> { alwaysFalseInvoked.set(true); return false; };
+    LongPredicate alwaysFalse2 = x -> { alwaysFalse2Invoked.set(true); return false; };
+
+    // true && true
+    resetToFalse(invocationState);
+    assertTrue(alwaysTrue.and(alwaysTrue2).test(1L));
+    assertTrue(alwaysTrueInvoked.get() && alwaysTrue2Invoked.get());
+
+    // true && false
+    resetToFalse(invocationState);
+    assertFalse(alwaysTrue.and(alwaysFalse).test(1L));
+    assertTrue(alwaysTrueInvoked.get() && alwaysFalseInvoked.get());
+
+    // false && false
+    resetToFalse(invocationState);
+    assertFalse(alwaysFalse.and(alwaysFalse2).test(1L));
+    assertTrue(alwaysFalseInvoked.get() && !alwaysFalse2Invoked.get());
+
+    // false && true
+    resetToFalse(invocationState);
+    assertFalse(alwaysFalse.and(alwaysTrue).test(1L));
+    assertTrue(alwaysFalseInvoked.get() && !alwaysTrueInvoked.get());
+  }
+
+  public void testAnd_null() throws Exception {
+    LongPredicate alwaysTrue = x -> true;
+    try {
+      alwaysTrue.and(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+
+  public void testNegate() throws Exception {
+    long arg = 5L;
+    LongPredicate alwaysTrue = x -> { assertEquals(x, arg); return true; };
+    assertFalse(alwaysTrue.negate().test(arg));
+
+    LongPredicate alwaysFalse = x -> { assertEquals(x, arg); return false; };
+    assertTrue(alwaysFalse.negate().test(arg));
+  }
+
+  public void testOr() throws Exception {
+    AtomicBoolean alwaysTrueInvoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysTrue2Invoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysFalseInvoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysFalse2Invoked = new AtomicBoolean(false);
+    AtomicBoolean[] invocationState = {
+        alwaysTrueInvoked, alwaysTrue2Invoked, alwaysFalseInvoked, alwaysFalse2Invoked };
+
+    LongPredicate alwaysTrue = x -> { alwaysTrueInvoked.set(true); return true; };
+    LongPredicate alwaysTrue2 = x -> { alwaysTrue2Invoked.set(true); return true; };
+    LongPredicate alwaysFalse = x -> { alwaysFalseInvoked.set(true); return false; };
+    LongPredicate alwaysFalse2 = x -> { alwaysFalse2Invoked.set(true); return false; };
+
+    // true || true
+    resetToFalse(invocationState);
+    assertTrue(alwaysTrue.or(alwaysTrue2).test(1L));
+    assertTrue(alwaysTrueInvoked.get() && !alwaysTrue2Invoked.get());
+
+    // true || false
+    resetToFalse(invocationState);
+    assertTrue(alwaysTrue.or(alwaysFalse).test(1L));
+    assertTrue(alwaysTrueInvoked.get() && !alwaysFalseInvoked.get());
+
+    // false || false
+    resetToFalse(invocationState);
+    assertFalse(alwaysFalse.or(alwaysFalse2).test(1L));
+    assertTrue(alwaysFalseInvoked.get() && alwaysFalse2Invoked.get());
+
+    // false || true
+    resetToFalse(invocationState);
+    assertTrue(alwaysFalse.or(alwaysTrue).test(1L));
+    assertTrue(alwaysFalseInvoked.get() && alwaysTrueInvoked.get());
+  }
+
+  public void testOr_null() throws Exception {
+    LongPredicate alwaysTrue = x -> true;
+    try {
+      alwaysTrue.or(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+
+  private static void resetToFalse(AtomicBoolean... toResets) {
+    for (AtomicBoolean toReset : toResets) {
+      toReset.set(false);
+    }
+  }
+}
diff --git a/luni/src/test/java/libcore/java/util/function/LongUnaryOperatorTest.java b/luni/src/test/java/libcore/java/util/function/LongUnaryOperatorTest.java
new file mode 100644
index 0000000..9ab028c
--- /dev/null
+++ b/luni/src/test/java/libcore/java/util/function/LongUnaryOperatorTest.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+package libcore.java.util.function;
+
+import junit.framework.TestCase;
+
+import java.util.function.LongUnaryOperator;
+
+public class LongUnaryOperatorTest extends TestCase {
+
+  public void testIdentity() throws Exception {
+    assertEquals(1L, LongUnaryOperator.identity().applyAsLong(1L));
+    assertEquals(Long.MAX_VALUE, LongUnaryOperator.identity().applyAsLong(Long.MAX_VALUE));
+  }
+
+  public void testCompose() throws Exception {
+    LongUnaryOperator plusOne = x -> x + 1L;
+    LongUnaryOperator twice = x -> 2L *x;
+    assertEquals(11L, plusOne.compose(twice).applyAsLong(5L));
+  }
+
+  public void testCompose_null() throws Exception {
+    LongUnaryOperator plusOne = x -> x + 1;
+    try {
+      plusOne.compose(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+
+  public void testAndThen() throws Exception {
+    LongUnaryOperator plusOne = x -> x + 1L;
+    LongUnaryOperator twice = x -> 2L *x;
+    assertEquals(12, plusOne.andThen(twice).applyAsLong(5L));
+  }
+
+  public void testAndThen_null() throws Exception {
+    LongUnaryOperator plusOne = x -> x + 1L;
+    try {
+      plusOne.andThen(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+}
diff --git a/luni/src/test/java/libcore/java/util/function/PredicateTest.java b/luni/src/test/java/libcore/java/util/function/PredicateTest.java
new file mode 100644
index 0000000..83a73eb
--- /dev/null
+++ b/luni/src/test/java/libcore/java/util/function/PredicateTest.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+package libcore.java.util.function;
+
+import junit.framework.TestCase;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Predicate;
+
+public class PredicateTest extends TestCase {
+
+  public void testAnd() throws Exception {
+    Object arg = new Object();
+
+    AtomicBoolean alwaysTrueInvoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysTrue2Invoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysFalseInvoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysFalse2Invoked = new AtomicBoolean(false);
+    AtomicBoolean[] invocationState = {
+        alwaysTrueInvoked, alwaysTrue2Invoked, alwaysFalseInvoked, alwaysFalse2Invoked };
+
+    Predicate<Object> alwaysTrue =
+        x -> { alwaysTrueInvoked.set(true); assertSame(x, arg); return true; };
+    Predicate<Object> alwaysTrue2 =
+        x -> { alwaysTrue2Invoked.set(true); assertSame(x, arg); return true; };
+    Predicate<Object> alwaysFalse =
+        x -> { alwaysFalseInvoked.set(true); assertSame(x, arg); return false; };
+    Predicate<Object> alwaysFalse2 =
+        x -> { alwaysFalse2Invoked.set(true); assertSame(x, arg); return false; };
+
+    // true && true
+    resetToFalse(invocationState);
+    assertTrue(alwaysTrue.and(alwaysTrue2).test(arg));
+    assertTrue(alwaysTrueInvoked.get() && alwaysTrue2Invoked.get());
+
+    // true && false
+    resetToFalse(invocationState);
+    assertFalse(alwaysTrue.and(alwaysFalse).test(arg));
+    assertTrue(alwaysTrueInvoked.get() && alwaysFalseInvoked.get());
+
+    // false && false
+    resetToFalse(invocationState);
+    assertFalse(alwaysFalse.and(alwaysFalse2).test(arg));
+    assertTrue(alwaysFalseInvoked.get() && !alwaysFalse2Invoked.get());
+
+    // false && true
+    resetToFalse(invocationState);
+    assertFalse(alwaysFalse.and(alwaysTrue).test(arg));
+    assertTrue(alwaysFalseInvoked.get() && !alwaysTrueInvoked.get());
+  }
+
+  public void testAnd_null() throws Exception {
+    Object arg = new Object();
+    Predicate<Object> alwaysTrue = x -> { assertSame(arg, x); return true; };
+    try {
+      alwaysTrue.and(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+
+  public void testNegate() throws Exception {
+    Predicate<Object> alwaysTrue = x -> true;
+    assertFalse(alwaysTrue.negate().test(null));
+
+    Predicate<Object> alwaysFalse = x -> false;
+    assertTrue(alwaysFalse.negate().test(null));
+  }
+
+  public void testOr() throws Exception {
+    Object arg = new Object();
+
+    AtomicBoolean alwaysTrueInvoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysTrue2Invoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysFalseInvoked = new AtomicBoolean(false);
+    AtomicBoolean alwaysFalse2Invoked = new AtomicBoolean(false);
+    AtomicBoolean[] invocationState = {
+        alwaysTrueInvoked, alwaysTrue2Invoked, alwaysFalseInvoked, alwaysFalse2Invoked };
+
+    Predicate<Object> alwaysTrue =
+        x -> { alwaysTrueInvoked.set(true); assertSame(x, arg); return true; };
+    Predicate<Object> alwaysTrue2 =
+        x -> { alwaysTrue2Invoked.set(true); assertSame(x, arg); return true; };
+    Predicate<Object> alwaysFalse =
+        x -> { alwaysFalseInvoked.set(true); assertSame(x, arg); return false; };
+    Predicate<Object> alwaysFalse2 =
+        x -> { alwaysFalse2Invoked.set(true); assertSame(x, arg); return false; };
+
+    // true || true
+    resetToFalse(invocationState);
+    assertTrue(alwaysTrue.or(alwaysTrue2).test(arg));
+    assertTrue(alwaysTrueInvoked.get() && !alwaysTrue2Invoked.get());
+
+    // true || false
+    resetToFalse(invocationState);
+    assertTrue(alwaysTrue.or(alwaysFalse).test(arg));
+    assertTrue(alwaysTrueInvoked.get() && !alwaysFalseInvoked.get());
+
+    // false || false
+    resetToFalse(invocationState);
+    assertFalse(alwaysFalse.or(alwaysFalse2).test(arg));
+    assertTrue(alwaysFalseInvoked.get() && alwaysFalse2Invoked.get());
+
+    // false || true
+    resetToFalse(invocationState);
+    assertTrue(alwaysFalse.or(alwaysTrue).test(arg));
+    assertTrue(alwaysFalseInvoked.get() && alwaysTrueInvoked.get());
+  }
+
+  public void testOr_null() throws Exception {
+    Predicate<Object> alwaysTrue = x -> true;
+    try {
+      alwaysTrue.or(null);
+      fail();
+    } catch (NullPointerException expected) {}
+  }
+
+  private static void resetToFalse(AtomicBoolean... toResets) {
+    for (AtomicBoolean toReset : toResets) {
+      toReset.set(false);
+    }
+  }
+}
diff --git a/luni/src/test/java/libcore/java/util/function/UnaryOperatorTest.java b/luni/src/test/java/libcore/java/util/function/UnaryOperatorTest.java
new file mode 100644
index 0000000..7a971a6
--- /dev/null
+++ b/luni/src/test/java/libcore/java/util/function/UnaryOperatorTest.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+package libcore.java.util.function;
+
+import junit.framework.TestCase;
+
+import java.util.function.UnaryOperator;
+
+public class UnaryOperatorTest extends TestCase {
+
+  public void testIdentity() throws Exception {
+    Object arg = new Object();
+    assertSame(arg, UnaryOperator.identity().apply(arg));
+    assertNull(null, UnaryOperator.identity().apply(null));
+  }
+}
diff --git a/ojluni/src/main/java/java/lang/Math.java b/ojluni/src/main/java/java/lang/Math.java
index aea7651..0e36ab7 100755
--- a/ojluni/src/main/java/java/lang/Math.java
+++ b/ojluni/src/main/java/java/lang/Math.java
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2014 The Android Open Source Project
- * Copyright (c) 1994, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -26,7 +26,8 @@
 
 package java.lang;
 import java.util.Random;
-
+import sun.misc.FloatConsts;
+import sun.misc.DoubleConsts;
 
 /**
  * The class {@code Math} contains methods for performing basic
@@ -591,7 +592,7 @@
 
     /**
      * Returns the closest {@code int} to the argument, with ties
-     * rounding up.
+     * rounding to positive infinity.
      *
      * <p>
      * Special cases:
@@ -610,15 +611,37 @@
      * @see     java.lang.Integer#MIN_VALUE
      */
     public static int round(float a) {
-        if (a != 0x1.fffffep-2f) // greatest float value less than 0.5
-            return (int)floor(a + 0.5f);
-        else
-            return 0;
+        int intBits = Float.floatToRawIntBits(a);
+        int biasedExp = (intBits & FloatConsts.EXP_BIT_MASK)
+                >> (FloatConsts.SIGNIFICAND_WIDTH - 1);
+        int shift = (FloatConsts.SIGNIFICAND_WIDTH - 2
+                + FloatConsts.EXP_BIAS) - biasedExp;
+        if ((shift & -32) == 0) { // shift >= 0 && shift < 32
+            // a is a finite number such that pow(2,-32) <= ulp(a) < 1
+            int r = ((intBits & FloatConsts.SIGNIF_BIT_MASK)
+                    | (FloatConsts.SIGNIF_BIT_MASK + 1));
+            if (intBits < 0) {
+                r = -r;
+            }
+            // In the comments below each Java expression evaluates to the value
+            // the corresponding mathematical expression:
+            // (r) evaluates to a / ulp(a)
+            // (r >> shift) evaluates to floor(a * 2)
+            // ((r >> shift) + 1) evaluates to floor((a + 1/2) * 2)
+            // (((r >> shift) + 1) >> 1) evaluates to floor(a + 1/2)
+            return ((r >> shift) + 1) >> 1;
+        } else {
+            // a is either
+            // - a finite number with abs(a) < exp(2,FloatConsts.SIGNIFICAND_WIDTH-32) < 1/2
+            // - a finite number with ulp(a) >= 1 and hence a is a mathematical integer
+            // - an infinity or NaN
+            return (int) a;
+        }
     }
 
     /**
      * Returns the closest {@code long} to the argument, with ties
-     * rounding up.
+     * rounding to positive infinity.
      *
      * <p>Special cases:
      * <ul><li>If the argument is NaN, the result is 0.
@@ -637,10 +660,32 @@
      * @see     java.lang.Long#MIN_VALUE
      */
     public static long round(double a) {
-        if (a != 0x1.fffffffffffffp-2) // greatest double value less than 0.5
-            return (long)floor(a + 0.5d);
-        else
-            return 0;
+        long longBits = Double.doubleToRawLongBits(a);
+        long biasedExp = (longBits & DoubleConsts.EXP_BIT_MASK)
+                >> (DoubleConsts.SIGNIFICAND_WIDTH - 1);
+        long shift = (DoubleConsts.SIGNIFICAND_WIDTH - 2
+                + DoubleConsts.EXP_BIAS) - biasedExp;
+        if ((shift & -64) == 0) { // shift >= 0 && shift < 64
+            // a is a finite number such that pow(2,-64) <= ulp(a) < 1
+            long r = ((longBits & DoubleConsts.SIGNIF_BIT_MASK)
+                    | (DoubleConsts.SIGNIF_BIT_MASK + 1));
+            if (longBits < 0) {
+                r = -r;
+            }
+            // In the comments below each Java expression evaluates to the value
+            // the corresponding mathematical expression:
+            // (r) evaluates to a / ulp(a)
+            // (r >> shift) evaluates to floor(a * 2)
+            // ((r >> shift) + 1) evaluates to floor((a + 1/2) * 2)
+            // (((r >> shift) + 1) >> 1) evaluates to floor(a + 1/2)
+            return ((r >> shift) + 1) >> 1;
+        } else {
+            // a is either
+            // - a finite number with abs(a) < exp(2,DoubleConsts.SIGNIFICAND_WIDTH-64) < 1/2
+            // - a finite number with ulp(a) >= 1 and hence a is a mathematical integer
+            // - an infinity or NaN
+            return (long) a;
+        }
     }
 
     private static class NoImagePreloadHolder {
diff --git a/ojluni/src/main/java/java/lang/StrictMath.java b/ojluni/src/main/java/java/lang/StrictMath.java
index b829a81..23978ea 100755
--- a/ojluni/src/main/java/java/lang/StrictMath.java
+++ b/ojluni/src/main/java/java/lang/StrictMath.java
@@ -614,7 +614,7 @@
 
     /**
      * Returns the closest {@code int} to the argument, with ties
-     * rounding up.
+     * rounding to positive infinity.
      *
      * <p>Special cases:
      * <ul><li>If the argument is NaN, the result is 0.
@@ -637,7 +637,7 @@
 
     /**
      * Returns the closest {@code long} to the argument, with ties
-     * rounding up.
+     * rounding to positive infinity.
      *
      * <p>Special cases:
      * <ul><li>If the argument is NaN, the result is 0.
diff --git a/ojluni/src/main/native/zip_util.h b/ojluni/src/main/native/zip_util.h
index 124e3f7..20d78b0 100755
--- a/ojluni/src/main/native/zip_util.h
+++ b/ojluni/src/main/native/zip_util.h
@@ -197,6 +197,11 @@
 #endif
 
 /*
+ * Use mmap for CEN & ENDHDR sections
+ */
+#define USE_MMAP 1
+
+/*
  * Descriptor for a ZIP file.
  */
 typedef struct jzfile {   /* Zip file */