1ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay/*
2ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay * Copyright (C) 2016 The Android Open Source Project
3ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay *
4ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay * Licensed under the Apache License, Version 2.0 (the "License");
5ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay * you may not use this file except in compliance with the License.
6ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay * You may obtain a copy of the License at
7ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay *
8ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay *      http://www.apache.org/licenses/LICENSE-2.0
9ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay *
10ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay * Unless required by applicable law or agreed to in writing, software
11ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay * distributed under the License is distributed on an "AS IS" BASIS,
12ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay * See the License for the specific language governing permissions and
14ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay * limitations under the License.
15ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay */
16ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
17ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKaypackage com.android.documentsui.services;
18ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
19ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKayimport static junit.framework.Assert.assertFalse;
20ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKayimport static junit.framework.Assert.fail;
21ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
22ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKayimport java.util.ArrayList;
23ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKayimport java.util.Collection;
24ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKayimport java.util.List;
25ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKayimport java.util.concurrent.Callable;
26ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKayimport java.util.concurrent.Delayed;
27ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKayimport java.util.concurrent.ExecutionException;
28ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKayimport java.util.concurrent.Future;
29ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKayimport java.util.concurrent.ScheduledExecutorService;
30ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKayimport java.util.concurrent.ScheduledFuture;
31ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKayimport java.util.concurrent.TimeUnit;
32ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKayimport java.util.concurrent.TimeoutException;
33ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
34ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKaypublic class TestScheduledExecutorService implements ScheduledExecutorService {
35ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
36ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    private List<TestFuture> scheduled = new ArrayList<>();
37ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    private boolean shutdown;
38ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
39ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    @Override
40ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    public void shutdown() {
41ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        this.shutdown = true;
42ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
43ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
44ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    @Override
45ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    public List<Runnable> shutdownNow() {
46ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        this.shutdown = true;
47ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        return new ArrayList<>();
48ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
49ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
50ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    void assertShutdown() {
51ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        if (!shutdown) {
52ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay            fail("Executor wasn't shut down.");
53ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        }
54ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
55ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
56ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    @Override
57ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    public boolean isShutdown() {
58ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        return shutdown;
59ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
60ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
61ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    @Override
62ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    public boolean isTerminated() {
63ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        throw new UnsupportedOperationException();
64ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
65ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
66ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    @Override
67ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
68ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        throw new UnsupportedOperationException();
69ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
70ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
71ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    @Override
72ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    public <T> Future<T> submit(Callable<T> task) {
73ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        throw new UnsupportedOperationException();
74ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
75ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
76ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    @Override
77ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    public <T> Future<T> submit(Runnable task, T result) {
78ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        throw new UnsupportedOperationException();
79ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
80ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
81ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    @Override
82ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    public Future<?> submit(Runnable task) {
83ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        throw new UnsupportedOperationException();
84ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
85ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
86ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    @Override
87ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
88ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay            throws InterruptedException {
89ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        throw new UnsupportedOperationException();
90ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
91ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
92ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    @Override
93ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout,
94ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay            TimeUnit unit) throws InterruptedException {
95ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        throw new UnsupportedOperationException();
96ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
97ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
98ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    @Override
99ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    public <T> T invokeAny(Collection<? extends Callable<T>> tasks)
100ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay            throws InterruptedException, ExecutionException {
101ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        throw new UnsupportedOperationException();
102ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
103ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
104ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    @Override
105ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
106ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay            throws InterruptedException, ExecutionException, TimeoutException {
107ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        throw new UnsupportedOperationException();
108ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
109ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
110ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    @Override
111ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    public void execute(Runnable command) {
112ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        throw new UnsupportedOperationException();
113ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
114ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
115ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    @Override
116ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) {
117ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        TestFuture future = new TestFuture(command, delay, unit);
118ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        scheduled.add(future);
119ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        return future;
120ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
121ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
122ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    @Override
123ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit) {
124ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        throw new UnsupportedOperationException();
125ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
126ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
127ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    @Override
128ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period,
129ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay            TimeUnit unit) {
130ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        throw new UnsupportedOperationException();
131ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
132ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
133ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    @Override
134ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay,
135ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay            long delay, TimeUnit unit) {
136ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        throw new UnsupportedOperationException();
137ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
138ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
139ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    void runAll() {
140ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        for (TestFuture future : scheduled) {
141ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay            future.runnable.run();
142ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        }
143ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
144ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
145ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    void run(int taskIndex) {
146ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        scheduled.get(taskIndex).runnable.run();
147ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
148ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
1493564543e1ece2211a2d5b729fbbf8dd7ac94944cSteve McKay    public void assertAlive() {
150ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        assertFalse(isShutdown());
151ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
152ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
153ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    static class TestFuture implements ScheduledFuture<Void> {
154ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
155ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        final Runnable runnable;
156ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        final long delay;
157ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        final TimeUnit unit;
158ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
159ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        public TestFuture(Runnable runnable, long delay, TimeUnit unit) {
160ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay            this.runnable = runnable;
161ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay            this.delay = delay;
162ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay            this.unit = unit;
163ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        }
164ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
165ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        @Override
166ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        public long getDelay(TimeUnit unit) {
167ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay            return 0;
168ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        }
169ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
170ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        @Override
171ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        public int compareTo(Delayed arg0) {
172ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay            return 0;
173ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        }
174ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
175ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        @Override
176ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        public boolean cancel(boolean mayInterruptIfRunning) {
177ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay            return false;
178ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        }
179ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
180ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        @Override
181ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        public boolean isCancelled() {
182ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay            return false;
183ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        }
184ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
185ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        @Override
186ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        public boolean isDone() {
187ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay            return false;
188ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        }
189ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
190ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        @Override
191ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        public Void get() throws InterruptedException, ExecutionException {
192ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay            return null;
193ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        }
194ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay
195ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        @Override
196ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        public Void get(long timeout, TimeUnit unit)
197ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay                throws InterruptedException, ExecutionException, TimeoutException {
198ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay            return null;
199ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay        }
200ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay    }
201ecbf3c504c5ec7ccb3e2be7f4dd175ebe634139dSteve McKay}
202