The commandunit is a testing framework intended to verrify your command line
tools. You can define your tests in JSON or YAML formats. It is also powered
by jq-front processor, with which you can write your JSON files using
inheritance and references.
Runs tests.
Usage: commandunit [OPTION]... [SUBCOMMAND]...preprocess: Preprocesses test definition files (yaml++, yaml, and json++) and convert them into "executable JSON test" filesrun: Runs tests under a directory specified by--test-workdirand writes a report file:testreport.jsonunder a directory specified by--test-reportdir.report: Reads a filetestreport.jsonunder directory specified by--test-reportdirand renders a report file (testreport.adoc) under the same directory.
If no sub-command is given, it will be interpreted as a sequence of preprocess
, run, and report.
-h,--help: show this help-p,--parallel: execute the tests in parallel-f,--filter: filter tests with the specified regular expression(default: {regexany})--configdir: directory to store config files (default: current {directory/.commandunit})--test-srcdir: write test reports under the specified directory (default: current directory)--test-workdir: write test reports under the specified directory (default: value for--test-srcdir)--test-reportdir: write test reports under the specified directory (default: value for--test-workdir)
commandunit
Run tests found under current directory in sequential mode.
commandunit --srcdir=DIR
Run tests found under DIR in sequential mode.
commandunit --srcdir=DIR -p
Run tests found under DIR in parallel mode.
Place the following script in one of your directories on PATH environment variable entry with 755 permission.
#!/usr/bin/env bashfunction__commandunit_exec_commandunit() {
export PROJECT_BASE_DIR="${PWD}"export COMMANDUNIT_PWD="${PROJECT_BASE_DIR}"# Referenced by commandunit itself.export COMMANDUNIT_SOURCE_DIR="${PROJECT_BASE_DIR}/src/dependencies/commandunit"export COMMANDUNIT_DEFAULT_VERSION="${COMMANDUNIT_DEFAULT_VERSION:-v1.29}"export BUD_DEBUG=enabled
function__commandunit_user_option() {
case"$(uname -sr)"in
Darwin*)
echo -n "-u""1000:1000"
;;
Linux*Microsoft*)
echo -n "-u""$(id -u):$(id -g)"
;;
Linux*)
echo -n "-u""$(id -u):$(id -g)"
;;
CYGWIN* | MINGW* | MSYS*)
echo -n "-u""$(id -u):$(id -g)"
;;
# Add here more strings to compare# See correspondence table at the bottom of this answer*)
echo -n "-u""$(id -u):$(id -g)"
;;
esac
}
function__commandunit_exec_commandunit_docker() {
local _image_name="${1}"shift# shellcheck disable=SC2086# shellcheck disable=SC2046
docker run \
$(__commandunit_user_option) \
--env COMMANDUNIT_PWD="${_project_basedir}" \
--env COMMANDUNIT_LOGLEVEL="${_loglevel}" \
--env TMPDIR="/tmp" \
-v "${_project_basedir}:${_hostfsroot_mountpoint}${_project_basedir}" \
${_entrypoint} \
-i "${_image_name}" \
"${@}"
}
function__commandunit_clean_cloned_commandunit() {
local _version_name="${1}" _source_dir="${2:-${COMMANDUNIT_SOURCE_DIR}}"# +-- Safeguard for a bug, where the variable becomes empty.# | Because this function removes everything under the dir.# Vif [[ "${_source_dir}/${_version_name}"==*"/src/dependencies/"* ]];thenif [[ -d"${_source_dir}/${_version_name}" ]];then
rm -fr "${_source_dir"?"}/${_version_name:?}"fifi
}
function__commandunit_clone_commandunit() {
local _git_tag_option="${1}" _version_name="${2}"local _out
# shellcheck disable=SC2086
_out="$(git clone --depth 1 ${_git_tag_option} https://github.com/dakusui/commandunit.git "${COMMANDUNIT_SOURCE_DIR}/${_version_name}"2>&1)"|| {
echo"Failed to clone<: ${_out}>">&2return 1
}
}
function__commandunit_exec_commandunit_native() {
local _version_name="${1}"shift"${COMMANDUNIT_SOURCE_DIR}/${_version_name}/src/main/scripts/bin/commandunit-main""${@}"
}
local _project_basedir="${PROJECT_BASE_DIR}"local _hostfsroot_mountpoint="/var/lib/commandunit"local _docker_repo_name="dakusui/commandunit"local _entrypoint=""local _native="no"local _loglevel="${COMMANDUNIT_LOGLEVEL:-ERROR}"local _image_name _image_version="${COMMANDUNIT_DEFAULT_VERSION}" _branch_name="main" _version_name=${COMMANDUNIT_DEFAULT_VERSION} _args _show_image_name=false _i _s _quit=false _help=false
_args=()
_s=to_func
for_iin"${@}";doif [[ "${_s}"== to_func ]];thenif [[ $_i=="--version="* ]];thenlocal _v="${_i#*=}"if [[ "${_v}"=="snapshot" ]];then# _image_version="${COMMANDUNIT_VERSION%.*}.$((${COMMANDUNIT_VERSION##*.} + 1))"local _default_version="${COMMANDUNIT_DEFAULT_VERSION}"# e.g. v1.24
_image_version="${_default_version%.*}.$((${_default_version##*.}+1))"else
_branch_name="${_v}"
_image_version="${_v}"fi
_version_name="${_v}"# --version= snapshot v1.99 (none)# _version_name snapshot v1.99 v1.24# _image_version v1.25 v1.99 v1.24 (private)# _image_name dakusui:v1.25-snapshot dakusui:v1.99 dakusui:v1.24# _branch_name main v1.99 v1.24elif [[ $_i=="--native" ]];then
_native="yes"elif [[ $_i=="--debug-shell" ]];then
_entrypoint="--entrypoint=/bin/bash"elif [[ $_i=="--show-image-name" ]];then
_show_image_name=true
elif [[ $_i=="--quit" ]];then
_quit=true
elif [[ $_i=="--help" ]];then
_help=true
_args+=("${_i}")
elif [[ $_i=="--" ]];then
_s=to_container
else
_args+=("${_i}")
fielse
_args+=("${_i}")
fidone
_image_name="${_docker_repo_name}:${_image_version}"if [[ "${_version_name}"=="snapshot" ]];then
_image_name="${_image_name}-${_v}"fiif${_show_image_name};thenecho"${_image_name}"fiif${_help};thenecho"Usage: commandunit [WRAPPER OPTION]... [--] [OPTION]... [SUBCOMMAND]..."echo""echo"A wrapper function for 'commandunit' to invoke its docker image.".
echo"Followings are switching options to control the wrapper's behaviour."echo"Options not listed here or ones after the separator (--) are passed to the commandunit implementation directly."echo""echo"Wrapper options:"echo"--native Use the 'native' version of commandunit."echo"--version={VERSION} Use the specified version of commandunit. If 'snapshot' is given, a version under development is used (default: ${COMMANDUNIT_DEFAULT_VERSION})."echo"--debug-shell Get the shell of the docker image. Type Ctrl-D to quit it. Development purpose only."echo"--show-image-name Print the image name. Useful to figure out the version."echo"--quit Quit before running the image. With --show-image-name, useful to figure out the image version"echo"--help Show this help and pass the --help option to the docker image."echo"-- A separator to let this wrapper know the options after it should be passed directly to the image"echo""fi${_quit}&&return 0
if [[ "${_native}"=="no" ]];then
__commandunit_exec_commandunit_docker "${_image_name}""${_args[@]}"else
which jq-front > /dev/null || {
functionjq-front() {
docker run --rm -i \
-v "${HOME}:/var/lib/jf/${HOME}" \
-e JF_PATH_BASE="/var/lib/jf" \
-e JF_PATH="${JF_PATH}" \
-e JF_DEBUG=${JF_DEBUG:-disabled} \
-e JF_CWD="$(pwd)" \
-e COMMANDUNIT_DEPENDENCIES_ROOT="${COMMANDUNIT_DEPENDENCIES_ROOT:?Required environment variable is not set.}" \
-e COMMANDUNIT_BUILTIN_ROOT="${COMMANDUNIT_DEPENDENCIES_ROOT:?Required environment variable is not set.}" \
dakusui/jq-front:"${JF_DOCKER_TAG:-v0.53}""${@}"
} &&export -f jq-front
}
if [[ "${_version_name}"=="snapshot" ]];then# Remove already loaded one, then... do clone
__commandunit_clean_cloned_commandunit "${_version_name}"fiif [[ !-e"${COMMANDUNIT_SOURCE_DIR}/${_version_name}" ]];then
__commandunit_clone_commandunit "--branch ${_branch_name}""${_version_name}"fi
__commandunit_exec_commandunit_native "${_version_name}""${_args[@]}"fi
}
functionmain() {
__commandunit_exec_commandunit "${@}"
}
main "${@}"If you are on macOS, make sure ~/.bashrc is read by ~/.bash_profile.
jq-front: Native version ofjq-frontsomewhere on thePATH.
- Hrioshi Ukai - Initial work - dakusui
- MIT license
- Copyright 2019 © Hiroshi Ukai.