/* * 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; } } }