diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/GenericTestUtils.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/GenericTestUtils.java index 7b94784bdb..fcc4e3c27c 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/GenericTestUtils.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/GenericTestUtils.java @@ -59,6 +59,7 @@ 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 static void assertExceptionContains(String string, Throwable t) { } } - public static void waitFor(Supplier check, - int checkEveryMillis, int waitForMillis) - throws TimeoutException, InterruptedException - { + public static void waitFor(Supplier 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(); diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/TestGenericTestUtils.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/TestGenericTestUtils.java index 86df5d5a08..b3fc836d5f 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/TestGenericTestUtils.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/TestGenericTestUtils.java @@ -26,7 +26,10 @@ 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 void testLogCapturerSlf4jLogger() { 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 simpleSupplier = new Supplier() { + + @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); + } + } }