diff --git a/test/cli_shim/demo.sh b/test/cli_shim/demo.sh new file mode 100755 index 00000000..f0a003c0 --- /dev/null +++ b/test/cli_shim/demo.sh @@ -0,0 +1,434 @@ +#!/usr/bin/env bash + +# rebase this out prior to PR: +# ------------------------------------------------------------------------------ +# don't forget to do an asciicast w/ asciinema, make sure to speed it up 3x; +# provide a short version, just the demos; and long version, full build and +# demos + +reset_shim_demo() { + local EMBARK_DOCKER_IMAGE="${EMBARK_DOCKER_IMAGE:-statusim/embark}" + local EMBARK_DOCKER_TAG="${EMBARK_DOCKER_TAG:-latest}" + local EMBARK_DOCKERFILE="${EMBARK_DOCKERFILE}" + local shim_demo_tag + if [[ (! -z "$EMBARK_DOCKERFILE") \ + && "$EMBARK_DOCKER_TAG" = "latest" ]]; then + shim_demo_tag="shim-demo" + else + shim_demo_tag="${EMBARK_DOCKER_TAG}-shim-demo" + fi + local step + if [[ -z "$1" ]]; then + step="step-0" + else + step="$1" + fi + docker rmi "${EMBARK_DOCKER_IMAGE}:${shim_demo_tag}-${step}" &> /dev/null +} +export -f reset_shim_demo + +run_shim_demo () { + local EMBARK_BRANCH="${EMBARK_BRANCH:-features/cli-shim}" + # ^ once the PR is ready to merge this should be bumped to :-develop + local EMBARK_DOCKER_IMAGE="${EMBARK_DOCKER_IMAGE:-statusim/embark}" + local EMBARK_DOCKER_RUN + local EMBARK_DOCKER_RUN_INTERACTIVE + local EMBARK_DOCKER_RUN_OPTS_REPLACE + local EMBARK_DOCKER_RUN_RM + local EMBARK_DOCKER_TAG="${EMBARK_DOCKER_TAG:-latest}" + local EMBARK_DOCKERFILE="${EMBARK_DOCKERFILE}" + # ^ can override with a local path: + # /path/to/embark-docker/Dockerfile + # or a url such as: + # https://github.com/embark-framework/embark-docker.git#master + # if EMBARK_DOCKERFILE is not empty, it will trigger `docker build` instead + # of `docker pull` in step-0 below + local url_regex='^(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]' + if [[ ! "$EMBARK_DOCKERFILE" =~ $url_regex ]]; then + EMBARK_DOCKERFILE="${EMBARK_DOCKERFILE%/*}" + fi + local EMBARK_SHIM_DEMO_DEV=${EMBARK_SHIM_DEMO_DEV:-false} + local EMBARK_VERSION="${EMBARK_VERSION:latest}" + # ^ only kicks in for `docker build`, not `docker pull` + local REAL="${REAL:-https://gist.githubusercontent.com/michaelsbradleyjr/87b5a99ad551e04cbad9c0c1d3af412b/raw/bfec2e589a91302b30f1d7cac8c2df71e5ebabe0/real.sh}" + local RUNNER="${RUNNER:-https://raw.githubusercontent.com/embark-framework/embark-docker/master/run.sh}" + + local shim_demo_tag + if [[ (! -z "$EMBARK_DOCKERFILE") \ + && "$EMBARK_DOCKER_TAG" = "latest" ]]; then + shim_demo_tag="shim-demo" + else + shim_demo_tag="${EMBARK_DOCKER_TAG}-shim-demo" + fi + local __shim_demo_tag="$shim_demo_tag" + local was_reset=false + local work_dir="$PWD" + if [[ "$REAL" =~ $url_regex ]]; then + source <(curl "$REAL" 2> /dev/null) + else + source "$REAL" + fi + local script_dir="$(real_dir "$BASH_SOURCE")" + local embark_dir="$(real_dir "$script_dir/../..")" + local cid_file="$script_dir/.cid" + if [[ "$RUNNER" =~ $url_regex ]]; then + source <(curl "$RUNNER" 2> /dev/null) + else + source "$RUNNER" + fi + + check_image () { + local tag + if [[ -z "$1" ]]; then + tag="${__shim_demo_tag}-step-0" + else + tag="${__shim_demo_tag}-$1" + fi + local iid="$(docker images -q ${EMBARK_DOCKER_IMAGE}:${tag} 2> /dev/null)" + if [[ "$iid" = "" ]]; then + return 1 + fi + } + + cleanup () { + local retval=$? + unset check_image + unset cleanup + rm -f "$cid_file" + cd "$work_dir" + return $retval + } + + # -- step 0 ---------------------------------------------------------------- + + echo '-----------------------------------' + echo 'setup - STEP 0' + echo '-----------------------------------' + + shim_demo_tag="${__shim_demo_tag}-step-0" + if ! check_image; then + was_reset=true + if [[ ! -z "$EMBARK_DOCKERFILE" ]]; then + # could expand the --build-arg list (and list of locals at top of + # function) w/ all the build args supported by embark-docker's + # Dockerfile; should probably be the responsibility of a + # build_embark.sh script/function in embark-docker repo that parses + # and dedupes all ARG variables in embark-docker's Dockerfile + docker build \ + --build-arg EMBARK_VERSION="$EMBARK_VERSION" \ + -t "${EMBARK_DOCKER_IMAGE}:${EMBARK_DOCKER_TAG}" \ + "$EMBARK_DOCKERFILE" \ + || cleanup || return + else + docker pull "${EMBARK_DOCKER_IMAGE}:${EMBARK_DOCKER_TAG}" \ + || cleanup || return + fi + docker tag \ + "${EMBARK_DOCKER_IMAGE}:${EMBARK_DOCKER_TAG}" \ + "${EMBARK_DOCKER_IMAGE}:${shim_demo_tag}" \ + || cleanup || return + else + echo "cached..." + fi + + # -- step 1 ---------------------------------------------------------------- + + echo '-----------------------------------' + echo 'setup - STEP 1' + echo '-----------------------------------' + + if (! check_image step-1) || [[ $was_reset = true ]]; then + was_reset=true + rm -f "$cid_file" + EMBARK_DOCKER_TAG="$shim_demo_tag" \ + run_embark \ + --cidfile "$cid_file" \ + -d \ + -- bash -c 'trap "exit 0" SIGINT \ + && while true; do sleep 1; done' \ + || cleanup || return + docker exec \ + -it \ + $(cat "$cid_file") \ + bash -c 'apt-get update && apt-get install -y rsync' \ + || cleanup || return + shim_demo_tag="${__shim_demo_tag}-step-1" + docker commit \ + --pause \ + $(cat "$cid_file") \ + "${EMBARK_DOCKER_IMAGE}:${shim_demo_tag}" \ + || cleanup || return + docker stop $(cat "$cid_file") \ + || cleanup || return + rm -f "$cid_file" + else + shim_demo_tag="${__shim_demo_tag}-step-1" + echo "cached..." + fi + + # -- step 2 ---------------------------------------------------------------- + + echo '-----------------------------------' + echo 'setup - STEP 2' + echo '-----------------------------------' + + local td_dapp="${HOME}/temp/$(basename $(mktemp -d))" + mkdir -p "$td_dapp" + + if (! check_image step-2) || [[ $was_reset = true ]]; then + was_reset=true + rm -f "$cid_file" + # do not alter indentation, tabs in lines below + local step_2=$(cat <<- 'SCRIPT' + #!/bin/bash + simple_nodeenv 8.11.2 pre-8.11.3 + simple_nodeenv 4.0.0 4.0.0 + simple_nodeenv 8.12.0 lts + npm install -g npm@latest + npm install -g json + nac default + SCRIPT + ) + # do not alter indentation, tabs in lines above + cd "$td_dapp" + EMBARK_DOCKER_RUN_RM=false + EMBARK_DOCKER_RUN=<(echo "$step_2") \ + EMBARK_DOCKER_TAG="$shim_demo_tag" \ + run_embark \ + --cidfile "$cid_file" \ + -- \ + || cleanup || return + EMBARK_DOCKER_RUN_RM=true + shim_demo_tag="${__shim_demo_tag}-step-2" + docker commit $(cat "$cid_file") "${EMBARK_DOCKER_IMAGE}:${shim_demo_tag}" \ + || cleanup || return + docker rm $(cat "$cid_file") \ + || cleanup || return + rm -f "$cid_file" + cd "$work_dir" + else + shim_demo_tag="${__shim_demo_tag}-step-2" + echo "cached..." + fi + + # -- step 3 ---------------------------------------------------------------- + + echo '-----------------------------------' + echo 'setup - STEP 3' + echo '-----------------------------------' + + if (! check_image step-3) || [[ $was_reset = true ]]; then + was_reset=true + rm -f "$cid_file" + # do not alter indentation, tabs in lines below + local step_3=$(cat <<- 'SCRIPT' + #!/bin/bash + dev=$1 + embark_branch="$2" + if [[ "$dev" = false ]]; then + mkdir -p ~/repos/embark + git clone https://github.com/embark-framework/embark.git \ + ~/repos/embark + pushd "$PWD" &> /dev/null + cd ~/repos/embark \ + && git checkout "$embark_branch" \ + && popd &> /dev/null + fi + mkdir -p ~/working/embark + rsync -a \ + --exclude=.git \ + --exclude=node_modules \ + --exclude=test/cli_shim/.cid \ + ~/repos/embark \ + ~/working/ + pushd "$PWD" &> /dev/null + cd ~/working/embark + git config --global user.email "foo@bar" + git config --global user.name "Foo Bar" + git init + git add -A + git commit -m 'synced!' + nac lts + npm install + npm link + popd &> /dev/null + nac default + SCRIPT + ) + # do not alter indentation, tabs in lines above + cd "$td_dapp" + local -a run_opts_step_3=( + "--cidfile" + "$cid_file" + ) + if [[ $EMBARK_SHIM_DEMO_DEV = true ]]; then + run_opts_step_3=( + "${run_opts_step_3[@]}" + "-v" + "${embark_dir}:/home/embark/repos/embark" + ) + fi + EMBARK_DOCKER_RUN_RM=false + EMBARK_DOCKER_RUN=<(echo "$step_3") \ + EMBARK_DOCKER_TAG="$shim_demo_tag" \ + run_embark \ + "${run_opts_step_3[@]}" \ + -- \ + $EMBARK_SHIM_DEMO_DEV \ + "$EMBARK_BRANCH" \ + || cleanup || return + EMBARK_DOCKER_RUN_RM=true + shim_demo_tag="${__shim_demo_tag}-step-3" + docker commit $(cat "$cid_file") "${EMBARK_DOCKER_IMAGE}:${shim_demo_tag}" \ + || cleanup || return + docker rm $(cat "$cid_file") \ + || cleanup || return + rm -f "$cid_file" + cd "$work_dir" + else + shim_demo_tag="${__shim_demo_tag}-step-3" + echo "cached..." + fi + + # -- step 4 ---------------------------------------------------------------- + + echo '-----------------------------------' + echo 'setup - STEP 4' + echo '-----------------------------------' + + if (! check_image step-4) || [[ $was_reset = true ]]; then + was_reset=true + rm -f "$cid_file" + # do not alter indentation, tabs in lines below + local step_4=$(cat <<- 'SCRIPT' + #!/bin/bash + dev=$1 + if [[ "$dev" = true ]]; then + rsync -a \ + --exclude=.git \ + --exclude=node_modules \ + --exclude=test/cli_shim/.cid \ + ~/repos/embark \ + ~/working/ + fi + pushd "$PWD" &> /dev/null + cd ~/working/embark + git add -A + git commit -m 'synced!' + cd ~ + nac default + embark demo + cd embark_demo + git init + git add -A + git commit -m 'committed!' + popd &> /dev/null + SCRIPT + ) + # do not alter indentation, tabs in lines above + cd "$td_dapp" + local -a run_opts_step_4=( + "--cidfile" + "$cid_file" + ) + if [[ $EMBARK_SHIM_DEMO_DEV = true ]]; then + run_opts_step_4=( + "${run_opts_step_4[@]}" + "-v" + "${embark_dir}:/home/embark/repos/embark" + ) + fi + EMBARK_DOCKER_RUN_RM=false + EMBARK_DOCKER_RUN=<(echo "$step_4") \ + EMBARK_DOCKER_TAG="$shim_demo_tag" \ + run_embark \ + "${run_opts_step_4[@]}" \ + -- \ + $EMBARK_SHIM_DEMO_DEV \ + || cleanup || return + EMBARK_DOCKER_RUN_RM=true + shim_demo_tag="${__shim_demo_tag}-step-4" + docker commit $(cat "$cid_file") "${EMBARK_DOCKER_IMAGE}:${shim_demo_tag}" \ + || cleanup || return + docker rm $(cat "$cid_file") \ + || cleanup || return + rm -f "$cid_file" + cd "$work_dir" + else + shim_demo_tag="${__shim_demo_tag}-step-4" + echo "cached..." + fi + + # -- DEMO ------------------------------------------------------------------ + + echo '-----------------------------------' + echo 'DEMO' 🎉 + echo '-----------------------------------' + + # do not alter indentation, tabs in lines below + local demo=$(cat <<- SCRIPT + #!/bin/bash + dev=\$1 + if [[ "\$dev" = true ]]; then + rsync -a \ + --exclude=.git \ + --exclude=node_modules \ + --exclude=test/cli_shim/.cid \ + ~/repos/embark \ + ~/working/ + fi + pushd "$PWD" &> /dev/null + cd ~/working/embark + git add -A + git commit -m 'synced!' + popd &> /dev/null + txtbld=\$(tput bold) + txtrst=\$(tput sgr0) + bldcyn=\${txtbld}\$(tput setaf 6) + say () { + local msg="\$1" + msg="\$([[ "\$msg" =~ \ + [[:space:]]*([^[:space:]]|[^[:space:]].*[^[:space:]])[[:space:]]* ]]; \ + echo -n "\${BASH_REMATCH[1]}")" + echo + echo + echo "\${bldcyn}\${msg}\${txtrst}" + } + export -f say + export PROMPT_COMMAND="echo; echo" + # demos + $(< "$script_dir/demos/runtime-pre-8.11.3.sh") + $(< "$script_dir/demos/runtime-4.0.0.sh") + $(< "$script_dir/demos/invoked_missing_json.sh") + $(< "$script_dir/demos/invoked_bad_json.sh") + $(< "$script_dir/demos/invoked_no_version.sh") + $(< "$script_dir/demos/invoked_no_node_engine.sh") + $(< "$script_dir/demos/invoked_bad_node_engine.sh") + $(< "$script_dir/demos/invoked_missing_dep.sh") + trap "exit 0" SIGINT && while true; do sleep 1; done + SCRIPT + ) + # do not alter indentation, tabs in lines above + cd "$td_dapp" + local -a run_opts_demo=() + if [[ $EMBARK_SHIM_DEMO_DEV = true ]]; then + run_opts_demo=( + "${run_opts_demo[@]}" + "-v" + "${embark_dir}:/home/embark/repos/embark" + ) + fi + EMBARK_DOCKER_RUN=<(echo "$demo") \ + EMBARK_DOCKER_TAG="$shim_demo_tag" \ + run_embark \ + "${run_opts_demo[@]}" \ + -- \ + $EMBARK_SHIM_DEMO_DEV \ + || cleanup || return + cd "$work_dir" +} +export -f run_shim_demo + +if [[ "$0" = "$BASH_SOURCE" ]]; then + run_shim_demo +fi diff --git a/test/cli_shim/demos/invoked_bad_json.sh b/test/cli_shim/demos/invoked_bad_json.sh new file mode 100644 index 00000000..aee0c357 --- /dev/null +++ b/test/cli_shim/demos/invoked_bad_json.sh @@ -0,0 +1,20 @@ +say "$(cat << 'MSG' + +If invoked embark's package.json cannot be parsed then report error and exit + +MSG +)" + +cd ~/working/embark +echo '}' >> package.json +cd ~/embark_demo +nac lts + +bash -i << 'DEMO' +embark version +DEMO + +nac default +cd ~/working/embark +git stash &> /dev/null +cd ~ diff --git a/test/cli_shim/demos/invoked_bad_node_engine.sh b/test/cli_shim/demos/invoked_bad_node_engine.sh new file mode 100644 index 00000000..bcf806e5 --- /dev/null +++ b/test/cli_shim/demos/invoked_bad_node_engine.sh @@ -0,0 +1,38 @@ +say "$(cat << 'MSG' + +If invoked embark's package.json does not specify a valid node engine and +node < default minimum version, include a message about the fallback in the +"Unsupported runtime" error messages + +MSG +)" + +cd ~/working/embark +nac lts +json -I -f package.json -e 'this.engines.node=">-8.11.3"' &> /dev/null + +cd ~/embark_demo +nac pre-8.11.3 + +bash -i << 'DEMO' +node ~/working/embark/bin/embark version +DEMO + +say "$(cat << 'MSG' + +No message about the fallback to testing with the default minimum version is +displayed if the node version is supported + +MSG +)" + +nac lts + +bash -i << 'DEMO' +node ~/working/embark/bin/embark version +DEMO + +nac default +cd ~/working/embark +git stash &> /dev/null +cd ~ diff --git a/test/cli_shim/demos/invoked_missing_dep.sh b/test/cli_shim/demos/invoked_missing_dep.sh new file mode 100644 index 00000000..0e5e44ee --- /dev/null +++ b/test/cli_shim/demos/invoked_missing_dep.sh @@ -0,0 +1,102 @@ +say "$(cat << 'MSG' + +If invoked embark is missing a dependency then report error and exit + +MSG +)" + +cd ~/working/embark/node_modules +mv opn opn-RENAMED + +cd ~ +nac lts + +bash -i << 'DEMO' +embark version +DEMO + +nac default +cd ~/working/embark/node_modules +mv opn-RENAMED opn +cd ~ + +say "$(cat << 'MSG' + +If invoked embark is missing a dev dependency then report error and exit + +MSG +)" + +cd ~/working/embark/node_modules +mv sinon sinon-RENAMED + +cd ~ +nac lts + +bash -i << 'DEMO' +embark version +DEMO + +nac default +cd ~/working/embark/node_modules +mv sinon-RENAMED sinon +cd ~ + +say "$(cat << 'MSG' + +If invoked embark is within a node_modules tree then dependencies are not checked + +MSG +)" + +cd ~/working/embark/node_modules +mv opn opn-RENAMED +cd ~/working +mkdir node_modules +mv embark node_modules/ + +cd ~ +nac lts + +bash -i << 'DEMO' +node ~/working/node_modules/embark/bin/embark version +DEMO + +nac default +cd ~/working/node_modules +mv embark ../ +cd ../ +rmdir node_modules +cd ~/working/embark/node_modules +mv opn-RENAMED opn +cd ~ + +say "$(cat << 'MSG' + +If invoked embark is within a node_modules tree then dev dependencies are not +checked + +MSG +)" + +cd ~/working/embark/node_modules +mv sinon sinon-RENAMED +cd ~/working +mkdir node_modules +mv embark node_modules/ + +cd ~ +nac lts + +bash -i << 'DEMO' +node ~/working/node_modules/embark/bin/embark version +DEMO + +nac default +cd ~/working/node_modules +mv embark ../ +cd ../ +rmdir node_modules +cd ~/working/embark/node_modules +mv sinon-RENAMED sinon +cd ~ diff --git a/test/cli_shim/demos/invoked_missing_json.sh b/test/cli_shim/demos/invoked_missing_json.sh new file mode 100644 index 00000000..c28b445d --- /dev/null +++ b/test/cli_shim/demos/invoked_missing_json.sh @@ -0,0 +1,20 @@ +say "$(cat << 'MSG' + +If invoked embark's package.json is missing then report error and exit + +MSG +)" + +cd ~/working/embark +rm package.json +cd ~/embark_demo +nac lts + +bash -i << 'DEMO' +embark version +DEMO + +nac default +cd ~/working/embark +git stash &> /dev/null +cd ~ diff --git a/test/cli_shim/demos/invoked_no_node_engine.sh b/test/cli_shim/demos/invoked_no_node_engine.sh new file mode 100644 index 00000000..35821f05 --- /dev/null +++ b/test/cli_shim/demos/invoked_no_node_engine.sh @@ -0,0 +1,38 @@ +say "$(cat << 'MSG' + +If invoked embark's package.json does not specify a node engine and +node < default minimum version, include a message about the fallback in the +"Unsupported runtime" error messages + +MSG +)" + +cd ~/working/embark +nac lts +json -I -f package.json -e 'delete this.engines.node' &> /dev/null + +cd ~/embark_demo +nac pre-8.11.3 + +bash -i << 'DEMO' +node ~/working/embark/bin/embark version +DEMO + +say "$(cat << 'MSG' + +No message about the fallback to testing with the default minimum version is +displayed if the node version is supported + +MSG +)" + +nac lts + +bash -i << 'DEMO' +node ~/working/embark/bin/embark version +DEMO + +nac default +cd ~/working/embark +git stash &> /dev/null +cd ~ diff --git a/test/cli_shim/demos/invoked_no_version.sh b/test/cli_shim/demos/invoked_no_version.sh new file mode 100644 index 00000000..24300c5c --- /dev/null +++ b/test/cli_shim/demos/invoked_no_version.sh @@ -0,0 +1,21 @@ +say "$(cat << 'MSG' + +If invoked embark's package.json does not specify a version then report warning +and continue + +MSG +)" + +cd ~/working/embark +nac lts +json -I -f package.json -e 'delete this.version' &> /dev/null +cd ~/embark_demo + +bash -i << 'DEMO' +embark version +DEMO + +nac default +cd ~/working/embark +git stash &> /dev/null +cd ~ diff --git a/test/cli_shim/demos/runtime-4.0.0.sh b/test/cli_shim/demos/runtime-4.0.0.sh new file mode 100644 index 00000000..a55a3353 --- /dev/null +++ b/test/cli_shim/demos/runtime-4.0.0.sh @@ -0,0 +1,16 @@ +say "$(cat << 'MSG' + +Intended "Unsupported runtime" error messages are displayed for node >= 4.0.0 + +MSG +)" + +cd ~/embark_demo +nac 4.0.0 + +bash -i << 'DEMO' +node ~/working/embark/bin/embark version +DEMO + +nac default +cd ~ diff --git a/test/cli_shim/demos/runtime-pre-8.11.3.sh b/test/cli_shim/demos/runtime-pre-8.11.3.sh new file mode 100644 index 00000000..f8786bfd --- /dev/null +++ b/test/cli_shim/demos/runtime-pre-8.11.3.sh @@ -0,0 +1,17 @@ +say "$(cat << 'MSG' + +If a node < version specified in invoked embark's `{engines:{node:[semver]}}` +is used to run embark then report error and exit + +MSG +)" + +cd ~/embark_demo +nac pre-8.11.3 + +bash -i << 'DEMO' +node ~/working/embark/bin/embark version +DEMO + +nac default +cd ~