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