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