blob: 2fb4a31eca23213eccccd918083037603b5b8f20 [file] [log] [blame]
#!/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.
#
#-------------------------------------------------------------
# directory to write test case temporary files
TEMP=~/temp/systemds_test
# should this test suite continue after encountering an error? true false
CONTINUE_ON_ERROR=true
# expecting this test script to be in directory ${PROJECT_ROOT_DIR}/src/test/scripts
TEST_SCRIPT_REL_DIR=src/test/scripts
# expecting the run script to be in directory ${PROJECT_ROOT_DIR}/bin
RUN_SCRIPT=systemds-standalone.sh
# the DML script with arguments we use to test the run script
DML_SCRIPT=genLinearRegressionData.dml
DML_SCRIPT_PATH=scripts/datagen
DML_OUTPUT=linRegData.csv
DML_ARGS="-nvargs numSamples=1000 numFeatures=50 maxFeatureValue=5 maxWeight=5 addNoise=FALSE b=0 sparsity=0.7 output=${DML_OUTPUT} format=csv perc=0.5"
DML_SCRIPT_WITH_ARGS="${DML_SCRIPT} ${DML_ARGS}"
# try to find the project root directory
USER_DIR="$PWD"
TEST_SCRIPT_PATH=$( dirname "$0" )
PROJECT_ROOT_DIR=$( cd "${TEST_SCRIPT_PATH/\/$TEST_SCRIPT_REL_DIR/}" ; pwd -P )
# generate the test log file name
DATE_TIME="$(date +"%Y-%m-%d-%H-%M-%S")"
TEST_LOG="${PROJECT_ROOT_DIR}/temp/test_runScript_${DATE_TIME}.log"
# verify we found the ${PROJECT_ROOT_DIR} and ${RUN_SCRIPT}
if [ "${TEST_SCRIPT_PATH}" = "${PROJECT_ROOT_DIR}" ]
then
echo This test script "$0" is expected to be located in folder "${TEST_SCRIPT_REL_DIR}" under the project root.
echo Please update "$0" and correctly set the variable "TEST_SCRIPT_REL_DIR".
exit 1
fi
if [ ! -f "${PROJECT_ROOT_DIR}/bin/${RUN_SCRIPT}" ]
then
echo "Could not find \"bin/${RUN_SCRIPT}\" in the project root directory. If the actual path of the run script is not \"bin/${RUN_SCRIPT}\", or if the actual project root directory is not \"${PROJECT_ROOT_DIR}\", please update this test script \"$0\"."
exit 1
fi
# set an exit trap if we should exit on first error
if [ "${CONTINUE_ON_ERROR}" = "false" ]
then
trap "exit 1" TERM
export PID=$$
fi
# test setup, create temp folders
if [ ! -d "${TEMP}" ] ; then
mkdir -p "${TEMP}"
fi
if [ ! -d "${PROJECT_ROOT_DIR}/temp" ] ; then
mkdir -p "${PROJECT_ROOT_DIR}/temp"
fi
# start running the test cases and write output to log file
echo "Writing test log to file \"${TEST_LOG}\"."; echo "$( date +"%F %T" )" > ${TEST_LOG}
# invoke the run script from the project root directory
CURRENT_TEST="Test_root__DML_script_with_path"
(
printf "Running test \"${CURRENT_TEST}\"... "
printf "\nTest case: \"${CURRENT_TEST}\"\n" >> ${TEST_LOG}
cd "${PROJECT_ROOT_DIR}"
echo "Working directory: $PWD" >> ${TEST_LOG}
rm -f "${DML_OUTPUT}" > /dev/null 2>&1
rm -f "temp/${DML_OUTPUT}" > /dev/null 2>&1
CMD="./bin/${RUN_SCRIPT} ${DML_SCRIPT_PATH}/${DML_SCRIPT_WITH_ARGS}"
echo "${CMD}" >> ${TEST_LOG} 2>&1
eval ${CMD} >> ${TEST_LOG} 2>&1
EXIT_CODE=$?
if [ $EXIT_CODE -eq 0 ]
then
if [ -f "${DML_OUTPUT}" ] ; then ERR_MSG="${ERR_MSG}, outputdata in project root" ; EXIT_CODE=1 ; fi
if [ ! -f "temp/${DML_OUTPUT}" ] ; then ERR_MSG="${ERR_MSG}, outputdata is missing" ; EXIT_CODE=1 ; fi
fi
if [ $EXIT_CODE -eq 0 ] ;
then printf "success\n";
else printf "failed${ERR_MSG}\n"; if [ "${CONTINUE_ON_ERROR}" = "false" ] ; then kill -s TERM $PID ; fi
fi
)
CURRENT_TEST="Test_root__DML_script_file_name"
(
printf "Running test \"${CURRENT_TEST}\"... "
printf "\nTest case: \"${CURRENT_TEST}\"\n" >> ${TEST_LOG}
cd "${PROJECT_ROOT_DIR}"
echo "Working directory: $PWD" >> ${TEST_LOG}
rm -f "${DML_OUTPUT}" > /dev/null 2>&1
rm -f "temp/${DML_OUTPUT}" > /dev/null 2>&1
CMD="./bin/${RUN_SCRIPT} ${DML_SCRIPT_WITH_ARGS}"
echo "${CMD}" >> ${TEST_LOG} 2>&1
eval ${CMD} >> ${TEST_LOG} 2>&1
EXIT_CODE=$?
if [ ${EXIT_CODE} -eq 0 ]
then
if [ -f "${DML_OUTPUT}" ] ; then ERR_MSG="${ERR_MSG}, outputdata in project root" ; EXIT_CODE=1 ; fi
if [ ! -f "temp/${DML_OUTPUT}" ] ; then ERR_MSG="${ERR_MSG}, outputdata is missing" ; EXIT_CODE=1 ; fi
fi
if [ ${EXIT_CODE} -eq 0 ] ;
then printf "success\n";
else printf "failed${ERR_MSG}\n"; if [ "${CONTINUE_ON_ERROR}" = "false" ] ; then kill -s TERM $PID ; fi
fi
)
# invoke the run script from the bin directory
CURRENT_TEST="Test_bin__DML_script_with_path"
(
printf "Running test \"${CURRENT_TEST}\"... "
printf "\nTest case: \"${CURRENT_TEST}\"\n" >> ${TEST_LOG}
cd "${PROJECT_ROOT_DIR}/bin"
echo "Working directory: $PWD" >> ${TEST_LOG}
rm -f "${DML_OUTPUT}" > /dev/null 2>&1
rm -f "../temp/${DML_OUTPUT}" > /dev/null 2>&1
CMD="./${RUN_SCRIPT} ../${DML_SCRIPT_PATH}/${DML_SCRIPT_WITH_ARGS}"
echo "${CMD}" >> ${TEST_LOG} 2>&1
sh ${CMD} >> ${TEST_LOG} 2>&1
EXIT_CODE=$?
if [ ${EXIT_CODE} -eq 0 ]
then
if [ -f "${DML_OUTPUT}" ] ; then ERR_MSG="${ERR_MSG}, outputdata in bin folder" ; EXIT_CODE=1 ; fi
if [ ! -f "../temp/${DML_OUTPUT}" ] ; then ERR_MSG="${ERR_MSG}, outputdata is missing" ; EXIT_CODE=1 ; fi
fi
if [ ${EXIT_CODE} -eq 0 ] ;
then printf "success\n";
else printf "failed${ERR_MSG}\n"; if [ "${CONTINUE_ON_ERROR}" = "false" ] ; then kill -s TERM $PID ; fi
fi
)
CURRENT_TEST="Test_bin__DML_script_file_name"
(
printf "Running test \"${CURRENT_TEST}\"... "
printf "\nTest case: \"${CURRENT_TEST}\"\n" >> ${TEST_LOG}
cd "${PROJECT_ROOT_DIR}/bin"
echo "Working directory: $PWD" >> ${TEST_LOG}
rm -f "${DML_OUTPUT}" > /dev/null 2>&1
rm -f "../temp/${DML_OUTPUT}" > /dev/null 2>&1
CMD="./${RUN_SCRIPT} ${DML_SCRIPT_WITH_ARGS}"
echo "${CMD}" >> ${TEST_LOG} 2>&1
sh ${CMD} >> ${TEST_LOG} 2>&1
EXIT_CODE=$?
if [ ${EXIT_CODE} -eq 0 ]
then
if [ -f "${DML_OUTPUT}" ] ; then ERR_MSG="${ERR_MSG}, outputdata in bin folder" ; EXIT_CODE=1 ; fi
if [ ! -f "../temp/${DML_OUTPUT}" ] ; then ERR_MSG="${ERR_MSG}, outputdata is missing" ; EXIT_CODE=1 ; fi
fi
if [ ${EXIT_CODE} -eq 0 ] ;
then printf "success\n";
else printf "failed${ERR_MSG}\n"; if [ "${CONTINUE_ON_ERROR}" = "false" ] ; then kill -s TERM $PID ; fi
fi
)
# invoke the run script from a working directory outside of the project root
CURRENT_TEST="Test_out__DML_script_with_path"
(
printf "Running test \"${CURRENT_TEST}\"... "
printf "\nTest case: \"${CURRENT_TEST}\"\n" >> ${TEST_LOG}
cd "${TEMP}"
echo "Working directory: $PWD" >> ${TEST_LOG}
rm -f "${DML_OUTPUT}" > /dev/null 2>&1
CMD="\"${PROJECT_ROOT_DIR}/bin/${RUN_SCRIPT}\" \"${PROJECT_ROOT_DIR}/${DML_SCRIPT_PATH}/${DML_SCRIPT}\" ${DML_ARGS}"
echo "${CMD}" >> ${TEST_LOG} 2>&1
eval ${CMD} >> ${TEST_LOG} 2>&1
EXIT_CODE=$?
if [ ${EXIT_CODE} -eq 0 ]
then
if [ ! -f "${DML_OUTPUT}" ] ; then ERR_MSG="${ERR_MSG}, outputdata is missing" ; EXIT_CODE=1 ; fi
fi
if [ ${EXIT_CODE} -eq 0 ] ;
then printf "success\n";
else printf "failed${ERR_MSG}\n"; if [ "${CONTINUE_ON_ERROR}" = "false" ] ; then kill -s TERM $PID ; fi
fi
)
CURRENT_TEST="Test_out__DML_script_file_name"
(
printf "Running test \"${CURRENT_TEST}\"... "
printf "\nTest case: \"${CURRENT_TEST}\"\n" >> ${TEST_LOG}
cd "${TEMP}"
echo "Working directory: $PWD" >> ${TEST_LOG}
rm -f "${DML_OUTPUT}" > /dev/null 2>&1
CMD="\"${PROJECT_ROOT_DIR}/bin/${RUN_SCRIPT}\" ${DML_SCRIPT_WITH_ARGS}"
echo "${CMD}" >> ${TEST_LOG} 2>&1
eval ${CMD} >> ${TEST_LOG} 2>&1
EXIT_CODE=$?
if [ ${EXIT_CODE} -eq 0 ]
then
if [ ! -f "${DML_OUTPUT}" ] ; then ERR_MSG="${ERR_MSG}, outputdata is missing" ; EXIT_CODE=1 ; fi
fi
if [ ${EXIT_CODE} -eq 0 ] ;
then printf "success\n";
else printf "failed${ERR_MSG}\n"; if [ "${CONTINUE_ON_ERROR}" = "false" ] ; then kill -s TERM $PID ; fi
fi
)
# test again from a directory with spaces in its path name
echo "Running test cases again from a folder with spaces in path name..."
SPACE_DIR="${TEMP}/Space Folder/SystemDS"
if [ ! -d "${SPACE_DIR}" ]
then
echo "mkdir -p ${SPACE_DIR}" >> ${TEST_LOG}
mkdir -p "${SPACE_DIR}" >> ${TEST_LOG}
fi
printf "Copying project contents from \"${PROJECT_ROOT_DIR}\" to \"${SPACE_DIR}\"... " >> ${TEST_LOG}
rsync -aqz --exclude '*.java' \
--exclude 'Test*.*' \
--exclude 'test-classes/' \
--exclude 'hadoop-test/' \
--exclude 'src/test' \
--exclude 'docs/' \
--exclude '.git' \
--exclude '.idea' \
--exclude '.settings' \
"${PROJECT_ROOT_DIR}/" "${SPACE_DIR}" >> ${TEST_LOG}
printf "done.\n" >> ${TEST_LOG}
# invoke the run script from the project root directory
CURRENT_TEST="Test_space_root__DML_script_with_path"
(
printf "Running test \"${CURRENT_TEST}\"... "
printf "\nTest case: \"${CURRENT_TEST}\"\n" >> ${TEST_LOG}
cd "${SPACE_DIR}"
echo "Working directory: \"$PWD\"" >> ${TEST_LOG}
rm -f "${DML_OUTPUT}" > /dev/null 2>&1
rm -f "temp/${DML_OUTPUT}" > /dev/null 2>&1
CMD="./bin/${RUN_SCRIPT} ${DML_SCRIPT_PATH}/${DML_SCRIPT_WITH_ARGS}"
echo "${CMD}" >> ${TEST_LOG} 2>&1
sh ${CMD} >> ${TEST_LOG} 2>&1
EXIT_CODE=$?
if [ $EXIT_CODE -eq 0 ]
then
if [ -f "${DML_OUTPUT}" ] ; then ERR_MSG="${ERR_MSG}, outputdata in project root" ; EXIT_CODE=1 ; fi
if [ ! -f "temp/${DML_OUTPUT}" ] ; then ERR_MSG="${ERR_MSG}, outputdata is missing" ; EXIT_CODE=1 ; fi
fi
if [ $EXIT_CODE -eq 0 ] ;
then printf "success\n";
else printf "failed${ERR_MSG}\n"; if [ "${CONTINUE_ON_ERROR}" = "false" ] ; then kill -s TERM $PID ; fi
fi
)
CURRENT_TEST="Test_space_root__DML_script_file_name"
(
printf "Running test \"${CURRENT_TEST}\"... "
printf "\nTest case: \"${CURRENT_TEST}\"\n" >> ${TEST_LOG}
cd "${SPACE_DIR}"
echo "Working directory: \"$PWD\"" >> ${TEST_LOG}
rm -f "${DML_OUTPUT}" > /dev/null 2>&1
rm -f "temp/${DML_OUTPUT}" > /dev/null 2>&1
CMD="./bin/${RUN_SCRIPT} ${DML_SCRIPT_WITH_ARGS} "
echo "${CMD}" >> ${TEST_LOG} 2>&1
sh ${CMD} >> ${TEST_LOG} 2>&1
EXIT_CODE=$?
if [ ${EXIT_CODE} -eq 0 ]
then
if [ -f "${DML_OUTPUT}" ] ; then ERR_MSG="${ERR_MSG}, outputdata in project root" ; EXIT_CODE=1 ; fi
if [ ! -f "temp/${DML_OUTPUT}" ] ; then ERR_MSG="${ERR_MSG}, outputdata is missing" ; EXIT_CODE=1 ; fi
fi
if [ ${EXIT_CODE} -eq 0 ] ;
then printf "success\n";
else printf "failed${ERR_MSG}\n"; if [ "${CONTINUE_ON_ERROR}" = "false" ] ; then kill -s TERM $PID ; fi
fi
)
# invoke the run script from the bin directory
CURRENT_TEST="Test_space_bin__DML_script_with_path"
(
printf "Running test \"${CURRENT_TEST}\"... "
printf "\nTest case: \"${CURRENT_TEST}\"\n" >> ${TEST_LOG}
cd "${SPACE_DIR}/bin"
echo "Working directory: \"$PWD\"" >> ${TEST_LOG}
rm -f "${DML_OUTPUT}" > /dev/null 2>&1
rm -f "../temp/${DML_OUTPUT}" > /dev/null 2>&1
CMD="./${RUN_SCRIPT} ../${DML_SCRIPT_PATH}/${DML_SCRIPT_WITH_ARGS} "
echo "${CMD}" >> ${TEST_LOG} 2>&1
sh ${CMD} >> ${TEST_LOG} 2>&1
EXIT_CODE=$?
if [ ${EXIT_CODE} -eq 0 ]
then
if [ -f "${DML_OUTPUT}" ] ; then ERR_MSG="${ERR_MSG}, outputdata in bin folder" ; EXIT_CODE=1 ; fi
if [ ! -f "../temp/${DML_OUTPUT}" ] ; then ERR_MSG="${ERR_MSG}, outputdata is missing" ; EXIT_CODE=1 ; fi
fi
if [ ${EXIT_CODE} -eq 0 ] ;
then printf "success\n";
else printf "failed${ERR_MSG}\n"; if [ "${CONTINUE_ON_ERROR}" = "false" ] ; then kill -s TERM $PID ; fi
fi
)
CURRENT_TEST="Test_space_bin__DML_script_file_name"
(
printf "Running test \"${CURRENT_TEST}\"... "
printf "\nTest case: \"${CURRENT_TEST}\"\n" >> ${TEST_LOG}
cd "${SPACE_DIR}/bin"
echo "Working directory: \"$PWD\"" >> ${TEST_LOG}
rm -f "${DML_OUTPUT}" > /dev/null 2>&1
rm -f "../temp/${DML_OUTPUT}" > /dev/null 2>&1
CMD="./${RUN_SCRIPT} ${DML_SCRIPT_WITH_ARGS} "
echo "${CMD}" >> ${TEST_LOG} 2>&1
sh ${CMD} >> ${TEST_LOG} 2>&1
EXIT_CODE=$?
if [ ${EXIT_CODE} -eq 0 ]
then
if [ -f "${DML_OUTPUT}" ] ; then ERR_MSG="${ERR_MSG}, outputdata in bin folder" ; EXIT_CODE=1 ; fi
if [ ! -f "../temp/${DML_OUTPUT}" ] ; then ERR_MSG="${ERR_MSG}, outputdata is missing" ; EXIT_CODE=1 ; fi
fi
if [ ${EXIT_CODE} -eq 0 ] ;
then printf "success\n";
else printf "failed${ERR_MSG}\n"; if [ "${CONTINUE_ON_ERROR}" = "false" ] ; then kill -s TERM $PID ; fi
fi
)
# invoke the run script from a working directory outside of the project root
CURRENT_TEST="Test_space_out__DML_script_with_path"
(
printf "Running test \"${CURRENT_TEST}\"... "
printf "\nTest case: \"${CURRENT_TEST}\"\n" >> ${TEST_LOG}
cd "${TEMP}"
echo "Working directory: \"$PWD\"" >> ${TEST_LOG}
rm -f "${DML_OUTPUT}" > /dev/null 2>&1
CMD="\"${SPACE_DIR}/bin/${RUN_SCRIPT}\" \"${SPACE_DIR}/${DML_SCRIPT_PATH}/${DML_SCRIPT}\" ${DML_ARGS}"
echo "${CMD}" >> ${TEST_LOG} 2>&1
eval ${CMD} >> ${TEST_LOG} 2>&1
EXIT_CODE=$?
if [ ${EXIT_CODE} -eq 0 ]
then
if [ ! -f "${DML_OUTPUT}" ] ; then ERR_MSG="${ERR_MSG}, outputdata is missing" ; EXIT_CODE=1 ; fi
fi
if [ ${EXIT_CODE} -eq 0 ] ;
then printf "success\n";
else printf "failed${ERR_MSG}\n"; if [ "${CONTINUE_ON_ERROR}" = "false" ] ; then kill -s TERM $PID ; fi
fi
)
CURRENT_TEST="Test_space_out__DML_script_file_name"
(
printf "Running test \"${CURRENT_TEST}\"... "
printf "\nTest case: \"${CURRENT_TEST}\"\n" >> ${TEST_LOG}
cd "${TEMP}"
echo "Working directory: \"$PWD\"" >> ${TEST_LOG}
rm -f "${DML_OUTPUT}" > /dev/null 2>&1
CMD="\"${SPACE_DIR}/bin/${RUN_SCRIPT}\" ${DML_SCRIPT_WITH_ARGS}"
echo "${CMD}" >> ${TEST_LOG} 2>&1
eval ${CMD} >> ${TEST_LOG} 2>&1
EXIT_CODE=$?
if [ ${EXIT_CODE} -eq 0 ]
then
if [ ! -f "${DML_OUTPUT}" ] ; then ERR_MSG="${ERR_MSG}, outputdata is missing" ; EXIT_CODE=1 ; fi
fi
if [ ${EXIT_CODE} -eq 0 ] ;
then printf "success\n";
else printf "failed${ERR_MSG}\n"; if [ "${CONTINUE_ON_ERROR}" = "false" ] ; then kill -s TERM $PID ; fi
fi
)
# Cleanup
printf "Cleaning up temporary files and folders ..."
if [ -d "${TEMP}" ] ; then
rm -rf "${TEMP}"
fi
printf "done.\n"
echo "Test log was written to file ${TEST_LOG}."
cd "${USER_DIR}"