1437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds/*
2437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds * Copyright (C) 2018 The Android Open Source Project
3437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds *
4437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds * Licensed under the Apache License, Version 2.0 (the "License");
5437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds * you may not use this file except in compliance with the License.
6437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds * You may obtain a copy of the License at
7437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds *
8437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds *      http://www.apache.org/licenses/LICENSE-2.0
9437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds *
10437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds * Unless required by applicable law or agreed to in writing, software
11437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds * distributed under the License is distributed on an "AS IS" BASIS,
12437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds * See the License for the specific language governing permissions and
14437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds * limitations under the License.
15437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds */
16437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds
17437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynoldspackage android.testing;
18437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds
19437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynoldsimport junit.framework.Assert;
20437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynoldsimport java.util.concurrent.Callable;
21437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds
22437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynoldspublic abstract class PollingCheck {
23437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds    private static final long TIME_SLICE = 50;
24437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds    private long mTimeout = 3000;
25437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds
26437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds    public static interface PollingCheckCondition {
27437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds        boolean canProceed();
28437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds    }
29437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds
30437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds    public PollingCheck() {
31437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds    }
32437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds
33437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds    public PollingCheck(long timeout) {
34437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds        mTimeout = timeout;
35437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds    }
36437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds
37437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds    protected abstract boolean check();
38437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds
39437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds    public void run() {
40437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds        if (check()) {
41437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds            return;
42437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds        }
43437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds
44437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds        long timeout = mTimeout;
45437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds        while (timeout > 0) {
46437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds            try {
47437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds                Thread.sleep(TIME_SLICE);
48437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds            } catch (InterruptedException e) {
49437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds                Assert.fail("unexpected InterruptedException");
50437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds            }
51437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds
52437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds            if (check()) {
53437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds                return;
54437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds            }
55437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds
56437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds            timeout -= TIME_SLICE;
57437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds        }
58437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds
59437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds        Assert.fail("unexpected timeout");
60437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds    }
61437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds
62437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds    public static void check(CharSequence message, long timeout, Callable<Boolean> condition)
63437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds            throws Exception {
64437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds        while (timeout > 0) {
65437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds            if (condition.call()) {
66437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds                return;
67437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds            }
68437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds
69437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds            Thread.sleep(TIME_SLICE);
70437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds            timeout -= TIME_SLICE;
71437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds        }
72437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds
73437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds        Assert.fail(message.toString());
74437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds    }
75437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds
76437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds    public static void waitFor(final PollingCheckCondition condition) {
77437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds        new PollingCheck() {
78437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds            @Override
79437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds            protected boolean check() {
80437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds                return condition.canProceed();
81437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds            }
82437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds        }.run();
83437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds    }
84437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds
85437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds    public static void waitFor(long timeout, final PollingCheckCondition condition) {
86437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds        new PollingCheck(timeout) {
87437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds            @Override
88437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds            protected boolean check() {
89437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds                return condition.canProceed();
90437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds            }
91437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds        }.run();
92437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds    }
93437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds}
94437cdb146498cbfabd6ed0c2466fc5349b0f1d65Julia Reynolds
95