1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package androidx.arch.core.executor.testing;
18
19import androidx.arch.core.executor.ArchTaskExecutor;
20import androidx.arch.core.executor.TaskExecutor;
21
22import org.junit.rules.TestWatcher;
23import org.junit.runner.Description;
24
25/**
26 * A JUnit Test Rule that swaps the background executor used by the Architecture Components with a
27 * different one which executes each task synchronously.
28 * <p>
29 * You can use this rule for your host side tests that use Architecture Components.
30 */
31public class InstantTaskExecutorRule extends TestWatcher {
32    @Override
33    protected void starting(Description description) {
34        super.starting(description);
35        ArchTaskExecutor.getInstance().setDelegate(new TaskExecutor() {
36            @Override
37            public void executeOnDiskIO(Runnable runnable) {
38                runnable.run();
39            }
40
41            @Override
42            public void postToMainThread(Runnable runnable) {
43                runnable.run();
44            }
45
46            @Override
47            public boolean isMainThread() {
48                return true;
49            }
50        });
51    }
52
53    @Override
54    protected void finished(Description description) {
55        super.finished(description);
56        ArchTaskExecutor.getInstance().setDelegate(null);
57    }
58}
59