mirror of
https://github.com/fsquillace/junest.git
synced 2026-01-23 02:34:30 +00:00
Issue #141: 🎨 Refactor code
This commit is contained in:
parent
b7f10dc55b
commit
ce3fefeab5
12 changed files with 631 additions and 448 deletions
11
LICENSE
11
LICENSE
|
|
@ -1,4 +1,6 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
|
|
@ -631,8 +633,8 @@ to attach them to the start of each source file to most effectively
|
|||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
{one line to give the program's name and a brief idea of what it does.}
|
||||
Copyright (C) {year} {name of author}
|
||||
JuNest: The Arch Linux based distro that runs upon any Linux distros without root access
|
||||
Copyright (C) 2014 Filippo Squillace
|
||||
|
||||
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
|
||||
|
|
@ -652,7 +654,7 @@ Also add information on how to contact you by electronic and paper mail.
|
|||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
{project} Copyright (C) {year} {fullname}
|
||||
JuNest Copyright (C) 2014 Filippo Squillace
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
|
@ -673,3 +675,4 @@ the library. If this is what you want to do, use the GNU Lesser General
|
|||
Public License instead of this License. But first, please read
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||
|
||||
|
||||
|
|
|
|||
1
VERSION
Normal file
1
VERSION
Normal file
|
|
@ -0,0 +1 @@
|
|||
5.6.7
|
||||
24
bin/jchroot
24
bin/jchroot
|
|
@ -1,30 +1,14 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# This file is part of JuNest (https://github.com/fsquillace/junest)
|
||||
#
|
||||
# Copyright (c) 2015
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU Library General Public License as published
|
||||
# by the Free Software Foundation; either version 2, 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, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
# This script is the simplified and portable version of arch-chroot
|
||||
# (https://wiki.archlinux.org/index.php/Change_root#Using_arch-chroot)
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
################################ IMPORTS ##################################
|
||||
source "$(dirname $0)/../lib/util.sh"
|
||||
JUNEST_BASE="$(readlink -f $(dirname $(readlink -f "$0"))/..)"
|
||||
|
||||
source "${JUNEST_BASE}/lib/utils.sh"
|
||||
|
||||
################################ MAIN FUNCTIONS ###########################
|
||||
|
||||
|
|
|
|||
35
bin/junest
35
bin/junest
|
|
@ -2,24 +2,10 @@
|
|||
#
|
||||
# This file is part of JuNest (https://github.com/fsquillace/junest).
|
||||
#
|
||||
# Copyright (c) 2015
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU Library General Public License as published
|
||||
# by the Free Software Foundation; either version 2, 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, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
JUNEST_BASE="$(dirname $0)/.."
|
||||
JUNEST_BASE="$(readlink -f $(dirname $(readlink -f "$0"))/..)"
|
||||
|
||||
source "${JUNEST_BASE}/lib/utils.sh"
|
||||
source "${JUNEST_BASE}/lib/core.sh"
|
||||
|
||||
###################################
|
||||
|
|
@ -27,7 +13,8 @@ source "${JUNEST_BASE}/lib/core.sh"
|
|||
###################################
|
||||
|
||||
usage() {
|
||||
echo -e "$NAME: $DESCRIPTION"
|
||||
echo -e "$NAME (v$(cat $JUNEST_BASE/VERSION)): $DESCRIPTION"
|
||||
echo
|
||||
echo -e "Usage: $CMD [options] [--] [command]"
|
||||
echo
|
||||
echo -e "Setup options:"
|
||||
|
|
@ -54,9 +41,7 @@ usage() {
|
|||
}
|
||||
|
||||
version() {
|
||||
echo -e "$NAME $VERSION ($CODE_NAME): $DESCRIPTION"
|
||||
echo -e "Copyright (c) $COPYRIGHT $AUTHOR"
|
||||
echo -e "Homepage: $HOMEPAGE"
|
||||
echo -e "$NAME $(cat $JUNEST_BASE/VERSION)"
|
||||
}
|
||||
|
||||
check_cli(){
|
||||
|
|
@ -225,7 +210,11 @@ function execute_operation(){
|
|||
fi
|
||||
}
|
||||
|
||||
parse_arguments "$@"
|
||||
check_cli
|
||||
execute_operation
|
||||
function cli() {
|
||||
parse_arguments "$@"
|
||||
check_cli
|
||||
execute_operation
|
||||
}
|
||||
|
||||
cli "$@"
|
||||
# vim: set ts=4 sw=4 noet:
|
||||
|
|
|
|||
175
lib/core.sh
175
lib/core.sh
|
|
@ -1,41 +1,17 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) 2015
|
||||
# This module contains all core functionalities for JuNest.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU Library General Public License as published
|
||||
# by the Free Software Foundation; either version 2, or (at your option)
|
||||
# any later version.
|
||||
# Dependencies:
|
||||
# - lib/utils.sh
|
||||
#
|
||||
# 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, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
# References:
|
||||
# https://wiki.archlinux.org/index.php/PKGBUILD
|
||||
# https://wiki.archlinux.org/index.php/Creating_Packages
|
||||
# vim: ft=sh
|
||||
|
||||
set -e
|
||||
|
||||
################################ IMPORTS #################################
|
||||
source "$(dirname ${BASH_ARGV[0]})/util.sh"
|
||||
|
||||
################################# VARIABLES ##############################
|
||||
|
||||
NAME='JuNest'
|
||||
CMD='junest'
|
||||
VERSION='5.6.7'
|
||||
CODE_NAME='Nitida'
|
||||
DESCRIPTION='The Arch Linux based distro that runs upon any Linux distros without root access'
|
||||
AUTHOR='Filippo Squillace <feel dot sqoox at gmail.com>'
|
||||
HOMEPAGE="https://github.com/fsquillace/${CMD}"
|
||||
COPYRIGHT='2012-2016'
|
||||
|
||||
|
||||
if [ "$JUNEST_ENV" == "1" ]
|
||||
then
|
||||
|
|
@ -101,6 +77,7 @@ WGET="wget --no-check-certificate"
|
|||
CURL="curl -L -J -O -k"
|
||||
TAR=tar
|
||||
CHOWN="chown"
|
||||
LN=ln
|
||||
|
||||
LD_EXEC="$LD_LIB --library-path ${JUNEST_HOME}/usr/lib:${JUNEST_HOME}/lib"
|
||||
|
||||
|
|
@ -109,7 +86,7 @@ LD_EXEC="$LD_LIB --library-path ${JUNEST_HOME}/usr/lib:${JUNEST_HOME}/lib"
|
|||
# image.
|
||||
|
||||
function ln_cmd(){
|
||||
ln $@ || $LD_EXEC ${JUNEST_HOME}/usr/bin/ln $@
|
||||
$LN $@ || $LD_EXEC ${JUNEST_HOME}/usr/bin/$LN $@
|
||||
}
|
||||
|
||||
function rm_cmd(){
|
||||
|
|
@ -148,6 +125,24 @@ function chroot_cmd(){
|
|||
|
||||
################################# MAIN FUNCTIONS ##############################
|
||||
|
||||
NOT_AVAILABLE_ARCH=102
|
||||
NOT_EXISTING_FILE=103
|
||||
ARCHITECTURE_MISMATCH=104
|
||||
ROOT_ACCESS_ERROR=105
|
||||
|
||||
#######################################
|
||||
# Check if the JuNest system is installed in JUNEST_HOME.
|
||||
#
|
||||
# Globals:
|
||||
# JUNEST_HOME (RO) : Contains the JuNest home directory.
|
||||
# Arguments:
|
||||
# None
|
||||
# Returns:
|
||||
# 0 : If JuNest is installed
|
||||
# 1 : If JuNest is not installed
|
||||
# Output:
|
||||
# None
|
||||
#######################################
|
||||
function is_env_installed(){
|
||||
[ -d "$JUNEST_HOME" ] && [ "$(ls -A $JUNEST_HOME)" ] && return 0
|
||||
return 1
|
||||
|
|
@ -155,8 +150,8 @@ function is_env_installed(){
|
|||
|
||||
|
||||
function _cleanup_build_directory(){
|
||||
# $1: maindir (optional) - str: build directory to get rid
|
||||
local maindir=$1
|
||||
check_not_null "$maindir"
|
||||
builtin cd $ORIGIN_WD
|
||||
trap - QUIT EXIT ABRT KILL TERM INT
|
||||
rm_cmd -fr "$maindir"
|
||||
|
|
@ -164,15 +159,20 @@ function _cleanup_build_directory(){
|
|||
|
||||
|
||||
function _prepare_build_directory(){
|
||||
local maindir=$1
|
||||
check_not_null "$maindir"
|
||||
trap - QUIT EXIT ABRT KILL TERM INT
|
||||
trap "rm_cmd -rf ${maindir}; die \"Error occurred when installing ${NAME}\"" EXIT QUIT ABRT KILL TERM INT
|
||||
}
|
||||
|
||||
|
||||
function _setup_env(){
|
||||
local imagepath=$1
|
||||
check_not_null "$imagepath"
|
||||
|
||||
is_env_installed && die "Error: ${NAME} has been already installed in $JUNEST_HOME"
|
||||
|
||||
mkdir_cmd -p "${JUNEST_HOME}"
|
||||
imagepath=$1
|
||||
$TAR -zxpf ${imagepath} -C ${JUNEST_HOME}
|
||||
mkdir_cmd -p ${JUNEST_HOME}/run/lock
|
||||
info "The default mirror URL is ${DEFAULT_MIRROR}."
|
||||
|
|
@ -182,14 +182,33 @@ function _setup_env(){
|
|||
}
|
||||
|
||||
|
||||
#######################################
|
||||
# Setup JuNest.
|
||||
#
|
||||
# Globals:
|
||||
# JUNEST_HOME (RO) : The JuNest home directory in which JuNest needs
|
||||
# to be installed.
|
||||
# ARCH (RO) : The host architecture.
|
||||
# JUNEST_TEMPDIR (RO) : The JuNest temporary directory for building
|
||||
# the JuNest system from the image.
|
||||
# ENV_REPO (RO) : URL of the site containing JuNest images.
|
||||
# NAME (RO) : The JuNest name.
|
||||
# DEFAULT_MIRROR (RO) : Arch Linux URL mirror.
|
||||
# Arguments:
|
||||
# arch ($1?) : The JuNest architecture image to download.
|
||||
# Defaults to the host architecture
|
||||
# Returns:
|
||||
# $NOT_AVAILABLE_ARCH : If the architecture is not one of the available ones.
|
||||
# Output:
|
||||
# None
|
||||
#######################################
|
||||
function setup_env(){
|
||||
local arch=$ARCH
|
||||
[ -z $1 ] || arch="$1"
|
||||
local arch=${1:-$ARCH}
|
||||
contains_element $arch "${ARCH_LIST[@]}" || \
|
||||
die "The architecture is not one of: ${ARCH_LIST[@]}"
|
||||
die_on_status $NOT_AVAILABLE_ARCH "The architecture is not one of: ${ARCH_LIST[@]}"
|
||||
|
||||
local maindir=$(TMPDIR=$JUNEST_TEMPDIR mktemp -d -t ${CMD}.XXXXXXXXXX)
|
||||
_prepare_build_directory
|
||||
_prepare_build_directory $maindir
|
||||
|
||||
info "Downloading ${NAME}..."
|
||||
builtin cd ${maindir}
|
||||
|
|
@ -202,21 +221,51 @@ function setup_env(){
|
|||
_cleanup_build_directory ${maindir}
|
||||
}
|
||||
|
||||
|
||||
#######################################
|
||||
# Setup JuNest from file.
|
||||
#
|
||||
# Globals:
|
||||
# JUNEST_HOME (RO) : The JuNest home directory in which JuNest needs
|
||||
# to be installed.
|
||||
# NAME (RO) : The JuNest name.
|
||||
# DEFAULT_MIRROR (RO) : Arch Linux URL mirror.
|
||||
# Arguments:
|
||||
# imagefile ($1) : The JuNest image file.
|
||||
# Returns:
|
||||
# $NOT_EXISTING_FILE : If the image file does not exist.
|
||||
# Output:
|
||||
# None
|
||||
#######################################
|
||||
function setup_env_from_file(){
|
||||
local imagefile=$1
|
||||
[ ! -e ${imagefile} ] && die "Error: The ${NAME} image file ${imagefile} does not exist"
|
||||
check_not_null "$imagefile"
|
||||
[ ! -e ${imagefile} ] && die_on_status $NOT_EXISTING_FILE "Error: The ${NAME} image file ${imagefile} does not exist"
|
||||
|
||||
info "Installing ${NAME} from ${imagefile}..."
|
||||
_setup_env ${imagefile}
|
||||
|
||||
builtin cd $ORIGIN_WD
|
||||
}
|
||||
|
||||
#######################################
|
||||
# Run JuNest as real root.
|
||||
#
|
||||
# Globals:
|
||||
# JUNEST_HOME (RO) : The JuNest home directory.
|
||||
# UID (RO) : The user ID.
|
||||
# SUDO_USER (RO) : The sudo user ID.
|
||||
# SUDO_GID (RO) : The sudo group ID.
|
||||
# SH (RO) : Contains the default command to run in JuNest.
|
||||
# Arguments:
|
||||
# cmd ($@?) : The command to run inside JuNest environment.
|
||||
# Default command is defined by SH variable.
|
||||
# Returns:
|
||||
# $ARCHITECTURE_MISMATCH : If host and JuNest architecture are different.
|
||||
# Output:
|
||||
# - : The command output.
|
||||
#######################################
|
||||
function run_env_as_root(){
|
||||
source ${JUNEST_HOME}/etc/junest/info
|
||||
[ "$JUNEST_ARCH" != "$ARCH" ] && \
|
||||
die "The host system architecture is not correct: $ARCH != $JUNEST_ARCH"
|
||||
die_on_status $ARCHITECTURE_MISMATCH "The host system architecture is not correct: $ARCH != $JUNEST_ARCH"
|
||||
|
||||
local uid=$UID
|
||||
# SUDO_USER is more reliable compared to SUDO_UID
|
||||
|
|
@ -268,18 +317,48 @@ function _run_env_with_qemu(){
|
|||
_run_env_with_proot "$proot_args" "${@}"
|
||||
}
|
||||
|
||||
#######################################
|
||||
# Run JuNest as fakeroot.
|
||||
#
|
||||
# Globals:
|
||||
# JUNEST_HOME (RO) : The JuNest home directory.
|
||||
# EUID (RO) : The user ID.
|
||||
# SH (RO) : Contains the default command to run in JuNest.
|
||||
# Arguments:
|
||||
# cmd ($@?) : The command to run inside JuNest environment.
|
||||
# Default command is defined by SH variable.
|
||||
# Returns:
|
||||
# $ROOT_ACCESS_ERROR : If the user is the real root.
|
||||
# Output:
|
||||
# - : The command output.
|
||||
#######################################
|
||||
function run_env_as_fakeroot(){
|
||||
(( EUID == 0 )) && \
|
||||
die "You cannot access with root privileges. Use --root option instead."
|
||||
die_on_status $ROOT_ACCESS_ERROR "You cannot access with root privileges. Use --root option instead."
|
||||
# The mtab file should already be available in the image.
|
||||
# This following instruction will be deleted
|
||||
[ ! -e ${JUNEST_HOME}/etc/mtab ] && ln_cmd -s /proc/self/mounts ${JUNEST_HOME}/etc/mtab
|
||||
_run_env_with_qemu "-S ${JUNEST_HOME} $1" "${@:2}"
|
||||
}
|
||||
|
||||
#######################################
|
||||
# Run JuNest as normal user.
|
||||
#
|
||||
# Globals:
|
||||
# JUNEST_HOME (RO) : The JuNest home directory.
|
||||
# EUID (RO) : The user ID.
|
||||
# SH (RO) : Contains the default command to run in JuNest.
|
||||
# Arguments:
|
||||
# cmd ($@?) : The command to run inside JuNest environment.
|
||||
# Default command is defined by SH variable.
|
||||
# Returns:
|
||||
# $ROOT_ACCESS_ERROR : If the user is the real root.
|
||||
# Output:
|
||||
# - : The command output.
|
||||
#######################################
|
||||
function run_env_as_user(){
|
||||
(( EUID == 0 )) && \
|
||||
die "You cannot access with root privileges. Use --root option instead."
|
||||
die_on_status $ROOT_ACCESS_ERROR "You cannot access with root privileges. Use --root option instead."
|
||||
# The mtab file should already be available in the image.
|
||||
# This following instruction will be deleted
|
||||
[ ! -e ${JUNEST_HOME}/etc/mtab ] && ln_cmd -s /proc/self/mounts ${JUNEST_HOME}/etc/mtab
|
||||
|
|
@ -298,6 +377,18 @@ function _provide_bindings_as_user(){
|
|||
echo $existing_bindings
|
||||
}
|
||||
|
||||
#######################################
|
||||
# Remove an existing JuNest system.
|
||||
#
|
||||
# Globals:
|
||||
# JUNEST_HOME (RO) : The JuNest home directory to remove.
|
||||
# Arguments:
|
||||
# None
|
||||
# Returns:
|
||||
# None
|
||||
# Output:
|
||||
# None
|
||||
#######################################
|
||||
function delete_env(){
|
||||
! ask "Are you sure to delete ${NAME} located in ${JUNEST_HOME}" "N" && return
|
||||
if mountpoint -q ${JUNEST_HOME}
|
||||
|
|
|
|||
93
lib/util.sh
93
lib/util.sh
|
|
@ -1,93 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# This file is part of JuNest (https://github.com/fsquillace/junest)
|
||||
#
|
||||
# Copyright (c) 2015
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU Library General Public License as published
|
||||
# by the Free Software Foundation; either version 2, 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, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
function echoerr(){
|
||||
echo "$@" 1>&2
|
||||
}
|
||||
function die(){
|
||||
# $@: msg (mandatory) - str: Message to print
|
||||
error $@
|
||||
exit 1
|
||||
}
|
||||
function error(){
|
||||
# $@: msg (mandatory) - str: Message to print
|
||||
echoerr -e "\033[1;31m$@\033[0m"
|
||||
}
|
||||
function warn(){
|
||||
# $@: msg (mandatory) - str: Message to print
|
||||
echoerr -e "\033[1;33m$@\033[0m"
|
||||
}
|
||||
function info(){
|
||||
# $@: msg (mandatory) - str: Message to print
|
||||
echo -e "\033[1;37m$@\033[0m"
|
||||
}
|
||||
|
||||
function ask(){
|
||||
# $1: question string
|
||||
# $2: default value - can be either Y, y, N, n (by default Y)
|
||||
|
||||
local default="Y"
|
||||
[ -z $2 ] || default=$(echo "$2" | tr '[:lower:]' '[:upper:]')
|
||||
|
||||
local other="n"
|
||||
[ "$default" == "N" ] && other="y"
|
||||
|
||||
local prompt="$1 (${default}/${other})> "
|
||||
|
||||
local res="none"
|
||||
while [ "$res" != "Y" ] && [ "$res" != "N" ] && [ "$res" != "" ];
|
||||
do
|
||||
read -p "$prompt" res
|
||||
res=$(echo "$res" | tr '[:lower:]' '[:upper:]')
|
||||
done
|
||||
|
||||
[ "$res" == "" ] && res="$default"
|
||||
|
||||
if [ "$res" == "Y" ]
|
||||
then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
function insert_quotes_on_spaces(){
|
||||
# It inserts quotes between arguments.
|
||||
# Useful to preserve quotes on command
|
||||
# to be used inside sh -c/bash -c
|
||||
C=''
|
||||
whitespace="[[:space:]]"
|
||||
for i in "$@"
|
||||
do
|
||||
if [[ $i =~ $whitespace ]]
|
||||
then
|
||||
C="$C \"$i\""
|
||||
else
|
||||
C="$C $i"
|
||||
fi
|
||||
done
|
||||
echo $C
|
||||
}
|
||||
|
||||
contains_element () {
|
||||
local e
|
||||
for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
|
||||
return 1
|
||||
}
|
||||
195
lib/utils.sh
Normal file
195
lib/utils.sh
Normal file
|
|
@ -0,0 +1,195 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
NULL_EXCEPTION=11
|
||||
WRONG_ANSWER=33
|
||||
|
||||
#######################################
|
||||
# Check if the argument is null.
|
||||
#
|
||||
# Globals:
|
||||
# None
|
||||
# Arguments:
|
||||
# argument ($1) : Argument to check.
|
||||
# Returns:
|
||||
# 0 : If argument is not null.
|
||||
# NULL_EXCEPTION : If argument is null.
|
||||
# Output:
|
||||
# None
|
||||
#######################################
|
||||
function check_not_null() {
|
||||
[ -z "$1" ] && { error "Error: null argument $1"; return $NULL_EXCEPTION; }
|
||||
return 0
|
||||
}
|
||||
|
||||
#######################################
|
||||
# Redirect message to stderr.
|
||||
#
|
||||
# Globals:
|
||||
# None
|
||||
# Arguments:
|
||||
# msg ($@): Message to print.
|
||||
# Returns:
|
||||
# None
|
||||
# Output:
|
||||
# Message printed to stderr.
|
||||
#######################################
|
||||
function echoerr() {
|
||||
echo "$@" 1>&2;
|
||||
}
|
||||
|
||||
#######################################
|
||||
# Print an error message to stderr and exit program.
|
||||
#
|
||||
# Globals:
|
||||
# None
|
||||
# Arguments:
|
||||
# msg ($@) : Message to print.
|
||||
# Returns:
|
||||
# 1 : The unique exit status printed.
|
||||
# Output:
|
||||
# Message printed to stderr.
|
||||
#######################################
|
||||
function die() {
|
||||
error $@
|
||||
exit 1
|
||||
}
|
||||
|
||||
#######################################
|
||||
# Print an error message to stderr and exit program with a given status.
|
||||
#
|
||||
# Globals:
|
||||
# None
|
||||
# Arguments:
|
||||
# status ($1) : The exit status to use.
|
||||
# msg ($2-) : Message to print.
|
||||
# Returns:
|
||||
# $? : The $status exit status.
|
||||
# Output:
|
||||
# Message printed to stderr.
|
||||
#######################################
|
||||
function die_on_status() {
|
||||
status=$1
|
||||
shift
|
||||
error $@
|
||||
exit $status
|
||||
}
|
||||
|
||||
#######################################
|
||||
# Print an error message to stderr.
|
||||
#
|
||||
# Globals:
|
||||
# None
|
||||
# Arguments:
|
||||
# msg ($@): Message to print.
|
||||
# Returns:
|
||||
# None
|
||||
# Output:
|
||||
# Message printed to stderr.
|
||||
#######################################
|
||||
function error() {
|
||||
echoerr -e "\033[1;31m$@\033[0m"
|
||||
}
|
||||
|
||||
#######################################
|
||||
# Print a warn message to stderr.
|
||||
#
|
||||
# Globals:
|
||||
# None
|
||||
# Arguments:
|
||||
# msg ($@): Message to print.
|
||||
# Returns:
|
||||
# None
|
||||
# Output:
|
||||
# Message printed to stderr.
|
||||
#######################################
|
||||
function warn() {
|
||||
# $@: msg (mandatory) - str: Message to print
|
||||
echoerr -e "\033[1;33m$@\033[0m"
|
||||
}
|
||||
|
||||
#######################################
|
||||
# Print an info message to stdout.
|
||||
#
|
||||
# Globals:
|
||||
# None
|
||||
# Arguments:
|
||||
# msg ($@): Message to print.
|
||||
# Returns:
|
||||
# None
|
||||
# Output:
|
||||
# Message printed to stdout.
|
||||
#######################################
|
||||
function info(){
|
||||
echo -e "\033[1;36m$@\033[0m"
|
||||
}
|
||||
|
||||
#######################################
|
||||
# Ask a question and wait to receive an answer from stdin.
|
||||
# It returns $default_answer if no answer has be received from stdin.
|
||||
#
|
||||
# Globals:
|
||||
# None
|
||||
# Arguments:
|
||||
# question ($1) : The question to ask.
|
||||
# default_answer ($2) : Possible values: 'Y', 'y', 'N', 'n' (default: 'Y')
|
||||
# Returns:
|
||||
# 0 : If user replied with either 'Y' or 'y'.
|
||||
# 1 : If user replied with either 'N' or 'n'.
|
||||
# WRONG_ANSWER : If `default_answer` is not one of the possible values.
|
||||
# Output:
|
||||
# Print the question to ask.
|
||||
#######################################
|
||||
function ask(){
|
||||
local question=$1
|
||||
local default_answer=$2
|
||||
check_not_null $question
|
||||
|
||||
if [ ! -z "$default_answer" ]
|
||||
then
|
||||
local answers="Y y N n"
|
||||
[[ "$answers" =~ "$default_answer" ]] || { error "The default answer: $default_answer is wrong."; return $WRONG_ANSWER; }
|
||||
fi
|
||||
|
||||
local default="Y"
|
||||
[ -z "$default_answer" ] || default=$(echo "$default_answer" | tr '[:lower:]' '[:upper:]')
|
||||
|
||||
local other="n"
|
||||
[ "$default" == "N" ] && other="y"
|
||||
|
||||
local prompt=$(info "$question (${default}/${other})> ")
|
||||
|
||||
local res="none"
|
||||
while [ "$res" != "Y" ] && [ "$res" != "N" ] && [ "$res" != "" ];
|
||||
do
|
||||
read -p "$prompt" res
|
||||
res=$(echo "$res" | tr '[:lower:]' '[:upper:]')
|
||||
done
|
||||
|
||||
[ "$res" == "" ] && res="$default"
|
||||
|
||||
[ "$res" == "Y" ]
|
||||
}
|
||||
|
||||
function insert_quotes_on_spaces(){
|
||||
# It inserts quotes between arguments.
|
||||
# Useful to preserve quotes on command
|
||||
# to be used inside sh -c/bash -c
|
||||
C=''
|
||||
whitespace="[[:space:]]"
|
||||
for i in "$@"
|
||||
do
|
||||
if [[ $i =~ $whitespace ]]
|
||||
then
|
||||
C="$C \"$i\""
|
||||
else
|
||||
C="$C $i"
|
||||
fi
|
||||
done
|
||||
echo $C
|
||||
}
|
||||
|
||||
contains_element () {
|
||||
local e
|
||||
for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
|
||||
return 1
|
||||
}
|
||||
|
|
@ -1,9 +1,15 @@
|
|||
#!/bin/bash
|
||||
source "$(dirname $0)/utils.sh"
|
||||
|
||||
source $(dirname $0)/../bin/junest -h &> /dev/null
|
||||
|
||||
# Disable the exiterr
|
||||
set +e
|
||||
|
||||
function oneTimeSetUp(){
|
||||
setUpUnitTests
|
||||
}
|
||||
|
||||
function setUp(){
|
||||
function is_env_installed(){
|
||||
return 0
|
||||
|
|
@ -51,152 +57,125 @@ function run_env_as_user(){
|
|||
echo "run_env_as_user($proot_args,$@)"
|
||||
}
|
||||
|
||||
function wrap_env(){
|
||||
parse_arguments "$@"
|
||||
check_cli
|
||||
execute_operation
|
||||
}
|
||||
|
||||
function test_help(){
|
||||
local output=$(wrap_env -h)
|
||||
assertEquals $output "usage"
|
||||
local output=$(wrap_env --help)
|
||||
assertEquals $output "usage"
|
||||
assertCommandSuccess cli -h
|
||||
assertEquals "usage" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess cli --help
|
||||
assertEquals "usage" "$(cat $STDOUTF)"
|
||||
}
|
||||
function test_version(){
|
||||
local output=$(wrap_env -v)
|
||||
assertEquals $output "version"
|
||||
local output=$(wrap_env --version)
|
||||
assertEquals $output "version"
|
||||
assertCommandSuccess cli -v
|
||||
assertEquals "version" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess cli --version
|
||||
assertEquals "version" "$(cat $STDOUTF)"
|
||||
}
|
||||
function test_build_image_env(){
|
||||
local output=$(wrap_env -b)
|
||||
assertEquals $output "build_image_env(false,false)"
|
||||
local output=$(wrap_env --build-image)
|
||||
assertEquals $output "build_image_env(false,false)"
|
||||
local output=$(wrap_env -b -s)
|
||||
assertEquals $output "build_image_env(false,true)"
|
||||
local output=$(wrap_env -b -n)
|
||||
assertEquals $output "build_image_env(true,false)"
|
||||
local output=$(wrap_env -b -n -s)
|
||||
assertEquals $output "build_image_env(true,true)"
|
||||
local output=$(wrap_env --build-image --disable-validation --skip-root-tests)
|
||||
assertEquals $output "build_image_env(true,true)"
|
||||
assertCommandSuccess cli -b
|
||||
assertEquals "build_image_env(false,false)" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess cli --build-image
|
||||
assertEquals "build_image_env(false,false)" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess cli -b -s
|
||||
assertEquals "build_image_env(false,true)" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess cli -b -n
|
||||
assertEquals "build_image_env(true,false)" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess cli -b -n -s
|
||||
assertEquals "build_image_env(true,true)" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess cli --build-image --disable-validation --skip-root-tests
|
||||
assertEquals "build_image_env(true,true)" "$(cat $STDOUTF)"
|
||||
}
|
||||
function test_check_env(){
|
||||
local output=$(wrap_env -c myscript)
|
||||
assertEquals $output "check_env(${JUNEST_HOME},myscript,false)"
|
||||
local output=$(wrap_env --check myscript)
|
||||
assertEquals $output "check_env(${JUNEST_HOME},myscript,false)"
|
||||
local output=$(wrap_env -c myscript -s)
|
||||
assertEquals $output "check_env(${JUNEST_HOME},myscript,true)"
|
||||
local output=$(wrap_env --check myscript --skip-root-tests)
|
||||
assertEquals $output "check_env(${JUNEST_HOME},myscript,true)"
|
||||
assertCommandSuccess cli -c myscript
|
||||
assertEquals "check_env(${JUNEST_HOME},myscript,false)" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess cli --check myscript
|
||||
assertEquals "check_env(${JUNEST_HOME},myscript,false)" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess cli -c myscript -s
|
||||
assertEquals "check_env(${JUNEST_HOME},myscript,true)" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess cli --check myscript --skip-root-tests
|
||||
assertEquals "check_env(${JUNEST_HOME},myscript,true)" "$(cat $STDOUTF)"
|
||||
}
|
||||
function test_delete_env(){
|
||||
local output=$(wrap_env -d)
|
||||
assertEquals $output "delete_env"
|
||||
local output=$(wrap_env --delete)
|
||||
assertEquals $output "delete_env"
|
||||
assertCommandSuccess cli -d
|
||||
assertEquals "delete_env" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess cli --delete
|
||||
assertEquals "delete_env" "$(cat $STDOUTF)"
|
||||
}
|
||||
#function test_setup_env_from_file(){
|
||||
#local output=$(wrap_env -i myimage)
|
||||
#assertEquals $output "setup_env_from_file(myimage)"
|
||||
#local output=$(wrap_env --setup-from-file myimage)
|
||||
#assertEquals $output "setup_env_from_file(myimage)"
|
||||
#}
|
||||
function test_setup_env_from_file(){
|
||||
is_env_installed(){
|
||||
return 1
|
||||
}
|
||||
local output=$(wrap_env -i myimage)
|
||||
assertEquals "$output" "$(echo -e "setup_env_from_file(myimage)\nrun_env_as_user(,)")"
|
||||
local output=$(wrap_env --setup-from-file myimage)
|
||||
assertEquals "$output" "$(echo -e "setup_env_from_file(myimage)\nrun_env_as_user(,)")"
|
||||
assertCommandSuccess cli -i myimage
|
||||
assertEquals "$(echo -e "setup_env_from_file(myimage)\nrun_env_as_user(,)")" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess cli --setup-from-file myimage
|
||||
assertEquals "$(echo -e "setup_env_from_file(myimage)\nrun_env_as_user(,)")" "$(cat $STDOUTF)"
|
||||
|
||||
is_env_installed(){
|
||||
return 0
|
||||
}
|
||||
$(wrap_env -i myimage 2> /dev/null)
|
||||
assertEquals 1 $?
|
||||
assertCommandFail cli -i myimage
|
||||
}
|
||||
|
||||
function test_setup_env(){
|
||||
is_env_installed(){
|
||||
return 1
|
||||
}
|
||||
local output=$(wrap_env -a arm)
|
||||
assertEquals "$output" "$(echo -e "setup_env(arm)\nrun_env_as_user(,)")"
|
||||
local output=$(wrap_env --arch arm)
|
||||
assertEquals "$output" "$(echo -e "setup_env(arm)\nrun_env_as_user(,)")"
|
||||
local output=$(wrap_env)
|
||||
assertEquals "$output" "$(echo -e "setup_env()\nrun_env_as_user(,)")"
|
||||
assertCommandSuccess cli -a arm
|
||||
assertEquals "$(echo -e "setup_env(arm)\nrun_env_as_user(,)")" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess cli --arch arm
|
||||
assertEquals "$(echo -e "setup_env(arm)\nrun_env_as_user(,)")" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess cli
|
||||
assertEquals "$(echo -e "setup_env()\nrun_env_as_user(,)")" "$(cat $STDOUTF)"
|
||||
|
||||
is_env_installed(){
|
||||
return 0
|
||||
}
|
||||
$(wrap_env -a arm 2> /dev/null)
|
||||
assertEquals 1 $?
|
||||
assertCommandFail cli -a arm
|
||||
}
|
||||
function test_run_env_as_fakeroot(){
|
||||
local output=$(wrap_env -f)
|
||||
assertEquals $output "run_env_as_fakeroot(,)"
|
||||
local output=$(wrap_env --fakeroot)
|
||||
assertEquals $output "run_env_as_fakeroot(,)"
|
||||
assertCommandSuccess cli -f
|
||||
assertEquals "run_env_as_fakeroot(,)" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess cli --fakeroot
|
||||
assertEquals "run_env_as_fakeroot(,)" "$(cat $STDOUTF)"
|
||||
|
||||
local output=$(wrap_env -f -p "-b arg")
|
||||
assertEquals "${output[@]}" "run_env_as_fakeroot(-b arg,)"
|
||||
local output=$(wrap_env -f -p "-b arg" -- command -kv)
|
||||
assertEquals "${output[@]}" "run_env_as_fakeroot(-b arg,command -kv)"
|
||||
local output=$(wrap_env -f command --as)
|
||||
assertEquals "${output[@]}" "run_env_as_fakeroot(,command --as)"
|
||||
$(wrap_env -a "myarch" -f command --as 2> /dev/null)
|
||||
assertEquals 1 $?
|
||||
assertCommandSuccess cli -f -p "-b arg"
|
||||
assertEquals "run_env_as_fakeroot(-b arg,)" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess cli -f -p "-b arg" -- command -kv
|
||||
assertEquals "run_env_as_fakeroot(-b arg,command -kv)" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess cli -f command --as
|
||||
assertEquals "run_env_as_fakeroot(,command --as)" "$(cat $STDOUTF)"
|
||||
assertCommandFail cli -a "myarch" -f command --as
|
||||
}
|
||||
function test_run_env_as_user(){
|
||||
local output=$(wrap_env)
|
||||
assertEquals $output "run_env_as_user(,)"
|
||||
assertCommandSuccess cli
|
||||
assertEquals "run_env_as_user(,)" "$(cat $STDOUTF)"
|
||||
|
||||
local output=$(wrap_env -p "-b arg")
|
||||
assertEquals "$output" "run_env_as_user(-b arg,)"
|
||||
local output=$(wrap_env -p "-b arg" -- command -ll)
|
||||
assertEquals "$output" "run_env_as_user(-b arg,command -ll)"
|
||||
local output=$(wrap_env command -ls)
|
||||
assertEquals "$output" "run_env_as_user(,command -ls)"
|
||||
$(wrap_env -a "myarch" -- command -ls 2> /dev/null)
|
||||
assertEquals 1 $?
|
||||
assertCommandSuccess cli -p "-b arg"
|
||||
assertEquals "run_env_as_user(-b arg,)" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess cli -p "-b arg" -- command -ll
|
||||
assertEquals "run_env_as_user(-b arg,command -ll)" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess cli command -ls
|
||||
assertEquals "run_env_as_user(,command -ls)" "$(cat $STDOUTF)"
|
||||
|
||||
assertCommandFail cli -a "myarch" -- command -ls
|
||||
}
|
||||
function test_run_env_as_root(){
|
||||
local output=$(wrap_env -r)
|
||||
assertEquals $output "run_env_as_root"
|
||||
|
||||
local output=$(wrap_env -r command)
|
||||
assertEquals "${output[@]}" "run_env_as_root command"
|
||||
assertCommandSuccess cli -r
|
||||
assertEquals "run_env_as_root " "$(cat $STDOUTF)"
|
||||
assertCommandSuccess cli -r command
|
||||
assertEquals "run_env_as_root command" "$(cat $STDOUTF)"
|
||||
}
|
||||
|
||||
function test_check_cli(){
|
||||
$(wrap_env -b -h 2> /dev/null)
|
||||
assertEquals $? 1
|
||||
$(wrap_env -b -c 2> /dev/null)
|
||||
assertEquals $? 1
|
||||
$(wrap_env -d -s 2> /dev/null)
|
||||
assertEquals $? 1
|
||||
$(wrap_env -n -v 2> /dev/null)
|
||||
assertEquals $? 1
|
||||
$(wrap_env -d -r 2> /dev/null)
|
||||
assertEquals $? 1
|
||||
$(wrap_env -h -f 2> /dev/null)
|
||||
assertEquals $? 1
|
||||
$(wrap_env -v -i fsd 2> /dev/null)
|
||||
assertEquals $? 1
|
||||
$(wrap_env -f -r 2> /dev/null)
|
||||
assertEquals $? 1
|
||||
$(wrap_env -p args -v 2> /dev/null)
|
||||
assertEquals $? 1
|
||||
$(wrap_env -a arch -v 2> /dev/null)
|
||||
assertEquals $? 1
|
||||
$(wrap_env -d args 2> /dev/null)
|
||||
assertEquals $? 1
|
||||
assertCommandFail cli -b -h
|
||||
assertCommandFail cli -b -c
|
||||
assertCommandFail cli -d -s
|
||||
assertCommandFail cli -n -v
|
||||
assertCommandFail cli -d -r
|
||||
assertCommandFail cli -h -f
|
||||
assertCommandFail cli -v -i fsd
|
||||
assertCommandFail cli -f -r
|
||||
assertCommandFail cli -p args -v
|
||||
assertCommandFail cli -a arch -v
|
||||
assertCommandFail cli -d args
|
||||
}
|
||||
|
||||
source $(dirname $0)/shunit2
|
||||
|
|
|
|||
|
|
@ -1,12 +1,17 @@
|
|||
#!/bin/bash
|
||||
source "$(dirname $0)/utils.sh"
|
||||
|
||||
# Disable the exiterr
|
||||
set +e
|
||||
|
||||
function oneTimeSetUp(){
|
||||
[ -z "$SKIP_ROOT_TESTS" ] && SKIP_ROOT_TESTS=0
|
||||
|
||||
CURRPWD=$PWD
|
||||
ENV_MAIN_HOME=/tmp/envtesthome
|
||||
[ -e $ENV_MAIN_HOME ] || JUNEST_HOME=$ENV_MAIN_HOME bash --rcfile "$(dirname $0)/../lib/core.sh" -ic "setup_env"
|
||||
ENV_MAIN_HOME=/tmp/junest-test-home
|
||||
[ -e $ENV_MAIN_HOME ] || JUNEST_HOME=$ENV_MAIN_HOME bash -ic "source $CURRPWD/$(dirname $0)/../lib/utils.sh; source $CURRPWD/$(dirname $0)/../lib/core.sh; setup_env"
|
||||
JUNEST_HOME=""
|
||||
setUpUnitTests
|
||||
}
|
||||
|
||||
function install_mini_env(){
|
||||
|
|
@ -17,6 +22,7 @@ function setUp(){
|
|||
cd $CURRPWD
|
||||
JUNEST_HOME=$(TMPDIR=/tmp mktemp -d -t envhome.XXXXXXXXXX)
|
||||
JUNEST_BASE="$CURRPWD/$(dirname $0)/.."
|
||||
source "${JUNEST_BASE}/lib/utils.sh"
|
||||
source "${JUNEST_BASE}/lib/core.sh"
|
||||
ORIGIN_WD=$(TMPDIR=/tmp mktemp -d -t envowd.XXXXXXXXXX)
|
||||
cd $ORIGIN_WD
|
||||
|
|
@ -40,42 +46,36 @@ function tearDown(){
|
|||
|
||||
|
||||
function test_is_env_installed(){
|
||||
is_env_installed
|
||||
assertEquals $? 1
|
||||
assertCommandFail is_env_installed
|
||||
touch $JUNEST_HOME/just_file
|
||||
is_env_installed
|
||||
assertEquals $? 0
|
||||
assertCommandSuccess is_env_installed
|
||||
}
|
||||
|
||||
|
||||
function test_download(){
|
||||
WGET=/bin/true
|
||||
CURL=/bin/false
|
||||
download_cmd
|
||||
assertEquals $? 0
|
||||
assertCommandSuccess download_cmd
|
||||
|
||||
WGET=/bin/false
|
||||
CURL=/bin/true
|
||||
download_cmd
|
||||
assertEquals $? 0
|
||||
assertCommandSuccess download_cmd
|
||||
|
||||
$(WGET=/bin/false CURL=/bin/false download_cmd something 2> /dev/null)
|
||||
assertEquals $? 1
|
||||
WGET=/bin/false CURL=/bin/false assertCommandFail download_cmd
|
||||
}
|
||||
|
||||
function test_ln(){
|
||||
install_mini_env
|
||||
|
||||
touch ln_file
|
||||
ln_cmd -s ln_file new_file
|
||||
assertEquals $? 0
|
||||
assertCommandSuccess ln_cmd -s ln_file new_file
|
||||
assertTrue "[ -e new_file ]"
|
||||
rm new_file
|
||||
|
||||
touch ln_file
|
||||
OLDPATH="$PATH"
|
||||
PATH=""
|
||||
ln_cmd -s ln_file new_file 2> /dev/null
|
||||
$(ln_cmd -s ln_file new_file 2> /dev/null)
|
||||
local ret=$?
|
||||
PATH="$OLDPATH"
|
||||
assertEquals $ret 0
|
||||
|
|
@ -86,8 +86,7 @@ function test_rm(){
|
|||
install_mini_env
|
||||
|
||||
touch rm_file
|
||||
rm_cmd rm_file
|
||||
assertEquals $? 0
|
||||
assertCommandSuccess rm_cmd rm_file
|
||||
assertTrue "[ ! -e rm_file ]"
|
||||
|
||||
touch rm_file
|
||||
|
|
@ -106,8 +105,7 @@ function test_chown(){
|
|||
local id=$(id -u)
|
||||
|
||||
touch chown_file
|
||||
chown_cmd $id chown_file
|
||||
assertEquals $? 0
|
||||
assertCommandSuccess chown_cmd $id chown_file
|
||||
|
||||
touch chown_file
|
||||
OLDPATH="$PATH"
|
||||
|
|
@ -121,8 +119,7 @@ function test_chown(){
|
|||
function test_mkdir(){
|
||||
install_mini_env
|
||||
|
||||
mkdir_cmd -p new_dir/new_dir
|
||||
assertEquals $? 0
|
||||
assertCommandSuccess mkdir_cmd -p new_dir/new_dir
|
||||
assertTrue "[ -d new_dir/new_dir ]"
|
||||
rm -rf new_dir
|
||||
|
||||
|
|
@ -150,8 +147,7 @@ function test_setup_env(){
|
|||
assertTrue "[ -e $JUNEST_HOME/file ]"
|
||||
assertTrue "[ -e $JUNEST_HOME/run/lock ]"
|
||||
|
||||
$(setup_env "noarch" 2> /dev/null)
|
||||
assertEquals 1 $?
|
||||
assertCommandFailOnStatus 102 setup_env "noarch"
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -162,8 +158,7 @@ function test_setup_env_from_file(){
|
|||
assertTrue "[ -e $JUNEST_HOME/file ]"
|
||||
assertTrue "[ -e $JUNEST_HOME/run/lock ]"
|
||||
|
||||
$(setup_env_from_file noexist.tar.gz 2> /dev/null)
|
||||
assertEquals $? 1
|
||||
assertCommandFailOnStatus 103 setup_env_from_file noexist.tar.gz
|
||||
}
|
||||
|
||||
function test_setup_env_from_file_with_absolute_path(){
|
||||
|
|
@ -182,29 +177,23 @@ function test_run_env_as_root(){
|
|||
CLASSIC_CHROOT="sudo $CLASSIC_CHROOT"
|
||||
CHOWN="sudo $CHOWN"
|
||||
|
||||
local output=$(run_env_as_root pwd)
|
||||
assertEquals "/" "$output"
|
||||
run_env_as_root [ -e /run/lock ]
|
||||
assertEquals 0 $?
|
||||
run_env_as_root [ -e $HOME ]
|
||||
assertEquals 0 $?
|
||||
assertCommandSuccess run_env_as_root pwd
|
||||
assertEquals "/" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess run_env_as_root [ -e /run/lock ]
|
||||
assertCommandSuccess run_env_as_root [ -e $HOME ]
|
||||
|
||||
# test that normal user has ownership of the files created by root
|
||||
run_env_as_root touch /a_root_file
|
||||
# This ensure that the trap will be executed
|
||||
kill -TERM $$
|
||||
local output=$(run_env_as_root stat -c '%u' /a_root_file)
|
||||
assertEquals "$UID" "$output"
|
||||
assertCommandSuccess run_env_as_root touch /a_root_file
|
||||
assertCommandSuccess run_env_as_root stat -c '%u' /a_root_file
|
||||
assertEquals "$UID" "$(cat $STDOUTF)"
|
||||
|
||||
SH=("sh" "--login" "-c" "type -t type")
|
||||
local output=$(run_env_as_root)
|
||||
assertEquals "builtin" "$output"
|
||||
assertCommandSuccess run_env_as_root
|
||||
assertEquals "builtin" "$(cat $STDOUTF)"
|
||||
SH=("sh" "--login" "-c" "[ -e /run/lock ]")
|
||||
run_env_as_root
|
||||
assertEquals 0 $?
|
||||
assertCommandSuccess run_env_as_root
|
||||
SH=("sh" "--login" "-c" "[ -e $HOME ]")
|
||||
run_env_as_root
|
||||
assertEquals 0 $?
|
||||
assertCommandSuccess run_env_as_root
|
||||
}
|
||||
|
||||
function test_run_env_as_root_different_arch(){
|
||||
|
|
@ -212,8 +201,7 @@ function test_run_env_as_root_different_arch(){
|
|||
|
||||
install_mini_env
|
||||
echo "JUNEST_ARCH=XXX" > ${JUNEST_HOME}/etc/junest/info
|
||||
$(run_env_as_root pwd 2> /dev/null)
|
||||
assertEquals 1 $?
|
||||
assertCommandFailOnStatus 104 run_env_as_root pwd
|
||||
}
|
||||
|
||||
function test_run_env_as_classic_root(){
|
||||
|
|
@ -224,10 +212,9 @@ function test_run_env_as_classic_root(){
|
|||
CLASSIC_CHROOT="sudo $CLASSIC_CHROOT"
|
||||
CHOWN="sudo $CHOWN"
|
||||
|
||||
local output=$(run_env_as_root pwd 2> /dev/null)
|
||||
assertEquals "/" "$output"
|
||||
run_env_as_root [ -e /run/lock ] 2> /dev/null
|
||||
assertEquals 0 $?
|
||||
assertCommandSuccess run_env_as_root pwd
|
||||
assertEquals "/" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess run_env_as_root [ -e /run/lock ]
|
||||
}
|
||||
|
||||
function test_run_env_as_junest_root(){
|
||||
|
|
@ -239,30 +226,28 @@ function test_run_env_as_junest_root(){
|
|||
LD_EXEC="sudo $LD_EXEC"
|
||||
CHOWN="sudo $CHOWN"
|
||||
|
||||
local output=$(run_env_as_root pwd 2> /dev/null)
|
||||
assertEquals "/" "$output"
|
||||
run_env_as_root [ -e /run/lock ] 2> /dev/null
|
||||
assertEquals 0 $?
|
||||
run_env_as_root [ -e $HOME ] 2> /dev/null
|
||||
assertEquals 1 $?
|
||||
assertCommandSuccess run_env_as_root pwd
|
||||
assertEquals "/" "$(cat $STDOUTF)"
|
||||
assertCommandSuccess run_env_as_root [ -e /run/lock ]
|
||||
assertCommandFail run_env_as_root [ -e $HOME ]
|
||||
}
|
||||
|
||||
function test_run_env_as_user(){
|
||||
install_mini_env
|
||||
local output=$(run_env_as_user "-k 3.10" "/usr/bin/mkdir" "-v" "/newdir2" | awk -F: '{print $1}')
|
||||
assertEquals "$output" "/usr/bin/mkdir"
|
||||
assertCommandSuccess run_env_as_user "-k 3.10" "/usr/bin/mkdir" "-v" "/newdir2"
|
||||
assertEquals "/usr/bin/mkdir" "$(cat $STDOUTF| awk -F: '{print $1}')"
|
||||
assertTrue "[ -e $JUNEST_HOME/newdir2 ]"
|
||||
|
||||
SH=("/usr/bin/echo")
|
||||
local output=$(run_env_as_user "-k 3.10")
|
||||
assertEquals "-c :" "$output"
|
||||
assertCommandSuccess run_env_as_user "-k 3.10"
|
||||
assertEquals "-c :" "$(cat $STDOUTF)"
|
||||
}
|
||||
|
||||
function test_run_env_as_proot_mtab(){
|
||||
install_mini_env
|
||||
$(run_env_as_fakeroot "-k 3.10" "echo")
|
||||
assertCommandSuccess run_env_as_fakeroot "-k 3.10" "echo"
|
||||
assertTrue "[ -e $JUNEST_HOME/etc/mtab ]"
|
||||
$(run_env_as_user "-k 3.10" "echo")
|
||||
assertCommandSuccess run_env_as_user "-k 3.10" "echo"
|
||||
assertTrue "[ -e $JUNEST_HOME/etc/mtab ]"
|
||||
}
|
||||
|
||||
|
|
@ -273,38 +258,33 @@ function test_run_env_as_root_mtab(){
|
|||
CHROOT="sudo $CHROOT"
|
||||
CLASSIC_CHROOT="sudo $CLASSIC_CHROOT"
|
||||
CHOWN="sudo $CHOWN"
|
||||
$(run_env_as_root "echo")
|
||||
assertCommandSuccess run_env_as_root "echo"
|
||||
assertTrue "[ ! -e $JUNEST_HOME/etc/mtab ]"
|
||||
}
|
||||
|
||||
function test_run_env_with_quotes(){
|
||||
install_mini_env
|
||||
local output=$(run_env_as_user "-k 3.10" "bash" "-c" "/usr/bin/mkdir -v /newdir2" | awk -F: '{print $1}')
|
||||
assertEquals "/usr/bin/mkdir" "$output"
|
||||
assertCommandSuccess run_env_as_user "-k 3.10" "bash" "-c" "/usr/bin/mkdir -v /newdir2"
|
||||
assertEquals "/usr/bin/mkdir" "$(cat $STDOUTF| awk -F: '{print $1}')"
|
||||
assertTrue "[ -e $JUNEST_HOME/newdir2 ]"
|
||||
}
|
||||
|
||||
function test_run_env_as_user_proot_args(){
|
||||
install_mini_env
|
||||
run_env_as_user "--help" "" &> /dev/null
|
||||
assertEquals 0 $?
|
||||
assertCommandSuccess run_env_as_user "--help" ""
|
||||
|
||||
mkdir $JUNEST_TEMPDIR/newdir
|
||||
touch $JUNEST_TEMPDIR/newdir/newfile
|
||||
run_env_as_user "-b $JUNEST_TEMPDIR/newdir:/newdir -k 3.10" "ls" "-l" "/newdir/newfile" &> /dev/null
|
||||
assertEquals 0 $?
|
||||
assertCommandSuccess run_env_as_user "-b $JUNEST_TEMPDIR/newdir:/newdir -k 3.10" "ls" "-l" "/newdir/newfile"
|
||||
|
||||
$(_run_env_with_proot --helps 2> /dev/null)
|
||||
assertEquals 1 $?
|
||||
assertCommandFail _run_env_with_proot --helps
|
||||
}
|
||||
|
||||
function test_run_env_with_proot_compat(){
|
||||
PROOT="/bin/true"
|
||||
_run_env_with_proot "" "" &> /dev/null
|
||||
assertEquals 0 $?
|
||||
assertCommandSuccess _run_env_with_proot "" ""
|
||||
|
||||
$(PROOT="/bin/false" _run_env_with_proot --helps 2> /dev/null)
|
||||
assertEquals 1 $?
|
||||
PROOT="/bin/false" assertCommandFail _run_env_with_proot --helps
|
||||
}
|
||||
|
||||
function test_run_env_with_proot_as_root(){
|
||||
|
|
@ -312,10 +292,8 @@ function test_run_env_with_proot_as_root(){
|
|||
|
||||
install_mini_env
|
||||
|
||||
$(sudo run_env_as_user 2> /dev/null)
|
||||
assertEquals 1 $?
|
||||
$(sudo run_env_as_fakeroot 2> /dev/null)
|
||||
assertEquals 1 $?
|
||||
assertCommandFail sudo run_env_as_user
|
||||
assertCommandFail sudo run_env_as_fakeroot
|
||||
}
|
||||
|
||||
function test_run_proot_seccomp(){
|
||||
|
|
@ -323,39 +301,38 @@ function test_run_proot_seccomp(){
|
|||
env
|
||||
}
|
||||
PROOT=envv
|
||||
local output=$(proot_cmd | grep "^PROOT_NO_SECCOMP")
|
||||
assertEquals "" "$output"
|
||||
assertCommandSuccess proot_cmd cmd
|
||||
assertEquals "" "$(cat $STDOUTF | grep "^PROOT_NO_SECCOMP")"
|
||||
|
||||
envv(){
|
||||
env | grep "^PROOT_NO_SECCOMP"
|
||||
}
|
||||
PROOT=envv
|
||||
local output=$(proot_cmd | grep "^PROOT_NO_SECCOMP")
|
||||
assertCommandSuccess proot_cmd cmd
|
||||
# The variable PROOT_NO_SECCOMP will be produced
|
||||
# twice due to the fallback mechanism
|
||||
assertEquals "PROOT_NO_SECCOMP=1
|
||||
PROOT_NO_SECCOMP=1" "$output"
|
||||
PROOT_NO_SECCOMP=1" "$(cat $STDOUTF | grep "^PROOT_NO_SECCOMP")"
|
||||
}
|
||||
|
||||
function test_run_env_as_fakeroot(){
|
||||
install_mini_env
|
||||
local output=$(run_env_as_fakeroot "-k 3.10" "id" | awk '{print $1}')
|
||||
assertEquals "uid=0(root)" "$output"
|
||||
assertCommandSuccess run_env_as_fakeroot "-k 3.10" "id"
|
||||
assertEquals "uid=0(root)" "$(cat $STDOUTF | awk '{print $1}')"
|
||||
}
|
||||
|
||||
function test_delete_env(){
|
||||
install_mini_env
|
||||
echo "N" | delete_env 1> /dev/null
|
||||
is_env_installed
|
||||
assertEquals 0 $?
|
||||
assertCommandSuccess is_env_installed
|
||||
echo "Y" | delete_env 1> /dev/null
|
||||
is_env_installed
|
||||
assertEquals 1 $?
|
||||
assertCommandFail is_env_installed
|
||||
}
|
||||
|
||||
function test_nested_env(){
|
||||
install_mini_env
|
||||
JUNEST_ENV=1 bash -ic "source $CURRPWD/$(dirname $0)/../lib/core.sh" &> /dev/null
|
||||
JUNEST_ENV=1 bash -ic "source $CURRPWD/$(dirname $0)/../lib/utils.sh; source $CURRPWD/$(dirname $0)/../lib/core.sh" &> /dev/null
|
||||
assertEquals 1 $?
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,72 +0,0 @@
|
|||
#!/bin/bash
|
||||
source "$(dirname $0)/../lib/util.sh"
|
||||
|
||||
# Disable the exiterr
|
||||
set +e
|
||||
|
||||
function test_echoerr(){
|
||||
local actual=$(echoerr "Test" 2>&1)
|
||||
assertEquals "$actual" "Test"
|
||||
}
|
||||
|
||||
function test_error(){
|
||||
local actual=$(error "Test" 2>&1)
|
||||
local expected=$(echo -e "\033[1;31mTest\033[0m")
|
||||
assertEquals "$actual" "$expected"
|
||||
}
|
||||
|
||||
function test_warn(){
|
||||
local actual=$(warn "Test" 2>&1)
|
||||
local expected=$(echo -e "\033[1;33mTest\033[0m")
|
||||
assertEquals "$actual" "$expected"
|
||||
}
|
||||
|
||||
function test_info(){
|
||||
local actual=$(info "Test")
|
||||
local expected=$(echo -e "\033[1;37mTest\033[0m")
|
||||
assertEquals "$actual" "$expected"
|
||||
}
|
||||
|
||||
function test_die(){
|
||||
local actual=$(die "Test" 2>&1)
|
||||
local expected=$(echo -e "\033[1;31mTest\033[0m")
|
||||
assertEquals "$actual" "$expected"
|
||||
$(die Dying 2> /dev/null)
|
||||
assertEquals $? 1
|
||||
}
|
||||
|
||||
function test_ask(){
|
||||
echo "Y" | ask "Test" &> /dev/null
|
||||
assertEquals $? 0
|
||||
echo "y" | ask "Test" &> /dev/null
|
||||
assertEquals $? 0
|
||||
echo "N" | ask "Test" &> /dev/null
|
||||
assertEquals $? 1
|
||||
echo "n" | ask "Test" &> /dev/null
|
||||
assertEquals $? 1
|
||||
echo -e "\n" | ask "Test" &> /dev/null
|
||||
assertEquals $? 0
|
||||
echo -e "\n" | ask "Test" "N" &> /dev/null
|
||||
assertEquals $? 1
|
||||
echo -e "asdf\n\n" | ask "Test" "N" &> /dev/null
|
||||
assertEquals $? 1
|
||||
}
|
||||
|
||||
function test_insert_quotes_on_spaces(){
|
||||
local actual=$(insert_quotes_on_spaces this is "a test")
|
||||
assertEquals "this is \"a test\"" "$actual"
|
||||
|
||||
local actual=$(insert_quotes_on_spaces this is 'a test')
|
||||
assertEquals "this is \"a test\"" "$actual"
|
||||
}
|
||||
|
||||
function test_contains_element(){
|
||||
array=("something to search for" "a string" "test2000")
|
||||
contains_element "a string" "${array[@]}"
|
||||
assertEquals "$?" "0"
|
||||
|
||||
contains_element "blabla" "${array[@]}"
|
||||
assertEquals "$?" "1"
|
||||
}
|
||||
|
||||
source $(dirname $0)/shunit2
|
||||
97
tests/test-utils.sh
Executable file
97
tests/test-utils.sh
Executable file
|
|
@ -0,0 +1,97 @@
|
|||
#!/bin/bash
|
||||
source "$(dirname $0)/utils.sh"
|
||||
|
||||
unset HOME
|
||||
export HOME=$(TMPDIR=/tmp mktemp -d -t pearl-user-home.XXXXXXX)
|
||||
|
||||
source "$(dirname $0)/../lib/utils.sh"
|
||||
|
||||
# Disable the exiterr
|
||||
set +e
|
||||
|
||||
function oneTimeSetUp(){
|
||||
setUpUnitTests
|
||||
}
|
||||
|
||||
function test_check_not_null(){
|
||||
assertCommandFailOnStatus 11 check_not_null "" ""
|
||||
assertCommandSuccess check_not_null "bla" ""
|
||||
}
|
||||
|
||||
function test_echoerr(){
|
||||
assertCommandSuccess echoerr "Test"
|
||||
assertEquals "Test" "$(cat $STDERRF)"
|
||||
}
|
||||
|
||||
function test_error(){
|
||||
assertCommandSuccess error "Test"
|
||||
local expected=$(echo -e "\033[1;31mTest\033[0m")
|
||||
assertEquals "$expected" "$(cat $STDERRF)"
|
||||
}
|
||||
|
||||
function test_warn(){
|
||||
assertCommandSuccess warn "Test"
|
||||
local expected=$(echo -e "\033[1;33mTest\033[0m")
|
||||
assertEquals "$expected" "$(cat $STDERRF)"
|
||||
}
|
||||
|
||||
function test_info(){
|
||||
assertCommandSuccess info "Test"
|
||||
local expected=$(echo -e "\033[1;36mTest\033[0m")
|
||||
assertEquals "$expected" "$(cat $STDOUTF)"
|
||||
}
|
||||
|
||||
function test_die(){
|
||||
assertCommandFail die "Test"
|
||||
local expected=$(echo -e "\033[1;31mTest\033[0m")
|
||||
assertEquals "$expected" "$(cat $STDERRF)"
|
||||
}
|
||||
|
||||
function test_die_on_status(){
|
||||
assertCommandFailOnStatus 222 die_on_status 222 "Test"
|
||||
local expected=$(echo -e "\033[1;31mTest\033[0m")
|
||||
assertEquals "$expected" "$(cat $STDERRF)"
|
||||
}
|
||||
|
||||
function test_ask_null_question(){
|
||||
assertCommandFailOnStatus 11 ask "" "Y"
|
||||
}
|
||||
|
||||
function test_ask(){
|
||||
echo "Y" | ask "Test" &> /dev/null
|
||||
assertEquals 0 $?
|
||||
echo "y" | ask "Test" &> /dev/null
|
||||
assertEquals 0 $?
|
||||
echo "N" | ask "Test" &> /dev/null
|
||||
assertEquals 1 $?
|
||||
echo "n" | ask "Test" &> /dev/null
|
||||
assertEquals 1 $?
|
||||
echo -e "\n" | ask "Test" &> /dev/null
|
||||
assertEquals 0 $?
|
||||
echo -e "\n" | ask "Test" "N" &> /dev/null
|
||||
assertEquals 1 $?
|
||||
echo -e "asdf\n\n" | ask "Test" "N" &> /dev/null
|
||||
assertEquals 1 $?
|
||||
}
|
||||
|
||||
function test_ask_wrong_default_answer() {
|
||||
echo "Y" | ask "Test" G &> /dev/null
|
||||
assertEquals 33 $?
|
||||
}
|
||||
|
||||
function test_insert_quotes_on_spaces(){
|
||||
assertCommandSuccess insert_quotes_on_spaces this is "a test"
|
||||
assertEquals "this is \"a test\"" "$(cat $STDOUTF)"
|
||||
|
||||
assertCommandSuccess insert_quotes_on_spaces this is 'a test'
|
||||
assertEquals "this is \"a test\"" "$(cat $STDOUTF)"
|
||||
}
|
||||
|
||||
function test_contains_element(){
|
||||
array=("something to search for" "a string" "test2000")
|
||||
assertCommandSuccess contains_element "a string" "${array[@]}"
|
||||
|
||||
assertCommandFailOnStatus 1 contains_element "blabla" "${array[@]}"
|
||||
}
|
||||
|
||||
source $(dirname $0)/shunit2
|
||||
32
tests/utils.sh
Normal file
32
tests/utils.sh
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
|
||||
function setUpUnitTests(){
|
||||
OUTPUT_DIR="${SHUNIT_TMPDIR}/output"
|
||||
mkdir "${OUTPUT_DIR}"
|
||||
STDOUTF="${OUTPUT_DIR}/stdout"
|
||||
STDERRF="${OUTPUT_DIR}/stderr"
|
||||
}
|
||||
|
||||
function assertCommandSuccess(){
|
||||
$(set -e
|
||||
"$@" > $STDOUTF 2> $STDERRF
|
||||
)
|
||||
assertTrue "The command $1 did not return 0 exit status" $?
|
||||
}
|
||||
|
||||
function assertCommandFail(){
|
||||
$(set -e
|
||||
"$@" > $STDOUTF 2> $STDERRF
|
||||
)
|
||||
assertFalse "The command $1 returned 0 exit status" $?
|
||||
}
|
||||
|
||||
# $1: expected exit status
|
||||
# $2-: The command under test
|
||||
function assertCommandFailOnStatus(){
|
||||
local status=$1
|
||||
shift
|
||||
$(set -e
|
||||
"$@" > $STDOUTF 2> $STDERRF
|
||||
)
|
||||
assertEquals $status $?
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue