10888a09821a98ac0680fad765217302858e70fa4Paul Duffin/*
20888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Copyright (C) 2013 The Guava Authors
30888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
40888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License"); you may not
50888a09821a98ac0680fad765217302858e70fa4Paul Duffin * use this file except in compliance with the License. You may obtain a copy of
60888a09821a98ac0680fad765217302858e70fa4Paul Duffin * the License at
70888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
80888a09821a98ac0680fad765217302858e70fa4Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0
90888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
100888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Unless required by applicable law or agreed to in writing, software
110888a09821a98ac0680fad765217302858e70fa4Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
120888a09821a98ac0680fad765217302858e70fa4Paul Duffin * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
130888a09821a98ac0680fad765217302858e70fa4Paul Duffin * License for the specific language governing permissions and limitations under
140888a09821a98ac0680fad765217302858e70fa4Paul Duffin * the License.
150888a09821a98ac0680fad765217302858e70fa4Paul Duffin */
160888a09821a98ac0680fad765217302858e70fa4Paul Duffin
170888a09821a98ac0680fad765217302858e70fa4Paul Duffinpackage com.google.common.util.concurrent;
180888a09821a98ac0680fad765217302858e70fa4Paul Duffin
190888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestCase;
200888a09821a98ac0680fad765217302858e70fa4Paul Duffin
210888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Collection;
220888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.List;
230888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.concurrent.Callable;
240888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.concurrent.ExecutionException;
250888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.concurrent.Executors;
260888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.concurrent.Future;
270888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.concurrent.ScheduledExecutorService;
280888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.concurrent.ScheduledFuture;
290888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.concurrent.TimeUnit;
300888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.concurrent.TimeoutException;
310888a09821a98ac0680fad765217302858e70fa4Paul Duffin
320888a09821a98ac0680fad765217302858e70fa4Paul Duffin/**
330888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Test for {@link WrappingScheduledExecutorService}
340888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
350888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @author Luke Sandberg
360888a09821a98ac0680fad765217302858e70fa4Paul Duffin */
370888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic class WrappingScheduledExecutorServiceTest extends TestCase {
380888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static final Runnable DO_NOTHING = new Runnable() {
390888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
400888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void run() {
410888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
420888a09821a98ac0680fad765217302858e70fa4Paul Duffin  };
430888a09821a98ac0680fad765217302858e70fa4Paul Duffin
440888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testSchedule() {
450888a09821a98ac0680fad765217302858e70fa4Paul Duffin    MockExecutor mock = new MockExecutor();
460888a09821a98ac0680fad765217302858e70fa4Paul Duffin    TestExecutor testExecutor = new TestExecutor(mock);
470888a09821a98ac0680fad765217302858e70fa4Paul Duffin
483ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    testExecutor.schedule(DO_NOTHING, 10, TimeUnit.MINUTES);
493ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    mock.assertLastMethodCalled("scheduleRunnable", 10, TimeUnit.MINUTES);
500888a09821a98ac0680fad765217302858e70fa4Paul Duffin
510888a09821a98ac0680fad765217302858e70fa4Paul Duffin    testExecutor.schedule(Executors.callable(DO_NOTHING), 5, TimeUnit.SECONDS);
520888a09821a98ac0680fad765217302858e70fa4Paul Duffin    mock.assertLastMethodCalled("scheduleCallable", 5, TimeUnit.SECONDS);
530888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
540888a09821a98ac0680fad765217302858e70fa4Paul Duffin
550888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public void testSchedule_repeating() {
560888a09821a98ac0680fad765217302858e70fa4Paul Duffin    MockExecutor mock = new MockExecutor();
570888a09821a98ac0680fad765217302858e70fa4Paul Duffin    TestExecutor testExecutor = new TestExecutor(mock);
583ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    testExecutor.scheduleWithFixedDelay(DO_NOTHING, 100, 10, TimeUnit.MINUTES);
593ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    mock.assertLastMethodCalled("scheduleWithFixedDelay", 100, 10, TimeUnit.MINUTES);
600888a09821a98ac0680fad765217302858e70fa4Paul Duffin
610888a09821a98ac0680fad765217302858e70fa4Paul Duffin    testExecutor.scheduleAtFixedRate(DO_NOTHING, 3, 7, TimeUnit.SECONDS);
620888a09821a98ac0680fad765217302858e70fa4Paul Duffin    mock.assertLastMethodCalled("scheduleAtFixedRate", 3, 7, TimeUnit.SECONDS);
630888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
640888a09821a98ac0680fad765217302858e70fa4Paul Duffin
650888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static final class WrappedCallable<T> implements Callable<T> {
660888a09821a98ac0680fad765217302858e70fa4Paul Duffin    private final Callable<T> delegate;
670888a09821a98ac0680fad765217302858e70fa4Paul Duffin
680888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public WrappedCallable(Callable<T> delegate) {
690888a09821a98ac0680fad765217302858e70fa4Paul Duffin      this.delegate = delegate;
700888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
710888a09821a98ac0680fad765217302858e70fa4Paul Duffin
720888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
730888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public T call() throws Exception {
740888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return delegate.call();
750888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
760888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
770888a09821a98ac0680fad765217302858e70fa4Paul Duffin
780888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static final class WrappedRunnable implements Runnable {
790888a09821a98ac0680fad765217302858e70fa4Paul Duffin    private final Runnable delegate;
800888a09821a98ac0680fad765217302858e70fa4Paul Duffin
810888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public WrappedRunnable(Runnable delegate) {
820888a09821a98ac0680fad765217302858e70fa4Paul Duffin      this.delegate = delegate;
830888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
840888a09821a98ac0680fad765217302858e70fa4Paul Duffin
850888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
860888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void run() {
870888a09821a98ac0680fad765217302858e70fa4Paul Duffin      delegate.run();
880888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
890888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
900888a09821a98ac0680fad765217302858e70fa4Paul Duffin
910888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static final class TestExecutor extends WrappingScheduledExecutorService {
920888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public TestExecutor(MockExecutor mock) {
930888a09821a98ac0680fad765217302858e70fa4Paul Duffin      super(mock);
940888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
950888a09821a98ac0680fad765217302858e70fa4Paul Duffin
960888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
970888a09821a98ac0680fad765217302858e70fa4Paul Duffin    protected <T> Callable<T> wrapTask(Callable<T> callable) {
980888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return new WrappedCallable<T>(callable);
990888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1000888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1010888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override protected Runnable wrapTask(Runnable command) {
1020888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return new WrappedRunnable(command);
1030888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1040888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1050888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1060888a09821a98ac0680fad765217302858e70fa4Paul Duffin  private static final class MockExecutor implements ScheduledExecutorService {
1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin    String lastMethodCalled = "";
1080888a09821a98ac0680fad765217302858e70fa4Paul Duffin    long lastInitialDelay;
1090888a09821a98ac0680fad765217302858e70fa4Paul Duffin    long lastDelay;
1100888a09821a98ac0680fad765217302858e70fa4Paul Duffin    TimeUnit lastUnit;
1110888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin    void assertLastMethodCalled(String method, long delay, TimeUnit unit) {
1130888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals(method, lastMethodCalled);
1140888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals(delay, lastDelay);
1150888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals(unit, lastUnit);
1160888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1180888a09821a98ac0680fad765217302858e70fa4Paul Duffin    void assertLastMethodCalled(String method, long initialDelay, long delay, TimeUnit unit) {
1190888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals(method, lastMethodCalled);
1200888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals(initialDelay, lastInitialDelay);
1210888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals(delay, lastDelay);
1220888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals(unit, lastUnit);
1230888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1240888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1250888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) {
1260888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertTrue(command instanceof WrappedRunnable);
1270888a09821a98ac0680fad765217302858e70fa4Paul Duffin      lastMethodCalled = "scheduleRunnable";
1280888a09821a98ac0680fad765217302858e70fa4Paul Duffin      lastDelay = delay;
1290888a09821a98ac0680fad765217302858e70fa4Paul Duffin      lastUnit = unit;
1300888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return null;
1310888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1320888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public <V> ScheduledFuture<V> schedule(
1340888a09821a98ac0680fad765217302858e70fa4Paul Duffin        Callable<V> callable, long delay, TimeUnit unit) {
1350888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertTrue(callable instanceof WrappedCallable);
1360888a09821a98ac0680fad765217302858e70fa4Paul Duffin      lastMethodCalled = "scheduleCallable";
1370888a09821a98ac0680fad765217302858e70fa4Paul Duffin      lastDelay = delay;
1380888a09821a98ac0680fad765217302858e70fa4Paul Duffin      lastUnit = unit;
1390888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return null;
1400888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1410888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1420888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public ScheduledFuture<?> scheduleAtFixedRate(
1430888a09821a98ac0680fad765217302858e70fa4Paul Duffin        Runnable command, long initialDelay, long period, TimeUnit unit) {
1440888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertTrue(command instanceof WrappedRunnable);
1450888a09821a98ac0680fad765217302858e70fa4Paul Duffin      lastMethodCalled = "scheduleAtFixedRate";
1460888a09821a98ac0680fad765217302858e70fa4Paul Duffin      lastInitialDelay = initialDelay;
1470888a09821a98ac0680fad765217302858e70fa4Paul Duffin      lastDelay = period;
1480888a09821a98ac0680fad765217302858e70fa4Paul Duffin      lastUnit = unit;
1490888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return null;
1500888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1510888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1520888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override public ScheduledFuture<?> scheduleWithFixedDelay(
1530888a09821a98ac0680fad765217302858e70fa4Paul Duffin        Runnable command, long initialDelay, long delay, TimeUnit unit) {
1540888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertTrue(command instanceof WrappedRunnable);
1550888a09821a98ac0680fad765217302858e70fa4Paul Duffin      lastMethodCalled = "scheduleWithFixedDelay";
1560888a09821a98ac0680fad765217302858e70fa4Paul Duffin      lastInitialDelay = initialDelay;
1570888a09821a98ac0680fad765217302858e70fa4Paul Duffin      lastDelay = delay;
1580888a09821a98ac0680fad765217302858e70fa4Paul Duffin      lastUnit = unit;
1590888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return null;
1600888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1610888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1620888a09821a98ac0680fad765217302858e70fa4Paul Duffin    // No need to test these methods as they are handled by WrappingExecutorServiceTest
1630888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
1640888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public boolean awaitTermination(long timeout, TimeUnit unit) {
1650888a09821a98ac0680fad765217302858e70fa4Paul Duffin      throw new UnsupportedOperationException();
1660888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1670888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1680888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
1690888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
1700888a09821a98ac0680fad765217302858e70fa4Paul Duffin        throws InterruptedException {
1710888a09821a98ac0680fad765217302858e70fa4Paul Duffin      throw new UnsupportedOperationException();
1720888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1730888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1740888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
1750888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public <T> List<Future<T>> invokeAll(
1760888a09821a98ac0680fad765217302858e70fa4Paul Duffin        Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
1770888a09821a98ac0680fad765217302858e70fa4Paul Duffin        throws InterruptedException {
1780888a09821a98ac0680fad765217302858e70fa4Paul Duffin      throw new UnsupportedOperationException();
1790888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1800888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1810888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
1820888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public <T> T invokeAny(Collection<? extends Callable<T>> tasks)
1830888a09821a98ac0680fad765217302858e70fa4Paul Duffin        throws ExecutionException, InterruptedException {
1840888a09821a98ac0680fad765217302858e70fa4Paul Duffin      throw new UnsupportedOperationException();
1850888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1860888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1870888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
1880888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
1890888a09821a98ac0680fad765217302858e70fa4Paul Duffin        throws ExecutionException, InterruptedException, TimeoutException {
1900888a09821a98ac0680fad765217302858e70fa4Paul Duffin      throw new UnsupportedOperationException();
1910888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1920888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1930888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
1940888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public boolean isShutdown() {
1950888a09821a98ac0680fad765217302858e70fa4Paul Duffin      throw new UnsupportedOperationException();
1960888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1970888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1980888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
1990888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public boolean isTerminated() {
2000888a09821a98ac0680fad765217302858e70fa4Paul Duffin      throw new UnsupportedOperationException();
2010888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2020888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2030888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
2040888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void shutdown() {
2050888a09821a98ac0680fad765217302858e70fa4Paul Duffin      throw new UnsupportedOperationException();
2060888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2070888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2080888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
2090888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public List<Runnable> shutdownNow() {
2100888a09821a98ac0680fad765217302858e70fa4Paul Duffin      throw new UnsupportedOperationException();
2110888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2120888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2130888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
2140888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public <T> Future<T> submit(Callable<T> task) {
2150888a09821a98ac0680fad765217302858e70fa4Paul Duffin      throw new UnsupportedOperationException();
2160888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2170888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2180888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
2190888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public Future<?> submit(Runnable task) {
2200888a09821a98ac0680fad765217302858e70fa4Paul Duffin      throw new UnsupportedOperationException();
2210888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2220888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2230888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
2240888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public <T> Future<T> submit(Runnable task, T result) {
2250888a09821a98ac0680fad765217302858e70fa4Paul Duffin      throw new UnsupportedOperationException();
2260888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2270888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2280888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
2290888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void execute(Runnable command) {
2300888a09821a98ac0680fad765217302858e70fa4Paul Duffin      throw new UnsupportedOperationException();
2310888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
2320888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2330888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
2340888a09821a98ac0680fad765217302858e70fa4Paul Duffin}
235