1ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/* 2ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Copyright (C) 2016 The Android Open Source Project 3ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 4ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License"); 5ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * you may not use this file except in compliance with the License. 6ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * You may obtain a copy of the License at 7ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 8ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * http://www.apache.org/licenses/LICENSE-2.0 9ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 10ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Unless required by applicable law or agreed to in writing, software 11ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS, 12ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * See the License for the specific language governing permissions and 14ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * limitations under the License 15ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 16ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 17ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpackage com.android.dialer.common; 18ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 19ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.os.Looper; 20ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.annotation.NonNull; 21ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.annotation.Nullable; 22d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport javax.annotation.CheckReturnValue; 23ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 24ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/** Assertions which will result in program termination unless disabled by flags. */ 25ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpublic class Assert { 26ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 27ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private static boolean areThreadAssertsEnabled = true; 28ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 29ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static void setAreThreadAssertsEnabled(boolean areThreadAssertsEnabled) { 30ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Assert.areThreadAssertsEnabled = areThreadAssertsEnabled; 31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 32ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 33ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 34ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Called when a truly exceptional case occurs. 35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 36ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @throws AssertionError 37d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @deprecated Use throw Assert.create*FailException() instead. 38ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 39d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @Deprecated 40ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static void fail() { 41ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian throw new AssertionError("Fail"); 42ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 43ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 44ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 45ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Called when a truly exceptional case occurs. 46ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 47ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param reason the optional reason to supply as the exception message 48ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @throws AssertionError 49d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @deprecated Use throw Assert.create*FailException() instead. 50ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 51d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @Deprecated 52ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static void fail(String reason) { 53ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian throw new AssertionError(reason); 54ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 55ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 56d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @CheckReturnValue 57d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static AssertionError createAssertionFailException(String msg) { 58d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return new AssertionError(msg); 59d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 60d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 61d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @CheckReturnValue 622f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian public static AssertionError createAssertionFailException(String msg, Throwable reason) { 632f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian return new AssertionError(msg, reason); 642f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian } 652f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian 662f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian @CheckReturnValue 67d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static UnsupportedOperationException createUnsupportedOperationFailException() { 68d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return new UnsupportedOperationException(); 69d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 70d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 71d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @CheckReturnValue 72d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static UnsupportedOperationException createUnsupportedOperationFailException(String msg) { 73d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return new UnsupportedOperationException(msg); 74d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 75d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 76d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @CheckReturnValue 77d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static IllegalStateException createIllegalStateFailException() { 78d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return new IllegalStateException(); 79d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 80d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 81d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @CheckReturnValue 82d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static IllegalStateException createIllegalStateFailException(String msg) { 83d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return new IllegalStateException(msg); 84d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 85d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 86ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 87ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Ensures the truth of an expression involving one or more parameters to the calling method. 88ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 89ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param expression a boolean expression 90ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @throws IllegalArgumentException if {@code expression} is false 91ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 92ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static void checkArgument(boolean expression) { 93ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian checkArgument(expression, null); 94ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 95ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 96ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 97ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Ensures the truth of an expression involving one or more parameters to the calling method. 98ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 99ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param expression a boolean expression 100ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param messageTemplate the message to log, possible with format arguments. 101ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param args optional arguments to be used in the formatted string. 102ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @throws IllegalArgumentException if {@code expression} is false 103ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 104ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static void checkArgument( 105ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian boolean expression, @Nullable String messageTemplate, Object... args) { 106ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (!expression) { 107ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian throw new IllegalArgumentException(format(messageTemplate, args)); 108ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 109ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 110ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 111ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 112ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Ensures the truth of an expression involving the state of the calling instance, but not 113ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * involving any parameters to the calling method. 114ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 115ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param expression a boolean expression 116ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @throws IllegalStateException if {@code expression} is false 117ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 118ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static void checkState(boolean expression) { 119ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian checkState(expression, null); 120ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 121ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 122ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 123ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Ensures the truth of an expression involving the state of the calling instance, but not 124ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * involving any parameters to the calling method. 125ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 126ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param expression a boolean expression 127ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param messageTemplate the message to log, possible with format arguments. 128ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param args optional arguments to be used in the formatted string. 129ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @throws IllegalStateException if {@code expression} is false 130ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 131ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static void checkState( 132ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian boolean expression, @Nullable String messageTemplate, Object... args) { 133ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (!expression) { 134ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian throw new IllegalStateException(format(messageTemplate, args)); 135ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 136ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 137ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 138ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 139ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Ensures that an object reference passed as a parameter to the calling method is not null. 140ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 141ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param reference an object reference 142ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @return the non-null reference that was validated 143ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @throws NullPointerException if {@code reference} is null 144ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 145ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @NonNull 146ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static <T> T isNotNull(@Nullable T reference) { 147ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return isNotNull(reference, null); 148ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 149ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 150ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 151ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Ensures that an object reference passed as a parameter to the calling method is not null. 152ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 153ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param reference an object reference 154ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param messageTemplate the message to log, possible with format arguments. 155ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param args optional arguments to be used in the formatted string. 156ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @return the non-null reference that was validated 157ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @throws NullPointerException if {@code reference} is null 158ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 159ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @NonNull 160ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static <T> T isNotNull( 161ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Nullable T reference, @Nullable String messageTemplate, Object... args) { 162ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (reference == null) { 163ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian throw new NullPointerException(format(messageTemplate, args)); 164ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 165ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return reference; 166ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 167ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 168ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 169ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Ensures that the current thread is the main thread. 170ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 171ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @throws IllegalStateException if called on a background thread 172ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 173ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static void isMainThread() { 174ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian isMainThread(null); 175ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 176ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 177ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 178ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Ensures that the current thread is the main thread. 179ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 180ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param messageTemplate the message to log, possible with format arguments. 181ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param args optional arguments to be used in the formatted string. 182ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @throws IllegalStateException if called on a background thread 183ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 184ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static void isMainThread(@Nullable String messageTemplate, Object... args) { 185ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (!areThreadAssertsEnabled) { 186ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return; 187ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 188ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian checkState(Looper.getMainLooper().equals(Looper.myLooper()), messageTemplate, args); 189ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 190ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 191ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 192ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Ensures that the current thread is a worker thread. 193ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 194ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @throws IllegalStateException if called on the main thread 195ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 196ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static void isWorkerThread() { 197ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian isWorkerThread(null); 198ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 199ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 200ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 201ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Ensures that the current thread is a worker thread. 202ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 203ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param messageTemplate the message to log, possible with format arguments. 204ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @param args optional arguments to be used in the formatted string. 205ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * @throws IllegalStateException if called on the main thread 206ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 207ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static void isWorkerThread(@Nullable String messageTemplate, Object... args) { 208ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (!areThreadAssertsEnabled) { 209ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return; 210ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 211ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian checkState(!Looper.getMainLooper().equals(Looper.myLooper()), messageTemplate, args); 212ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 213ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 214ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private static String format(@Nullable String messageTemplate, Object... args) { 215ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (messageTemplate == null) { 216ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return null; 217ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 218ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return String.format(messageTemplate, args); 219ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 220ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian} 221