diff --git a/labs/abiquo/src/main/java/org/jclouds/abiquo/internal/BaseMonitoringService.java b/labs/abiquo/src/main/java/org/jclouds/abiquo/internal/BaseMonitoringService.java index cacbf69372..a4a3c7dc13 100644 --- a/labs/abiquo/src/main/java/org/jclouds/abiquo/internal/BaseMonitoringService.java +++ b/labs/abiquo/src/main/java/org/jclouds/abiquo/internal/BaseMonitoringService.java @@ -176,8 +176,7 @@ public class BaseMonitoringService implements MonitoringService { * Performs the periodical monitoring tasks. * * @author Ignasi Barrera - * @param - * The type of the object being monitored. + * @param The type of the object being monitored. */ @VisibleForTesting class AsyncMonitor implements Runnable { @@ -205,10 +204,13 @@ public class BaseMonitoringService implements MonitoringService { /** * Starts the monitoring job with the given timeout. * - * @param maxWait - * The timeout. + * @param maxWait The timeout. + * @param timeUnit The timeunit used in the maxWait parameter. */ public void startMonitoring(final Long maxWait, TimeUnit timeUnit) { + if (maxWait != null) { + checkNotNull(timeUnit, "timeUnit must not be null when using timeouts"); + } future = scheduler.scheduleWithFixedDelay(this, 0L, pollingDelay, TimeUnit.MILLISECONDS); timeout = maxWait == null ? null : System.currentTimeMillis() + timeUnit.toMillis(maxWait); logger.debug("started monitor job for %s with %s timeout", monitoredObject, diff --git a/labs/abiquo/src/test/java/org/jclouds/abiquo/internal/AsyncMonitorTest.java b/labs/abiquo/src/test/java/org/jclouds/abiquo/internal/AsyncMonitorTest.java index e3d3cea08d..e42cba3619 100644 --- a/labs/abiquo/src/test/java/org/jclouds/abiquo/internal/AsyncMonitorTest.java +++ b/labs/abiquo/src/test/java/org/jclouds/abiquo/internal/AsyncMonitorTest.java @@ -78,6 +78,42 @@ public class AsyncMonitorTest { verify(schedulerMock); } + @Test(expectedExceptions = NullPointerException.class, expectedExceptionsMessageRegExp = "timeUnit must not be null when using timeouts") + public void testStartMonitoringWithNullTimeout() { + ScheduledExecutorService schedulerMock = EasyMock.createMock(ScheduledExecutorService.class); + AsyncMonitor monitor = mockMonitor(schedulerMock, new Object(), mockFunction(MonitorStatus.DONE), + new EventBus()); + + monitor.startMonitoring(100L, null); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public void testStartMonitoringWithoutTimeoutAndNullTimeUnit() { + ScheduledFuture mockFuture = EasyMock.createMock(ScheduledFuture.class); + ScheduledExecutorService schedulerMock = EasyMock.createMock(ScheduledExecutorService.class); + expect( + schedulerMock.scheduleWithFixedDelay(anyObject(Runnable.class), anyLong(), anyLong(), + anyObject(TimeUnit.class))).andReturn(mockFuture); + + replay(mockFuture); + replay(schedulerMock); + + AsyncMonitor monitor = mockMonitor(schedulerMock, new Object(), mockFunction(MonitorStatus.DONE), + new EventBus()); + + assertNull(monitor.getFuture()); + assertNull(monitor.getTimeout()); + + // If the maxWait parameter is null, timeUnit is not required + monitor.startMonitoring(null, null); + + assertNotNull(monitor.getFuture()); + assertNull(monitor.getTimeout()); + + verify(mockFuture); + verify(schedulerMock); + } + @SuppressWarnings({ "rawtypes", "unchecked" }) public void testStartMonitoringWithTimeout() { ScheduledFuture mockFuture = EasyMock.createMock(ScheduledFuture.class); @@ -105,6 +141,33 @@ public class AsyncMonitorTest { verify(schedulerMock); } + @SuppressWarnings({ "rawtypes", "unchecked" }) + public void testStartMonitoringWithTimeoutInMinutes() { + ScheduledFuture mockFuture = EasyMock.createMock(ScheduledFuture.class); + ScheduledExecutorService schedulerMock = EasyMock.createMock(ScheduledExecutorService.class); + expect( + schedulerMock.scheduleWithFixedDelay(anyObject(Runnable.class), anyLong(), anyLong(), + anyObject(TimeUnit.class))).andReturn(mockFuture); + + replay(mockFuture); + replay(schedulerMock); + + AsyncMonitor monitor = mockMonitor(schedulerMock, new Object(), mockFunction(MonitorStatus.DONE), + new EventBus()); + + assertNull(monitor.getFuture()); + assertNull(monitor.getTimeout()); + + monitor.startMonitoring(1L, TimeUnit.MINUTES); + + assertNotNull(monitor.getFuture()); + assertNotNull(monitor.getTimeout()); + assertTrue(monitor.getTimeout() > TimeUnit.MINUTES.toMillis(1)); + + verify(mockFuture); + verify(schedulerMock); + } + @SuppressWarnings({ "rawtypes", "unchecked" }) public void testIsTimeoutWhenNullTimeout() { ScheduledFuture mockFuture = EasyMock.createMock(ScheduledFuture.class);