#!/bin/bash # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. function ensure_cwd_is_solr() { local cwd=`pwd` if [[ "solr" != `basename $cwd` ]] then echo "ERROR: Please run this script from the 'solr' directory." exit 1 fi } function run_suite_before_if_present() { if declare -f solr_suite_before > /dev/null ; then solr_suite_before fi } function run_suite_after_if_present() { if declare -f solr_suite_after > /dev/null ; then solr_suite_after fi } function run_test_before_if_present() { if declare -f solr_unit_test_before > /dev/null ; then solr_unit_test_before fi } function run_test_after_if_present() { if declare -f solr_unit_test_after > /dev/null ; then solr_unit_test_after fi } function run_test_suite() { local test_file=$1 local test_name_filter="${2:-}" echo "Executing $test_file" source $test_file test_names="$(declare -F | awk '{print $3}' | grep 'solr_test')" run_suite_before_if_present for test_name in $test_names do if [[ -z "$test_name_filter" || "$test_name_filter" == "$test_name" ]]; then run_single_test $test_name fi unset -f $test_name done run_suite_after_if_present unset solr_suite_before unset solr_suite_after unset solr_unit_test_before unset solr_unit_test_after } function run_single_test() { local test_name=$1 echo -n " $test_name " run_test_before_if_present let NUM_TESTS+=1 output=$($test_name) if [[ $? -ne 0 ]]; then let NUM_FAILURES+=1 echo "FAILED" echo "---------------------------------------------------" echo "$output" echo "---------------------------------------------------" else let NUM_SUCCESSES+=1 echo "SUCCEEDED" fi run_test_after_if_present } function ensure_param_arg_present() { if [[ $# -lt 2 || "$2" == -* ]]; then echo "Option '$1' requires a single argument, but none provided." exit 1 fi } function print_help() { echo "Usage: bin-test/test [-h] [-s SUITE_NAME] [-t SUITE_NAME#TEST_NAME]" echo "" echo " Run tests for the 'bin/solr' Solr startup/admin scripts. By default all tests are run." echo " Tests suites or single tests can be selected by use of the options below:" echo "" echo " -s|--run-single-suite Runs all tests living in the specified file. Filename argument" echo " should include the full file extension, but no path prefix." echo " (e.g. test_help.sh works, bin-test/test_help.sh and test_help" echo " do not)" echo "" echo " -t|--run-single-test Runs the specified test from the specified test suite file." echo " Takes an argument in the form 'SUITE_NAME#TEST_NAME', where" echo " SUITE_NAME is the filename of a test suite (see -s above), and" echo " TEST_NAME matches the name of a bash test function present in" echo " that file" echo "" echo " -h|--help You're soaking in it." echo "" exit 0 } function run_all_tests() { test_files="$(find bin-test -name "test_*.sh")" for test_file in $test_files do run_test_suite $test_file done } ## MAIN ## ########## ensure_cwd_is_solr # Can be 'all', 'help', 'single-suite', or 'single-test' MODE="all" SUITE_NAME="" TEST_NAME="" NUM_TESTS=0 NUM_SUCCESSES=0 NUM_FAILURES=0 while [[ $# -gt 0 ]] do case $1 in -h|--help) MODE="help" shift 1 ;; -s|--run-single-suite) ensure_param_arg_present $@ MODE="single-suite" SUITE_NAME="bin-test/$2" shift 2 ;; -t|--run-single-test) ensure_param_arg_present $@ MODE="single-test" SUITE_NAME="bin-test/$(echo "$2" | cut -d "#" -f 1 | tr -d " ")" TEST_NAME=$(echo "$2" | cut -d "#" -f 2 | tr -d " ") shift 2 ;; *) echo "WARNING: Unexpected argument [$1] detected, ignoring." shift 1 ;; esac done case $MODE in "help") print_help MAIN_RESULT=0 ;; "single-suite") run_test_suite $SUITE_NAME MAIN_RESULT=$? ;; "single-test") run_test_suite $SUITE_NAME $TEST_NAME MAIN_RESULT=$? ;; "all") run_all_tests MAIN_RESULT=$? esac echo "Ran $NUM_TESTS tests, with $NUM_SUCCESSES passing, and $NUM_FAILURES failures" exit $MAIN_RESULT