|
@@ -0,0 +1,97 @@
|
|
|
+/*
|
|
|
+ * Licensed to the Apache Software Foundation (ASF) under one
|
|
|
+ * or more contributor license agreements. See the NOTICE file
|
|
|
+ * distributed with this work for additional information
|
|
|
+ * regarding copyright ownership. The ASF licenses this file
|
|
|
+ * to you 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 org.apache.hadoop.util.functional;
|
|
|
+
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.UncheckedIOException;
|
|
|
+
|
|
|
+import org.assertj.core.api.Assertions;
|
|
|
+import org.junit.Test;
|
|
|
+
|
|
|
+import org.apache.hadoop.test.AbstractHadoopTestBase;
|
|
|
+
|
|
|
+import static org.apache.hadoop.test.LambdaTestUtils.intercept;
|
|
|
+import static org.apache.hadoop.util.functional.FunctionalIO.extractIOExceptions;
|
|
|
+import static org.apache.hadoop.util.functional.FunctionalIO.toUncheckedIOExceptionSupplier;
|
|
|
+import static org.apache.hadoop.util.functional.FunctionalIO.uncheckIOExceptions;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Test the functional IO class.
|
|
|
+ */
|
|
|
+public class TestFunctionalIO extends AbstractHadoopTestBase {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Verify that IOEs are caught and wrapped.
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ public void testUncheckIOExceptions() throws Throwable {
|
|
|
+ final IOException raised = new IOException("text");
|
|
|
+ final UncheckedIOException ex = intercept(UncheckedIOException.class, "text", () ->
|
|
|
+ uncheckIOExceptions(() -> {
|
|
|
+ throw raised;
|
|
|
+ }));
|
|
|
+ Assertions.assertThat(ex.getCause())
|
|
|
+ .describedAs("Cause of %s", ex)
|
|
|
+ .isSameAs(raised);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Verify that UncheckedIOEs are not double wrapped.
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ public void testUncheckIOExceptionsUnchecked() throws Throwable {
|
|
|
+ final UncheckedIOException raised = new UncheckedIOException(
|
|
|
+ new IOException("text"));
|
|
|
+ final UncheckedIOException ex = intercept(UncheckedIOException.class, "text", () ->
|
|
|
+ uncheckIOExceptions(() -> {
|
|
|
+ throw raised;
|
|
|
+ }));
|
|
|
+ Assertions.assertThat(ex)
|
|
|
+ .describedAs("Propagated Exception %s", ex)
|
|
|
+ .isSameAs(raised);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Supplier will also wrap IOEs.
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ public void testUncheckedSupplier() throws Throwable {
|
|
|
+ intercept(UncheckedIOException.class, "text", () ->
|
|
|
+ toUncheckedIOExceptionSupplier(() -> {
|
|
|
+ throw new IOException("text");
|
|
|
+ }).get());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * The wrap/unwrap code which will be used to invoke operations
|
|
|
+ * through reflection.
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ public void testUncheckAndExtract() throws Throwable {
|
|
|
+ final IOException raised = new IOException("text");
|
|
|
+ final IOException ex = intercept(IOException.class, "text", () ->
|
|
|
+ extractIOExceptions(toUncheckedIOExceptionSupplier(() -> {
|
|
|
+ throw raised;
|
|
|
+ })));
|
|
|
+ Assertions.assertThat(ex)
|
|
|
+ .describedAs("Propagated Exception %s", ex)
|
|
|
+ .isSameAs(raised);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|