1# Copyright 2011 The Kyua Authors.
2# All rights reserved.
3#
4# Redistribution and use in source and binary forms, with or without
5# modification, are permitted provided that the following conditions are
6# met:
7#
8# * Redistributions of source code must retain the above copyright
9#   notice, this list of conditions and the following disclaimer.
10# * Redistributions in binary form must reproduce the above copyright
11#   notice, this list of conditions and the following disclaimer in the
12#   documentation and/or other materials provided with the distribution.
13# * Neither the name of Google Inc. nor the names of its contributors
14#   may be used to endorse or promote products derived from this software
15#   without specific prior written permission.
16#
17# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29
30utils_test_case defaults
31defaults_body() {
32    atf_check -s exit:0 \
33        -o match:'^architecture = ' \
34        -o match:'^platform = ' \
35        kyua config
36}
37
38
39utils_test_case all
40all_body() {
41    mkdir "${HOME}/.kyua"
42    cat >"${HOME}/.kyua/kyua.conf" <<EOF
43syntax(2)
44architecture = "my-architecture"
45parallelism = 256
46platform = "my-platform"
47unprivileged_user = "$(id -u -n)"
48test_suites.suite1.the_variable = "value1"
49test_suites.suite2.the_variable = "value2"
50EOF
51
52    cat >expout <<EOF
53architecture = my-architecture
54parallelism = 256
55platform = my-platform
56test_suites.suite1.the_variable = value1
57test_suites.suite2.the_variable = value2
58unprivileged_user = $(id -u -n)
59EOF
60
61    atf_check -s exit:0 -o file:expout -e empty kyua config
62}
63
64
65utils_test_case one__ok
66one__ok_body() {
67    mkdir "${HOME}/.kyua"
68    cat >"${HOME}/.kyua/kyua.conf" <<EOF
69syntax(2)
70test_suites.first.one = 1
71test_suites.first.two = 2
72EOF
73
74    cat >expout <<EOF
75test_suites.first.two = 2
76EOF
77
78    atf_check -s exit:0 -o file:expout -e empty kyua config \
79        test_suites.first.two
80}
81
82
83utils_test_case one__fail
84one__fail_body() {
85    mkdir "${HOME}/.kyua"
86    cat >"${HOME}/.kyua/kyua.conf" <<EOF
87syntax(2)
88test_suites.first.one = 1
89test_suites.first.three = 3
90EOF
91
92    cat >experr <<EOF
93kyua: W: 'test_suites.first.two' is not defined.
94EOF
95
96    atf_check -s exit:1 -o empty -e file:experr kyua config \
97        test_suites.first.two
98}
99
100
101utils_test_case many__ok
102many__ok_body() {
103    mkdir "${HOME}/.kyua"
104    cat >"${HOME}/.kyua/kyua.conf" <<EOF
105syntax(2)
106architecture = "overriden"
107unknown_setting = "foo"
108test_suites.first.one = 1
109test_suites.first.two = 2
110EOF
111
112    cat >expout <<EOF
113architecture = overriden
114test_suites.first.two = 2
115test_suites.first.one = 1
116EOF
117
118    atf_check -s exit:0 -o file:expout -e empty kyua config \
119        architecture \
120        test_suites.first.two \
121        test_suites.first.one  # Inverse order on purpose.
122    atf_check -s exit:0 -o match:architecture -o not-match:unknown_setting \
123        -e empty kyua config
124}
125
126
127utils_test_case many__fail
128many__fail_body() {
129    mkdir "${HOME}/.kyua"
130    cat >"${HOME}/.kyua/kyua.conf" <<EOF
131syntax(2)
132test_suites.first.one = 1
133test_suites.first.three = 3
134EOF
135
136    cat >expout <<EOF
137test_suites.first.one = 1
138test_suites.first.three = 3
139EOF
140
141    cat >experr <<EOF
142kyua: W: 'test_suites.first.two' is not defined.
143kyua: W: 'test_suites.first.fourth' is not defined.
144EOF
145
146    atf_check -s exit:1 -o file:expout -e file:experr kyua config \
147        test_suites.first.one test_suites.first.two \
148        test_suites.first.three test_suites.first.fourth
149}
150
151
152utils_test_case config_flag__default_system
153config_flag__default_system_body() {
154    cat >kyua.conf <<EOF
155syntax(2)
156test_suites.foo.var = "baz"
157EOF
158
159    atf_check -s exit:1 -o empty \
160        -e match:"kyua: W: 'test_suites.foo.var'.*not defined" \
161        kyua config test_suites.foo.var
162    export KYUA_CONFDIR="$(pwd)"
163    atf_check -s exit:0 -o match:"foo.var = baz" -e empty \
164        kyua config test_suites.foo.var
165}
166
167
168utils_test_case config_flag__default_home
169config_flag__default_home_body() {
170    cat >kyua.conf <<EOF
171syntax(2)
172test_suites.foo.var = "bar"
173EOF
174    export KYUA_CONFDIR="$(pwd)"
175    atf_check -s exit:0 -o match:"test_suites.foo.var = bar" -e empty \
176        kyua config test_suites.foo.var
177
178    # The previously-created "system-wide" file has to be ignored.
179    mkdir .kyua
180    cat >.kyua/kyua.conf <<EOF
181syntax(2)
182test_suites.foo.var = "baz"
183EOF
184    atf_check -s exit:0 -o match:"test_suites.foo.var = baz" -e empty \
185        kyua config test_suites.foo.var
186}
187
188
189utils_test_case config_flag__explicit__ok
190config_flag__explicit__ok_body() {
191    cat >kyua.conf <<EOF
192syntax(2)
193test_suites.foo.var = "baz"
194EOF
195
196    atf_check -s exit:1 -o empty \
197        -e match:"kyua: W: 'test_suites.foo.var'.*not defined" \
198        kyua config test_suites.foo.var
199    atf_check -s exit:0 -o match:"test_suites.foo.var = baz" -e empty \
200        kyua -c kyua.conf config test_suites.foo.var
201    atf_check -s exit:0 -o match:"test_suites.foo.var = baz" -e empty \
202        kyua --config=kyua.conf config test_suites.foo.var
203}
204
205
206utils_test_case config_flag__explicit__disable
207config_flag__explicit__disable_body() {
208    cat >kyua.conf <<EOF
209syntax(2)
210test_suites.foo.var = "baz"
211EOF
212    mkdir .kyua
213    cp kyua.conf .kyua/kyua.conf
214    export KYUA_CONFDIR="$(pwd)"
215
216    atf_check -s exit:0 -o match:"test_suites.foo.var = baz" -e empty \
217        kyua config test_suites.foo.var
218    atf_check -s exit:1 -o empty \
219        -e match:"kyua: W: 'test_suites.foo.var'.*not defined" \
220        kyua --config=none config test_suites.foo.var
221}
222
223
224utils_test_case config_flag__explicit__missing_file
225config_flag__explicit__missing_file_body() {
226    cat >experr <<EOF
227kyua: E: Load of 'foo' failed: File 'foo' not found.
228EOF
229    atf_check -s exit:2 -o empty -e file:experr kyua --config=foo config
230}
231
232
233utils_test_case config_flag__explicit__bad_file
234config_flag__explicit__bad_file_body() {
235    touch custom
236    atf_check -s exit:2 -o empty -e match:"No syntax defined" \
237        kyua --config=custom config
238}
239
240
241utils_test_case variable_flag__no_config
242variable_flag__no_config_body() {
243    atf_check -s exit:0 \
244        -o match:'test_suites.suite1.the_variable = value1' \
245        -o match:'test_suites.suite2.the_variable = value2' \
246        -e empty \
247        kyua \
248        -v "test_suites.suite1.the_variable=value1" \
249        -v "test_suites.suite2.the_variable=value2" \
250        config
251
252    atf_check -s exit:0 \
253        -o match:'test_suites.suite1.the_variable = value1' \
254        -o match:'test_suites.suite2.the_variable = value2' \
255        -e empty \
256        kyua \
257        --variable="test_suites.suite1.the_variable=value1" \
258        --variable="test_suites.suite2.the_variable=value2" \
259        config
260}
261
262
263utils_test_case variable_flag__override_default_config
264variable_flag__override_default_config_body() {
265    mkdir "${HOME}/.kyua"
266    cat >"${HOME}/.kyua/kyua.conf" <<EOF
267syntax(2)
268test_suites.suite1.the_variable = "value1"
269test_suites.suite2.the_variable = "should not be used"
270EOF
271
272    atf_check -s exit:0 \
273        -o match:'test_suites.suite1.the_variable = value1' \
274        -o match:'test_suites.suite2.the_variable = overriden' \
275        -o match:'test_suites.suite3.the_variable = new' \
276        -e empty kyua \
277        -v "test_suites.suite2.the_variable=overriden" \
278        -v "test_suites.suite3.the_variable=new" \
279        config
280
281    atf_check -s exit:0 \
282        -o match:'test_suites.suite1.the_variable = value1' \
283        -o match:'test_suites.suite2.the_variable = overriden' \
284        -o match:'test_suites.suite3.the_variable = new' \
285        -e empty kyua \
286        --variable="test_suites.suite2.the_variable=overriden" \
287        --variable="test_suites.suite3.the_variable=new" \
288        config
289}
290
291
292utils_test_case variable_flag__override_custom_config
293variable_flag__override_custom_config_body() {
294    cat >config <<EOF
295syntax(2)
296test_suites.suite1.the_variable = "value1"
297test_suites.suite2.the_variable = "should not be used"
298EOF
299
300    atf_check -s exit:0 \
301        -o match:'test_suites.suite2.the_variable = overriden' \
302        -e empty kyua -c config \
303        -v "test_suites.suite2.the_variable=overriden" config
304
305    atf_check -s exit:0 \
306        -o match:'test_suites.suite2.the_variable = overriden' \
307        -e empty kyua -c config \
308        --variable="test_suites.suite2.the_variable=overriden" config
309}
310
311
312utils_test_case variable_flag__invalid_key
313variable_flag__invalid_key_body() {
314    # CHECK_STYLE_DISABLE
315    cat >experr <<EOF
316Usage error: Invalid argument '' for option --variable: Argument does not have the form 'K=V'.
317Type 'kyua help' for usage information.
318EOF
319    # CHECK_STYLE_ENABLE
320    atf_check -s exit:3 -o empty -e file:experr kyua \
321        -v "test_suites.a.b=c" -v "" config
322}
323
324
325utils_test_case variable_flag__invalid_value
326variable_flag__invalid_value_body() {
327    cat >experr <<EOF
328kyua: E: Invalid value for property 'parallelism': Must be a positive integer.
329EOF
330    atf_check -s exit:2 -o empty -e file:experr kyua \
331        -v "parallelism=0" config
332}
333
334
335atf_init_test_cases() {
336    atf_add_test_case defaults
337    atf_add_test_case all
338    atf_add_test_case one__ok
339    atf_add_test_case one__fail
340    atf_add_test_case many__ok
341    atf_add_test_case many__fail
342
343    atf_add_test_case config_flag__default_system
344    atf_add_test_case config_flag__default_home
345    atf_add_test_case config_flag__explicit__ok
346    atf_add_test_case config_flag__explicit__disable
347    atf_add_test_case config_flag__explicit__missing_file
348    atf_add_test_case config_flag__explicit__bad_file
349
350    atf_add_test_case variable_flag__no_config
351    atf_add_test_case variable_flag__override_default_config
352    atf_add_test_case variable_flag__override_custom_config
353    atf_add_test_case variable_flag__invalid_key
354    atf_add_test_case variable_flag__invalid_value
355}
356