xref: /netbsd-src/external/bsd/kyua-cli/dist/integration/cmd_report_html_test.sh (revision f39f9c9b2b3d39fa4e71f38ebea4c5d12192a641)
16b3a42afSjmmv# Copyright 2012 Google Inc.
26b3a42afSjmmv# All rights reserved.
36b3a42afSjmmv#
46b3a42afSjmmv# Redistribution and use in source and binary forms, with or without
56b3a42afSjmmv# modification, are permitted provided that the following conditions are
66b3a42afSjmmv# met:
76b3a42afSjmmv#
86b3a42afSjmmv# * Redistributions of source code must retain the above copyright
96b3a42afSjmmv#   notice, this list of conditions and the following disclaimer.
106b3a42afSjmmv# * Redistributions in binary form must reproduce the above copyright
116b3a42afSjmmv#   notice, this list of conditions and the following disclaimer in the
126b3a42afSjmmv#   documentation and/or other materials provided with the distribution.
136b3a42afSjmmv# * Neither the name of Google Inc. nor the names of its contributors
146b3a42afSjmmv#   may be used to endorse or promote products derived from this software
156b3a42afSjmmv#   without specific prior written permission.
166b3a42afSjmmv#
176b3a42afSjmmv# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
186b3a42afSjmmv# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
196b3a42afSjmmv# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
206b3a42afSjmmv# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
216b3a42afSjmmv# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
226b3a42afSjmmv# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
236b3a42afSjmmv# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
246b3a42afSjmmv# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
256b3a42afSjmmv# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
266b3a42afSjmmv# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
276b3a42afSjmmv# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
286b3a42afSjmmv
296b3a42afSjmmv
306b3a42afSjmmv# Executes a mock test suite to generate data in the database.
316b3a42afSjmmv#
326b3a42afSjmmv# \param mock_env The value to store in a MOCK variable in the environment.
336b3a42afSjmmv#     Use this to be able to differentiate executions by inspecting the
346b3a42afSjmmv#     context of the output.
356b3a42afSjmmv#
366b3a42afSjmmv# \return The action identifier of the committed action.
376b3a42afSjmmvrun_tests() {
386b3a42afSjmmv    local mock_env="${1}"
396b3a42afSjmmv
406b3a42afSjmmv    mkdir testsuite
416b3a42afSjmmv    cd testsuite
426b3a42afSjmmv
436b3a42afSjmmv    cat >Kyuafile <<EOF
446b3a42afSjmmvsyntax(2)
456b3a42afSjmmvtest_suite("integration")
466b3a42afSjmmvatf_test_program{name="simple_all_pass"}
476b3a42afSjmmvatf_test_program{name="simple_some_fail"}
486b3a42afSjmmvatf_test_program{name="metadata"}
496b3a42afSjmmvEOF
506b3a42afSjmmv
516b3a42afSjmmv    utils_cp_helper simple_all_pass .
526b3a42afSjmmv    utils_cp_helper simple_some_fail .
536b3a42afSjmmv    utils_cp_helper metadata .
546b3a42afSjmmv    test -d ../.kyua || mkdir ../.kyua
556b3a42afSjmmv    kyua=$(which kyua)
566b3a42afSjmmv    atf_check -s exit:1 -o save:stdout -e empty env \
576b3a42afSjmmv        HOME="$(pwd)/home" MOCK="${mock_env}" \
586b3a42afSjmmv        "${kyua}" test --store=../.kyua/store.db
596b3a42afSjmmv
606b3a42afSjmmv    action_id=$(grep '^Committed action ' stdout | cut -d ' ' -f 3)
616b3a42afSjmmv    echo "New action is ${action_id}"
626b3a42afSjmmv
636b3a42afSjmmv    cd -
646b3a42afSjmmv    # Ensure the results of 'report' come from the database.
656b3a42afSjmmv    rm -rf testsuite
666b3a42afSjmmv
676b3a42afSjmmv    return "${action_id}"
686b3a42afSjmmv}
696b3a42afSjmmv
706b3a42afSjmmv
716b3a42afSjmmv# Ensure a file has a set of strings.
726b3a42afSjmmv#
736b3a42afSjmmv# \param file The name of the file to check.
746b3a42afSjmmv# \param ... List of strings to check.
756b3a42afSjmmvcheck_in_file() {
766b3a42afSjmmv    local file="${1}"; shift
776b3a42afSjmmv
786b3a42afSjmmv    while [ ${#} -gt 0 ]; do
796b3a42afSjmmv        echo "Checking for presence of '${1}' in ${file}"
806b3a42afSjmmv        if grep "${1}" "${file}" >/dev/null; then
816b3a42afSjmmv            :
826b3a42afSjmmv        else
83*f39f9c9bSjmmv            atf_fail "Test case output not found in HTML page ${file}"
846b3a42afSjmmv        fi
856b3a42afSjmmv        shift
866b3a42afSjmmv    done
876b3a42afSjmmv}
886b3a42afSjmmv
896b3a42afSjmmv
906b3a42afSjmmv# Ensure a file does not have a set of strings.
916b3a42afSjmmv#
926b3a42afSjmmv# \param file The name of the file to check.
936b3a42afSjmmv# \param ... List of strings to check.
946b3a42afSjmmvcheck_not_in_file() {
956b3a42afSjmmv    local file="${1}"; shift
966b3a42afSjmmv
976b3a42afSjmmv    while [ ${#} -gt 0 ]; do
986b3a42afSjmmv        echo "Checking for lack of '${1}' in ${file}"
996b3a42afSjmmv        if grep "${1}" "${file}" >/dev/null; then
1006b3a42afSjmmv            atf_fail "Spurious test case output found in HTML page"
1016b3a42afSjmmv        fi
1026b3a42afSjmmv        shift
1036b3a42afSjmmv    done
1046b3a42afSjmmv}
1056b3a42afSjmmv
1066b3a42afSjmmv
1076b3a42afSjmmvutils_test_case default_behavior__ok
1086b3a42afSjmmvdefault_behavior__ok_body() {
1096b3a42afSjmmv    utils_install_timestamp_wrapper
1106b3a42afSjmmv
1116b3a42afSjmmv    run_tests "mock1"
1126b3a42afSjmmv
1136b3a42afSjmmv    atf_check -s exit:0 -o ignore -e empty kyua report-html
1146b3a42afSjmmv    for f in \
1156b3a42afSjmmv        html/index.html \
1166b3a42afSjmmv        html/context.html \
1176b3a42afSjmmv        html/simple_all_pass_skip.html \
118*f39f9c9bSjmmv        html/simple_some_fail_fail.html
1196b3a42afSjmmv    do
1206b3a42afSjmmv        test -f "${f}" || atf_fail "Missing ${f}"
1216b3a42afSjmmv    done
1226b3a42afSjmmv
1236b3a42afSjmmv    atf_check -o match:"2 TESTS FAILING" cat html/index.html
1246b3a42afSjmmv
1256b3a42afSjmmv    check_in_file html/simple_all_pass_skip.html \
1266b3a42afSjmmv        "This is the stdout of skip" "This is the stderr of skip"
1276b3a42afSjmmv    check_not_in_file html/simple_all_pass_skip.html \
1286b3a42afSjmmv        "This is the stdout of pass" "This is the stderr of pass" \
1296b3a42afSjmmv        "This is the stdout of fail" "This is the stderr of fail" \
1306b3a42afSjmmv        "Test case did not write anything to"
1316b3a42afSjmmv
1326b3a42afSjmmv    check_in_file html/simple_some_fail_fail.html \
1336b3a42afSjmmv        "This is the stdout of fail" "This is the stderr of fail"
1346b3a42afSjmmv    check_not_in_file html/simple_some_fail_fail.html \
1356b3a42afSjmmv        "This is the stdout of pass" "This is the stderr of pass" \
1366b3a42afSjmmv        "This is the stdout of skip" "This is the stderr of skip" \
1376b3a42afSjmmv        "Test case did not write anything to"
1386b3a42afSjmmv
1396b3a42afSjmmv    check_in_file html/metadata_one_property.html \
1406b3a42afSjmmv        "description = Does nothing but has one metadata property"
1416b3a42afSjmmv    check_not_in_file html/metadata_one_property.html \
1426b3a42afSjmmv        "allowed_architectures = some-architecture"
1436b3a42afSjmmv
1446b3a42afSjmmv    check_in_file html/metadata_many_properties.html \
1456b3a42afSjmmv        "allowed_architectures = some-architecture"
1466b3a42afSjmmv    check_not_in_file html/metadata_many_properties.html \
1476b3a42afSjmmv        "description = Does nothing but has one metadata property"
1486b3a42afSjmmv}
1496b3a42afSjmmv
1506b3a42afSjmmv
1516b3a42afSjmmvutils_test_case default_behavior__no_actions
1526b3a42afSjmmvdefault_behavior__no_actions_body() {
1536b3a42afSjmmv    kyua db-exec "SELECT * FROM actions"
1546b3a42afSjmmv
1556b3a42afSjmmv    echo 'kyua: E: No actions in the database.' >experr
1566b3a42afSjmmv    atf_check -s exit:2 -o empty -e file:experr kyua report-html
1576b3a42afSjmmv}
1586b3a42afSjmmv
1596b3a42afSjmmv
1606b3a42afSjmmvutils_test_case default_behavior__no_store
1616b3a42afSjmmvdefault_behavior__no_store_body() {
1626b3a42afSjmmv    atf_check -s exit:2 -o empty \
1636b3a42afSjmmv        -e match:"kyua: E: Cannot open '.*/.kyua/store.db': " kyua report-html
1646b3a42afSjmmv}
1656b3a42afSjmmv
1666b3a42afSjmmv
1676b3a42afSjmmvutils_test_case action__explicit
1686b3a42afSjmmvaction__explicit_body() {
1696b3a42afSjmmv    run_tests "mock1"; action1=$?
1706b3a42afSjmmv    run_tests "mock2"; action2=$?
1716b3a42afSjmmv
1726b3a42afSjmmv    atf_check -s exit:0 -o ignore -e empty kyua report-html \
1736b3a42afSjmmv        --action="${action1}"
1746b3a42afSjmmv    grep "action 1" html/index.html || atf_fail "Invalid action in report"
1756b3a42afSjmmv    grep "MOCK.*mock1" html/context.html || atf_fail "Invalid context in report"
1766b3a42afSjmmv
1776b3a42afSjmmv    rm -rf html
1786b3a42afSjmmv    atf_check -s exit:0 -o ignore -e empty kyua report-html \
1796b3a42afSjmmv        --action="${action2}"
1806b3a42afSjmmv    grep "action 2" html/index.html || atf_fail "Invalid action in report"
1816b3a42afSjmmv    grep "MOCK.*mock2" html/context.html || atf_fail "Invalid context in report"
1826b3a42afSjmmv}
1836b3a42afSjmmv
1846b3a42afSjmmv
1856b3a42afSjmmvutils_test_case action__not_found
1866b3a42afSjmmvaction__not_found_body() {
1876b3a42afSjmmv    kyua db-exec "SELECT * FROM actions"
1886b3a42afSjmmv
1896b3a42afSjmmv    echo 'kyua: E: Error loading action 514: does not exist.' >experr
1906b3a42afSjmmv    atf_check -s exit:2 -o empty -e file:experr kyua report-html --action=514
1916b3a42afSjmmv}
1926b3a42afSjmmv
1936b3a42afSjmmv
1946b3a42afSjmmvutils_test_case force__yes
1956b3a42afSjmmvforce__yes_body() {
1966b3a42afSjmmv    run_tests "mock1"
1976b3a42afSjmmv
1986b3a42afSjmmv    atf_check -s exit:0 -o ignore -e empty kyua report-html
1996b3a42afSjmmv    test -f html/index.html || atf_fail "Expected file not created"
2006b3a42afSjmmv    rm html/index.html
2016b3a42afSjmmv    atf_check -s exit:0 -o ignore -e empty kyua report-html --force
2026b3a42afSjmmv    test -f html/index.html || atf_fail "Expected file not created"
2036b3a42afSjmmv}
2046b3a42afSjmmv
2056b3a42afSjmmv
2066b3a42afSjmmvutils_test_case force__no
2076b3a42afSjmmvforce__no_body() {
2086b3a42afSjmmv    run_tests "mock1"
2096b3a42afSjmmv
2106b3a42afSjmmv    atf_check -s exit:0 -o ignore -e empty kyua report-html
2116b3a42afSjmmv    test -f html/index.html || atf_fail "Expected file not created"
2126b3a42afSjmmv    rm html/index.html
2136b3a42afSjmmv
2146b3a42afSjmmvcat >experr <<EOF
2156b3a42afSjmmvkyua: E: Output directory 'html' already exists; maybe use --force?.
2166b3a42afSjmmvEOF
2176b3a42afSjmmv    atf_check -s exit:2 -o empty -e file:experr kyua report-html
2186b3a42afSjmmv    test ! -f html/index.html || atf_fail "Not expected file created"
2196b3a42afSjmmv}
2206b3a42afSjmmv
2216b3a42afSjmmv
2226b3a42afSjmmvutils_test_case output__explicit
2236b3a42afSjmmvoutput__explicit_body() {
2246b3a42afSjmmv    run_tests "mock1"
2256b3a42afSjmmv
2266b3a42afSjmmv    mkdir output
2276b3a42afSjmmv    atf_check -s exit:0 -o ignore -e empty kyua report-html --output=output/foo
2286b3a42afSjmmv    test ! -d html || atf_fail "Not expected directory created"
2296b3a42afSjmmv    test -f output/foo/index.html || atf_fail "Expected file not created"
2306b3a42afSjmmv}
2316b3a42afSjmmv
2326b3a42afSjmmv
233*f39f9c9bSjmmvutils_test_case results_filter__ok
234*f39f9c9bSjmmvresults_filter__ok_body() {
235*f39f9c9bSjmmv    utils_install_timestamp_wrapper
236*f39f9c9bSjmmv
237*f39f9c9bSjmmv    run_tests "mock1"
238*f39f9c9bSjmmv
239*f39f9c9bSjmmv    atf_check -s exit:0 -o ignore -e empty kyua report-html \
240*f39f9c9bSjmmv        --results-filter=passed
241*f39f9c9bSjmmv    for f in \
242*f39f9c9bSjmmv        html/index.html \
243*f39f9c9bSjmmv        html/context.html \
244*f39f9c9bSjmmv        html/simple_all_pass_pass.html \
245*f39f9c9bSjmmv        html/simple_some_fail_pass.html \
246*f39f9c9bSjmmv        html/metadata_no_properties.html \
247*f39f9c9bSjmmv        html/metadata_with_cleanup.html
248*f39f9c9bSjmmv    do
249*f39f9c9bSjmmv        test -f "${f}" || atf_fail "Missing ${f}"
250*f39f9c9bSjmmv    done
251*f39f9c9bSjmmv
252*f39f9c9bSjmmv    atf_check -o match:"2 TESTS FAILING" cat html/index.html
253*f39f9c9bSjmmv
254*f39f9c9bSjmmv    check_in_file html/simple_all_pass_pass.html \
255*f39f9c9bSjmmv        "This is the stdout of pass" "This is the stderr of pass"
256*f39f9c9bSjmmv    check_not_in_file html/simple_all_pass_pass.html \
257*f39f9c9bSjmmv        "This is the stdout of skip" "This is the stderr of skip" \
258*f39f9c9bSjmmv        "This is the stdout of fail" "This is the stderr of fail" \
259*f39f9c9bSjmmv        "Test case did not write anything to"
260*f39f9c9bSjmmv
261*f39f9c9bSjmmv    check_in_file html/simple_some_fail_pass.html \
262*f39f9c9bSjmmv        "Test case did not write anything to stdout" \
263*f39f9c9bSjmmv        "Test case did not write anything to stderr"
264*f39f9c9bSjmmv    check_not_in_file html/simple_some_fail_pass.html \
265*f39f9c9bSjmmv        "This is the stdout of pass" "This is the stderr of pass" \
266*f39f9c9bSjmmv        "This is the stdout of skip" "This is the stderr of skip" \
267*f39f9c9bSjmmv        "This is the stdout of fail" "This is the stderr of fail"
268*f39f9c9bSjmmv}
269*f39f9c9bSjmmv
270*f39f9c9bSjmmv
271*f39f9c9bSjmmvutils_test_case results_filter__invalid
272*f39f9c9bSjmmvresults_filter__invalid_body() {
273*f39f9c9bSjmmv    kyua db-exec "SELECT * FROM actions"
274*f39f9c9bSjmmv
275*f39f9c9bSjmmv    echo "kyua: E: Unknown result type 'foo-bar'." >experr
276*f39f9c9bSjmmv    atf_check -s exit:2 -o empty -e file:experr kyua report-html \
277*f39f9c9bSjmmv        --results-filter=passed,foo-bar
278*f39f9c9bSjmmv}
279*f39f9c9bSjmmv
280*f39f9c9bSjmmv
2816b3a42afSjmmvatf_init_test_cases() {
2826b3a42afSjmmv    atf_add_test_case default_behavior__ok
2836b3a42afSjmmv    atf_add_test_case default_behavior__no_actions
2846b3a42afSjmmv    atf_add_test_case default_behavior__no_store
2856b3a42afSjmmv
2866b3a42afSjmmv    atf_add_test_case action__explicit
2876b3a42afSjmmv    atf_add_test_case action__not_found
2886b3a42afSjmmv
2896b3a42afSjmmv    atf_add_test_case force__yes
2906b3a42afSjmmv    atf_add_test_case force__no
2916b3a42afSjmmv
2926b3a42afSjmmv    atf_add_test_case output__explicit
293*f39f9c9bSjmmv
294*f39f9c9bSjmmv    atf_add_test_case results_filter__ok
295*f39f9c9bSjmmv    atf_add_test_case results_filter__invalid
2966b3a42afSjmmv}
297