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