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