1*b0d29bc4SBrooks Davis# Copyright 2013 The Kyua Authors. 2*b0d29bc4SBrooks Davis# All rights reserved. 3*b0d29bc4SBrooks Davis# 4*b0d29bc4SBrooks Davis# Redistribution and use in source and binary forms, with or without 5*b0d29bc4SBrooks Davis# modification, are permitted provided that the following conditions are 6*b0d29bc4SBrooks Davis# met: 7*b0d29bc4SBrooks Davis# 8*b0d29bc4SBrooks Davis# * Redistributions of source code must retain the above copyright 9*b0d29bc4SBrooks Davis# notice, this list of conditions and the following disclaimer. 10*b0d29bc4SBrooks Davis# * Redistributions in binary form must reproduce the above copyright 11*b0d29bc4SBrooks Davis# notice, this list of conditions and the following disclaimer in the 12*b0d29bc4SBrooks Davis# documentation and/or other materials provided with the distribution. 13*b0d29bc4SBrooks Davis# * Neither the name of Google Inc. nor the names of its contributors 14*b0d29bc4SBrooks Davis# may be used to endorse or promote products derived from this software 15*b0d29bc4SBrooks Davis# without specific prior written permission. 16*b0d29bc4SBrooks Davis# 17*b0d29bc4SBrooks Davis# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18*b0d29bc4SBrooks Davis# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19*b0d29bc4SBrooks Davis# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20*b0d29bc4SBrooks Davis# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21*b0d29bc4SBrooks Davis# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22*b0d29bc4SBrooks Davis# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23*b0d29bc4SBrooks Davis# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24*b0d29bc4SBrooks Davis# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25*b0d29bc4SBrooks Davis# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26*b0d29bc4SBrooks Davis# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27*b0d29bc4SBrooks Davis# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28*b0d29bc4SBrooks Davis 29*b0d29bc4SBrooks Davis 30*b0d29bc4SBrooks Davis# Location of installed schema files. 31*b0d29bc4SBrooks Davis: "${KYUA_STOREDIR:=__KYUA_STOREDIR__}" 32*b0d29bc4SBrooks Davis 33*b0d29bc4SBrooks Davis 34*b0d29bc4SBrooks Davis# Location of installed test data files. 35*b0d29bc4SBrooks Davis: "${KYUA_STORETESTDATADIR:=__KYUA_STORETESTDATADIR__}" 36*b0d29bc4SBrooks Davis 37*b0d29bc4SBrooks Davis 38*b0d29bc4SBrooks Davis# Creates an empty old-style action database. 39*b0d29bc4SBrooks Davis# 40*b0d29bc4SBrooks Davis# \param ... Files that contain SQL commands to be run. 41*b0d29bc4SBrooks Daviscreate_historical_db() { 42*b0d29bc4SBrooks Davis mkdir -p "${HOME}/.kyua" 43*b0d29bc4SBrooks Davis cat "${@}" | sqlite3 "${HOME}/.kyua/store.db" 44*b0d29bc4SBrooks Davis} 45*b0d29bc4SBrooks Davis 46*b0d29bc4SBrooks Davis 47*b0d29bc4SBrooks Davis# Creates an empty results file. 48*b0d29bc4SBrooks Davis# 49*b0d29bc4SBrooks Davis# \param ... Files that contain SQL commands to be run. 50*b0d29bc4SBrooks Daviscreate_results_file() { 51*b0d29bc4SBrooks Davis mkdir -p "${HOME}/.kyua/store" 52*b0d29bc4SBrooks Davis local dbname="results.$(utils_test_suite_id)-20140718-173200-123456.db" 53*b0d29bc4SBrooks Davis cat "${@}" | sqlite3 "${HOME}/.kyua/store/${dbname}" 54*b0d29bc4SBrooks Davis} 55*b0d29bc4SBrooks Davis 56*b0d29bc4SBrooks Davis 57*b0d29bc4SBrooks Davisutils_test_case upgrade__from_v1 58*b0d29bc4SBrooks Davisupgrade__from_v1_head() { 59*b0d29bc4SBrooks Davis atf_set require.files \ 60*b0d29bc4SBrooks Davis "${KYUA_STORETESTDATADIR}/schema_v1.sql" \ 61*b0d29bc4SBrooks Davis "${KYUA_STORETESTDATADIR}/testdata_v1.sql" \ 62*b0d29bc4SBrooks Davis "${KYUA_STOREDIR}/migrate_v1_v2.sql" \ 63*b0d29bc4SBrooks Davis "${KYUA_STOREDIR}/migrate_v2_v3.sql" 64*b0d29bc4SBrooks Davis atf_set require.progs "sqlite3" 65*b0d29bc4SBrooks Davis} 66*b0d29bc4SBrooks Davisupgrade__from_v1_body() { 67*b0d29bc4SBrooks Davis create_historical_db "${KYUA_STORETESTDATADIR}/schema_v1.sql" \ 68*b0d29bc4SBrooks Davis "${KYUA_STORETESTDATADIR}/testdata_v1.sql" 69*b0d29bc4SBrooks Davis atf_check -s exit:0 -o empty -e empty kyua db-migrate 70*b0d29bc4SBrooks Davis for f in \ 71*b0d29bc4SBrooks Davis "results.test_suite_root.20130108-111331-000000.db" \ 72*b0d29bc4SBrooks Davis "results.usr_tests.20130108-123832-000000.db" \ 73*b0d29bc4SBrooks Davis "results.usr_tests.20130108-112635-000000.db" 74*b0d29bc4SBrooks Davis do 75*b0d29bc4SBrooks Davis [ -f "${HOME}/.kyua/store/${f}" ] || atf_fail "Expected file ${f}" \ 76*b0d29bc4SBrooks Davis "was not created" 77*b0d29bc4SBrooks Davis done 78*b0d29bc4SBrooks Davis [ ! -f "${HOME}/.kyua/store.db" ] || atf_fail "Historical database not" \ 79*b0d29bc4SBrooks Davis "deleted" 80*b0d29bc4SBrooks Davis} 81*b0d29bc4SBrooks Davis 82*b0d29bc4SBrooks Davis 83*b0d29bc4SBrooks Davisutils_test_case upgrade__from_v2 84*b0d29bc4SBrooks Davisupgrade__from_v2_head() { 85*b0d29bc4SBrooks Davis atf_set require.files \ 86*b0d29bc4SBrooks Davis "${KYUA_STORETESTDATADIR}/schema_v2.sql" \ 87*b0d29bc4SBrooks Davis "${KYUA_STORETESTDATADIR}/testdata_v2.sql" \ 88*b0d29bc4SBrooks Davis "${KYUA_STOREDIR}/migrate_v2_v3.sql" 89*b0d29bc4SBrooks Davis atf_set require.progs "sqlite3" 90*b0d29bc4SBrooks Davis} 91*b0d29bc4SBrooks Davisupgrade__from_v2_body() { 92*b0d29bc4SBrooks Davis create_historical_db "${KYUA_STORETESTDATADIR}/schema_v2.sql" \ 93*b0d29bc4SBrooks Davis "${KYUA_STORETESTDATADIR}/testdata_v2.sql" 94*b0d29bc4SBrooks Davis atf_check -s exit:0 -o empty -e empty kyua db-migrate 95*b0d29bc4SBrooks Davis for f in \ 96*b0d29bc4SBrooks Davis "results.test_suite_root.20130108-111331-000000.db" \ 97*b0d29bc4SBrooks Davis "results.usr_tests.20130108-123832-000000.db" \ 98*b0d29bc4SBrooks Davis "results.usr_tests.20130108-112635-000000.db" 99*b0d29bc4SBrooks Davis do 100*b0d29bc4SBrooks Davis [ -f "${HOME}/.kyua/store/${f}" ] || atf_fail "Expected file ${f}" \ 101*b0d29bc4SBrooks Davis "was not created" 102*b0d29bc4SBrooks Davis done 103*b0d29bc4SBrooks Davis [ ! -f "${HOME}/.kyua/store.db" ] || atf_fail "Historical database not" \ 104*b0d29bc4SBrooks Davis "deleted" 105*b0d29bc4SBrooks Davis} 106*b0d29bc4SBrooks Davis 107*b0d29bc4SBrooks Davis 108*b0d29bc4SBrooks Davisutils_test_case already_up_to_date 109*b0d29bc4SBrooks Davisalready_up_to_date_head() { 110*b0d29bc4SBrooks Davis atf_set require.files "${KYUA_STOREDIR}/schema_v3.sql" 111*b0d29bc4SBrooks Davis atf_set require.progs "sqlite3" 112*b0d29bc4SBrooks Davis} 113*b0d29bc4SBrooks Davisalready_up_to_date_body() { 114*b0d29bc4SBrooks Davis create_results_file "${KYUA_STOREDIR}/schema_v3.sql" 115*b0d29bc4SBrooks Davis atf_check -s exit:1 -o empty -e match:"already at schema version" \ 116*b0d29bc4SBrooks Davis kyua db-migrate 117*b0d29bc4SBrooks Davis} 118*b0d29bc4SBrooks Davis 119*b0d29bc4SBrooks Davis 120*b0d29bc4SBrooks Davisutils_test_case need_upgrade 121*b0d29bc4SBrooks Davisneed_upgrade_head() { 122*b0d29bc4SBrooks Davis atf_set require.files "${KYUA_STORETESTDATADIR}/schema_v1.sql" 123*b0d29bc4SBrooks Davis atf_set require.progs "sqlite3" 124*b0d29bc4SBrooks Davis} 125*b0d29bc4SBrooks Davisneed_upgrade_body() { 126*b0d29bc4SBrooks Davis create_results_file "${KYUA_STORETESTDATADIR}/schema_v1.sql" 127*b0d29bc4SBrooks Davis atf_check -s exit:2 -o empty \ 128*b0d29bc4SBrooks Davis -e match:"database has schema version 1.*use db-migrate" kyua report 129*b0d29bc4SBrooks Davis} 130*b0d29bc4SBrooks Davis 131*b0d29bc4SBrooks Davis 132*b0d29bc4SBrooks Davisutils_test_case results_file__ok 133*b0d29bc4SBrooks Davisresults_file__ok_body() { 134*b0d29bc4SBrooks Davis echo "This is not a valid database" >test.db 135*b0d29bc4SBrooks Davis atf_check -s exit:1 -o empty -e match:"Migration failed" \ 136*b0d29bc4SBrooks Davis kyua db-migrate --results-file ./test.db 137*b0d29bc4SBrooks Davis} 138*b0d29bc4SBrooks Davis 139*b0d29bc4SBrooks Davis 140*b0d29bc4SBrooks Davisutils_test_case results_file__fail 141*b0d29bc4SBrooks Davisresults_file__fail_body() { 142*b0d29bc4SBrooks Davis atf_check -s exit:1 -o empty -e match:"No previous results.*test.db" \ 143*b0d29bc4SBrooks Davis kyua db-migrate --results-file ./test.db 144*b0d29bc4SBrooks Davis} 145*b0d29bc4SBrooks Davis 146*b0d29bc4SBrooks Davis 147*b0d29bc4SBrooks Davisutils_test_case too_many_arguments 148*b0d29bc4SBrooks Davistoo_many_arguments_body() { 149*b0d29bc4SBrooks Davis cat >stderr <<EOF 150*b0d29bc4SBrooks DavisUsage error for command db-migrate: Too many arguments. 151*b0d29bc4SBrooks DavisType 'kyua help db-migrate' for usage information. 152*b0d29bc4SBrooks DavisEOF 153*b0d29bc4SBrooks Davis atf_check -s exit:3 -o empty -e file:stderr kyua db-migrate abc def 154*b0d29bc4SBrooks Davis} 155*b0d29bc4SBrooks Davis 156*b0d29bc4SBrooks Davis 157*b0d29bc4SBrooks Davisatf_init_test_cases() { 158*b0d29bc4SBrooks Davis atf_add_test_case upgrade__from_v1 159*b0d29bc4SBrooks Davis atf_add_test_case upgrade__from_v2 160*b0d29bc4SBrooks Davis atf_add_test_case already_up_to_date 161*b0d29bc4SBrooks Davis atf_add_test_case need_upgrade 162*b0d29bc4SBrooks Davis 163*b0d29bc4SBrooks Davis atf_add_test_case results_file__ok 164*b0d29bc4SBrooks Davis atf_add_test_case results_file__fail 165*b0d29bc4SBrooks Davis 166*b0d29bc4SBrooks Davis atf_add_test_case too_many_arguments 167*b0d29bc4SBrooks Davis} 168