1*6a6c8299Sjmmv# Copyright 2011 Google Inc.
2*6a6c8299Sjmmv# All rights reserved.
3*6a6c8299Sjmmv#
4*6a6c8299Sjmmv# Redistribution and use in source and binary forms, with or without
5*6a6c8299Sjmmv# modification, are permitted provided that the following conditions are
6*6a6c8299Sjmmv# met:
7*6a6c8299Sjmmv#
8*6a6c8299Sjmmv# * Redistributions of source code must retain the above copyright
9*6a6c8299Sjmmv#   notice, this list of conditions and the following disclaimer.
10*6a6c8299Sjmmv# * Redistributions in binary form must reproduce the above copyright
11*6a6c8299Sjmmv#   notice, this list of conditions and the following disclaimer in the
12*6a6c8299Sjmmv#   documentation and/or other materials provided with the distribution.
13*6a6c8299Sjmmv# * Neither the name of Google Inc. nor the names of its contributors
14*6a6c8299Sjmmv#   may be used to endorse or promote products derived from this software
15*6a6c8299Sjmmv#   without specific prior written permission.
16*6a6c8299Sjmmv#
17*6a6c8299Sjmmv# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*6a6c8299Sjmmv# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*6a6c8299Sjmmv# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*6a6c8299Sjmmv# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*6a6c8299Sjmmv# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*6a6c8299Sjmmv# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*6a6c8299Sjmmv# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*6a6c8299Sjmmv# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*6a6c8299Sjmmv# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*6a6c8299Sjmmv# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*6a6c8299Sjmmv# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*6a6c8299Sjmmv
29*6a6c8299Sjmmv
30*6a6c8299Sjmmv# Executes a mock test suite to generate data in the database.
31*6a6c8299Sjmmv#
32*6a6c8299Sjmmv# \param mock_env The value to store in a MOCK variable in the environment.
33*6a6c8299Sjmmv#     Use this to be able to differentiate executions by inspecting the
34*6a6c8299Sjmmv#     context of the output.
35*6a6c8299Sjmmv#
36*6a6c8299Sjmmv# \return The action identifier of the committed action.
37*6a6c8299Sjmmvrun_tests() {
38*6a6c8299Sjmmv    local mock_env="${1}"
39*6a6c8299Sjmmv
40*6a6c8299Sjmmv    mkdir testsuite
41*6a6c8299Sjmmv    cd testsuite
42*6a6c8299Sjmmv
43*6a6c8299Sjmmv    cat >Kyuafile <<EOF
44*6a6c8299Sjmmvsyntax(2)
45*6a6c8299Sjmmvtest_suite("integration")
46*6a6c8299Sjmmvatf_test_program{name="simple_all_pass"}
47*6a6c8299SjmmvEOF
48*6a6c8299Sjmmv
49*6a6c8299Sjmmv    utils_cp_helper simple_all_pass .
50*6a6c8299Sjmmv    test -d ../.kyua || mkdir ../.kyua
51*6a6c8299Sjmmv    kyua=$(which kyua)
52*6a6c8299Sjmmv    atf_check -s exit:0 -o save:stdout -e empty env \
53*6a6c8299Sjmmv        HOME="$(pwd)/home" MOCK="${mock_env}" \
54*6a6c8299Sjmmv        "${kyua}" test --store=../.kyua/store.db
55*6a6c8299Sjmmv
56*6a6c8299Sjmmv    action_id=$(grep '^Committed action ' stdout | cut -d ' ' -f 3)
57*6a6c8299Sjmmv    echo "New action is ${action_id}"
58*6a6c8299Sjmmv
59*6a6c8299Sjmmv    cd -
60*6a6c8299Sjmmv    # Ensure the results of 'report' come from the database.
61*6a6c8299Sjmmv    rm -rf testsuite
62*6a6c8299Sjmmv
63*6a6c8299Sjmmv    return "${action_id}"
64*6a6c8299Sjmmv}
65*6a6c8299Sjmmv
66*6a6c8299Sjmmv
67*6a6c8299Sjmmvutils_test_case default_behavior__ok
68*6a6c8299Sjmmvdefault_behavior__ok_body() {
69*6a6c8299Sjmmv    utils_install_timestamp_wrapper
70*6a6c8299Sjmmv
71*6a6c8299Sjmmv    run_tests "mock1"
72*6a6c8299Sjmmv
73*6a6c8299Sjmmv    cat >expout <<EOF
74*6a6c8299Sjmmv===> Skipped tests
75*6a6c8299Sjmmvsimple_all_pass:skip  ->  skipped: The reason for skipping is this  [S.UUUs]
76*6a6c8299Sjmmv===> Summary
77*6a6c8299SjmmvAction: 1
78*6a6c8299SjmmvTest cases: 2 total, 1 skipped, 0 expected failures, 0 broken, 0 failed
79*6a6c8299SjmmvTotal time: S.UUUs
80*6a6c8299SjmmvEOF
81*6a6c8299Sjmmv    atf_check -s exit:0 -o file:expout -e empty kyua report
82*6a6c8299Sjmmv
83*6a6c8299Sjmmv    run_tests "mock2"
84*6a6c8299Sjmmv
85*6a6c8299Sjmmv    cat >expout <<EOF
86*6a6c8299Sjmmv===> Skipped tests
87*6a6c8299Sjmmvsimple_all_pass:skip  ->  skipped: The reason for skipping is this  [S.UUUs]
88*6a6c8299Sjmmv===> Summary
89*6a6c8299SjmmvAction: 2
90*6a6c8299SjmmvTest cases: 2 total, 1 skipped, 0 expected failures, 0 broken, 0 failed
91*6a6c8299SjmmvTotal time: S.UUUs
92*6a6c8299SjmmvEOF
93*6a6c8299Sjmmv    atf_check -s exit:0 -o file:expout -e empty kyua report
94*6a6c8299Sjmmv}
95*6a6c8299Sjmmv
96*6a6c8299Sjmmv
97*6a6c8299Sjmmvutils_test_case default_behavior__no_actions
98*6a6c8299Sjmmvdefault_behavior__no_actions_body() {
99*6a6c8299Sjmmv    kyua db-exec "SELECT * FROM actions"
100*6a6c8299Sjmmv
101*6a6c8299Sjmmv    echo 'kyua: E: No actions in the database.' >experr
102*6a6c8299Sjmmv    atf_check -s exit:2 -o empty -e file:experr kyua report
103*6a6c8299Sjmmv}
104*6a6c8299Sjmmv
105*6a6c8299Sjmmv
106*6a6c8299Sjmmvutils_test_case default_behavior__no_store
107*6a6c8299Sjmmvdefault_behavior__no_store_body() {
108*6a6c8299Sjmmv    atf_check -s exit:2 -o empty \
109*6a6c8299Sjmmv        -e match:"kyua: E: Cannot open '.*/.kyua/store.db': " kyua report
110*6a6c8299Sjmmv}
111*6a6c8299Sjmmv
112*6a6c8299Sjmmv
113*6a6c8299Sjmmvutils_test_case action__explicit
114*6a6c8299Sjmmvaction__explicit_body() {
115*6a6c8299Sjmmv    run_tests "mock1"; action1=$?
116*6a6c8299Sjmmv    run_tests "mock2"; action2=$?
117*6a6c8299Sjmmv
118*6a6c8299Sjmmv    atf_check -s exit:0 -o match:"MOCK=mock1" -o not-match:"MOCK=mock2" \
119*6a6c8299Sjmmv        -o match:"Action: 1" -o not-match:"Action: 2" \
120*6a6c8299Sjmmv        -e empty kyua report --action="${action1}" --show-context
121*6a6c8299Sjmmv    atf_check -s exit:0 -o not-match:"MOCK=mock1" -o match:"MOCK=mock2" \
122*6a6c8299Sjmmv        -o match:"Action: 2" -o not-match:"Action: 1" \
123*6a6c8299Sjmmv        -e empty kyua report --action="${action2}" --show-context
124*6a6c8299Sjmmv}
125*6a6c8299Sjmmv
126*6a6c8299Sjmmv
127*6a6c8299Sjmmvutils_test_case action__not_found
128*6a6c8299Sjmmvaction__not_found_body() {
129*6a6c8299Sjmmv    kyua db-exec "SELECT * FROM actions"
130*6a6c8299Sjmmv
131*6a6c8299Sjmmv    echo 'kyua: E: Error loading action 514: does not exist.' >experr
132*6a6c8299Sjmmv    atf_check -s exit:2 -o empty -e file:experr kyua report --action=514
133*6a6c8299Sjmmv}
134*6a6c8299Sjmmv
135*6a6c8299Sjmmv
136*6a6c8299Sjmmvutils_test_case show_context
137*6a6c8299Sjmmvshow_context_body() {
138*6a6c8299Sjmmv    run_tests "mock1"
139*6a6c8299Sjmmv
140*6a6c8299Sjmmv    cat >expout <<EOF
141*6a6c8299Sjmmv===> Execution context
142*6a6c8299SjmmvCurrent directory: $(pwd)/testsuite
143*6a6c8299SjmmvEnvironment variables:
144*6a6c8299SjmmvEOF
145*6a6c8299Sjmmv    mkdir testsuite
146*6a6c8299Sjmmv    ( cd testsuite && HOME=$(pwd)/home MOCK=mock1 env ) \
147*6a6c8299Sjmmv        | sort | sed -e 's,^,    ,' | grep -v '^    _.*=.*' >>expout
148*6a6c8299Sjmmv    rmdir testsuite
149*6a6c8299Sjmmv    cat >>expout <<EOF
150*6a6c8299Sjmmv===> Skipped tests
151*6a6c8299Sjmmvsimple_all_pass:skip  ->  skipped: The reason for skipping is this  [S.UUUs]
152*6a6c8299Sjmmv===> Summary
153*6a6c8299SjmmvAction: 1
154*6a6c8299SjmmvTest cases: 2 total, 1 skipped, 0 expected failures, 0 broken, 0 failed
155*6a6c8299SjmmvTotal time: S.UUUs
156*6a6c8299SjmmvEOF
157*6a6c8299Sjmmv    atf_check -s exit:0 -o file:expout -e empty -x kyua report --show-context \
158*6a6c8299Sjmmv        "| ${utils_strip_timestamp} | grep -v '^    _.*=.*'"
159*6a6c8299Sjmmv}
160*6a6c8299Sjmmv
161*6a6c8299Sjmmv
162*6a6c8299Sjmmvutils_test_case output__change_file
163*6a6c8299Sjmmvoutput__change_file_body() {
164*6a6c8299Sjmmv    run_tests
165*6a6c8299Sjmmv
166*6a6c8299Sjmmv    cat >report <<EOF
167*6a6c8299Sjmmv===> Skipped tests
168*6a6c8299Sjmmvsimple_all_pass:skip  ->  skipped: The reason for skipping is this  [S.UUUs]
169*6a6c8299Sjmmv===> Summary
170*6a6c8299SjmmvAction: 1
171*6a6c8299SjmmvTest cases: 2 total, 1 skipped, 0 expected failures, 0 broken, 0 failed
172*6a6c8299SjmmvTotal time: S.UUUs
173*6a6c8299SjmmvEOF
174*6a6c8299Sjmmv
175*6a6c8299Sjmmv    atf_check -s exit:0 -o file:report -e empty -x kyua report \
176*6a6c8299Sjmmv        --output=/dev/stdout "| ${utils_strip_timestamp}"
177*6a6c8299Sjmmv    atf_check -s exit:0 -o empty -e save:stderr kyua report \
178*6a6c8299Sjmmv        --output=/dev/stderr
179*6a6c8299Sjmmv    atf_check -s exit:0 -o file:report -x cat stderr \
180*6a6c8299Sjmmv        "| ${utils_strip_timestamp}"
181*6a6c8299Sjmmv
182*6a6c8299Sjmmv    atf_check -s exit:0 -o empty -e empty kyua report \
183*6a6c8299Sjmmv        --output=my-file
184*6a6c8299Sjmmv    atf_check -s exit:0 -o file:report -x cat my-file \
185*6a6c8299Sjmmv        "| ${utils_strip_timestamp}"
186*6a6c8299Sjmmv}
187*6a6c8299Sjmmv
188*6a6c8299Sjmmv
189*6a6c8299Sjmmvutils_test_case results_filter__empty
190*6a6c8299Sjmmvresults_filter__empty_body() {
191*6a6c8299Sjmmv    utils_install_timestamp_wrapper
192*6a6c8299Sjmmv
193*6a6c8299Sjmmv    run_tests "mock1"
194*6a6c8299Sjmmv
195*6a6c8299Sjmmv    cat >expout <<EOF
196*6a6c8299Sjmmv===> Passed tests
197*6a6c8299Sjmmvsimple_all_pass:pass  ->  passed  [S.UUUs]
198*6a6c8299Sjmmv===> Skipped tests
199*6a6c8299Sjmmvsimple_all_pass:skip  ->  skipped: The reason for skipping is this  [S.UUUs]
200*6a6c8299Sjmmv===> Summary
201*6a6c8299SjmmvAction: 1
202*6a6c8299SjmmvTest cases: 2 total, 1 skipped, 0 expected failures, 0 broken, 0 failed
203*6a6c8299SjmmvTotal time: S.UUUs
204*6a6c8299SjmmvEOF
205*6a6c8299Sjmmv    atf_check -s exit:0 -o file:expout -e empty kyua report --results-filter=
206*6a6c8299Sjmmv}
207*6a6c8299Sjmmv
208*6a6c8299Sjmmv
209*6a6c8299Sjmmvutils_test_case results_filter__one
210*6a6c8299Sjmmvresults_filter__one_body() {
211*6a6c8299Sjmmv    utils_install_timestamp_wrapper
212*6a6c8299Sjmmv
213*6a6c8299Sjmmv    run_tests "mock1"
214*6a6c8299Sjmmv
215*6a6c8299Sjmmv    cat >expout <<EOF
216*6a6c8299Sjmmv===> Passed tests
217*6a6c8299Sjmmvsimple_all_pass:pass  ->  passed  [S.UUUs]
218*6a6c8299Sjmmv===> Summary
219*6a6c8299SjmmvAction: 1
220*6a6c8299SjmmvTest cases: 2 total, 1 skipped, 0 expected failures, 0 broken, 0 failed
221*6a6c8299SjmmvTotal time: S.UUUs
222*6a6c8299SjmmvEOF
223*6a6c8299Sjmmv    atf_check -s exit:0 -o file:expout -e empty kyua report \
224*6a6c8299Sjmmv        --results-filter=passed
225*6a6c8299Sjmmv}
226*6a6c8299Sjmmv
227*6a6c8299Sjmmv
228*6a6c8299Sjmmvutils_test_case results_filter__multiple_all_match
229*6a6c8299Sjmmvresults_filter__multiple_all_match_body() {
230*6a6c8299Sjmmv    utils_install_timestamp_wrapper
231*6a6c8299Sjmmv
232*6a6c8299Sjmmv    run_tests "mock1"
233*6a6c8299Sjmmv
234*6a6c8299Sjmmv    cat >expout <<EOF
235*6a6c8299Sjmmv===> Skipped tests
236*6a6c8299Sjmmvsimple_all_pass:skip  ->  skipped: The reason for skipping is this  [S.UUUs]
237*6a6c8299Sjmmv===> Passed tests
238*6a6c8299Sjmmvsimple_all_pass:pass  ->  passed  [S.UUUs]
239*6a6c8299Sjmmv===> Summary
240*6a6c8299SjmmvAction: 1
241*6a6c8299SjmmvTest cases: 2 total, 1 skipped, 0 expected failures, 0 broken, 0 failed
242*6a6c8299SjmmvTotal time: S.UUUs
243*6a6c8299SjmmvEOF
244*6a6c8299Sjmmv    atf_check -s exit:0 -o file:expout -e empty kyua report \
245*6a6c8299Sjmmv        --results-filter=skipped,passed
246*6a6c8299Sjmmv}
247*6a6c8299Sjmmv
248*6a6c8299Sjmmv
249*6a6c8299Sjmmvutils_test_case results_filter__multiple_some_match
250*6a6c8299Sjmmvresults_filter__multiple_some_match_body() {
251*6a6c8299Sjmmv    utils_install_timestamp_wrapper
252*6a6c8299Sjmmv
253*6a6c8299Sjmmv    run_tests "mock1"
254*6a6c8299Sjmmv
255*6a6c8299Sjmmv    cat >expout <<EOF
256*6a6c8299Sjmmv===> Skipped tests
257*6a6c8299Sjmmvsimple_all_pass:skip  ->  skipped: The reason for skipping is this  [S.UUUs]
258*6a6c8299Sjmmv===> Summary
259*6a6c8299SjmmvAction: 1
260*6a6c8299SjmmvTest cases: 2 total, 1 skipped, 0 expected failures, 0 broken, 0 failed
261*6a6c8299SjmmvTotal time: S.UUUs
262*6a6c8299SjmmvEOF
263*6a6c8299Sjmmv    atf_check -s exit:0 -o file:expout -e empty kyua report \
264*6a6c8299Sjmmv        --results-filter=skipped,xfail,broken,failed
265*6a6c8299Sjmmv}
266*6a6c8299Sjmmv
267*6a6c8299Sjmmv
268*6a6c8299Sjmmvatf_init_test_cases() {
269*6a6c8299Sjmmv    atf_add_test_case default_behavior__ok
270*6a6c8299Sjmmv    atf_add_test_case default_behavior__no_actions
271*6a6c8299Sjmmv    atf_add_test_case default_behavior__no_store
272*6a6c8299Sjmmv
273*6a6c8299Sjmmv    atf_add_test_case action__explicit
274*6a6c8299Sjmmv    atf_add_test_case action__not_found
275*6a6c8299Sjmmv
276*6a6c8299Sjmmv    atf_add_test_case show_context
277*6a6c8299Sjmmv
278*6a6c8299Sjmmv    atf_add_test_case output__change_file
279*6a6c8299Sjmmv
280*6a6c8299Sjmmv    atf_add_test_case results_filter__empty
281*6a6c8299Sjmmv    atf_add_test_case results_filter__one
282*6a6c8299Sjmmv    atf_add_test_case results_filter__multiple_all_match
283*6a6c8299Sjmmv    atf_add_test_case results_filter__multiple_some_match
284*6a6c8299Sjmmv}
285