freebsd-dev/contrib/kyua/integration/cmd_list_test.sh
Brooks Davis b0d29bc47d Import the kyua test framework.
Having kyua in the base system will simplify automated testing in CI and
eliminates bootstrapping issues on new platforms.

The build of kyua is controlled by WITH(OUT)_TESTS_SUPPORT.

Reviewed by:	emaste
Obtained from:	CheriBSD
Sponsored by:	DARPA
Differential Revision:	https://reviews.freebsd.org/D24103
2020-03-23 19:01:23 +00:00

601 lines
15 KiB
Bash
Executable File

# Copyright 2011 The Kyua Authors.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of Google Inc. nor the names of its contributors
# may be used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
utils_test_case no_args
no_args_body() {
cat >Kyuafile <<EOF
syntax(2)
test_suite("integration")
atf_test_program{name="metadata"}
atf_test_program{name="simple_all_pass"}
include("subdir/Kyuafile")
EOF
utils_cp_helper metadata .
utils_cp_helper simple_all_pass .
mkdir subdir
cat >subdir/Kyuafile <<EOF
syntax(2)
test_suite("integration2")
atf_test_program{name="simple_some_fail"}
EOF
utils_cp_helper simple_some_fail subdir
cat >expout <<EOF
metadata:many_properties
metadata:no_properties
metadata:one_property
metadata:with_cleanup
simple_all_pass:pass
simple_all_pass:skip
subdir/simple_some_fail:fail
subdir/simple_some_fail:pass
EOF
atf_check -s exit:0 -o file:expout -e empty kyua list
}
utils_test_case one_arg__subdir
one_arg__subdir_body() {
cat >Kyuafile <<EOF
syntax(2)
test_suite("top-level")
include("subdir/Kyuafile")
EOF
mkdir subdir
cat >subdir/Kyuafile <<EOF
syntax(2)
test_suite("in-subdir")
atf_test_program{name="simple_all_pass"}
EOF
utils_cp_helper simple_all_pass subdir
cat >expout <<EOF
subdir/simple_all_pass:pass
subdir/simple_all_pass:skip
EOF
atf_check -s exit:0 -o file:expout -e empty kyua list subdir
}
utils_test_case one_arg__test_case
one_arg__test_case_body() {
cat >Kyuafile <<EOF
syntax(2)
test_suite("top-level")
atf_test_program{name="first"}
atf_test_program{name="second"}
EOF
utils_cp_helper simple_all_pass first
utils_cp_helper simple_all_pass second
cat >expout <<EOF
first:skip
EOF
atf_check -s exit:0 -o file:expout -e empty kyua list first:skip
}
utils_test_case one_arg__test_program
one_arg__test_program_body() {
cat >Kyuafile <<EOF
syntax(2)
test_suite("top-level")
atf_test_program{name="first"}
atf_test_program{name="second"}
EOF
utils_cp_helper simple_all_pass first
utils_cp_helper simple_some_fail second
cat >expout <<EOF
second:fail
second:pass
EOF
atf_check -s exit:0 -o file:expout -e empty kyua list second
}
utils_test_case one_arg__invalid
one_arg__invalid_body() {
cat >experr <<EOF
kyua: E: Test case component in 'foo:' is empty.
EOF
atf_check -s exit:2 -o empty -e file:experr kyua list foo:
cat >experr <<EOF
kyua: E: Program name '/a/b' must be relative to the test suite, not absolute.
EOF
atf_check -s exit:2 -o empty -e file:experr kyua list /a/b
}
utils_test_case many_args__ok
many_args__ok_body() {
cat >Kyuafile <<EOF
syntax(2)
test_suite("top-level")
include("subdir/Kyuafile")
atf_test_program{name="first"}
EOF
utils_cp_helper simple_all_pass first
mkdir subdir
cat >subdir/Kyuafile <<EOF
syntax(2)
test_suite("in-subdir")
atf_test_program{name="second"}
EOF
utils_cp_helper simple_some_fail subdir/second
cat >expout <<EOF
subdir/second:fail (in-subdir)
subdir/second:pass (in-subdir)
first:pass (top-level)
EOF
atf_check -s exit:0 -o file:expout -e empty kyua list -v subdir first:pass
}
utils_test_case many_args__invalid
many_args__invalid_body() {
cat >experr <<EOF
kyua: E: Program name component in ':badbad' is empty.
EOF
atf_check -s exit:2 -o empty -e file:experr kyua list this-is-ok :badbad
cat >experr <<EOF
kyua: E: Program name '/foo' must be relative to the test suite, not absolute.
EOF
atf_check -s exit:2 -o empty -e file:experr kyua list this-is-ok /foo
}
utils_test_case many_args__no_match__all
many_args__no_match__all_body() {
cat >Kyuafile <<EOF
syntax(2)
test_suite("top-level")
atf_test_program{name="first"}
atf_test_program{name="second"}
EOF
utils_cp_helper simple_all_pass first
utils_cp_helper simple_all_pass second
cat >experr <<EOF
kyua: W: No test cases matched by the filter 'first1'.
EOF
atf_check -s exit:1 -o empty -e file:experr kyua list first1
}
utils_test_case many_args__no_match__some
many_args__no_match__some_body() {
cat >Kyuafile <<EOF
syntax(2)
test_suite("top-level")
atf_test_program{name="first"}
atf_test_program{name="second"}
atf_test_program{name="third"}
EOF
utils_cp_helper simple_all_pass first
utils_cp_helper simple_all_pass second
utils_cp_helper simple_some_fail third
cat >expout <<EOF
first:pass
first:skip
third:fail
third:pass
EOF
cat >experr <<EOF
kyua: W: No test cases matched by the filter 'fifth'.
kyua: W: No test cases matched by the filter 'fourth'.
EOF
atf_check -s exit:1 -o file:expout -e file:experr kyua list first fourth \
third fifth
}
utils_test_case args_are_relative
args_are_relative_body() {
mkdir root
cat >root/Kyuafile <<EOF
syntax(2)
test_suite("integration-1")
atf_test_program{name="first"}
atf_test_program{name="second"}
include("subdir/Kyuafile")
EOF
utils_cp_helper simple_all_pass root/first
utils_cp_helper simple_some_fail root/second
mkdir root/subdir
cat >root/subdir/Kyuafile <<EOF
syntax(2)
test_suite("integration-2")
atf_test_program{name="third"}
atf_test_program{name="fourth"}
EOF
utils_cp_helper simple_all_pass root/subdir/third
utils_cp_helper simple_some_fail root/subdir/fourth
cat >expout <<EOF
first:pass (integration-1)
first:skip (integration-1)
subdir/fourth:fail (integration-2)
EOF
atf_check -s exit:0 -o file:expout -e empty kyua list \
-v -k "$(pwd)/root/Kyuafile" first subdir/fourth:fail
}
utils_test_case only_load_used_test_programs
only_load_used_test_programs_body() {
cat >Kyuafile <<EOF
syntax(2)
test_suite("integration")
atf_test_program{name="first"}
atf_test_program{name="second"}
EOF
utils_cp_helper simple_all_pass first
utils_cp_helper bad_test_program second
cat >expout <<EOF
first:pass
first:skip
EOF
CREATE_COOKIE="$(pwd)/cookie"; export CREATE_COOKIE
atf_check -s exit:0 -o file:expout -e empty kyua list first
if [ -f "${CREATE_COOKIE}" ]; then
atf_fail "An unmatched test case has been executed, which harms" \
"performance"
fi
}
utils_test_case config_behavior
config_behavior_body() {
cat >"my-config" <<EOF
syntax(2)
test_suites.suite1["the-variable"] = "value1"
EOF
cat >Kyuafile <<EOF
syntax(2)
atf_test_program{name="config1", test_suite="suite1"}
EOF
utils_cp_helper config config1
CONFIG_VAR_FILE="$(pwd)/cookie"; export CONFIG_VAR_FILE
if [ -f "${CONFIG_VAR_FILE}" ]; then
atf_fail "Cookie file already created; test case list may have gotten" \
"a bad configuration"
fi
atf_check -s exit:0 -o ignore -e empty kyua -c my-config list
[ -f "${CONFIG_VAR_FILE}" ] || \
atf_fail "Cookie file not created; test case list did not get" \
"configuration variables"
value="$(cat "${CONFIG_VAR_FILE}")"
[ "${value}" = "value1" ] || \
atf_fail "Invalid value (${value}) in cookie file; test case list did" \
"not get the correct configuration variables"
}
utils_test_case build_root_flag
build_root_flag_body() {
mkdir subdir
mkdir build
mkdir build/subdir
cat >Kyuafile <<EOF
syntax(2)
test_suite("top-level")
include("subdir/Kyuafile")
atf_test_program{name="first"}
EOF
echo 'invalid' >first
utils_cp_helper simple_all_pass build/first
cat >subdir/Kyuafile <<EOF
syntax(2)
test_suite("in-subdir")
atf_test_program{name="second"}
EOF
echo 'invalid' >subdir/second
utils_cp_helper simple_some_fail build/subdir/second
cat >expout <<EOF
subdir/second:fail
subdir/second:pass
first:pass
EOF
atf_check -s exit:0 -o file:expout -e empty kyua list --build-root=build \
subdir first:pass
}
utils_test_case kyuafile_flag__no_args
kyuafile_flag__no_args_body() {
cat >Kyuafile <<EOF
This file is bogus but it is not loaded.
EOF
cat >myfile <<EOF
syntax(2)
test_suite("integration")
atf_test_program{name="sometest"}
EOF
utils_cp_helper simple_all_pass sometest
cat >expout <<EOF
sometest:pass
sometest:skip
EOF
atf_check -s exit:0 -o file:expout -e empty kyua list -k myfile
atf_check -s exit:0 -o file:expout -e empty kyua list --kyuafile=myfile
}
utils_test_case kyuafile_flag__some_args
kyuafile_flag__some_args_body() {
cat >Kyuafile <<EOF
This file is bogus but it is not loaded.
EOF
cat >myfile <<EOF
syntax(2)
test_suite("hello-world")
atf_test_program{name="sometest"}
EOF
utils_cp_helper simple_all_pass sometest
cat >expout <<EOF
sometest:pass (hello-world)
sometest:skip (hello-world)
EOF
atf_check -s exit:0 -o file:expout -e empty kyua list -v -k myfile sometest
atf_check -s exit:0 -o file:expout -e empty kyua list -v --kyuafile=myfile \
sometest
}
utils_test_case verbose_flag
verbose_flag_body() {
cat >Kyuafile <<EOF
syntax(2)
test_suite("integration-suite-1")
atf_test_program{name="simple_all_pass"}
plain_test_program{name="i_am_plain", timeout=654}
include("subdir/Kyuafile")
EOF
utils_cp_helper simple_all_pass .
touch i_am_plain
mkdir subdir
cat >subdir/Kyuafile <<EOF
syntax(2)
test_suite("integration-suite-2")
atf_test_program{name="metadata"}
EOF
utils_cp_helper metadata subdir
cat >expout <<EOF
simple_all_pass:pass (integration-suite-1)
simple_all_pass:skip (integration-suite-1)
i_am_plain:main (integration-suite-1)
timeout = 654
subdir/metadata:many_properties (integration-suite-2)
allowed_architectures = some-architecture
allowed_platforms = some-platform
custom.no-meaning = I am a custom variable
description = A description with some padding
required_configs = var1 var2 var3
required_files = /my/file1 /some/other/file
required_programs = /nonexistent/bin3 bin1 bin2
required_user = root
subdir/metadata:no_properties (integration-suite-2)
subdir/metadata:one_property (integration-suite-2)
description = Does nothing but has one metadata property
subdir/metadata:with_cleanup (integration-suite-2)
has_cleanup = true
timeout = 250
EOF
atf_check -s exit:0 -o file:expout -e empty kyua list -v
atf_check -s exit:0 -o file:expout -e empty kyua list --verbose
}
utils_test_case no_test_program_match
no_test_program_match_body() {
cat >Kyuafile <<EOF
syntax(2)
test_suite("integration")
atf_test_program{name="first"}
EOF
utils_cp_helper simple_all_pass first
utils_cp_helper simple_all_pass second
cat >experr <<EOF
kyua: W: No test cases matched by the filter 'second'.
EOF
atf_check -s exit:1 -o empty -e file:experr kyua list second
}
utils_test_case no_test_case_match
no_test_case_match_body() {
cat >Kyuafile <<EOF
syntax(2)
test_suite("integration")
atf_test_program{name="first"}
EOF
utils_cp_helper simple_all_pass first
cat >experr <<EOF
kyua: W: No test cases matched by the filter 'first:foobar'.
EOF
atf_check -s exit:1 -o empty -e file:experr kyua list first:foobar
}
utils_test_case missing_kyuafile__no_args
missing_kyuafile__no_args_body() {
cat >experr <<EOF
kyua: E: Load of 'Kyuafile' failed: File 'Kyuafile' not found.
EOF
atf_check -s exit:2 -o empty -e file:experr kyua list
}
utils_test_case missing_kyuafile__test_program
missing_kyuafile__test_program_body() {
mkdir subdir
cat >subdir/Kyuafile <<EOF
syntax(2)
test_suite("integration")
atf_test_program{name="unused"}
EOF
utils_cp_helper simple_all_pass subdir/unused
cat >experr <<EOF
kyua: E: Load of 'Kyuafile' failed: File 'Kyuafile' not found.
EOF
atf_check -s exit:2 -o empty -e file:experr kyua list subdir/unused
}
utils_test_case missing_kyuafile__subdir
missing_kyuafile__subdir_body() {
mkdir subdir
cat >subdir/Kyuafile <<EOF
syntax(2)
test_suite("integration")
atf_test_program{name="unused"}
EOF
utils_cp_helper simple_all_pass subdir/unused
cat >experr <<EOF
kyua: E: Load of 'Kyuafile' failed: File 'Kyuafile' not found.
EOF
atf_check -s exit:2 -o empty -e file:experr kyua list subdir
}
utils_test_case bogus_kyuafile
bogus_kyuafile_body() {
cat >Kyuafile <<EOF
Hello, world.
EOF
atf_check -s exit:2 -o empty \
-e match:"Load of 'Kyuafile' failed: .* Kyuafile:2:" kyua list
}
utils_test_case bogus_test_program
bogus_test_program_body() {
cat >Kyuafile <<EOF
syntax(2)
test_suite("integration")
atf_test_program{name="crash_on_list"}
atf_test_program{name="non_executable"}
EOF
utils_cp_helper bad_test_program crash_on_list
echo 'I am not executable' >non_executable
cat >expout <<EOF
crash_on_list:__test_cases_list__
non_executable:__test_cases_list__
EOF
atf_check -s exit:0 -o file:expout -e empty kyua list
}
utils_test_case missing_test_program
missing_test_program_body() {
cat >Kyuafile <<EOF
syntax(2)
include("subdir/Kyuafile")
EOF
mkdir subdir
cat >subdir/Kyuafile <<EOF
syntax(2)
test_suite("integration")
atf_test_program{name="ok"}
atf_test_program{name="i-am-missing"}
EOF
echo 'I should not be touched because the Kyuafile is bogus' >subdir/ok
# CHECK_STYLE_DISABLE
cat >experr <<EOF
kyua: E: Load of 'Kyuafile' failed: .*Non-existent test program 'subdir/i-am-missing'.
EOF
# CHECK_STYLE_ENABLE
atf_check -s exit:2 -o empty -e "match:$(cat experr)" kyua list
}
atf_init_test_cases() {
atf_add_test_case no_args
atf_add_test_case one_arg__subdir
atf_add_test_case one_arg__test_case
atf_add_test_case one_arg__test_program
atf_add_test_case one_arg__invalid
atf_add_test_case many_args__ok
atf_add_test_case many_args__invalid
atf_add_test_case many_args__no_match__all
atf_add_test_case many_args__no_match__some
atf_add_test_case args_are_relative
atf_add_test_case only_load_used_test_programs
atf_add_test_case config_behavior
atf_add_test_case build_root_flag
atf_add_test_case kyuafile_flag__no_args
atf_add_test_case kyuafile_flag__some_args
atf_add_test_case verbose_flag
atf_add_test_case no_test_program_match
atf_add_test_case no_test_case_match
atf_add_test_case missing_kyuafile__no_args
atf_add_test_case missing_kyuafile__test_program
atf_add_test_case missing_kyuafile__subdir
atf_add_test_case bogus_kyuafile
atf_add_test_case bogus_test_program
atf_add_test_case missing_test_program
}