/******************************************************************************* * Copyright (c) 2012 Google, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Google, Inc. - initial API and implementation *******************************************************************************/ package com.windowtester.runtime.condition; import java.util.concurrent.TimeUnit; import static java.lang.System.currentTimeMillis; /** * Tests if a unit of time has elapsed. * * For example: * <p> * <code>ui.wait(new TimeElapsedCondition(TimeUnit.SECONDS, 1));</code> * </p> * specifies a wait of 1 second. * <p/> * Note that as a general rule, time periods should be replaced with * conditions that test more specific properties of the application under test. * * <p/> */ public class TimeElapsedCondition implements ICondition { private static final long UNSET = -1; private final TimeUnit unit; private final long duration; //NOTE in ms private long start = UNSET; /** * Equivalent to: <code>new TimeElapsedCondition(TimeUnit.SECONDS, duration)</code> */ public static TimeElapsedCondition seconds(long duration){ return new TimeElapsedCondition(TimeUnit.SECONDS, duration); } /** * Equivalent to: <code>new TimeElapsedCondition(TimeUnit.MILLISECONDS, duration)</code> */ public static TimeElapsedCondition milliseconds(long duration){ return new TimeElapsedCondition(TimeUnit.MILLISECONDS, duration); } /** * Equivalent to: <code>new TimeElapsedCondition(TimeUnit.MINUTES, duration)</code> */ public static TimeElapsedCondition minutes(long duration){ //TimeUnit.MINUTES was introduced in Java1.6 so we simulate: return new TimeElapsedCondition(TimeUnit.SECONDS, 60* duration); } /** * Create a condition that can test if a period of time has elapsed. * @param unit - the unit of time * @param duration - the duration */ public TimeElapsedCondition(TimeUnit unit, long duration){ this.unit = unit; this.duration = duration; } /** * Test if the specified time duration has elapsed. * @see com.windowtester.runtime.condition.ICondition#test() */ public boolean test() { if (start == UNSET) start = currentTimeMillis(); return currentTimeMillis() - start > unit.toMillis(duration); } }