1#!/usr/bin/env bash 2 3set -e 4 5# If the configuration of tests is not provided, no tests will be carried out. 6if [[ ! -f $1 ]]; then 7 echo "ERROR: SPDK test configuration not specified" 8 exit 1 9fi 10 11rootdir=$(readlink -f $(dirname $0)) 12 13source "$1" 14source "$rootdir/test/common/autotest_common.sh" 15 16out=$output_dir 17scanbuild="scan-build -o $output_dir/scan-build-tmp --status-bugs" 18config_params=$(get_config_params) 19 20trap '[[ -d $SPDK_WORKSPACE ]] && rm -rf "$SPDK_WORKSPACE"' 0 21 22SPDK_WORKSPACE=$(mktemp -dt "spdk_$(date +%s).XXXXXX") 23export SPDK_WORKSPACE 24 25umask 022 26cd $rootdir 27 28# Print some test system info out for the log 29date -u 30git describe --tags 31./configure $config_params 32echo "** START ** Info for Hostname: $HOSTNAME" 33uname -a 34$MAKE cc_version 35$MAKE cxx_version 36echo "** END ** Info for Hostname: $HOSTNAME" 37 38function ocf_precompile() { 39 # We compile OCF sources ourselves 40 # They don't need to be checked with scanbuild and code coverage is not applicable 41 # So we precompile OCF now for further use as standalone static library 42 ./configure $(echo $config_params | sed 's/--enable-coverage//g') 43 $MAKE $MAKEFLAGS include/spdk/config.h 44 CC=gcc CCAR=ar $MAKE $MAKEFLAGS -C lib/env_ocf exportlib O=$rootdir/build/ocf.a 45 # Set config to use precompiled library 46 config_params="$config_params --with-ocf=/$rootdir/build/ocf.a" 47 # need to reconfigure to avoid clearing ocf related files on future make clean. 48 ./configure $config_params 49} 50 51function make_fail_cleanup() { 52 if [ -d $out/scan-build-tmp ]; then 53 scanoutput=$(ls -1 $out/scan-build-tmp/) 54 mv $out/scan-build-tmp/$scanoutput $out/scan-build 55 rm -rf $out/scan-build-tmp 56 chmod -R a+rX $out/scan-build 57 fi 58 false 59} 60 61function scanbuild_make() { 62 pass=true 63 $scanbuild $MAKE $MAKEFLAGS > $out/build_output.txt && rm -rf $out/scan-build-tmp || make_fail_cleanup 64 xtrace_disable 65 66 rm -f $out/*files.txt 67 for ent in $(find app examples lib module test -type f | grep -vF ".h"); do 68 if [[ $ent == lib/env_ocf* ]]; then continue; fi 69 if file -bi $ent | grep -q 'text/x-c'; then 70 echo $ent | sed 's/\.cp\{0,2\}$//g' >> $out/all_c_files.txt 71 fi 72 done 73 xtrace_restore 74 75 grep -E "CC|CXX" $out/build_output.txt | sed 's/\s\s\(CC\|CXX\)\s//g' | sed 's/\.o//g' > $out/built_c_files.txt 76 cat $rootdir/test/common/skipped_build_files.txt >> $out/built_c_files.txt 77 78 sort -o $out/all_c_files.txt $out/all_c_files.txt 79 sort -o $out/built_c_files.txt $out/built_c_files.txt 80 # from comm manual: 81 # -2 suppress column 2 (lines unique to FILE2) 82 # -3 suppress column 3 (lines that appear in both files) 83 # comm may exit 1 if no lines were printed (undocumented, unreliable) 84 comm -2 -3 $out/all_c_files.txt $out/built_c_files.txt > $out/unbuilt_c_files.txt || true 85 86 if [ $(wc -l < $out/unbuilt_c_files.txt) -ge 1 ]; then 87 echo "missing files" 88 cat $out/unbuilt_c_files.txt 89 pass=false 90 fi 91 92 $pass 93} 94 95function porcelain_check() { 96 if [ $(git status --porcelain --ignore-submodules | wc -l) -ne 0 ]; then 97 echo "Generated files missing from .gitignore:" 98 git status --porcelain --ignore-submodules 99 exit 1 100 fi 101} 102 103# Check that header file dependencies are working correctly by 104# capturing a binary's stat data before and after touching a 105# header file and re-making. 106function header_dependency_check() { 107 STAT1=$(stat $SPDK_BIN_DIR/spdk_tgt) 108 sleep 1 109 touch lib/nvme/nvme_internal.h 110 $MAKE $MAKEFLAGS 111 STAT2=$(stat $SPDK_BIN_DIR/spdk_tgt) 112 113 if [ "$STAT1" == "$STAT2" ]; then 114 echo "Header dependency check failed" 115 false 116 fi 117} 118 119function test_make_uninstall() { 120 # Create empty file to check if it is not deleted by target uninstall 121 touch "$SPDK_WORKSPACE/usr/lib/sample_xyz.a" 122 $MAKE $MAKEFLAGS uninstall DESTDIR="$SPDK_WORKSPACE" prefix=/usr 123 if [[ $(find "$SPDK_WORKSPACE/usr" -maxdepth 1 -mindepth 1 | wc -l) -ne 2 ]] || [[ $(find "$SPDK_WORKSPACE/usr/lib/" -maxdepth 1 -mindepth 1 | wc -l) -ne 1 ]]; then 124 ls -lR "$SPDK_WORKSPACE" 125 echo "Make uninstall failed" 126 exit 1 127 fi 128} 129 130function build_doc() { 131 $MAKE -C "$rootdir"/doc --no-print-directory $MAKEFLAGS &> "$out"/doxygen.log 132 if [ -s "$out"/doxygen.log ]; then 133 cat "$out"/doxygen.log 134 echo "Doxygen errors found!" 135 exit 1 136 fi 137 if hash pdflatex 2> /dev/null; then 138 $MAKE -C "$rootdir"/doc/output/latex --no-print-directory $MAKEFLAGS &>> "$out"/doxygen.log 139 fi 140 mkdir -p "$out"/doc 141 mv "$rootdir"/doc/output/html "$out"/doc 142 if [ -f "$rootdir"/doc/output/latex/refman.pdf ]; then 143 mv "$rootdir"/doc/output/latex/refman.pdf "$out"/doc/spdk.pdf 144 fi 145 $MAKE -C "$rootdir"/doc --no-print-directory $MAKEFLAGS clean &>> "$out"/doxygen.log 146 if [ -s "$out"/doxygen.log ]; then 147 rm "$out"/doxygen.log 148 fi 149 rm -rf "$rootdir"/doc/output 150} 151 152function autobuild_test_suite() { 153 run_test "autobuild_check_format" ./scripts/check_format.sh 154 run_test "autobuild_external_code" sudo -E $rootdir/test/external_code/test_make.sh $rootdir 155 if [ "$SPDK_TEST_OCF" -eq 1 ]; then 156 run_test "autobuild_ocf_precompile" ocf_precompile 157 fi 158 run_test "autobuild_check_so_deps" $rootdir/test/make/check_so_deps.sh $1 159 ./configure $config_params --without-shared 160 run_test "scanbuild_make" scanbuild_make 161 run_test "autobuild_generated_files_check" porcelain_check 162 run_test "autobuild_header_dependency_check" header_dependency_check 163 run_test "autobuild_make_install" $MAKE $MAKEFLAGS install DESTDIR="$SPDK_WORKSPACE" prefix=/usr 164 run_test "autobuild_make_uninstall" test_make_uninstall 165 run_test "autobuild_build_doc" build_doc 166} 167 168if [ $SPDK_RUN_VALGRIND -eq 1 ]; then 169 run_test "valgrind" echo "using valgrind" 170fi 171 172if [ $SPDK_RUN_ASAN -eq 1 ]; then 173 run_test "asan" echo "using asan" 174fi 175 176if [ $SPDK_RUN_UBSAN -eq 1 ]; then 177 run_test "ubsan" echo "using ubsan" 178fi 179 180if [ "$SPDK_TEST_AUTOBUILD" -eq 1 ]; then 181 run_test "autobuild" autobuild_test_suite $1 182else 183 if [ "$SPDK_TEST_OCF" -eq 1 ]; then 184 run_test "autobuild_ocf_precompile" ocf_precompile 185 fi 186 # if we aren't testing the unittests, build with shared objects. 187 ./configure $config_params --with-shared 188 run_test "make" $MAKE $MAKEFLAGS 189fi 190