Add tests/test_all_configurations.sh (#2053)

Can be used as a script to run sanitized tests before tagging a
release.
diff --git a/tests/test_all_configurations.sh b/tests/test_all_configurations.sh
new file mode 100755
index 0000000..5adcf4d
--- /dev/null
+++ b/tests/test_all_configurations.sh
@@ -0,0 +1,94 @@
+#!/bin/bash
+# Copyright 2024 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ------------------------------------------------------------------------------
+#
+# Try all test configurations, typically before a release. This script should be
+# executed from the root of a fresh local clone of the libavif repository, for
+# example (Unix only):
+#   git clone -b v1.0.x https://github.com/AOMediaCodec/libavif.git
+#   cd libavif
+#   tests/test_all_configurations.sh
+
+set -e
+
+pushd ext
+  rm -rf googletest
+  ./googletest.cmd
+popd
+
+rm -rf build_*
+
+for BUILD_TYPE in Debug Release; do
+  pushd ext
+    rm -rf aom
+    ./aom.cmd
+    rm -rf dav1d
+    ./dav1d.cmd
+    rm -rf libyuv
+    ./libyuv.cmd
+    rm -rf libwebp
+    ./libsharpyuv.cmd
+  popd
+
+  mkdir build_${BUILD_TYPE}
+  pushd build_${BUILD_TYPE}
+    cmake .. \
+     -DAVIF_BUILD_APPS=ON -DAVIF_BUILD_EXAMPLES=ON \
+     -DAVIF_BUILD_TESTS=ON -DAVIF_ENABLE_GTEST=ON -DAVIF_LOCAL_GTEST=ON \
+     -DAVIF_CODEC_AOM=ON -DAVIF_LOCAL_AOM=ON \
+     -DAVIF_CODEC_DAV1D=ON -DAVIF_LOCAL_DAV1D=ON \
+     -DAVIF_LOCAL_LIBYUV=ON -DAVIF_LOCAL_LIBSHARPYUV=ON \
+     -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DBUILD_SHARED_LIBS=OFF
+    cmake --build . --parallel
+    ctest . -j $(nproc)
+  popd
+
+  # The memory sanitizer triggers too many use-of-uninitialized-value errors
+  # (possibly false positives because standard libraries were not instrumented).
+  for SANITIZER in address thread undefined; do
+    pushd ext
+      rm -rf aom
+      CC=clang CXX=clang++ CFLAGS=-fsanitize=${SANITIZER} CXXFLAGS=-fsanitize=${SANITIZER} LDFLAGS=-fsanitize=${SANITIZER} \
+      ./aom.cmd
+      rm -rf dav1d
+      cp dav1d.cmd dav1d_sanitized.cmd
+      sed -i 's/meson setup \(.*\) \.\./meson setup \1 '"-Db_sanitize=${SANITIZER} -Db_lundef=false"' ../g' dav1d_sanitized.cmd
+      CC=clang CXX=clang++ ./dav1d_sanitized.cmd
+      rm -rf libyuv
+      # libyuv is not instrumented with ubsan because it generates linker errors.
+      # CC=clang CXX=clang++ CFLAGS=-fsanitize=${SANITIZER} CXXFLAGS=-fsanitize=${SANITIZER} LDFLAGS=-fsanitize=${SANITIZER} \
+      ./libyuv.cmd
+      rm -rf libwebp
+      CC=clang CXX=clang++ CFLAGS=-fsanitize=${SANITIZER} CXXFLAGS=-fsanitize=${SANITIZER} LDFLAGS=-fsanitize=${SANITIZER} \
+      ./libsharpyuv.cmd
+    popd
+
+    mkdir build_${BUILD_TYPE}_${SANITIZER}
+    pushd build_${BUILD_TYPE}_${SANITIZER}
+      CC=clang CXX=clang++ CFLAGS=-fsanitize=${SANITIZER} CXXFLAGS=-fsanitize=${SANITIZER} LDFLAGS=-fsanitize=${SANITIZER} \
+      cmake .. \
+       -DAVIF_BUILD_APPS=ON -DAVIF_BUILD_EXAMPLES=ON \
+       -DAVIF_BUILD_TESTS=ON -DAVIF_ENABLE_GTEST=ON -DAVIF_LOCAL_GTEST=ON \
+       -DAVIF_CODEC_AOM=ON -DAVIF_LOCAL_AOM=ON \
+       -DAVIF_CODEC_DAV1D=ON -DAVIF_LOCAL_DAV1D=ON \
+       -DAVIF_LOCAL_LIBYUV=ON -DAVIF_LOCAL_LIBSHARPYUV=ON \
+       -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DBUILD_SHARED_LIBS=OFF
+      cmake --build . --parallel
+      ASAN_OPTIONS=allocator_may_return_null=1:detect_odr_violation=0 \
+      TSAN_OPTIONS=allocator_may_return_null=1 \
+      ctest . -j $(nproc)
+    popd
+  done
+done