ソースを参照

HADOOP-14568. GenericTestUtils#waitFor missing parameter verification.
Contributed by Yiqun Lin

Steve Loughran 8 年 前
コミット
e5db9af8a0

+ 15 - 4
hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/GenericTestUtils.java

@@ -59,6 +59,7 @@ import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 
 import com.google.common.base.Joiner;
+import com.google.common.base.Preconditions;
 import com.google.common.base.Supplier;
 import com.google.common.collect.Sets;
 
@@ -85,6 +86,14 @@ public abstract class GenericTestUtils {
    */
   public static final String DEFAULT_TEST_DATA_PATH = "target/test/data/";
 
+  /**
+   * Error string used in {@link GenericTestUtils#waitFor(Supplier, int, int)}.
+   */
+  public static final String ERROR_MISSING_ARGUMENT =
+      "Input supplier interface should be initailized";
+  public static final String ERROR_INVALID_ARGUMENT =
+      "Total wait time should be greater than check interval time";
+
   @SuppressWarnings("unchecked")
   public static void disableLog(Log log) {
     // We expect that commons-logging is a wrapper around Log4j.
@@ -258,10 +267,12 @@ public abstract class GenericTestUtils {
     }
   }  
 
-  public static void waitFor(Supplier<Boolean> check,
-      int checkEveryMillis, int waitForMillis)
-      throws TimeoutException, InterruptedException
-  {
+  public static void waitFor(Supplier<Boolean> check, int checkEveryMillis,
+      int waitForMillis) throws TimeoutException, InterruptedException {
+    Preconditions.checkNotNull(check, ERROR_MISSING_ARGUMENT);
+    Preconditions.checkArgument(waitForMillis > checkEveryMillis,
+        ERROR_INVALID_ARGUMENT);
+
     long st = Time.now();
     do {
       boolean result = check.get();

+ 32 - 0
hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/TestGenericTestUtils.java

@@ -26,7 +26,10 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Supplier;
+
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 public class TestGenericTestUtils extends GenericTestUtils {
 
@@ -119,4 +122,33 @@ public class TestGenericTestUtils extends GenericTestUtils {
     assertTrue(logCapturer.getOutput().isEmpty());
   }
 
+  @Test
+  public void testWaitingForConditionWithInvalidParams() throws Throwable {
+    // test waitFor method with null supplier interface
+    try {
+      waitFor(null, 0, 0);
+    } catch (NullPointerException e) {
+      assertExceptionContains(GenericTestUtils.ERROR_MISSING_ARGUMENT, e);
+    }
+
+    Supplier<Boolean> simpleSupplier = new Supplier<Boolean>() {
+
+      @Override
+      public Boolean get() {
+        return true;
+      }
+    };
+
+    // test waitFor method with waitForMillis greater than checkEveryMillis
+    waitFor(simpleSupplier, 5, 10);
+    try {
+      // test waitFor method with waitForMillis smaller than checkEveryMillis
+      waitFor(simpleSupplier, 10, 5);
+      fail(
+          "Excepted a failure when the param value of"
+          + " waitForMillis is smaller than checkEveryMillis.");
+    } catch (IllegalArgumentException e) {
+      assertExceptionContains(GenericTestUtils.ERROR_INVALID_ARGUMENT, e);
+    }
+  }
 }