1f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev/* 2f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * Copyright (C) 2014 The Android Open Source Project 3f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * 4f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * Licensed under the Apache License, Version 2.0 (the "License"); 5f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * you may not use this file except in compliance with the License. 6f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * You may obtain a copy of the License at 7f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * 8f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * http://www.apache.org/licenses/LICENSE-2.0 9f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * 10f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * Unless required by applicable law or agreed to in writing, software 11f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * distributed under the License is distributed on an "AS IS" BASIS, 12f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * See the License for the specific language governing permissions and 14f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * limitations under the License. 15f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev */ 16f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 17f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelevpackage com.google.android.apps.common.testing.ui.espresso; 18f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 19f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelevimport static com.google.common.base.Preconditions.checkState; 20f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 21f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelevimport com.google.common.base.Joiner; 22f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 23f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelevimport android.os.Looper; 24f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 25f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelevimport java.util.List; 26f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 27f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev/** 28f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * An exception which indicates that the App has not become idle even after the specified duration. 29f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev */ 30f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelevpublic final class AppNotIdleException extends RuntimeException implements EspressoException { 31f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 32f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev private AppNotIdleException(String description) { 33f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev super(description); 34f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev } 35f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 36f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev /** 37f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * Creates a new AppNotIdleException suitable for erroring out a test case. 38f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * 39f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * This should be called only from the main thread if the app does not idle out within the 40f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * specified duration. 41f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * 42f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * @param idleConditions list of idleConditions that failed to become idle. 43f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * @param loopCount number of times it was tried to check if they became idle. 44f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * @param seconds number of seconds that was tried before giving up. 45f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * 46f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * @return a AppNotIdleException suitable to be thrown on the instrumentation thread. 47f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev */ 48f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev @Deprecated 49f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev public static AppNotIdleException create(List<String> idleConditions, int loopCount, 50f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev int seconds) { 51f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev checkState(Looper.myLooper() == Looper.getMainLooper()); 52f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev String errorMessage = String.format("App not idle within timeout of %s seconds even" + 53f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev "after trying for %s iterations. The following Idle Conditions failed %s", 54f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev seconds, loopCount, Joiner.on(",").join(idleConditions)); 55f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev return new AppNotIdleException(errorMessage); 56f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev } 57f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 58f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev /** 59f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * Creates a new AppNotIdleException suitable for erroring out a test case. 60f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * 61f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * This should be called only from the main thread if the app does not idle out within the 62f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * specified duration. 63f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * 64f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * @param idleConditions list of idleConditions that failed to become idle. 65f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * @param message a message about the failure. 66f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * 67f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev * @return a AppNotIdleException suitable to be thrown on the instrumentation thread. 68f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev */ 69f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev static AppNotIdleException create(List<String> idleConditions, String message) { 70f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev String errorMessage = String.format("%s The following Idle Conditions failed %s.", 71f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev message, Joiner.on(",").join(idleConditions)); 72f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev return new AppNotIdleException(errorMessage); 73f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev } 74f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev} 75f69eb9ac2856f470cb79f57141f711ed3ceed99dNick Korostelev 76