From 7eeda213775285d737c2efdee8f76c347eee1421 Mon Sep 17 00:00:00 2001 From: Vasyl Gello Date: Wed, 27 Jan 2021 14:31:03 +0200 Subject: [PATCH] Add testsuite Signed-off-by: Vasyl Gello --- test/kissfft-testsuite.sh | 275 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 275 insertions(+) create mode 100644 test/kissfft-testsuite.sh diff --git a/test/kissfft-testsuite.sh b/test/kissfft-testsuite.sh new file mode 100644 index 0000000..7d616ab --- /dev/null +++ b/test/kissfft-testsuite.sh @@ -0,0 +1,275 @@ +#!/bin/sh + +# +# Test suite for kissfft +# +# Copyright (c) 2021, Vasyl Gello. +# This file is part of KISS FFT - https://github.com/mborgerding/kissfft +# +# SPDX-License-Identifier: BSD-3-Clause +# See COPYING file for more information. +# + +if [ ! -f CHANGELOG ] && [ ! -f kiss_fft.h ]; then + echo "ERROR: Please run this testsuite from top level of kissfft source tree!" >&2 + return 1 +fi + +TESTSUITEOUTDIR="$2" + +if [ -z "$TESTSUITEOUTDIR" ]; then + TESTSUITEOUTDIR="/tmp/kissfft-testsuite" +fi + +if ! mkdir -p "$TESTSUITEOUTDIR"; then + echo "ERROR: Can not create directory '$TESTSUITEOUTDIR'!" >&2 + return 1 +fi + +# +# Test runner function +# +# Parameters: +# +# $1 - Action: "test" or "install" +# $2 - Build type: "make" or "cmake" +# $3 - Data type: "float" "double" "int16_t" "int32_t" "simd" +# $4 - library type: "shared" or "static" +# $5 - Include tools: "yes" or "no" +# $6 - Install root dir: "existing writable directory" +# + +test_runner() { + _ACTION="$1" + _BUILD_TYPE="$2" + _DATA_TYPE="$3" + _LIB_TYPE="$4" + _OPENMP="$5" + _INCLUDE_TOOLS="$6" + _INSTALL_ROOT_DIR="$7" + + _CMAKE_OPTS="" + _MAKE_OPTS="" + + # Prepare install directory name without "$_OPENMP" and "$_INCLUDE_TOOLS" + + _INSTALL_DIR="$_INSTALL_ROOT_DIR/$_BUILD_TYPE/$_DATA_TYPE/$_LIB_TYPE" + + # Prepare log file without "$_OPENMP" and "$_INCLUDE_TOOLS" + + _LOG_FILE="$_INSTALL_ROOT_DIR/$_ACTION-$_BUILD_TYPE-$_DATA_TYPE-$_LIB_TYPE" + + # Validate parameters + + # Create install root directory + + if [ -z "$_INSTALL_ROOT_DIR" ]; then + echo "" >&2 + echo "ERROR: Empty path to writeable directory" >&2 + echo "" >&2 + return 1 + fi + + if [ ! -d "$_INSTALL_ROOT_DIR" ]; then + if ! mkdir -p "$_INSTALL_ROOT_DIR"; then + echo "" >&2 + echo "ERROR: Can not create directory '$_INSTALL_ROOT_DIR'" >&2 + echo "" >&2 + return 1 + fi + fi + + if [ "$_BUILD_TYPE" != "make" ] && [ "$_BUILD_TYPE" != "cmake" ]; then + echo "ERROR: Build type must be one of: cmake make" >&2 + echo "" >&2 + return 1 + fi + + if [ "$_DATA_TYPE" != "double" ] && + [ "$_DATA_TYPE" != "float" ] && + [ "$_DATA_TYPE" != "int16_t" ] && + [ "$_DATA_TYPE" != "int32_t" ] && + [ "$_DATA_TYPE" != "simd" ]; + then + echo "ERROR: Data type must be one of: double float int16_t int32_t simd" >&2 + echo "" >&2 + return 1 + else + _MAKE_OPTS="$_MAKE_OPTS KISSFFT_DATATYPE=$_DATA_TYPE" + _CMAKE_OPTS="$_CMAKE_OPTS -DKISSFFT_DATATYPE=$_DATA_TYPE" + fi + + if [ "$_LIB_TYPE" != "shared" ] && [ "$_LIB_TYPE" != "static" ]; then + echo "ERROR: Library type must be one of: shared static" >&2 + echo "" >&2 + return 1 + fi + + case "$_LIB_TYPE" in + "shared") + ;; + "static") + _MAKE_OPTS="$_MAKE_OPTS KISSFFT_STATIC=1" + _CMAKE_OPTS="$_CMAKE_OPTS -DKISSFFT_STATIC=ON" + ;; + "*") + echo "ERROR: OpenMP inclusion must be one of: no yes" >&2 + echo "" >&2 + return 1 + ;; + esac + + case "$_OPENMP" in + "yes") + _INSTALL_DIR="$_INSTALL_DIR/openmp" + _LOG_FILE="$_LOG_FILE-openmp" + _MAKE_OPTS="$_MAKE_OPTS KISSFFT_OPENMP=1" + _CMAKE_OPTS="$_CMAKE_OPTS -DKISSFFT_OPENMP=ON" + ;; + "no") + _INSTALL_DIR="$_INSTALL_DIR/noopenmp" + _LOG_FILE="$_LOG_FILE-noopenmp" + ;; + "*") + echo "ERROR: OpenMP inclusion must be one of: no yes" >&2 + echo "" >&2 + return 1 + ;; + esac + + case "$_INCLUDE_TOOLS" in + "yes") + _INSTALL_DIR="$_INSTALL_DIR/tools" + _LOG_FILE="$_LOG_FILE-tools" + ;; + "no") + _INSTALL_DIR="$_INSTALL_DIR/notools" + _LOG_FILE="$_LOG_FILE-notools" + _MAKE_OPTS="$_MAKE_OPTS KISSFFT_TOOLS=0" + _CMAKE_OPTS="$_CMAKE_OPTS -DKISSFFT_TOOLS=OFF" + ;; + "*") + echo "ERROR: Tools inclusion must be one of: no yes" >&2 + echo "" >&2 + return 1 + ;; + esac + + # Clean kissfft + + rm -rf build 1>/dev/null 2>/dev/null + make clean 1>/dev/null 2>&1 + + # Prepare status line + + _STATUS_LINE="Running: $(printf "% 10s" "$_ACTION") |" + _STATUS_LINE="$_STATUS_LINE Build Type: $(printf "% 7s" "$_BUILD_TYPE") |" + _STATUS_LINE="$_STATUS_LINE Data Type: $(printf "% 7s" "$_DATA_TYPE") |" + _STATUS_LINE="$_STATUS_LINE Lib Type: $(printf "% 7s" "$_LIB_TYPE") |" + _STATUS_LINE="$_STATUS_LINE OpenMP: $(printf "% 3s" "$_OPENMP") |" + _STATUS_LINE="$_STATUS_LINE Tools: $(printf "% 3s" "$_INCLUDE_TOOLS") |" + + # Skip tests with tools not installed as they are same as with tools + + if [ "$_ACTION" = "test" ] && [ "$_INCLUDE_TOOLS" = "no" ]; then + return 2 + fi + + # Run selected action + + echo "$_STATUS_LINE" + + case "$_ACTION" in + "test") + _MAKE_OPTS="$_MAKE_OPTS PREFIX=$_INSTALL_DIR" + _CMAKE_OPTS="$_CMAKE_OPTS -DCMAKE_INSTALL_PREFIX=$_INSTALL_DIR" + + case "$_BUILD_TYPE" in + "make") + make $_MAKE_OPTS all 1>>"$_LOG_FILE" 2>&1 && + make $_MAKE_OPTS testsingle 1>>"$_LOG_FILE" 2>&1 && + _RET=$? + ;; + "cmake") + mkdir build 1>/dev/null 2>&1 && + cd build && + cmake $_CMAKE_OPTS .. 1>"$_LOG_FILE" 2>&1 && + make all 1>>"$_LOG_FILE" 2>&1 && + make test 1>>"$_LOG_FILE" 2>&1 + _RET=$? + cd .. + ;; + esac + ;; + "install") + _MAKE_OPTS="$_MAKE_OPTS PREFIX=$_INSTALL_DIR" + _CMAKE_OPTS="$_CMAKE_OPTS -DCMAKE_INSTALL_PREFIX=$_INSTALL_DIR" + + case "$_BUILD_TYPE" in + "make") + make $_MAKE_OPTS install 1>>"$_LOG_FILE" 2>&1 + _RET=$? + ;; + "cmake") + mkdir build 1>/dev/null 2>&1 && + cd build && + cmake $_CMAKE_OPTS .. 1>"$_LOG_FILE" 2>&1 && + make all 1>>"$_LOG_FILE" 2>&1 && + make install 1>>"$_LOG_FILE" 2>&1 + _RET=$? + cd .. + ;; + esac + ;; + *) + echo "ERROR: Action must be one of: test install" >&2 + echo "" >&2 + return 1 + ;; + esac + + # Clean kissfft + + rm -rf build 1>/dev/null 2>/dev/null + make clean 1>/dev/null 2>&1 + + # Return result + + [ $_RET -eq 0 ] && return 0 || return 1 +} + +# Main script + +for ACTION in test install; do + for BUILD_TYPE in make cmake; do + for DATA_TYPE in float double int16_t int32_t simd; do + for LIB_TYPE in shared static; do + for OPENMP in no yes; do + for INCLUDE_TOOLS in no yes; do + test_runner \ + "$ACTION" \ + "$BUILD_TYPE" \ + "$DATA_TYPE" \ + "$LIB_TYPE" \ + "$OPENMP" \ + "$INCLUDE_TOOLS" \ + "$TESTSUITEOUTDIR" + + case $? in + 0) + echo "Result: OK" + ;; + 1) + echo "Result: FAIL" + ;; + 2) + # Ignore it + echo "Result: IGNORE" 1>/dev/null + ;; + esac + done + done + done + done + done +done 2>&1 | tee "$TESTSUITEOUTDIR/all-tests.log"