1dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon/*
2dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon * Copyright 2017 The Android Open Source Project
3dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon *
4dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon * Licensed under the Apache License, Version 2.0 (the "License");
5dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon * you may not use this file except in compliance with the License.
6dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon * You may obtain a copy of the License at
7dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon *
8dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon *      http://www.apache.org/licenses/LICENSE-2.0
9dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon *
10dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon * Unless required by applicable law or agreed to in writing, software
11dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon * distributed under the License is distributed on an "AS IS" BASIS,
12dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon * See the License for the specific language governing permissions and
14dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon * limitations under the License.
15dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon */
16dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon
17dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moonpackage android.support.mediacompat.testlib.util;
18dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon
19fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikasimport static org.junit.Assert.fail;
20dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon
21dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon/**
22dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon * Utility used for testing that allows to poll for a certain condition to happen within a timeout.
23dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon * (Copied from testutils/src/main/java/android/support/testutils/PollingCheck.java.)
24dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon */
25dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moonpublic abstract class PollingCheck {
26dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon    private static final long DEFAULT_TIMEOUT = 3000;
27dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon    private static final long TIME_SLICE = 50;
28dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon    private final long mTimeout;
29dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon
30dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon    /**
31dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon     * The condition that the PollingCheck should use to proceed successfully.
32dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon     */
33dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon    public interface PollingCheckCondition {
34dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon        /**
35dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon         * @return Whether the polling condition has been met.
36dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon         */
37dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon        boolean canProceed();
38dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon    }
39dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon
40dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon    public PollingCheck(long timeout) {
41dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon        mTimeout = timeout;
42dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon    }
43dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon
44dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon    protected abstract boolean check();
45dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon
46dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon    /**
47dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon     * Start running the polling check.
48dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon     */
49dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon    public void run() {
50dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon        if (check()) {
51dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon            return;
52dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon        }
53dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon
54dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon        long timeout = mTimeout;
55dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon        while (timeout > 0) {
56dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon            try {
57dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon                Thread.sleep(TIME_SLICE);
58dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon            } catch (InterruptedException e) {
5945e6d8a60387c26a7f7f26c209f54ef3023fc638Aurimas Liutikas                throw new AssertionError("unexpected InterruptedException");
60dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon            }
61dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon
62dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon            if (check()) {
63dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon                return;
64dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon            }
65dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon
66dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon            timeout -= TIME_SLICE;
67dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon        }
68dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon
69fa39e2bca1b284ad7c931d9194287770b7b507faAurimas Liutikas        fail("unexpected timeout");
70dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon    }
71dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon
72dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon    /**
73dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon     * Instantiate and start polling for a given condition with a default 3000ms timeout.
74dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon     * @param condition The condition to check for success.
75dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon     */
76dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon    public static void waitFor(final PollingCheckCondition condition) {
77dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon        new PollingCheck(DEFAULT_TIMEOUT) {
78dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon            @Override
79dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon            protected boolean check() {
80dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon                return condition.canProceed();
81dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon            }
82dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon        }.run();
83dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon    }
84dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon
85dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon    /**
86dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon     * Instantiate and start polling for a given condition.
87dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon     * @param timeout Time out in ms
88dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon     * @param condition The condition to check for success.
89dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon     */
90dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon    public static void waitFor(long timeout, final PollingCheckCondition condition) {
91dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon        new PollingCheck(timeout) {
92dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon            @Override
93dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon            protected boolean check() {
94dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon                return condition.canProceed();
95dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon            }
96dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon        }.run();
97dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon    }
98dd2f60bfe0b37f5bda89b870c86915bcf410339aHyundo Moon}
99