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