xref: /netbsd-src/external/bsd/kyua-atf-compat/dist/atf-run.sh (revision 63c0fb41084a128963a6675b5001376e9ef962c9)
1#! __SH__
2# Copyright 2012 Google Inc.
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions are
7# met:
8#
9# * Redistributions of source code must retain the above copyright
10#   notice, this list of conditions and the following disclaimer.
11# * Redistributions in binary form must reproduce the above copyright
12#   notice, this list of conditions and the following disclaimer in the
13#   documentation and/or other materials provided with the distribution.
14# * Neither the name of Google Inc. nor the names of its contributors
15#   may be used to endorse or promote products derived from this software
16#   without specific prior written permission.
17#
18# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30# \file atf-run.sh
31# Kyua-based compatibility replacement for atf-run.
32
33
34. "${KYUA_ATF_COMPAT_PKGDATADIR:-__PKGDATADIR__}/lib.subr"
35
36
37# Path to ATF's configuration directory.
38ATF_CONFDIR="${ATF_CONFDIR:-__ATF_CONFDIR__}"
39
40
41# Path to the bin directory where we got installed.
42BINDIR="${KYUA_ATF_COMPAT_BINDIR:-__BINDIR__}"
43
44
45# Loads configuration variables from a set of files.
46#
47# \param dir The directory from which to load the configuration files.
48# \param output_var The name of the variable that will accumulate all the
49#     --variable flags to represent the configuration file.
50load_configs() {
51    local dir="${1}"; shift
52    local output_var="${1}"; shift
53
54    local all_vars=
55    for file in "${dir}"/*; do
56        [ "${file}" != "${dir}/*" ] || break
57
58        lib_info "Loading configuration from ${file}"
59
60        local prefix
61        case "${file}" in
62        *common.conf) prefix= ;;
63        *) prefix="test_suites.$(basename "${file}" | sed -e 's,.conf$,,')." ;;
64        esac
65
66        local ws='[ 	]*'  # That's a space and a tab.
67        local name='[a-zA-Z][-_a-zA-Z0-9]*'
68        local repl="--variable='${prefix}\\1=\\2'"
69        local vars="$(grep "^${ws}${name}${ws}=" "${file}" | \
70            sed -e 's,#(.*)$,,;s,unprivileged-user,unprivileged_user,g' \
71            -e "s,^${ws}\(${name}\)${ws}=${ws}'\([^']*\)'${ws}$,${repl}," \
72            -e "s,^${ws}\(${name}\)${ws}=${ws}\"\([^\"]*\)\"${ws}$,${repl}," \
73            -e "s,^${ws}\(${name}\)${ws}=${ws}\(.*\)$,${repl},")"
74
75        lib_info "Extracted arguments: ${vars}"
76        all_vars="${all_vars} ${vars}"
77    done
78    eval ${output_var}=\'"${all_vars}"\'
79}
80
81
82# Transforms an atf-run -v specification to Kyua's semantics.
83#
84# \param raw The key=value argument to -v.
85# \param ... The names of all the possible test suites.  For test-suite specific
86#     variables, we expand them to all their possibilities as Kyua needs to know
87#     what test suite a particular variable belongs to.
88#
89# \post Prints one or more --variable arguments that match the input variable
90# name.
91convert_variable() {
92    local raw="${1}"; shift
93
94    case "${raw}" in
95    unprivileged-user=*)
96        echo "--variable=${raw}" | \
97            sed -e 's,unprivileged-user,unprivileged_user,g'
98        ;;
99    *)
100        for test_suite in "${@}"; do
101            echo "--variable=test_suites.${test_suite}.${raw}"
102        done
103        ;;
104    esac
105}
106
107
108# Collects all the test suite names defined in a subtree.
109#
110# \param dir The subtree to scan for Kyuafiles.
111#
112# \post Prints the names of all found test suites.
113grab_test_suites() {
114    local dir="${1}"; shift
115
116    find "${dir}" -name Kyuafile -exec grep "test_suite('" "{}" \; | \
117        cut -d "'" -f 2
118}
119
120
121# Gets the path to the compatibility Kyuafile.
122#
123# If a Kyuafile is found in the current directory, use that directly.
124# Otherwise, generate a fake Kyuafile in a temporary directory and return
125# that instead.
126#
127# \param [out] output_var The name of the variable to set with the path
128#     of the Kyuafile to be used.
129select_kyuafile() {
130    local output_var="${1}"; shift
131
132    if [ -f Kyuafile ]; then
133        eval ${output_var}=\'"$(pwd)/Kyuafile"\'
134    elif [ -f Atffile ]; then
135        "${BINDIR}/atf2kyua" -s "$(pwd)" -t "${Lib_TempDir}" || \
136            lib_error "Cannot generate fake Kyuafile"
137        eval ${output_var}=\'"${Lib_TempDir}/Kyuafile"\'
138    else
139        lib_error "Cannot find Atffile nor Kyuafile"
140    fi
141}
142
143
144# Prints program usage to stdout.
145#
146# \param progname The name of the program to use for the syntax help.
147usage() {
148    local progname="${1}"; shift
149    echo "Usage: ${progname} [-v var-value] [program1 [.. programN]]"
150}
151
152
153# Entry point for the program.
154#
155# \param ... The user-provided arguments.
156main() {
157    local vflags=
158
159    while getopts ':v:' arg "${@}"; do
160        case "${arg}" in
161        v)
162            vflags="${OPTARG} ${cli_variables}"
163            ;;
164        \?)
165            lib_usage_error "Unknown option -${OPTARG}"
166            ;;
167        esac
168    done
169    shift $((${OPTIND} - 1))
170
171    lib_init_tempdir
172
173    load_configs "${ATF_CONFDIR}" "system_variables"  # Sets system_variables.
174    load_configs "${HOME}/.atf" "user_variables"  # Sets user_variables.
175
176    local kyuafile_path
177    select_kyuafile "kyuafile_path"  # Sets kyuafile_path.
178
179    local test_suites="$(grab_test_suites "$(dirname "${kyuafile_path}")")"
180
181    cli_variables=
182    for vflag in ${vflags}; do
183        local values="$(convert_variable "${vflag}" ${test_suites})"
184        cli_variables="${values} ${cli_variables}"
185    done
186
187    kyua ${system_variables} ${user_variables} ${cli_variables} \
188        test --kyuafile="${kyuafile_path}" --build-root="$(pwd)" "${@}"
189    local ret="${?}"
190
191    lib_cleanup
192
193    return "${ret}"
194}
195
196
197main "${@}"
198