16d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim/* 26d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * Copyright 2016 The Android Open Source Project 36d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 46d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * Licensed under the Apache License, Version 2.0 (the "License"); 56d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * you may not use this file except in compliance with the License. 66d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * You may obtain a copy of the License at 76d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 86d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * http://www.apache.org/licenses/LICENSE-2.0 96d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 106d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * Unless required by applicable law or agreed to in writing, software 116d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * distributed under the License is distributed on an "AS IS" BASIS, 126d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * See the License for the specific language governing permissions and 146d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * limitations under the License. 156d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim */ 166d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 176d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimpackage com.android.mediaframeworktest.helpers; 186d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 196d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport java.util.Collection; 206d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimimport java.util.Objects; 216d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 226d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim/** 236d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * Helper set of methods to perform precondition checks before starting method execution. 246d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 256d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * <p>Typically used to sanity check arguments or the current object state.</p> 266d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim */ 276d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim/** 286d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * (non-Javadoc) 296d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @see android.hardware.camera2.cts.helpers.Preconditions 306d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim */ 316d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kimpublic final class Preconditions { 326d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 336d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim /** 346d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * Checks that the value has the expected bitwise flags set. 356d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 366d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @param argName Name of the argument 376d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @param arg Argument to check 386d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @param flagsName Name of the bitwise flags 396d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @param flags Bit flags to check. 406d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @return arg 416d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 426d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @throws IllegalArgumentException if the bitwise flags weren't set 436d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim */ 446d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim public static int checkBitFlags(String argName, int arg, String flagsName, int flags) { 456d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim if ((arg & flags) == 0) { 466d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim throw new IllegalArgumentException( 476d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim String.format("Argument '%s' must have flags '%s' set", argName, flagsName)); 486d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 496d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 506d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim return arg; 516d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 526d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 536d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim /** 546d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * Checks that the value is {@link Object#equals equal} to the expected value. 556d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 566d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @param argName Name of the argument 576d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @param arg Argument to check 586d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @param expectedName Name of the expected value 596d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @param expectedValue Expected value 606d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @return arg 616d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 626d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @throws IllegalArgumentException if the values were not equal 636d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim */ 646d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim public static <T> T checkEquals(String argName, T arg, 656d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim String expectedName, T expectedValue) { 666d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim if (!Objects.equals(arg, expectedValue)) { 676d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim throw new IllegalArgumentException( 686d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim String.format( 696d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim "Argument '%s' must be equal to '%s' (was '%s', but expected '%s')", 706d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim argName, expectedName, arg, expectedValue)); 716d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 726d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 736d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim return arg; 746d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 756d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 766d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim /** 776d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * Checks that the value is not {@code null}. 786d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 796d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * <p> 806d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * Returns the value directly, so you can use {@code checkNotNull("value", value)} inline. 816d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * </p> 826d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 836d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @param argName Name of the argument 846d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @param arg Argument to check 856d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @return arg 866d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 876d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @throws NullPointerException if arg was {@code null} 886d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim */ 896d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim public static <T> T checkNotNull(String argName, T arg) { 906d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim if (arg == null) { 916d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim throw new NullPointerException("Argument '" + argName + "' must not be null"); 926d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 936d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 946d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim return arg; 956d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 966d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 976d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim /** 986d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * Checks that the value is not {@code null}. 996d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 1006d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * <p> 1016d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * Returns the value directly, so you can use {@code checkNotNull("value", value)} inline. 1026d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * </p> 1036d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 1046d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @param arg Argument to check 1056d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @return arg 1066d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 1076d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @throws NullPointerException if arg was {@code null} 1086d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim */ 1096d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim public static <T> T checkNotNull(T arg) { 1106d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim return checkNotNull("", arg); 1116d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 1126d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 1136d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim /** 1146d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * Checks that the state is currently {@link true}. 1156d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 1166d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @param message Message to raise an exception with if the state checking fails. 1176d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @param state State to check 1186d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 1196d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @throws IllegalStateException if state was {@code false} 1206d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 1216d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @return The state value (always {@code true}). 1226d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim */ 1236d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim public static boolean checkState(String message, boolean state) { 1246d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim if (!state) { 1256d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim throw new IllegalStateException(message); 1266d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 1276d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 1286d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim return state; 1296d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 1306d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 1316d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim /** 1326d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * Ensures that the {@link Collection} is not {@code null}, and none of its elements are 1336d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * {@code null}. 1346d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 1356d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @param value a {@link Collection} of boxed objects 1366d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @param valueName the name of the argument to use if the check fails 1376d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 1386d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @return the validated {@link Collection} 1396d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 1406d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @throws NullPointerException if the {@code value} or any of its elements were {@code null} 1416d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim */ 1426d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim public static <T> Collection<T> checkCollectionElementsNotNull(final Collection<T> value, 1436d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim final String valueName) { 1446d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim if (value == null) { 1456d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim throw new NullPointerException(valueName + " must not be null"); 1466d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 1476d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 1486d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim long ctr = 0; 1496d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim for (T elem : value) { 1506d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim if (elem == null) { 1516d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim throw new NullPointerException( 1526d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim String.format("%s[%d] must not be null", valueName, ctr)); 1536d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 1546d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim ++ctr; 1556d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 1566d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 1576d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim return value; 1586d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 1596d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 1606d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim /** 1616d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * Ensures that the {@link Collection} is not {@code null}, and contains at least one element. 1626d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 1636d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @param value a {@link Collection} of boxed elements. 1646d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @param valueName the name of the argument to use if the check fails. 1656d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 1666d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @return the validated {@link Collection} 1676d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * 1686d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @throws NullPointerException if the {@code value} was {@code null} 1696d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim * @throws IllegalArgumentException if the {@code value} was empty 1706d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim */ 1716d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim public static <T> Collection<T> checkCollectionNotEmpty(final Collection<T> value, 1726d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim final String valueName) { 1736d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim if (value == null) { 1746d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim throw new NullPointerException(valueName + " must not be null"); 1756d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 1766d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim if (value.isEmpty()) { 1776d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim throw new IllegalArgumentException(valueName + " is empty"); 1786d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 1796d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim return value; 1806d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim } 1816d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim 1826d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim // Suppress default constructor for noninstantiability 1836d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim private Preconditions() { throw new AssertionError(); } 1846d8fd0a23fdc01b9414202c3de9bba41222583e6Hyungtae Tim Kim} 185