diff options
-rw-r--r-- | vespajlib/pom.xml | 1 | ||||
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/concurrent/Sleeper.java | 42 | ||||
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/concurrent/UncheckedInterruptedException.java | 27 |
3 files changed, 70 insertions, 0 deletions
diff --git a/vespajlib/pom.xml b/vespajlib/pom.xml index af3db750a71..0f2ebadac82 100644 --- a/vespajlib/pom.xml +++ b/vespajlib/pom.xml @@ -109,6 +109,7 @@ <compilerArgs> <arg>-Xlint:all</arg> <arg>-Xlint:-try</arg> + <arg>-Xlint:-serial</arg> <arg>-Werror</arg> </compilerArgs> </configuration> diff --git a/vespajlib/src/main/java/com/yahoo/concurrent/Sleeper.java b/vespajlib/src/main/java/com/yahoo/concurrent/Sleeper.java new file mode 100644 index 00000000000..53478e37a86 --- /dev/null +++ b/vespajlib/src/main/java/com/yahoo/concurrent/Sleeper.java @@ -0,0 +1,42 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.concurrent; + +import java.time.Duration; + +/** + * An abstraction used for mocking {@link Thread#sleep(long)} in unit tests. + * + * @author bjorncs + */ +public interface Sleeper { + default void sleep(Duration duration) throws UncheckedInterruptedException { + uncheck(() -> sleepChecked(duration.toMillis())); + } + + default void sleepChecked(Duration duration) throws InterruptedException { sleepChecked(duration.toMillis()); } + + default void sleep(long millis) throws UncheckedInterruptedException { uncheck(() -> sleepChecked(millis)); } + + void sleepChecked(long millis) throws InterruptedException; + + Sleeper DEFAULT = new Default(); + Sleeper NOOP = new Noop(); + + private void uncheck(InterruptingRunnable runnable) { + try { + runnable.run(); + } catch (InterruptedException e) { + throw new UncheckedInterruptedException(e); + } + } +} + +interface InterruptingRunnable { void run() throws InterruptedException; } + +class Default implements Sleeper { + @Override public void sleepChecked(long millis) throws InterruptedException { Thread.sleep(millis); } +} + +class Noop implements Sleeper { + @Override public void sleepChecked(long millis) {} +} diff --git a/vespajlib/src/main/java/com/yahoo/concurrent/UncheckedInterruptedException.java b/vespajlib/src/main/java/com/yahoo/concurrent/UncheckedInterruptedException.java new file mode 100644 index 00000000000..1f8f45bace9 --- /dev/null +++ b/vespajlib/src/main/java/com/yahoo/concurrent/UncheckedInterruptedException.java @@ -0,0 +1,27 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.concurrent; + +/** + * Wraps an {@link InterruptedException} with an unchecked exception. + * + * @author bjorncs + */ +public class UncheckedInterruptedException extends RuntimeException { + + public UncheckedInterruptedException(String message, InterruptedException cause, boolean restoreInterruptFlag) { + super(message, cause); + if (restoreInterruptFlag) Thread.currentThread().interrupt(); + } + + public UncheckedInterruptedException(InterruptedException cause, boolean restoreInterruptFlags) { + this(cause.toString(), cause, restoreInterruptFlags); + } + + public UncheckedInterruptedException(String message, boolean restoreInterruptFlag) { this(message, null, false); } + + public UncheckedInterruptedException(String message, InterruptedException cause) { this(message, cause, false); } + + public UncheckedInterruptedException(InterruptedException cause) { this(cause.toString(), cause, false); } + + @Override public InterruptedException getCause() { return (InterruptedException) super.getCause(); } +} |