blob: 8fd4852abf7292b8073c86993a03f37202a2915d [file] [log] [blame]
Justin Klaassen4d01eea2018-04-03 23:21:57 -04001/*
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.testutils;
18
19import org.junit.Assert;
20
21/**
22 * Utility used for testing that allows to poll for a certain condition to happen within a timeout.
23 */
24public abstract class PollingCheck {
25 private static final long DEFAULT_TIMEOUT = 3000;
26 private static final long TIME_SLICE = 50;
27 private final long mTimeout;
28
29 /**
30 * The condition that the PollingCheck should use to proceed successfully.
31 */
32 public interface PollingCheckCondition {
33 /**
34 * @return Whether the polling condition has been met.
35 */
36 boolean canProceed();
37 }
38
39 public PollingCheck(long timeout) {
40 mTimeout = timeout;
41 }
42
43 protected abstract boolean check();
44
45 /**
46 * Start running the polling check.
47 */
48 public void run() {
49 if (check()) {
50 return;
51 }
52
53 long timeout = mTimeout;
54 while (timeout > 0) {
55 try {
56 Thread.sleep(TIME_SLICE);
57 } catch (InterruptedException e) {
58 Assert.fail("unexpected InterruptedException");
59 }
60
61 if (check()) {
62 return;
63 }
64
65 timeout -= TIME_SLICE;
66 }
67
68 Assert.fail("unexpected timeout");
69 }
70
71 /**
72 * Instantiate and start polling for a given condition with a default 3000ms timeout.
73 * @param condition The condition to check for success.
74 */
75 public static void waitFor(final PollingCheckCondition condition) {
76 new PollingCheck(DEFAULT_TIMEOUT) {
77 @Override
78 protected boolean check() {
79 return condition.canProceed();
80 }
81 }.run();
82 }
83
84 /**
85 * Instantiate and start polling for a given condition.
86 * @param timeout Time out in ms
87 * @param condition The condition to check for success.
88 */
89 public static void waitFor(long timeout, final PollingCheckCondition condition) {
90 new PollingCheck(timeout) {
91 @Override
92 protected boolean check() {
93 return condition.canProceed();
94 }
95 }.run();
96 }
97}