This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-io.git

commit 3639b2f6a433e4948bd00bd9f027a459e9f829c6
Author: Gary Gregory <gardgreg...@gmail.com>
AuthorDate: Sat Sep 17 20:23:09 2022 -0400

    Revert "Revert "Make this test more reliable based on a failure seen on 
GitHub.""
    
    This reverts commit f46c153a8b8194c7674cb975b86a6f1696189317.
---
 .../apache/commons/io/function/IOBaseStream.java   | 154 +++++++++++++++++++++
 .../apache/commons/io/FileUtilsWaitForTest.java    |   6 +-
 2 files changed, 158 insertions(+), 2 deletions(-)

diff --git a/src/main/java/org/apache/commons/io/function/IOBaseStream.java 
b/src/main/java/org/apache/commons/io/function/IOBaseStream.java
new file mode 100644
index 00000000..6ac9bee2
--- /dev/null
+++ b/src/main/java/org/apache/commons/io/function/IOBaseStream.java
@@ -0,0 +1,154 @@
+/*
+ * 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.commons.io.function;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.util.stream.BaseStream;
+import java.util.stream.Stream;
+
+/**
+ * Like {@link BaseStream} but throws {@link IOException}.
+ *
+ * @param <T> the type of the stream elements.
+ * @param <S> the type of the IO stream extending {@code IOBaseStream}.
+ * @param <B> the type of the stream extending {@code BaseStream}.
+ * @since 2.12.0
+ */
+public interface IOBaseStream<T, S extends IOBaseStream<T, S, B>, B extends 
BaseStream<T, B>> extends Closeable {
+
+    /**
+     * Creates a {@link BaseStream} for this instance that throws {@link 
UncheckedIOException} instead of
+     * {@link IOException}.
+     *
+     * @return an {@link UncheckedIOException} {@link BaseStream}.
+     */
+    @SuppressWarnings("unchecked")
+    default BaseStream<T, B> asBaseStream() {
+        return new UncheckedIOBaseStream<>((S) this);
+    }
+
+    /**
+     * Like {@link BaseStream#close()}.
+     *
+     * @see BaseStream#close()
+     */
+    @Override
+    default void close() {
+        unwrap().close();
+    }
+
+    /**
+     * Like {@link BaseStream#isParallel()}.
+     *
+     * @return See {@link BaseStream#isParallel() delegate}.
+     * @see BaseStream#isParallel()
+     */
+    @SuppressWarnings("resource") // for unwrap()
+    default boolean isParallel() {
+        return unwrap().isParallel();
+    }
+
+    /**
+     * Like {@link BaseStream#iterator()}.
+     *
+     * @return See {@link BaseStream#iterator() delegate}.
+     * @see BaseStream#iterator()
+     */
+    @SuppressWarnings("resource") // for unwrap()
+    default IOIterator<T> iterator() {
+        return IOIteratorAdapter.adapt(unwrap().iterator());
+    }
+
+    /**
+     * Like {@link BaseStream#onClose(Runnable)}.
+     *
+     * @param closeHandler See {@link BaseStream#onClose(Runnable) delegate}.
+     * @return See {@link BaseStream#onClose(Runnable) delegate}.
+     * @throws IOException if an I/O error occurs.
+     * @see BaseStream#onClose(Runnable)
+     */
+    @SuppressWarnings({"unused", "resource"}) // throws IOException, unwrap()
+    default S onClose(final IORunnable closeHandler) throws IOException {
+        return wrap(unwrap().onClose(() -> Erase.run(closeHandler)));
+    }
+
+    /**
+     * Like {@link BaseStream#parallel()}.
+     *
+     * @return See {@link BaseStream#parallel() delegate}.
+     * @see BaseStream#parallel()
+     */
+    @SuppressWarnings({"resource", "unchecked"}) // for unwrap(), this
+    default S parallel() {
+        return isParallel() ? (S) this : wrap(unwrap().parallel());
+    }
+
+    /**
+     * Like {@link BaseStream#sequential()}.
+     *
+     * @return See {@link BaseStream#sequential() delegate}.
+     * @see BaseStream#sequential()
+     */
+    @SuppressWarnings({"resource", "unchecked"}) // for unwrap(), this
+    default S sequential() {
+        return isParallel() ? wrap(unwrap().sequential()) : (S) this;
+    }
+
+    /**
+     * Like {@link BaseStream#spliterator()}.
+     *
+     * @return See {@link BaseStream#spliterator() delegate}.
+     * @see BaseStream#spliterator()
+     */
+    @SuppressWarnings("resource") // for unwrap()
+    default IOSpliterator<T> spliterator() {
+        return IOSpliteratorAdapter.adapt(unwrap().spliterator());
+    }
+
+    /**
+     * Like {@link BaseStream#unordered()}.
+     *
+     * @return See {@link BaseStream#unordered() delegate}.
+     * @see java.util.stream.BaseStream#unordered()
+     */
+    @SuppressWarnings("resource") // for unwrap()
+    default S unordered() {
+        return wrap(unwrap().unordered());
+    }
+
+    /**
+     * Unwraps this instance and returns the underlying {@link Stream}.
+     * <p>
+     * Implementations may not have anything to unwrap and that behavior is 
undefined for now.
+     * </p>
+     *
+     * @return the underlying stream.
+     */
+    B unwrap();
+
+    /**
+     * Wraps a {@link Stream}.
+     *
+     * @param delegate The delegate.
+     * @return An IO stream.
+     */
+    S wrap(B delegate);
+
+}
diff --git a/src/test/java/org/apache/commons/io/FileUtilsWaitForTest.java 
b/src/test/java/org/apache/commons/io/FileUtilsWaitForTest.java
index 50af4a2f..a5f6a0f1 100644
--- a/src/test/java/org/apache/commons/io/FileUtilsWaitForTest.java
+++ b/src/test/java/org/apache/commons/io/FileUtilsWaitForTest.java
@@ -44,13 +44,15 @@ public class FileUtilsWaitForTest {
     @Test
     public void testWaitForInterrupted() throws InterruptedException {
         final AtomicBoolean wasInterrupted = new AtomicBoolean();
-        final CountDownLatch started = new CountDownLatch(1);
+        final CountDownLatch started = new CountDownLatch(2);
+        final int seconds = 10;
         final Thread thread1 = new Thread(() -> {
             started.countDown();
-            assertTrue(FileUtils.waitFor(FileUtils.current(), 10));
+            assertTrue(FileUtils.waitFor(FileUtils.current(), seconds));
             wasInterrupted.set(Thread.currentThread().isInterrupted());
         });
         thread1.start();
+        started.countDown();
         thread1.interrupt();
         started.await();
         thread1.join();

Reply via email to