CriteriaHelper.java revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
1// Copyright 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5package org.chromium.content.browser.test.util;
6
7/**
8 * Helper methods for creating and managing criteria.
9 *
10 * <p>
11 * If possible, use callbacks or testing delegates instead of criteria as they
12 * do not introduce any polling delays.  Should only use Criteria if no suitable
13 * other approach exists.
14 */
15public class CriteriaHelper {
16
17    /** The default maximum time to wait for a criteria to become valid. */
18    public static final long DEFAULT_MAX_TIME_TO_POLL = 3000;
19    /** The default polling interval to wait between checking for a satisfied criteria. */
20    public static final long DEFAULT_POLLING_INTERVAL = 50;
21
22    /**
23     * Checks whether the given Criteria is satisfied at a given interval, until either
24     * the criteria is satisfied, or the specified maxTimeoutMs number of ms has elapsed.
25     * @param criteria The Criteria that will be checked.
26     * @param maxTimeoutMs The maximum number of ms that this check will be performed for
27     * before timeout.
28     * @param checkIntervalMs The number of ms between checks.
29     * @return true iff checking has ended with the criteria being satisfied.
30     * @throws InterruptedException
31     */
32    public static boolean pollForCriteria(Criteria criteria, long maxTimeoutMs,
33            long checkIntervalMs) throws InterruptedException {
34        boolean isSatisfied = criteria.isSatisfied();
35        long startTime = System.currentTimeMillis();
36        while (!isSatisfied && System.currentTimeMillis() - startTime < maxTimeoutMs) {
37            Thread.sleep(checkIntervalMs);
38            isSatisfied = criteria.isSatisfied();
39        }
40        return isSatisfied;
41    }
42
43    /**
44     * Checks whether the given Criteria is satisfied polling at a default interval.
45     *
46     * @param criteria The Criteria that will be checked.
47     * @return iff checking has ended with the criteria being satisfied.
48     * @throws InterruptedException
49     * @see #pollForCriteria(Criteria, long, long)
50     */
51    public static boolean pollForCriteria(Criteria criteria) throws InterruptedException {
52        return pollForCriteria(criteria, DEFAULT_MAX_TIME_TO_POLL, DEFAULT_POLLING_INTERVAL);
53    }
54
55    /**
56     * Performs the runnable action, then checks whether the given criteria are satisfied
57     * until the specified timeout, using the pollForCriteria method. If not, then the runnable
58     * action is performed again, to a maximum of maxAttempts tries.
59     */
60    public static boolean runUntilCriteria(Runnable runnable, Criteria criteria,
61            int maxAttempts, long maxTimeoutMs, long checkIntervalMs) throws InterruptedException {
62        int count = 0;
63        boolean success = false;
64        while (count < maxAttempts && !success) {
65            count++;
66            runnable.run();
67            success = pollForCriteria(criteria, maxTimeoutMs, checkIntervalMs);
68        }
69        return success;
70    }
71}
72