5 # If the configuration of tests is not provided, no tests will be carried out.
7 echo "ERROR: SPDK test configuration not specified"
11 rootdir
=$
(readlink
-f $
(dirname $0))
14 source "$rootdir/test/common/autotest_common.sh"
17 scanbuild
="scan-build -o $output_dir/scan-build-tmp --exclude $rootdir/dpdk/ --status-bugs"
18 config_params
=$
(get_config_params
)
20 trap '[[ -d $SPDK_WORKSPACE ]] && rm -rf "$SPDK_WORKSPACE"' 0
22 SPDK_WORKSPACE
=$
(mktemp
-dt "spdk_$(date +%s).XXXXXX")
28 # Print some test system info out for the log
31 .
/configure
$config_params
32 echo "** START ** Info for Hostname: $HOSTNAME"
36 echo "** END ** Info for Hostname: $HOSTNAME"
38 function 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
51 function 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
61 function scanbuild_make
() {
63 $scanbuild $MAKE $MAKEFLAGS > $out/build_output.txt
&& rm -rf $out/scan-build-tmp || make_fail_cleanup
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
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
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
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
86 if [ $
(wc -l < $out/unbuilt_c_files.txt
) -ge 1 ]; then
88 cat $out/unbuilt_c_files.txt
95 function 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
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.
106 function header_dependency_check
() {
107 STAT1
=$
(stat
$SPDK_BIN_DIR/spdk_tgt
)
109 touch lib
/nvme
/nvme_internal.h
111 STAT2
=$
(stat
$SPDK_BIN_DIR/spdk_tgt
)
113 if [ "$STAT1" == "$STAT2" ]; then
114 echo "Header dependency check failed"
119 function 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"
130 function 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!"
137 if hash pdflatex
2> /dev
/null
; then
138 $MAKE -C "$rootdir"/doc
/output
/latex
--no-print-directory $MAKEFLAGS &>> "$out"/doxygen.log
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
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
149 rm -rf "$rootdir"/doc
/output
152 function 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
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
168 if [ $SPDK_RUN_VALGRIND -eq 1 ]; then
169 run_test
"valgrind" echo "using valgrind"
172 if [ $SPDK_RUN_ASAN -eq 1 ]; then
173 run_test
"asan" echo "using asan"
176 if [ $SPDK_RUN_UBSAN -eq 1 ]; then
177 run_test
"ubsan" echo "using ubsan"
180 if [ "$SPDK_TEST_AUTOBUILD" -eq 1 ]; then
181 run_test
"autobuild" autobuild_test_suite
$1
183 if [ "$SPDK_TEST_OCF" -eq 1 ]; then
184 run_test
"autobuild_ocf_precompile" ocf_precompile
186 # if we aren't testing the unittests, build with shared objects.
187 .
/configure
$config_params --with-shared
188 run_test
"make" $MAKE $MAKEFLAGS