aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--vespajlib/pom.xml1
-rw-r--r--vespajlib/src/main/java/com/yahoo/concurrent/Sleeper.java42
-rw-r--r--vespajlib/src/main/java/com/yahoo/concurrent/UncheckedInterruptedException.java27
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(); }
+}