blob: 2eaf37435bcaf21f15910b0d924f90fbbfee169b [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.email;
import com.android.emailcommon.Logging;
import android.app.KeyguardManager;
import android.content.Context;
import android.os.PowerManager;
import android.test.MoreAsserts;
import android.test.suitebuilder.annotation.LargeTest;
import android.util.Log;
import android.view.View;
import android.view.ViewParent;
import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
/**
* Utility methods used only by tests.
*/
@LargeTest
public class TestUtils extends TestCase /* It tests itself */ {
public interface Condition {
public boolean isMet();
}
/** Shortcut to create byte array */
public static byte[] b(int... array) {
if (array == null) {
return null;
}
byte[] ret = new byte[array.length];
for (int i = 0; i < ret.length; i++) {
ret[i] = (byte) array[i];
}
return ret;
}
public void testB() {
assertNull(b(null));
MoreAsserts.assertEquals(new byte[] {}, b());
MoreAsserts.assertEquals(new byte[] {1, 2, (byte) 0xff}, b(1, 2, 0xff));
}
/**
* Run {@code runnable} and fails if it doesn't throw a {@code expectedThrowable} or a subclass
* of it.
*/
public static void expectThrowable(Runnable runnable,
Class<? extends Throwable> expectedThrowable) {
try {
runnable.run();
fail("Expected throwable not thrown.");
} catch (Throwable th) {
if (expectedThrowable.isAssignableFrom(th.getClass())) {
return; // Expcted. OK
}
fail("Cought unexpected throwable " + th.getClass().getName());
}
}
public void testExpectThrowable() {
try {
expectThrowable(new Runnable() {
@Override public void run() {
// Throwing no exception
}
}, Throwable.class);
fail();
} catch (AssertionFailedError ok) {
}
try {
expectThrowable(new Runnable() {
@Override public void run() {
// Throw RuntimeException, which is not a subclass of Error.
throw new RuntimeException();
}
}, Error.class);
fail();
} catch (AssertionFailedError ok) {
}
expectThrowable(new Runnable() {
@Override public void run() {
throw new RuntimeException();
}
}, Exception.class);
}
/**
* Wait until a {@code Condition} is met.
*/
public static void waitUntil(Condition condition, int timeoutSeconds) {
waitUntil("", condition, timeoutSeconds);
}
/**
* Wait until a {@code Condition} is met.
*/
public static void waitUntil(String message, Condition condition, int timeoutSeconds) {
Log.d(Logging.LOG_TAG, message + ": Waiting...");
final long timeout = System.currentTimeMillis() + timeoutSeconds * 1000;
while (System.currentTimeMillis() < timeout) {
if (condition.isMet()) {
return;
}
try {
Thread.sleep(500);
} catch (InterruptedException ignore) {
}
}
fail(message + ": Timeout");
}
public void testWaitUntil() {
// Shouldn't fail.
waitUntil("message", new Condition() {
@Override public boolean isMet() {
return true;
}
}, 1000000);
expectThrowable(new Runnable() {
@Override public void run() {
// Condition never meets, should fail.
waitUntil("message", new Condition() {
@Override public boolean isMet() {
return false;
}
}, 0);
}
}, AssertionFailedError.class);
}
/**
* @return true if the screen is on and not locked; false otherwise, in which case tests that
* send key events will fail.
*/
public static boolean isScreenOnAndNotLocked(Context context) {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
if (!pm.isScreenOn()) {
return false;
}
KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
if (km.inKeyguardRestrictedInputMode()) {
return false;
}
return true;
}
public static void assertViewVisible(View v) {
if (v == null) {
throw new NullPointerException();
}
for (;;) {
assertTrue("visibility for " + v, View.VISIBLE == v.getVisibility());
ViewParent parent = v.getParent();
if (parent == null || !(parent instanceof View)) {
break;
}
v = (View) parent;
}
}
}