From ec2d37cd987c6aafc7d0d71ab6c2643487d8ef92 Mon Sep 17 00:00:00 2001 From: Mohamed Ashiq Liyazudeen Date: Mon, 8 May 2017 21:08:09 +0530 Subject: Unit Test to check the shell script and Dockerfile lint. Travis.ci intergrated. Refer: https://github.com/projectatomic/dockerfile_lint Signed-off-by: Mohamed Ashiq Liyazudeen --- .travis.yml | 20 +++++ Makefile | 2 + tests/Dockerfiletest/Dockerfile_faulty | 10 +++ tests/Dockerfiletest/Makefile | 2 + tests/Dockerfiletest/run.sh | 12 +++ tests/Dockerfiletest/test_gluster_dockerfile.sh | 45 ++++++++++ tests/Makefile | 2 + tests/common/subunit.sh | 113 ++++++++++++++++++++++++ tests/run.sh | 22 +++++ tests/shelltest/Makefile | 2 + tests/shelltest/run.sh | 12 +++ tests/shelltest/test_gluster_container_basic.sh | 47 ++++++++++ 12 files changed, 289 insertions(+) create mode 100644 .travis.yml create mode 100644 Makefile create mode 100644 tests/Dockerfiletest/Dockerfile_faulty create mode 100644 tests/Dockerfiletest/Makefile create mode 100755 tests/Dockerfiletest/run.sh create mode 100755 tests/Dockerfiletest/test_gluster_dockerfile.sh create mode 100644 tests/Makefile create mode 100755 tests/common/subunit.sh create mode 100755 tests/run.sh create mode 100644 tests/shelltest/Makefile create mode 100755 tests/shelltest/run.sh create mode 100755 tests/shelltest/test_gluster_container_basic.sh diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..0badc89 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,20 @@ +sudo: true + +addons: + apt: + sources: + - sourceline: 'deb http://archive.ubuntu.com/ubuntu trusty-backports main restricted universe multiverse' + packages: + - shellcheck + +before_install: +- sudo apt-get install -y -qq npm +- sudo add-apt-repository -y ppa:chris-lea/node.js +- sudo apt-get -y update +- sudo apt-get install -y nodejs +- sudo npm config set registry http://registry.npmjs.org/ +- sudo npm install -g npm +- sudo npm install -g dockerfile_lint + +script: +- make test diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2526438 --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +test: + $(MAKE) -C tests test diff --git a/tests/Dockerfiletest/Dockerfile_faulty b/tests/Dockerfiletest/Dockerfile_faulty new file mode 100644 index 0000000..b538995 --- /dev/null +++ b/tests/Dockerfiletest/Dockerfile_faulty @@ -0,0 +1,10 @@ + +MAINTAINER Humble Chirammal hchiramm@redhat.com Mohamed Ashiq Liyazudeen mliyazud@redhat.com + +LABEL Name="faulty" + +RUNCMD 'echo "fail"' + +EXPOSE 3333 + +CMD ["/usr/sbin/init"] diff --git a/tests/Dockerfiletest/Makefile b/tests/Dockerfiletest/Makefile new file mode 100644 index 0000000..13cf414 --- /dev/null +++ b/tests/Dockerfiletest/Makefile @@ -0,0 +1,2 @@ +test: + ./run.sh diff --git a/tests/Dockerfiletest/run.sh b/tests/Dockerfiletest/run.sh new file mode 100755 index 0000000..b82b810 --- /dev/null +++ b/tests/Dockerfiletest/run.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +SCRIPT_DIR=$(cd $(dirname $0); pwd) + +echo "running tests in ${SCRIPT_DIR}" + +for test in ${SCRIPT_DIR}/test_*.sh ; do + $test + if [ $? -ne 0 ]; then + exit 1 + fi +done diff --git a/tests/Dockerfiletest/test_gluster_dockerfile.sh b/tests/Dockerfiletest/test_gluster_dockerfile.sh new file mode 100755 index 0000000..fc52d44 --- /dev/null +++ b/tests/Dockerfiletest/test_gluster_dockerfile.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +SCRIPT_DIR=$(cd $(dirname ${0}); pwd) +TESTS_DIR="${SCRIPT_DIR}/.." +INC_DIR="${TESTS_DIR}/common" +BASE_DIR="${SCRIPT_DIR}/../.." +FAULTY_DOCKERFILE="${SCRIPT_DIR}/Dockerfile_faulty" + +source "${INC_DIR}/subunit.sh" + +check_dockerfilelint_invalid() { + local file="${1}" + check_dockerfilelint ${file} + if [[ "x$?" == "x0" ]]; then + echo "ERROR: parsing invalid Dockerfile succeeded" + return 1 + fi + + return 0 +} + +check_dockerfilelint() { + local file="${1}" + if ! which dockerfile_lint ; then + echo "dockerfile_lint not found: skipping..." + return 0 + fi + + dockerfile_lint -p -f ${file} +} + +failed=0 + + testit "check invalid Dockerfile" \ + check_dockerfilelint_invalid ${FAULTY_DOCKERFILE} \ + || ((failed++)) + + for Dockerfile in $(find ${BASE_DIR} -name "Dockerfile") ; do + testit "check Dockerfile_lint $(basename ${Dockerfile})" \ + check_dockerfilelint ${Dockerfile} \ + || ((failed++)) + done + + +testok $0 ${failed} diff --git a/tests/Makefile b/tests/Makefile new file mode 100644 index 0000000..13cf414 --- /dev/null +++ b/tests/Makefile @@ -0,0 +1,2 @@ +test: + ./run.sh diff --git a/tests/common/subunit.sh b/tests/common/subunit.sh new file mode 100755 index 0000000..71aba94 --- /dev/null +++ b/tests/common/subunit.sh @@ -0,0 +1,113 @@ +# +# subunit.sh: shell functions to report test status via the subunit protocol. +# Copyright (C) 2006 Robert Collins +# Copyright (C) 2008 Jelmer Vernooij +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +timestamp() { + # mark the start time. With Gnu date, you get nanoseconds from %N + # (here truncated to microseconds with %6N), but not on BSDs, + # Solaris, etc, which will apparently leave either %N or N at the end. + date -u +'time: %Y-%m-%d %H:%M:%S.%6NZ' | sed 's/\..*NZ$/.000000Z/' +} + +subunit_start_test () { + # emit the current protocol start-marker for test $1 + timestamp + echo "test: $1" +} + + +subunit_pass_test () { + # emit the current protocol test passed marker for test $1 + timestamp + echo "success: $1" +} + +# This is just a hack as we have some broken scripts +# which use "exit $failed", without initializing failed. +failed=0 + +subunit_fail_test () { + # emit the current protocol fail-marker for test $1, and emit stdin as + # the error text. + # we use stdin because the failure message can be arbitrarily long, and this + # makes it convenient to write in scripts (using <&1` + status=$? + if [ x$status = x0 ]; then + subunit_pass_test "$name" + else + echo "$output" | subunit_fail_test "$name" + fi + return $status +} + +testit_expect_failure () { + name="$1" + shift + cmdline="$*" + subunit_start_test "$name" + output=`$cmdline 2>&1` + status=$? + if [ x$status = x0 ]; then + echo "$output" | subunit_fail_test "$name" + else + subunit_pass_test "$name" + fi + return $status +} + +testok () { + name=`basename $1` + failed=$2 + + exit $failed +} diff --git a/tests/run.sh b/tests/run.sh new file mode 100755 index 0000000..baf6a48 --- /dev/null +++ b/tests/run.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +SCRIPT_DIR=$(cd $(dirname $0); pwd) + +for testdir in ${SCRIPT_DIR}/*; do + if [[ ! -d ${testdir} ]]; then + continue + fi + + if [[ ! -x ${testdir}/run.sh ]]; then + continue + fi + + pushd ${testdir} + ./run.sh + rc=$? + popd + + if [[ ${rc} -ne 0 ]]; then + exit 1 + fi +done diff --git a/tests/shelltest/Makefile b/tests/shelltest/Makefile new file mode 100644 index 0000000..13cf414 --- /dev/null +++ b/tests/shelltest/Makefile @@ -0,0 +1,2 @@ +test: + ./run.sh diff --git a/tests/shelltest/run.sh b/tests/shelltest/run.sh new file mode 100755 index 0000000..b82b810 --- /dev/null +++ b/tests/shelltest/run.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +SCRIPT_DIR=$(cd $(dirname $0); pwd) + +echo "running tests in ${SCRIPT_DIR}" + +for test in ${SCRIPT_DIR}/test_*.sh ; do + $test + if [ $? -ne 0 ]; then + exit 1 + fi +done diff --git a/tests/shelltest/test_gluster_container_basic.sh b/tests/shelltest/test_gluster_container_basic.sh new file mode 100755 index 0000000..8d139ca --- /dev/null +++ b/tests/shelltest/test_gluster_container_basic.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +SCRIPT_DIR=$(cd $(dirname ${0}); pwd) +TESTS_DIR="${SCRIPT_DIR}/.." +INC_DIR="${TESTS_DIR}/common" +BASE_DIR="${SCRIPT_DIR}/../.." + +GK_DEPLOY="${DEPLOY_DIR}/" + +source "${INC_DIR}/subunit.sh" + + +test_syntax() { + local file="${1}" + bash -n ${file} +} + +test_shellcheck() { + local file="${1}" + if ! which shellcheck ; then + echo "ShellCheck not found: skipping..." + return 0 + fi + + shellcheck -s bash -e SC2181 ${file} +} + +failed=0 + +testit "test script syntax ${BASE_DIR}/CentOS/gluster-setup.sh" \ + test_syntax ${BASE_DIR}/CentOS/gluster-setup.sh \ + || ((failed++)) + +testit "test shellcheck ${BASE_DIR}/CentOS/gluster-setup.sh" \ + test_shellcheck ${BASE_DIR}/CentOS/gluster-setup.sh \ + || ((failed++)) + +testit "test script syntax ${BASE_DIR}/gluster-object/CentOS/docker-gluster-swift/update_gluster_vol.sh" \ + test_syntax ${BASE_DIR}/gluster-object/CentOS/docker-gluster-swift/update_gluster_vol.sh \ + || ((failed++)) + +testit "test shellcheck ${BASE_DIR}/gluster-object/CentOS/docker-gluster-swift/update_gluster_vol.sh" \ + test_shellcheck ${BASE_DIR}/gluster-object/CentOS/docker-gluster-swift/update_gluster_vol.sh \ + || ((failed++)) + + +testok $0 ${failed} -- cgit v1.2.1