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