From 867b7e0b56ee784f04c9a02298216a3c8f946005 Mon Sep 17 00:00:00 2001
From: Jean-Noël Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Wed, 02 Nov 2016 15:53:49 +0000
Subject: [PATCH] TestTimer.java: Added repeatUntilSuccess(CallableVoid callable)

---
 opendj-server-legacy/src/test/java/org/opends/server/util/TestTimer.java |   64 +++++++++++++++++++++++++++++--
 1 files changed, 59 insertions(+), 5 deletions(-)

diff --git a/opendj-server-legacy/src/test/java/org/opends/server/util/TestTimer.java b/opendj-server-legacy/src/test/java/org/opends/server/util/TestTimer.java
index 3698297..ceeaa39 100644
--- a/opendj-server-legacy/src/test/java/org/opends/server/util/TestTimer.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/util/TestTimer.java
@@ -11,7 +11,7 @@
  * Header, with the fields enclosed by brackets [] replaced by your own identifying
  * information: "Portions Copyright [year] [name of copyright owner]".
  *
- * Copyright 2015 ForgeRock AS.
+ * Copyright 2015-2016 ForgeRock AS.
  */
 package org.opends.server.util;
 
@@ -27,10 +27,25 @@
 public interface TestTimer
 {
   /**
-   * Constant that can be used at the end of {@code Callable<Void>.call()} to better explicit this
-   * is the end of the method.
+   * Equivalent to {@code Callable<Void>} or a {@code Runnable} that can throw exception.
+   * <p>
+   * <b>Note:</b> The name has been designed to stay close to {@code Callable<Void>} to allow to
+   * easily change test code back and forth between {@code java.util.Callable} and
+   * {@code CallableVoid} while writing the test code. It also avoids name collisions while writing
+   * the rest of the OpenDJ code base.
    */
-  Void END_RUN = null;
+  public static interface CallableVoid
+  {
+    /**
+     * Equivalent of {@link Runnable#run()} or {@link Callable#call()}.
+     *
+     * @throws Exception
+     *           if an error occurred
+     * @see {@link Runnable#run()}
+     * @see {@link Callable#call()}
+     */
+    void call() throws Exception;
+  }
 
   /**
    * Repeatedly call the supplied callable (respecting a sleep interval) until:
@@ -46,7 +61,7 @@
    * </ul>
    * <p>
    * Note: The test code in the callable can be written as any test code outside a callable. In
-   * particular, asserts can and should be used inside the {@link Callable#call()}.
+   * particular, asserts can and should be used inside the {@link Callable#call()} method.
    *
    * @param callable
    *          the callable to repeat until success
@@ -61,6 +76,31 @@
    */
   <R> R repeatUntilSuccess(Callable<R> callable) throws Exception, InterruptedException;
 
+  /**
+   * Repeatedly call the supplied callable (respecting a sleep interval) until:
+   * <ul>
+   * <li>it returns,</li>
+   * <li>it throws an exception other than {@link AssertionError},</li>
+   * <li>the current timer times out.</li>
+   * </ul>
+   * If the current timer times out, then it will:
+   * <ul>
+   * <li>either rethrow an {@link AssertionError} thrown by the callable,</li>
+   * <li>or return {@code null}.</li>
+   * </ul>
+   * <p>
+   * Note: The test code in the callable can be written as any test code outside a callable. In
+   * particular, asserts can and should be used inside the {@link TestTimer.Callable#call()} method.
+   *
+   * @param callable
+   *          the callable to repeat until success
+   * @throws Exception
+   *           The exception thrown by the provided callable
+   * @throws InterruptedException
+   *           If the thread is interrupted while sleeping
+   */
+  void repeatUntilSuccess(CallableVoid callable) throws Exception, InterruptedException;
+
   /** Builder for a {@link TestTimer}. */
   public static final class Builder
   {
@@ -173,6 +213,20 @@
     }
 
     @Override
+    public void repeatUntilSuccess(final CallableVoid callable) throws Exception, InterruptedException
+    {
+      repeatUntilSuccess(new Callable<Void>()
+      {
+        @Override
+        public Void call() throws Exception
+        {
+          callable.call();
+          return null;
+        }
+      });
+    }
+
+    @Override
     public String toString()
     {
       return totalNbSteps * sleepTime + " ms max sleep time"

--
Gitblit v1.10.0