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
30# Creates a new database file in the store directory.
31#
32# Subsequent invocations of db-exec should just pick this new file up.
33create_empty_store() {
34    cat >Kyuafile <<EOF
35syntax(2)
36EOF
37    atf_check -s exit:0 -o ignore -e empty kyua test
38}
39
40
41utils_test_case one_arg
42one_arg_body() {
43    create_empty_store
44
45    atf_check -s exit:0 -o save:metadata.csv -e empty \
46        kyua db-exec "SELECT * FROM metadata"
47    atf_check -s exit:0 -o ignore -e empty \
48        grep 'schema_version,.*timestamp' metadata.csv
49}
50
51
52utils_test_case many_args
53many_args_body() {
54    create_empty_store
55
56    atf_check -s exit:0 -o save:metadata.csv -e empty \
57        kyua db-exec SELECT "*" FROM metadata
58    atf_check -s exit:0 -o ignore -e empty \
59        grep 'schema_version,.*timestamp' metadata.csv
60}
61
62
63utils_test_case no_args
64no_args_body() {
65    atf_check -s exit:3 -o empty -e match:"Not enough arguments" kyua db-exec
66    test ! -d .kyua/store/ || atf_fail "Database created but it should" \
67        "not have been"
68}
69
70
71utils_test_case invalid_statement
72invalid_statement_body() {
73    create_empty_store
74
75    atf_check -s exit:1 -o empty -e match:"SQLite error.*foo" \
76        kyua db-exec foo
77}
78
79
80utils_test_case no_create_store
81no_create_store_body() {
82    atf_check -s exit:1 -o empty -e match:"No previous results.*not-here" \
83        kyua db-exec --results-file=not-here "SELECT * FROM metadata"
84    if [ -f not-here ]; then
85        atf_fail "Database created but it should not have been"
86    fi
87}
88
89
90utils_test_case results_file__default_home
91results_file__default_home_body() {
92    HOME=home-dir
93    create_empty_store
94
95    atf_check -s exit:0 -o save:metadata.csv -e empty \
96        kyua db-exec "SELECT * FROM metadata"
97    test -f home-dir/.kyua/store/*.db || atf_fail "Database not created in" \
98        "the home directory"
99    atf_check -s exit:0 -o ignore -e empty \
100        grep 'schema_version,.*timestamp' metadata.csv
101}
102
103
104utils_test_case results_file__explicit__ok
105results_file__explicit__ok_body() {
106    create_empty_store
107    mv .kyua/store/*.db custom.db
108    rmdir .kyua/store
109
110    HOME=home-dir
111    atf_check -s exit:0 -o save:metadata.csv -e empty \
112        kyua --logfile=/dev/null db-exec -r custom.db "SELECT * FROM metadata"
113    test ! -d home-dir/.kyua || atf_fail "Home directory created but this" \
114        "should not have happened"
115    atf_check -s exit:0 -o ignore -e empty \
116        grep 'schema_version,.*timestamp' metadata.csv
117}
118
119
120utils_test_case results_file__explicit__fail
121results_file__explicit__fail_head() {
122    atf_set "require.user" "unprivileged"
123}
124results_file__explicit__fail_body() {
125    atf_check -s exit:1 -o empty -e match:"No previous results.*foo.db" \
126        kyua db-exec --results-file=foo.db "SELECT * FROM metadata"
127}
128
129
130utils_test_case no_headers_flag
131no_headers_flag_body() {
132    create_empty_store
133
134    atf_check kyua db-exec "CREATE TABLE data" \
135        "(a INTEGER PRIMARY KEY, b INTEGER, c TEXT)"
136    atf_check kyua db-exec "INSERT INTO data VALUES (65, 43, NULL)"
137    atf_check kyua db-exec "INSERT INTO data VALUES (23, 42, 'foo')"
138
139    cat >expout <<EOF
140a,b,c
14123,42,foo
14265,43,NULL
143EOF
144    atf_check -s exit:0 -o file:expout -e empty \
145        kyua db-exec "SELECT * FROM data ORDER BY a"
146
147    tail -n 2 <expout >expout2
148    atf_check -s exit:0 -o file:expout2 -e empty \
149        kyua db-exec --no-headers "SELECT * FROM data ORDER BY a"
150}
151
152
153atf_init_test_cases() {
154    atf_add_test_case one_arg
155    atf_add_test_case many_args
156    atf_add_test_case no_args
157    atf_add_test_case invalid_statement
158    atf_add_test_case no_create_store
159
160    atf_add_test_case results_file__default_home
161    atf_add_test_case results_file__explicit__ok
162    atf_add_test_case results_file__explicit__fail
163
164    atf_add_test_case no_headers_flag
165}
166