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