diff --git a/lib/core.sh b/lib/core.sh index 631931d..c6cc042 100644 --- a/lib/core.sh +++ b/lib/core.sh @@ -75,6 +75,10 @@ then else die "The variable JUJU_ENV is not properly set" fi + +CHROOT=${JUJU_HOME}/usr/bin/arch-chroot +TRUE=${JUJU_HOME}/usr/bin/true + ################################# MAIN FUNCTIONS ############################## function is_juju_installed(){ @@ -160,12 +164,12 @@ function run_juju_as_root(){ [ "$JUJU_ENV" == "1" ] && die "Error: The operation is not allowed inside JuJu environment" mkdir -p ${JUJU_HOME}/${HOME} - ${JUJU_HOME}/usr/bin/arch-chroot $JUJU_HOME /usr/bin/bash -c "mkdir -p /run/lock && $(_define_chroot_args "$@")" + ${CHROOT} $JUJU_HOME /usr/bin/bash -c "mkdir -p /run/lock && $(_define_chroot_args "$@")" } function _run_juju_with_proot(){ - if ${PROOT} ${JUJU_HOME}/usr/bin/true &> /dev/null + if ${PROOT} ${TRUE} &> /dev/null then JUJU_ENV=1 ${PROOT} $@ else diff --git a/tests/test_all.sh b/tests/test_all.sh new file mode 100755 index 0000000..684e6fd --- /dev/null +++ b/tests/test_all.sh @@ -0,0 +1,5 @@ + +for tst in $(ls $(dirname $0)/test_* | grep -v $(basename $0)) +do + $tst +done diff --git a/tests/test_core.sh b/tests/test_core.sh new file mode 100755 index 0000000..1a1dc77 --- /dev/null +++ b/tests/test_core.sh @@ -0,0 +1,154 @@ +#!/bin/bash +# To test this module you need to run it inside a Archlinux system. Also, the following packages needs to be installed: +# bash +# pacman +# arch-install-scripts +# proot +# coreutils +# grep +# sudo + +source "$(dirname $0)/utils.sh" +CURRPWD=$PWD +JUJU_HOME="" + +function set_up(){ + cd $CURRPWD + JUJU_HOME=$(TMPDIR=/tmp mktemp -d -t jujuhome.XXXXXXXXXX) + source "$(dirname $0)/../lib/core.sh" + ORIGIN_WD=$(TMPDIR=/tmp mktemp -d -t jujuowd.XXXXXXXXXX) + cd $ORIGIN_WD + JUJU_TEMPDIR=$(TMPDIR=/tmp mktemp -d -t jujutemp.XXXXXXXXXX) +} + + +function tear_down(){ + rm -rf $JUJU_HOME + rm -rf $ORIGIN_WD + rm -rf $JUJU_TEMPDIR +} + +function test_is_juju_installed(){ + is_juju_installed + is_equal $? 1 || return 1 + touch $JUJU_HOME/just_file + is_juju_installed + is_equal $? 0 || return 1 +} + + +function test_setup_juju(){ + wget_mock(){ + # Proof that the setup is happening + # inside $JUJU_TEMPDIR + local cwd=${PWD#${JUJU_TEMPDIR}} + local parent_dir=${PWD%${cwd}} + is_equal $JUJU_TEMPDIR ${parent_dir} || return 1 + touch file + tar -czvf juju-${ARCH}.tar.gz file + } + WGET=wget_mock + setup_juju 1> /dev/null + [ -e $JUJU_HOME/file ] || return 1 + [ -e $JUJU_HOME/run/lock ] || return 1 + + export -f setup_juju + JUJU_ENV=1 bash -ic "setup_juju" &> /dev/null + is_equal $? 1 || return 1 +} + + +function test_setup_from_file_juju(){ + touch file + tar -czvf juju-${ARCH}.tar.gz file 1> /dev/null + setup_from_file_juju juju-${ARCH}.tar.gz 1> /dev/null + [ -e $JUJU_HOME/file ] || return 1 + [ -e $JUJU_HOME/run/lock ] || return 1 + + export -f setup_from_file_juju + bash -ic "setup_from_file_juju noexist.tar.gz" &> /dev/null + is_equal $? 1 || return 1 + + export -f setup_from_file_juju + JUJU_ENV=1 bash -ic "setup_from_file_juju" &> /dev/null + is_equal $? 1 || return 1 +} + + +function test_run_juju_as_root(){ + install_mini_juju + CHROOT="sudo $CHROOT" + SH="type -t type" + local output=$(run_juju_as_root) + is_equal $output "builtin" || return 1 + local output=$(run_juju_as_root pwd) + is_equal $output "/" || return 1 + run_juju_as_root "[ -e /run/lock ]" + is_equal $? 0 || return 1 + [ -e $JUJU_HOME/${HOME} ] || return 1 + + export -f run_juju_as_root + JUJU_ENV=1 bash -ic "run_juju_as_root" &> /dev/null + is_equal $? 1 || return 1 +} + +function test_run_juju_as_user(){ + install_mini_juju + local output=$(run_juju_as_user "" "mkdir -v /newdir2") + is_equal "$output" "/usr/bin/mkdir: created directory '/newdir2'" || return 1 + [ -e $JUJU_HOME/newdir2 ] + is_equal $? 0 || return 1 + + SH="mkdir -v /newdir" + local output=$(run_juju_as_user "") + is_equal "$output" "/usr/bin/mkdir: created directory '/newdir'" || return 1 + [ -e $JUJU_HOME/newdir ] + is_equal $? 0 || return 1 +} + +function test_run_juju_as_user_proot_args(){ + install_mini_juju + run_juju_as_user "--help" "" 1> /dev/null + is_equal $? 0 || return 1 + run_juju_as_user "--helps" "" &> /dev/null + is_equal $? 1 || return 1 + + mkdir $JUJU_TEMPDIR/newdir + touch $JUJU_TEMPDIR/newdir/newfile + run_juju_as_user "-b $JUJU_TEMPDIR/newdir:/newdir" "ls -l /newdir/newfile" 1> /dev/null + is_equal $? 0 || return 1 +} + +#function test_run_juju_as_user_seccomp(){ + #install_mini_juju + #TRUE="/usr/bin/false" + #run_juju_as_user "" "env" "|" "grep" "PROOT_NO_SECCOMP" +#} + +#function test_run_juju_as_fakeroot(){ + #install_mini_juju + #local output=$(run_juju_as_fakeroot "" "bash") + #is_equal "$output" "root" || return 1 +#} + +function test_delete_juju(){ + install_mini_juju + echo "N" | delete_juju 1> /dev/null + is_juju_installed + is_equal $? 0 || return 1 + echo "Y" | delete_juju 1> /dev/null + is_juju_installed + is_equal $? 1 || return 1 + + export -f delete_juju + JUJU_ENV=1 bash -ic "delete_juju" &> /dev/null + is_equal $? 1 || return 1 +} + + +for func in $(declare -F | grep test_ | awk '{print $3}' | xargs) +do + set_up + $func && echo -e "${func}...\033[1;32mOK\033[0m" || echo -e "${func}...\033[1;31mFAIL\033[0m" + tear_down +done diff --git a/tests/util.sh b/tests/test_util.sh old mode 100644 new mode 100755 similarity index 93% rename from tests/util.sh rename to tests/test_util.sh index 0e39ad1..757f08f --- a/tests/util.sh +++ b/tests/test_util.sh @@ -1,9 +1,7 @@ +#!/bin/bash +source "$(dirname $0)/utils.sh" source "$(dirname $0)/../lib/util.sh" -function is_equal(){ - [ "$1" == "$2" ] || return 1 && return 0 -} - function test_echoerr(){ local actual=$(echoerr "Test" 2>&1) is_equal "$actual" "Test" || return 1 @@ -35,6 +33,8 @@ function test_die(){ local actual=$(die "Test" 2>&1) local expected=$(echo -e "\033[1;31mTest\033[0m") is_equal "$actual" "$expected" || return 1 + bash -ic "die Dying" &> /dev/null + is_equal $? 1 || return 1 return 0 } diff --git a/tests/utils.sh b/tests/utils.sh new file mode 100644 index 0000000..bd12d4e --- /dev/null +++ b/tests/utils.sh @@ -0,0 +1,51 @@ +function install_executable(){ + for i in $( ldd $* | grep -v dynamic | cut -d " " -f 3 | sed 's/://' | sort | uniq ) + do + cp --parents $i $JUJU_HOME + done + # ARCH amd64 + if [ -f /lib64/ld-linux-x86-64.so.2 ]; then + cp --parents /lib64/ld-linux-x86-64.so.2 $JUJU_HOME + fi + # ARCH i386 + if [ -f /lib/ld-linux.so.2 ]; then + cp --parents /lib/ld-linux.so.2 $JUJU_HOME + fi + cp --parent $* $JUJU_HOME/ +} + +function install_package(){ + pacman -Ql $1 | grep "/$" | sed 's/.* //' | xargs -I {} mkdir -p $JUJU_HOME/{} + pacman -Ql $1 | grep -v "/$" | sed 's/.* //' | xargs -I {} cp -f -a --parents {} $JUJU_HOME + #export -f install_executable + #export JUJU_HOME + #pacman -Ql $1 | sed 's/.* //' | grep "^/usr/bin/" | xargs -I {} bash -ic "install_executable {}" +} + +function install_mini_juju(){ + mkdir -p ${JUJU_HOME}/{proc,bin,sys,dev,run,tmp,etc} + touch ${JUJU_HOME}/etc/resolv.conf + mkdir -p ${JUJU_HOME}/usr/bin + #echo "root:x:0:0:root:/root:/bin/bash" > ${JUJU_HOME}/etc/passwd + #cp /etc/nsswitch.conf ${JUJU_HOME} + cp /usr/bin/arch-chroot ${JUJU_HOME}/usr/bin + install_executable /usr/bin/bash + install_executable /usr/bin/ls + install_executable /usr/bin/whoami + install_executable /usr/bin/grep + install_executable /usr/bin/mkdir + install_executable /usr/bin/proot + install_package bash + install_package talloc + install_package proot + install_package coreutils + install_package grep + ln -s /usr/bin/bash $JUJU_HOME/bin/sh +} + + +function is_equal(){ + [ "$1" == "$2" ] || return 1 && return 0 +} + +