Retain all applicable checks behind one result and use native CircleCI reporting. Co-Authored-By: Codex <noreply@openai.com> Signed-off-by: James Maes <james@kof22.com>
1136 lines
37 KiB
Bash
Executable File
1136 lines
37 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
SRC_SCRIPTS="${PROJECT_DIR}/src/scripts"
|
|
PASS=0
|
|
FAIL=0
|
|
|
|
# Test helper functions
|
|
pass() {
|
|
echo "PASS"
|
|
PASS=$((PASS + 1))
|
|
}
|
|
|
|
fail() {
|
|
local msg="${1:-}"
|
|
echo "FAIL${msg:+ ($msg)}"
|
|
FAIL=$((FAIL + 1))
|
|
}
|
|
|
|
# =============================================================================
|
|
# Test: node_test.sh - Custom test commands
|
|
# =============================================================================
|
|
echo "=== node_test.sh Tests ==="
|
|
|
|
echo -n " TEST: runs custom test commands via bash -c (not eval)... "
|
|
# Verify the script uses bash -c, not eval
|
|
if grep -q 'bash -c "\${CMD}"' "${SRC_SCRIPTS}/node_test.sh"; then
|
|
pass
|
|
else
|
|
fail "script should use 'bash -c' not 'eval'"
|
|
fi
|
|
|
|
echo -n " TEST: creates reports/junit directory... "
|
|
if grep -q 'mkdir -p reports/junit' "${SRC_SCRIPTS}/node_test.sh"; then
|
|
pass
|
|
else
|
|
fail "should create reports/junit"
|
|
fi
|
|
|
|
echo -n " TEST: handles empty TEST_COMMANDS_JSON... "
|
|
if grep -q '\[\]' "${SRC_SCRIPTS}/node_test.sh" && grep -q 'null' "${SRC_SCRIPTS}/node_test.sh"; then
|
|
pass
|
|
else
|
|
fail "should handle empty/null JSON"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: docker_push_ghcr.sh - Secret validation
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== docker_push_ghcr.sh Tests ==="
|
|
|
|
echo -n " TEST: validates DOCKER_IMAGE is set... "
|
|
if grep -q 'DOCKER_IMAGE:?' "${SRC_SCRIPTS}/docker_push_ghcr.sh"; then
|
|
pass
|
|
else
|
|
fail "should validate DOCKER_IMAGE"
|
|
fi
|
|
|
|
echo -n " TEST: validates DOCKER_TAG is set... "
|
|
if grep -q 'DOCKER_TAG:?' "${SRC_SCRIPTS}/docker_push_ghcr.sh"; then
|
|
pass
|
|
else
|
|
fail "should validate DOCKER_TAG"
|
|
fi
|
|
|
|
echo -n " TEST: validates GHCR credentials... "
|
|
if grep -q 'if \[\[ -z "\${TOKEN}"' "${SRC_SCRIPTS}/docker_push_ghcr.sh"; then
|
|
pass
|
|
else
|
|
fail "should validate TOKEN"
|
|
fi
|
|
|
|
echo -n " TEST: uses --password-stdin for docker login... "
|
|
if grep -q '\-\-password-stdin' "${SRC_SCRIPTS}/docker_push_ghcr.sh"; then
|
|
pass
|
|
else
|
|
fail "should use --password-stdin"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: github_release.sh - Secret validation
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== github_release.sh Tests ==="
|
|
|
|
echo -n " TEST: validates GITHUB_TOKEN is set... "
|
|
if grep -q 'GITHUB_TOKEN' "${SRC_SCRIPTS}/github_release.sh" && grep -q 'ERROR.*GITHUB_TOKEN' "${SRC_SCRIPTS}/github_release.sh"; then
|
|
pass
|
|
else
|
|
fail "should validate GITHUB_TOKEN"
|
|
fi
|
|
|
|
echo -n " TEST: validates PROJECT_VERSION is set... "
|
|
if grep -q 'PROJECT_VERSION' "${SRC_SCRIPTS}/github_release.sh"; then
|
|
pass
|
|
else
|
|
fail "should validate PROJECT_VERSION"
|
|
fi
|
|
|
|
echo -n " TEST: creates GitHub Release with --generate-notes... "
|
|
if grep -q 'gh release create' "${SRC_SCRIPTS}/github_release.sh" && grep -q '\-\-generate-notes' "${SRC_SCRIPTS}/github_release.sh"; then
|
|
pass
|
|
else
|
|
fail "should create GitHub Release with --generate-notes"
|
|
fi
|
|
|
|
echo -n " TEST: uses dynamic --target (not hardcoded main)... "
|
|
if grep -q '\-\-target "\${TARGET}"' "${SRC_SCRIPTS}/github_release.sh"; then
|
|
pass
|
|
else
|
|
fail "should use dynamic --target"
|
|
fi
|
|
|
|
echo -n " TEST: supports --prerelease flag for RC versions... "
|
|
if grep -q '\-\-prerelease' "${SRC_SCRIPTS}/github_release.sh" && grep -q 'PRERELEASE_FLAG' "${SRC_SCRIPTS}/github_release.sh"; then
|
|
pass
|
|
else
|
|
fail "should support --prerelease flag"
|
|
fi
|
|
|
|
echo -n " TEST: detects RC/alpha/beta/SNAPSHOT versions... "
|
|
if grep -q 'RC|alpha|beta|SNAPSHOT' "${SRC_SCRIPTS}/github_release.sh"; then
|
|
pass
|
|
else
|
|
fail "should detect pre-release version patterns"
|
|
fi
|
|
|
|
echo -n " TEST: uses CIRCLE_BRANCH for pre-release target... "
|
|
if grep -q 'CIRCLE_BRANCH' "${SRC_SCRIPTS}/github_release.sh"; then
|
|
pass
|
|
else
|
|
fail "should use CIRCLE_BRANCH for pre-release target"
|
|
fi
|
|
|
|
echo -n " TEST: skips if release already exists... "
|
|
if grep -q 'already exists, skipping' "${SRC_SCRIPTS}/github_release.sh"; then
|
|
pass
|
|
else
|
|
fail "should skip existing releases"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: calculate_version.sh - Munitor-managed GitVersion config
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== calculate_version.sh Tests ==="
|
|
|
|
echo -n " TEST: writes GitVersion.yml before running GitVersion... "
|
|
if grep -q 'cat > GitVersion.yml' "${SRC_SCRIPTS}/calculate_version.sh"; then
|
|
pass
|
|
else
|
|
fail "should write GitVersion.yml"
|
|
fi
|
|
|
|
echo -n " TEST: includes tag-prefix: v in GitVersion config... "
|
|
if grep -q 'tag-prefix: v' "${SRC_SCRIPTS}/calculate_version.sh"; then
|
|
pass
|
|
else
|
|
fail "should include tag-prefix: v"
|
|
fi
|
|
|
|
echo -n " TEST: warns if repo already has GitVersion.yml... "
|
|
if grep -q 'WARNING.*GitVersion.yml' "${SRC_SCRIPTS}/calculate_version.sh"; then
|
|
pass
|
|
else
|
|
fail "should warn about existing GitVersion.yml"
|
|
fi
|
|
|
|
echo -n " TEST: enables commit-message-incrementing... "
|
|
if grep -q 'commit-message-incrementing: Enabled' "${SRC_SCRIPTS}/calculate_version.sh"; then
|
|
pass
|
|
else
|
|
fail "should enable commit-message-incrementing"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: npm_auth.sh - Secret validation
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== npm_auth.sh Tests ==="
|
|
|
|
echo -n " TEST: validates NPM_TOKEN is set... "
|
|
if grep -q 'if \[\[ -z "\${NPM_TOKEN:-}"' "${SRC_SCRIPTS}/npm_auth.sh"; then
|
|
pass
|
|
else
|
|
fail "should validate NPM_TOKEN"
|
|
fi
|
|
|
|
echo -n " TEST: configures .npmrc securely... "
|
|
if grep -q '_authToken=\${NPM_TOKEN}' "${SRC_SCRIPTS}/npm_auth.sh"; then
|
|
pass
|
|
else
|
|
fail "should use NPM_TOKEN in .npmrc"
|
|
fi
|
|
|
|
echo -n " TEST: always includes @koftwentytwo scope... "
|
|
if grep -q '@koftwentytwo' "${SRC_SCRIPTS}/npm_auth.sh"; then
|
|
pass
|
|
else
|
|
fail "should always include @koftwentytwo scope"
|
|
fi
|
|
|
|
echo -n " TEST: supports additional scopes via NPM_SCOPES... "
|
|
if grep -q 'NPM_SCOPES' "${SRC_SCRIPTS}/npm_auth.sh"; then
|
|
pass
|
|
else
|
|
fail "should read NPM_SCOPES env var"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: health_check.sh - Generic PG env vars
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== health_check.sh Tests ==="
|
|
|
|
echo -n " TEST: passes Liquibase env vars for java-webapp compat... "
|
|
if grep -q 'LIQUIBASE_USERNAME' "${SRC_SCRIPTS}/health_check.sh"; then
|
|
pass
|
|
else
|
|
fail "should pass Liquibase env vars"
|
|
fi
|
|
|
|
echo -n " TEST: passes generic PG env vars for non-Liquibase apps... "
|
|
if grep -q 'PG_HOST' "${SRC_SCRIPTS}/health_check.sh"; then
|
|
pass
|
|
else
|
|
fail "should pass PG_HOST env var"
|
|
fi
|
|
|
|
echo -n " TEST: passes PG_SSL=false for sidecar... "
|
|
if grep -q 'PG_SSL=false' "${SRC_SCRIPTS}/health_check.sh"; then
|
|
pass
|
|
else
|
|
fail "should pass PG_SSL=false"
|
|
fi
|
|
|
|
echo -n " TEST: passes complete RDBMS env vars for sidecar... "
|
|
if grep -q 'RDBMS_VENDOR=postgresql' "${SRC_SCRIPTS}/health_check.sh" \
|
|
&& grep -q 'RDBMS_DATABASE_NAME=postgres' "${SRC_SCRIPTS}/health_check.sh" \
|
|
&& grep -q 'RDBMS_USERNAME=postgres' "${SRC_SCRIPTS}/health_check.sh" \
|
|
&& grep -q 'RDBMS_PASSWORD=postgres' "${SRC_SCRIPTS}/health_check.sh"; then
|
|
pass
|
|
else
|
|
fail "should pass all six RDBMS_* env vars"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: mvn_sonar.sh - Secret validation
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== mvn_sonar.sh Tests ==="
|
|
|
|
echo -n " TEST: validates SONAR_PROJECT_KEY is set... "
|
|
if grep -q 'SONAR_PROJECT_KEY:?' "${SRC_SCRIPTS}/mvn_sonar.sh"; then
|
|
pass
|
|
else
|
|
fail "should validate SONAR_PROJECT_KEY"
|
|
fi
|
|
|
|
echo -n " TEST: validates TOKEN is set... "
|
|
if grep -q 'if \[\[ -z "\${TOKEN}"' "${SRC_SCRIPTS}/mvn_sonar.sh"; then
|
|
pass
|
|
else
|
|
fail "should validate TOKEN"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: start_services.sh - Security
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== start_services.sh Tests ==="
|
|
|
|
echo -n " TEST: uses bash -c for healthcheck (not eval)... "
|
|
if grep -q 'bash -c "\${HEALTHCHECK}"' "${SRC_SCRIPTS}/start_services.sh"; then
|
|
pass
|
|
else
|
|
fail "should use 'bash -c' not 'eval'"
|
|
fi
|
|
|
|
echo -n " TEST: has health timeout... "
|
|
if grep -q 'HEALTH_TIMEOUT' "${SRC_SCRIPTS}/start_services.sh"; then
|
|
pass
|
|
else
|
|
fail "should have health timeout"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: node_coverage_check.sh - Security
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== node_coverage_check.sh Tests ==="
|
|
|
|
echo -n " TEST: uses bash -c for coverage command (not eval)... "
|
|
if grep -q 'bash -c "\${COVERAGE_COMMAND}"' "${SRC_SCRIPTS}/node_coverage_check.sh"; then
|
|
pass
|
|
else
|
|
fail "should use 'bash -c' not 'eval'"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: update_cd_repo.sh - CD_ENVIRONMENT support
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== update_cd_repo.sh Tests ==="
|
|
|
|
echo -n " TEST: reads CD_ENVIRONMENT from env... "
|
|
if grep -q 'CD_ENVIRONMENT' "${SRC_SCRIPTS}/update_cd_repo.sh"; then
|
|
pass
|
|
else
|
|
fail "should reference CD_ENVIRONMENT"
|
|
fi
|
|
|
|
echo -n " TEST: resolves environment-specific values path... "
|
|
if grep -q 'environments/' "${SRC_SCRIPTS}/update_cd_repo.sh"; then
|
|
pass
|
|
else
|
|
fail "should resolve environments/<env>/values.yaml"
|
|
fi
|
|
|
|
echo -n " TEST: supports a validated explicit Kustomize path... "
|
|
if grep -q 'CONFIGURED_PATH="${CD_PATH:-}"' "${SRC_SCRIPTS}/update_cd_repo.sh" &&
|
|
grep -q 'cd.path must be a relative path' "${SRC_SCRIPTS}/update_cd_repo.sh"; then
|
|
pass
|
|
else
|
|
fail "should support and validate an explicit Kustomize path"
|
|
fi
|
|
|
|
echo -n " TEST: retries concurrent shared-repository commits against the new head... "
|
|
if grep -q 'for attempt in 1 2 3' "${SRC_SCRIPTS}/update_cd_repo.sh" &&
|
|
grep -q 'expectedHeadOid' "${SRC_SCRIPTS}/update_cd_repo.sh" &&
|
|
grep -q 'git reset -q --hard "origin/${BRANCH}"' "${SRC_SCRIPTS}/update_cd_repo.sh"; then
|
|
pass
|
|
else
|
|
fail "should retry commit races against the refreshed branch head"
|
|
fi
|
|
|
|
echo -n " TEST: commits through the signed GraphQL API, never git push... "
|
|
if grep -q 'createCommitOnBranch' "${SRC_SCRIPTS}/update_cd_repo.sh" &&
|
|
! grep -q 'git push' "${SRC_SCRIPTS}/update_cd_repo.sh"; then
|
|
pass
|
|
else
|
|
fail "should create GitOps commits with createCommitOnBranch so GitHub signs them"
|
|
fi
|
|
|
|
echo -n " TEST: deletes digest field when setting newTag (kustomize)... "
|
|
if grep -q 'del((.images\[\] | select(.name == \\"${IMAGE_NAME}\\")).digest)' "${SRC_SCRIPTS}/update_cd_repo.sh"; then
|
|
pass
|
|
else
|
|
fail "should delete digest field to prevent kustomize from ignoring newTag"
|
|
fi
|
|
|
|
echo -n " TEST: upserts supplemental images (creates new entry)... "
|
|
if grep -q '.images += \[{' "${SRC_SCRIPTS}/update_cd_repo.sh"; then
|
|
pass
|
|
else
|
|
fail "should create new image entries for supplemental images"
|
|
fi
|
|
|
|
echo -n " TEST: checks for existing entry before upsert... "
|
|
if grep -q 'EXISTING=' "${SRC_SCRIPTS}/update_cd_repo.sh" && grep -q 'if \[\[ -z "${EXISTING}"' "${SRC_SCRIPTS}/update_cd_repo.sh"; then
|
|
pass
|
|
else
|
|
fail "should check if image entry exists before deciding to create or update"
|
|
fi
|
|
|
|
# Functional test: verify upsert creates entries in a real kustomization file
|
|
echo -n " TEST: upsert creates new image entry in kustomization (functional)... "
|
|
UPSERT_TMPDIR=$(mktemp -d)
|
|
cat > "${UPSERT_TMPDIR}/kustomization.yaml" <<'KUSTYAML'
|
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
|
kind: Kustomization
|
|
images:
|
|
- name: ghcr.io/koftwentytwo/website-backend
|
|
newTag: "0.1.0"
|
|
KUSTYAML
|
|
SUPP_CD_IMAGE="ghcr.io/koftwentytwo/website-backend-migrations"
|
|
VERSION_TEST="0.2.0-SNAPSHOT.abc1234"
|
|
EXISTING=$(yq ".images[] | select(.name == \"${SUPP_CD_IMAGE}\") | .name" "${UPSERT_TMPDIR}/kustomization.yaml")
|
|
if [[ -z "${EXISTING}" ]]; then
|
|
yq -i ".images += [{\"name\": \"${SUPP_CD_IMAGE}\", \"newTag\": \"${VERSION_TEST}\"}]" "${UPSERT_TMPDIR}/kustomization.yaml"
|
|
fi
|
|
RESULT_TAG=$(yq ".images[] | select(.name == \"${SUPP_CD_IMAGE}\") | .newTag" "${UPSERT_TMPDIR}/kustomization.yaml")
|
|
if [[ "${RESULT_TAG}" == "${VERSION_TEST}" ]]; then
|
|
pass
|
|
else
|
|
fail "expected newTag=${VERSION_TEST}, got ${RESULT_TAG}"
|
|
fi
|
|
|
|
echo -n " TEST: upsert updates existing image entry in kustomization (functional)... "
|
|
VERSION_TEST2="0.3.0-SNAPSHOT.def5678"
|
|
EXISTING=$(yq ".images[] | select(.name == \"${SUPP_CD_IMAGE}\") | .name" "${UPSERT_TMPDIR}/kustomization.yaml")
|
|
if [[ -n "${EXISTING}" ]]; then
|
|
yq -i "(.images[] | select(.name == \"${SUPP_CD_IMAGE}\")).newTag = \"${VERSION_TEST2}\"" "${UPSERT_TMPDIR}/kustomization.yaml"
|
|
fi
|
|
RESULT_TAG2=$(yq ".images[] | select(.name == \"${SUPP_CD_IMAGE}\") | .newTag" "${UPSERT_TMPDIR}/kustomization.yaml")
|
|
ENTRY_COUNT=$(yq "[.images[] | select(.name == \"${SUPP_CD_IMAGE}\")] | length" "${UPSERT_TMPDIR}/kustomization.yaml")
|
|
if [[ "${RESULT_TAG2}" == "${VERSION_TEST2}" && "${ENTRY_COUNT}" == "1" ]]; then
|
|
pass
|
|
else
|
|
fail "expected newTag=${VERSION_TEST2} with 1 entry, got tag=${RESULT_TAG2} count=${ENTRY_COUNT}"
|
|
fi
|
|
rm -rf "${UPSERT_TMPDIR}"
|
|
|
|
# =============================================================================
|
|
# Test: docker_build.sh - DOCKER_ENV_TAG support
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== docker_build.sh Tests ==="
|
|
|
|
echo -n " TEST: reads DOCKER_ENV_TAG from env... "
|
|
if grep -q 'DOCKER_ENV_TAG' "${SRC_SCRIPTS}/docker_build.sh"; then
|
|
pass
|
|
else
|
|
fail "should reference DOCKER_ENV_TAG"
|
|
fi
|
|
|
|
echo -n " TEST: exports DOCKER_ENV_TAG to BASH_ENV... "
|
|
if grep -q "DOCKER_ENV_TAG" "${SRC_SCRIPTS}/docker_build.sh" && grep -q 'BASH_ENV' "${SRC_SCRIPTS}/docker_build.sh"; then
|
|
pass
|
|
else
|
|
fail "should export DOCKER_ENV_TAG"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: docker_push_ghcr.sh - DOCKER_ENV_TAG support
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== docker_push_ghcr.sh DOCKER_ENV_TAG Tests ==="
|
|
|
|
echo -n " TEST: reads DOCKER_ENV_TAG from env... "
|
|
if grep -q 'DOCKER_ENV_TAG' "${SRC_SCRIPTS}/docker_push_ghcr.sh"; then
|
|
pass
|
|
else
|
|
fail "should reference DOCKER_ENV_TAG"
|
|
fi
|
|
|
|
echo -n " TEST: conditionally pushes env tag... "
|
|
if grep -q 'ENV_TAG' "${SRC_SCRIPTS}/docker_push_ghcr.sh" && grep -q 'docker push.*ENV_TAG' "${SRC_SCRIPTS}/docker_push_ghcr.sh"; then
|
|
pass
|
|
else
|
|
fail "should conditionally push env tag"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: export_version_vars.sh - DOCKER_ENV_TAG export
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== export_version_vars.sh DOCKER_ENV_TAG Tests ==="
|
|
|
|
echo -n " TEST: exports DOCKER_ENV_TAG to BASH_ENV... "
|
|
if grep -q 'DOCKER_ENV_TAG' "${SRC_SCRIPTS}/export_version_vars.sh" && grep -q 'BASH_ENV' "${SRC_SCRIPTS}/export_version_vars.sh"; then
|
|
pass
|
|
else
|
|
fail "should export DOCKER_ENV_TAG to BASH_ENV"
|
|
fi
|
|
|
|
echo -n " TEST: handles staging branch... "
|
|
if grep -q 'staging)' "${SRC_SCRIPTS}/export_version_vars.sh"; then
|
|
pass
|
|
else
|
|
fail "should handle staging branch"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: generate_dockerfile.sh - Dockerfile generation
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== generate_dockerfile.sh Tests ==="
|
|
|
|
echo -n " TEST: reads .munitor.yml config... "
|
|
if grep -q '\.munitor\.yml' "${SRC_SCRIPTS}/generate_dockerfile.sh"; then
|
|
pass
|
|
else
|
|
fail "should read .munitor.yml"
|
|
fi
|
|
|
|
echo -n " TEST: handles node-api pipeline... "
|
|
if grep -q 'node-api)' "${SRC_SCRIPTS}/generate_dockerfile.sh"; then
|
|
pass
|
|
else
|
|
fail "should handle node-api"
|
|
fi
|
|
|
|
echo -n " TEST: handles java-webapp pipeline... "
|
|
if grep -q 'java-webapp)' "${SRC_SCRIPTS}/generate_dockerfile.sh"; then
|
|
pass
|
|
else
|
|
fail "should handle java-webapp"
|
|
fi
|
|
|
|
echo -n " TEST: handles node-webapp pipeline... "
|
|
if grep -q 'node-webapp)' "${SRC_SCRIPTS}/generate_dockerfile.sh"; then
|
|
pass
|
|
else
|
|
fail "should handle node-webapp"
|
|
fi
|
|
|
|
echo -n " TEST: fails on unsupported pipeline... "
|
|
if grep -q 'Unsupported pipeline type' "${SRC_SCRIPTS}/generate_dockerfile.sh"; then
|
|
pass
|
|
else
|
|
fail "should fail on unsupported type"
|
|
fi
|
|
|
|
echo -n " TEST: uses multi-stage build for node-api... "
|
|
if grep -q 'AS deps' "${SRC_SCRIPTS}/generate_dockerfile.sh" && grep -q 'AS builder' "${SRC_SCRIPTS}/generate_dockerfile.sh"; then
|
|
pass
|
|
else
|
|
fail "should use multi-stage build"
|
|
fi
|
|
|
|
echo -n " TEST: uses Alpine JRE for java-webapp... "
|
|
if grep -q 'eclipse-temurin.*jre-alpine' "${SRC_SCRIPTS}/generate_dockerfile.sh" && grep -q 'USER appuser' "${SRC_SCRIPTS}/generate_dockerfile.sh"; then
|
|
pass
|
|
else
|
|
fail "should use Alpine JRE with non-root user"
|
|
fi
|
|
|
|
echo ""
|
|
echo "=== node_install_deps.sh pnpm support ==="
|
|
|
|
echo -n " TEST: node_install_deps.sh handles pnpm case... "
|
|
if grep -q 'pnpm install --frozen-lockfile' "${SRC_SCRIPTS}/node_install_deps.sh"; then
|
|
pass
|
|
else
|
|
fail "missing pnpm install --frozen-lockfile"
|
|
fi
|
|
|
|
echo -n " TEST: node_install_deps.sh has Prisma auto-detection... "
|
|
if grep -q 'prisma/schema.prisma' "${SRC_SCRIPTS}/node_install_deps.sh"; then
|
|
pass
|
|
else
|
|
fail "missing Prisma auto-detection"
|
|
fi
|
|
|
|
echo -n " TEST: node_test.sh handles pnpm fallback... "
|
|
if grep -q 'pnpm test' "${SRC_SCRIPTS}/node_test.sh"; then
|
|
pass
|
|
else
|
|
fail "missing pnpm test fallback"
|
|
fi
|
|
|
|
echo -n " TEST: run_test_setup.sh supports inline commands... "
|
|
if grep -q 'bash -c' "${SRC_SCRIPTS}/run_test_setup.sh"; then
|
|
pass
|
|
else
|
|
fail "missing bash -c inline command support"
|
|
fi
|
|
|
|
echo -n " TEST: generate_dockerfile.sh has pnpm Dockerfile variant... "
|
|
if grep -q 'pnpm install --frozen-lockfile' "${SRC_SCRIPTS}/generate_dockerfile.sh"; then
|
|
pass
|
|
else
|
|
fail "missing pnpm Dockerfile variant"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: install_kustomize.sh - Pinned binary install
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== install_kustomize.sh Tests ==="
|
|
|
|
echo -n " TEST: uses munitor_download_with_retry... "
|
|
if grep -q 'munitor_download_with_retry' "${SRC_SCRIPTS}/install_kustomize.sh"; then
|
|
pass
|
|
else
|
|
fail "should use munitor_download_with_retry"
|
|
fi
|
|
|
|
echo -n " TEST: pins version via KUSTOMIZE_VERSION... "
|
|
if grep -q 'KUSTOMIZE_VERSION' "${SRC_SCRIPTS}/install_kustomize.sh"; then
|
|
pass
|
|
else
|
|
fail "should use KUSTOMIZE_VERSION env var"
|
|
fi
|
|
|
|
echo -n " TEST: uses URL-encoded path segment... "
|
|
if grep -q 'kustomize%2Fv' "${SRC_SCRIPTS}/install_kustomize.sh"; then
|
|
pass
|
|
else
|
|
fail "should use kustomize%2Fv in URL"
|
|
fi
|
|
|
|
echo -n " TEST: has cleanup trap... "
|
|
if grep -q 'trap cleanup EXIT' "${SRC_SCRIPTS}/install_kustomize.sh"; then
|
|
pass
|
|
else
|
|
fail "should have cleanup trap"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: kustomize_validate.sh - Build base + overlays
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== kustomize_validate.sh Tests ==="
|
|
|
|
echo -n " TEST: auto-detects overlays when KUSTOMIZE_OVERLAYS is empty... "
|
|
if grep -q '/\*/kustomization.yaml' "${SRC_SCRIPTS}/kustomize_validate.sh"; then
|
|
pass
|
|
else
|
|
fail "should auto-detect overlays"
|
|
fi
|
|
|
|
echo -n " TEST: supports load restrictor flag... "
|
|
if grep -q 'LoadRestrictionsNone' "${SRC_SCRIPTS}/kustomize_validate.sh"; then
|
|
pass
|
|
else
|
|
fail "should support LoadRestrictionsNone"
|
|
fi
|
|
|
|
echo -n " TEST: outputs to /tmp/kustomize-output... "
|
|
if grep -q '/tmp/kustomize-output' "${SRC_SCRIPTS}/kustomize_validate.sh"; then
|
|
pass
|
|
else
|
|
fail "should output to /tmp/kustomize-output"
|
|
fi
|
|
|
|
echo -n " TEST: supports KUSTOMIZE_OVERLAY_DIR env var... "
|
|
if grep -q 'KUSTOMIZE_OVERLAY_DIR' "${SRC_SCRIPTS}/kustomize_validate.sh"; then
|
|
pass
|
|
else
|
|
fail "should support KUSTOMIZE_OVERLAY_DIR"
|
|
fi
|
|
|
|
echo -n " TEST: skips base build when BASE_PATH is empty... "
|
|
if grep -q 'if \[\[ -n "\${BASE_PATH}" \]\]' "${SRC_SCRIPTS}/kustomize_validate.sh"; then
|
|
pass
|
|
else
|
|
fail "should conditionally skip base build"
|
|
fi
|
|
|
|
echo -n " TEST: uses OVERLAY_DIR variable for overlay path... "
|
|
if grep -q '"\${OVERLAY_DIR}/' "${SRC_SCRIPTS}/kustomize_validate.sh"; then
|
|
pass
|
|
else
|
|
fail "should use OVERLAY_DIR variable"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: install_kubesec.sh - Pinned binary install
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== install_kubesec.sh Tests ==="
|
|
|
|
echo -n " TEST: uses munitor_download_with_retry... "
|
|
if grep -q 'munitor_download_with_retry' "${SRC_SCRIPTS}/install_kubesec.sh"; then
|
|
pass
|
|
else
|
|
fail "should use munitor_download_with_retry"
|
|
fi
|
|
|
|
echo -n " TEST: has cleanup trap... "
|
|
if grep -q 'trap cleanup EXIT' "${SRC_SCRIPTS}/install_kubesec.sh"; then
|
|
pass
|
|
else
|
|
fail "should have cleanup trap"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: run_kubesec.sh - Soft-fail scan
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== run_kubesec.sh Tests ==="
|
|
|
|
echo -n " TEST: reads scan overlay from env... "
|
|
if grep -q 'KUBESEC_SCAN_OVERLAY' "${SRC_SCRIPTS}/run_kubesec.sh"; then
|
|
pass
|
|
else
|
|
fail "should read KUBESEC_SCAN_OVERLAY"
|
|
fi
|
|
|
|
echo -n " TEST: soft-fails (|| true)... "
|
|
if grep -q '|| true' "${SRC_SCRIPTS}/run_kubesec.sh"; then
|
|
pass
|
|
else
|
|
fail "should soft-fail"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: install_kube_linter.sh - Pinned binary install
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== install_kube_linter.sh Tests ==="
|
|
|
|
echo -n " TEST: uses munitor_download_with_retry... "
|
|
if grep -q 'munitor_download_with_retry' "${SRC_SCRIPTS}/install_kube_linter.sh"; then
|
|
pass
|
|
else
|
|
fail "should use munitor_download_with_retry"
|
|
fi
|
|
|
|
echo -n " TEST: has cleanup trap... "
|
|
if grep -q 'trap cleanup EXIT' "${SRC_SCRIPTS}/install_kube_linter.sh"; then
|
|
pass
|
|
else
|
|
fail "should have cleanup trap"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: run_kube_linter.sh - Soft-fail lint
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== run_kube_linter.sh Tests ==="
|
|
|
|
echo -n " TEST: reads scan overlay from env... "
|
|
if grep -q 'KUBE_LINTER_SCAN_OVERLAY' "${SRC_SCRIPTS}/run_kube_linter.sh"; then
|
|
pass
|
|
else
|
|
fail "should read KUBE_LINTER_SCAN_OVERLAY"
|
|
fi
|
|
|
|
echo -n " TEST: supports optional config file... "
|
|
if grep -q 'KUBE_LINTER_CONFIG' "${SRC_SCRIPTS}/run_kube_linter.sh"; then
|
|
pass
|
|
else
|
|
fail "should read KUBE_LINTER_CONFIG"
|
|
fi
|
|
|
|
echo -n " TEST: soft-fails (|| true)... "
|
|
if grep -q '|| true' "${SRC_SCRIPTS}/run_kube_linter.sh"; then
|
|
pass
|
|
else
|
|
fail "should soft-fail"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: yaml_lint_cd.sh - YAML linting
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== yaml_lint_cd.sh Tests ==="
|
|
|
|
echo -n " TEST: installs yamllint via apt... "
|
|
if grep -q 'apt-get install.*yamllint' "${SRC_SCRIPTS}/yaml_lint_cd.sh"; then
|
|
pass
|
|
else
|
|
fail "should install yamllint via apt"
|
|
fi
|
|
|
|
echo -n " TEST: uses relaxed config with line-length disabled... "
|
|
if grep -q 'line-length: disable' "${SRC_SCRIPTS}/yaml_lint_cd.sh"; then
|
|
pass
|
|
else
|
|
fail "should disable line-length rule"
|
|
fi
|
|
|
|
echo -n " TEST: skips missing directories... "
|
|
if grep -q '! -d' "${SRC_SCRIPTS}/yaml_lint_cd.sh"; then
|
|
pass
|
|
else
|
|
fail "should skip missing directories"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: build_push_supplemental.sh - Supplemental image build
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== build_push_supplemental.sh Tests ==="
|
|
|
|
echo -n " TEST: sources munitor_helpers... "
|
|
if grep -q 'MUNITOR_HELPERS' "${SRC_SCRIPTS}/build_push_supplemental.sh"; then
|
|
pass
|
|
else
|
|
fail "should source munitor_helpers"
|
|
fi
|
|
|
|
echo -n " TEST: calls munitor_header... "
|
|
if grep -q 'munitor_header' "${SRC_SCRIPTS}/build_push_supplemental.sh"; then
|
|
pass
|
|
else
|
|
fail "should call munitor_header"
|
|
fi
|
|
|
|
echo -n " TEST: reads SUPPLEMENTAL_IMAGES_JSON... "
|
|
if grep -q 'SUPPLEMENTAL_IMAGES_JSON' "${SRC_SCRIPTS}/build_push_supplemental.sh"; then
|
|
pass
|
|
else
|
|
fail "should read SUPPLEMENTAL_IMAGES_JSON"
|
|
fi
|
|
|
|
echo -n " TEST: skips when JSON is empty... "
|
|
if grep -q 'exit 0' "${SRC_SCRIPTS}/build_push_supplemental.sh"; then
|
|
pass
|
|
else
|
|
fail "should exit 0 when no supplemental images"
|
|
fi
|
|
|
|
echo -n " TEST: uses jq to parse JSON... "
|
|
if grep -q 'jq' "${SRC_SCRIPTS}/build_push_supplemental.sh"; then
|
|
pass
|
|
else
|
|
fail "should use jq"
|
|
fi
|
|
|
|
echo -n " TEST: builds Docker images... "
|
|
if grep -q 'docker build' "${SRC_SCRIPTS}/build_push_supplemental.sh"; then
|
|
pass
|
|
else
|
|
fail "should run docker build"
|
|
fi
|
|
|
|
echo -n " TEST: scans with Trivy... "
|
|
if grep -q 'trivy image' "${SRC_SCRIPTS}/build_push_supplemental.sh"; then
|
|
pass
|
|
else
|
|
fail "should scan with trivy"
|
|
fi
|
|
|
|
echo -n " TEST: pushes images... "
|
|
if grep -q 'docker push' "${SRC_SCRIPTS}/build_push_supplemental.sh"; then
|
|
pass
|
|
else
|
|
fail "should push images"
|
|
fi
|
|
|
|
echo -n " TEST: supports custom Dockerfile... "
|
|
if grep -q 'dockerfile' "${SRC_SCRIPTS}/build_push_supplemental.sh"; then
|
|
pass
|
|
else
|
|
fail "should support custom dockerfile"
|
|
fi
|
|
|
|
echo -n " TEST: auto-generates Dockerfile from base+copy... "
|
|
if grep -q 'Dockerfile\.' "${SRC_SCRIPTS}/build_push_supplemental.sh" && grep -q 'FROM' "${SRC_SCRIPTS}/build_push_supplemental.sh"; then
|
|
pass
|
|
else
|
|
fail "should auto-generate Dockerfile"
|
|
fi
|
|
|
|
echo -n " TEST: uses set -euo pipefail... "
|
|
if grep -q 'set -euo pipefail' "${SRC_SCRIPTS}/build_push_supplemental.sh"; then
|
|
pass
|
|
else
|
|
fail "should use strict mode"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: Scripts have proper error handling
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== Error Handling Tests ==="
|
|
|
|
echo -n " TEST: all scripts use set -euo pipefail... "
|
|
# Sourced libraries must not change the caller shell options.
|
|
SCRIPTS_WITHOUT_STRICT=$(find "${SRC_SCRIPTS}" -name "*.sh" ! -name "munitor_helpers.sh" ! -name "docs_only.sh" -exec grep -L 'set -euo pipefail' {} \;)
|
|
if [[ -z "${SCRIPTS_WITHOUT_STRICT}" ]]; then
|
|
pass
|
|
else
|
|
fail "missing in: ${SCRIPTS_WITHOUT_STRICT}"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: Cleanup traps
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== Cleanup Trap Tests ==="
|
|
|
|
echo -n " TEST: install_gitleaks.sh has cleanup trap... "
|
|
if grep -q 'trap cleanup EXIT' "${SRC_SCRIPTS}/install_gitleaks.sh"; then
|
|
pass
|
|
else
|
|
fail "should have cleanup trap"
|
|
fi
|
|
|
|
echo -n " TEST: install_gh.sh has cleanup trap... "
|
|
if grep -q 'trap cleanup EXIT' "${SRC_SCRIPTS}/install_gh.sh"; then
|
|
pass
|
|
else
|
|
fail "should have cleanup trap"
|
|
fi
|
|
|
|
echo -n " TEST: update_cd_repo.sh has cleanup trap... "
|
|
if grep -q 'trap cleanup EXIT' "${SRC_SCRIPTS}/update_cd_repo.sh"; then
|
|
pass
|
|
else
|
|
fail "should have cleanup trap"
|
|
fi
|
|
|
|
echo -n " TEST: sdk_post_validate.sh has cleanup trap... "
|
|
if grep -q 'trap cleanup EXIT' "${SRC_SCRIPTS}/sdk_post_validate.sh"; then
|
|
pass
|
|
else
|
|
fail "should have cleanup trap"
|
|
fi
|
|
|
|
echo -n " TEST: generate_config.sh has cleanup trap... "
|
|
if grep -q 'trap cleanup EXIT' "${SRC_SCRIPTS}/generate_config.sh"; then
|
|
pass
|
|
else
|
|
fail "should have cleanup trap"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: All scripts source munitor_helpers and call munitor_header
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== Munitor Helpers Integration Tests ==="
|
|
|
|
# Scripts that are excluded from the munitor_header requirement:
|
|
# - munitor_helpers.sh: the library itself
|
|
# - extract_munitor_vars.sh: low-level helper, sourced by other scripts
|
|
# - docs_only.sh: status-only predicate sourced by the generator
|
|
# - packed_*: auto-generated, embed helpers differently
|
|
EXCLUDED_PATTERN="munitor_helpers.sh|extract_munitor_vars.sh|docs_only.sh|packed_"
|
|
|
|
echo -n " TEST: all scripts source munitor_helpers... "
|
|
MISSING_SOURCE=""
|
|
while IFS= read -r script; do
|
|
name=$(basename "${script}")
|
|
if echo "${name}" | grep -qE "${EXCLUDED_PATTERN}"; then continue; fi
|
|
if ! grep -q 'MUNITOR_HELPERS' "${script}"; then
|
|
MISSING_SOURCE="${MISSING_SOURCE} ${name}"
|
|
fi
|
|
done < <(find "${SRC_SCRIPTS}" -maxdepth 1 -name "*.sh" -type f)
|
|
if [[ -z "${MISSING_SOURCE}" ]]; then
|
|
pass
|
|
else
|
|
fail "missing sourcing:${MISSING_SOURCE}"
|
|
fi
|
|
|
|
echo -n " TEST: all scripts call munitor_header... "
|
|
MISSING_HEADER=""
|
|
while IFS= read -r script; do
|
|
name=$(basename "${script}")
|
|
if echo "${name}" | grep -qE "${EXCLUDED_PATTERN}"; then continue; fi
|
|
if ! grep -q 'munitor_header' "${script}"; then
|
|
MISSING_HEADER="${MISSING_HEADER} ${name}"
|
|
fi
|
|
done < <(find "${SRC_SCRIPTS}" -maxdepth 1 -name "*.sh" -type f)
|
|
if [[ -z "${MISSING_HEADER}" ]]; then
|
|
pass
|
|
else
|
|
fail "missing munitor_header:${MISSING_HEADER}"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: External download URLs are reachable
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== External Download URL Tests ==="
|
|
|
|
# Extract pinned versions from scripts (single source of truth)
|
|
extract_version() { sed -n "s/.*${1}:-\([v0-9.]*\).*/\1/p" "$2" | head -1; }
|
|
TRIVY_VER=$(extract_version TRIVY_VERSION "${SRC_SCRIPTS}/run_trivy.sh")
|
|
GH_VER=$(extract_version GH_VERSION "${SRC_SCRIPTS}/install_gh.sh")
|
|
GITLEAKS_VER=$(extract_version GITLEAKS_VERSION "${SRC_SCRIPTS}/install_gitleaks.sh")
|
|
KUBE_LINTER_VER=$(extract_version KUBE_LINTER_VERSION "${SRC_SCRIPTS}/install_kube_linter.sh")
|
|
TERRAGRUNT_VER=$(extract_version TERRAGRUNT_VERSION "${SRC_SCRIPTS}/install_terragrunt.sh")
|
|
YQ_VER=$(extract_version YQ_VERSION "${SRC_SCRIPTS}/install_yq.sh")
|
|
KUSTOMIZE_VER=$(extract_version KUSTOMIZE_VERSION "${SRC_SCRIPTS}/install_kustomize.sh")
|
|
KUBESEC_VER=$(extract_version KUBESEC_VERSION "${SRC_SCRIPTS}/install_kubesec.sh")
|
|
TFSEC_TRIVY_VER=$(extract_version TRIVY_VERSION "${SRC_SCRIPTS}/install_tfsec.sh")
|
|
SONAR_VER=$(extract_version SONAR_SCANNER_VERSION "${SRC_SCRIPTS}/node_sonar.sh")
|
|
|
|
# All URLs target linux/amd64 -- matches the CI executor
|
|
URLS=(
|
|
"Trivy ${TRIVY_VER}|https://github.com/aquasecurity/trivy/releases/download/v${TRIVY_VER}/trivy_${TRIVY_VER}_Linux-64bit.tar.gz"
|
|
"Trivy/tfsec ${TFSEC_TRIVY_VER}|https://github.com/aquasecurity/trivy/releases/download/v${TFSEC_TRIVY_VER}/trivy_${TFSEC_TRIVY_VER}_Linux-64bit.tar.gz"
|
|
"gh ${GH_VER}|https://github.com/cli/cli/releases/download/v${GH_VER}/gh_${GH_VER}_linux_amd64.tar.gz"
|
|
"gitleaks ${GITLEAKS_VER}|https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VER}/gitleaks_${GITLEAKS_VER}_linux_x64.tar.gz"
|
|
"kube-linter ${KUBE_LINTER_VER}|https://github.com/stackrox/kube-linter/releases/download/v${KUBE_LINTER_VER}/kube-linter-linux.tar.gz"
|
|
"terragrunt ${TERRAGRUNT_VER}|https://github.com/gruntwork-io/terragrunt/releases/download/v${TERRAGRUNT_VER}/terragrunt_linux_amd64"
|
|
"yq ${YQ_VER}|https://github.com/mikefarah/yq/releases/download/${YQ_VER}/yq_linux_amd64"
|
|
"kustomize ${KUSTOMIZE_VER}|https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv${KUSTOMIZE_VER}/kustomize_v${KUSTOMIZE_VER}_linux_amd64.tar.gz"
|
|
"kubesec ${KUBESEC_VER}|https://github.com/controlplaneio/kubesec/releases/download/v${KUBESEC_VER}/kubesec_linux_amd64.tar.gz"
|
|
"OpenTofu installer|https://get.opentofu.org/install-opentofu.sh"
|
|
"sonar-scanner ${SONAR_VER}|https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SONAR_VER}-linux-x64.zip"
|
|
)
|
|
|
|
for entry in "${URLS[@]}"; do
|
|
LABEL="${entry%%|*}"
|
|
URL="${entry##*|}"
|
|
echo -n " TEST: ${LABEL} download URL is reachable... "
|
|
HTTP_CODE=$(curl -sI -o /dev/null -w "%{http_code}" -L --retry 2 "${URL}" 2>/dev/null || echo "000")
|
|
if [[ "${HTTP_CODE}" == "200" ]]; then
|
|
pass
|
|
else
|
|
fail "HTTP ${HTTP_CODE} for ${URL}"
|
|
fi
|
|
done
|
|
|
|
# =============================================================================
|
|
# Test: Gradle scripts - structural tests
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== Gradle Scripts Tests ==="
|
|
|
|
for GRADLE_SCRIPT in gradle_build gradle_test gradle_jacoco gradle_checkstyle gradle_spotbugs gradle_pmd; do
|
|
SCRIPT_FILE="${SRC_SCRIPTS}/${GRADLE_SCRIPT}.sh"
|
|
|
|
echo -n " TEST: ${GRADLE_SCRIPT}.sh exists... "
|
|
if [[ -f "${SCRIPT_FILE}" ]]; then
|
|
pass
|
|
else
|
|
fail "file not found"
|
|
continue
|
|
fi
|
|
|
|
echo -n " TEST: ${GRADLE_SCRIPT}.sh is executable... "
|
|
if [[ -x "${SCRIPT_FILE}" ]]; then
|
|
pass
|
|
else
|
|
fail "not executable"
|
|
fi
|
|
|
|
echo -n " TEST: ${GRADLE_SCRIPT}.sh sources munitor_helpers.sh... "
|
|
if grep -q 'munitor_helpers.sh' "${SCRIPT_FILE}"; then
|
|
pass
|
|
else
|
|
fail "should source munitor_helpers.sh"
|
|
fi
|
|
|
|
echo -n " TEST: ${GRADLE_SCRIPT}.sh uses set -euo pipefail... "
|
|
if grep -q 'set -euo pipefail' "${SCRIPT_FILE}"; then
|
|
pass
|
|
else
|
|
fail "should use set -euo pipefail"
|
|
fi
|
|
|
|
echo -n " TEST: ${GRADLE_SCRIPT}.sh uses gradlew... "
|
|
if grep -q 'gradlew' "${SCRIPT_FILE}"; then
|
|
pass
|
|
else
|
|
fail "should use ./gradlew"
|
|
fi
|
|
done
|
|
|
|
echo -n " TEST: gradle_build.sh uses --no-daemon... "
|
|
if grep -q '\-\-no-daemon' "${SRC_SCRIPTS}/gradle_build.sh"; then
|
|
pass
|
|
else
|
|
fail "should use --no-daemon"
|
|
fi
|
|
|
|
echo -n " TEST: gradle_build.sh skips tests (-x test)... "
|
|
if grep -q '\-x test' "${SRC_SCRIPTS}/gradle_build.sh"; then
|
|
pass
|
|
else
|
|
fail "should skip tests with -x test"
|
|
fi
|
|
|
|
echo -n " TEST: gradle_jacoco.sh validates MIN_INSTRUCTION... "
|
|
if grep -q 'MIN_INSTRUCTION' "${SRC_SCRIPTS}/gradle_jacoco.sh"; then
|
|
pass
|
|
else
|
|
fail "should use MIN_INSTRUCTION"
|
|
fi
|
|
|
|
echo -n " TEST: gradle_jacoco.sh aggregates multi-module CSVs... "
|
|
if grep -q 'find' "${SRC_SCRIPTS}/gradle_jacoco.sh" && grep -q 'jacocoTestReport.csv' "${SRC_SCRIPTS}/gradle_jacoco.sh"; then
|
|
pass
|
|
else
|
|
fail "should find jacocoTestReport.csv files"
|
|
fi
|
|
|
|
echo -n " TEST: gradle_checkstyle.sh detects plugin availability... "
|
|
if grep -q 'tasks --all' "${SRC_SCRIPTS}/gradle_checkstyle.sh" && grep -q 'checkstyleMain' "${SRC_SCRIPTS}/gradle_checkstyle.sh"; then
|
|
pass
|
|
else
|
|
fail "should detect checkstyleMain task"
|
|
fi
|
|
|
|
echo -n " TEST: gradle_checkstyle.sh skips gracefully... "
|
|
if grep -q 'skipping\|Skipping\|skip\|not applied' "${SRC_SCRIPTS}/gradle_checkstyle.sh"; then
|
|
pass
|
|
else
|
|
fail "should skip gracefully when plugin not applied"
|
|
fi
|
|
|
|
echo -n " TEST: gradle_spotbugs.sh detects plugin availability... "
|
|
if grep -q 'tasks --all' "${SRC_SCRIPTS}/gradle_spotbugs.sh" && grep -q 'spotbugsMain' "${SRC_SCRIPTS}/gradle_spotbugs.sh"; then
|
|
pass
|
|
else
|
|
fail "should detect spotbugsMain task"
|
|
fi
|
|
|
|
echo -n " TEST: gradle_pmd.sh detects plugin availability... "
|
|
if grep -q 'tasks --all' "${SRC_SCRIPTS}/gradle_pmd.sh" && grep -q 'pmdMain' "${SRC_SCRIPTS}/gradle_pmd.sh"; then
|
|
pass
|
|
else
|
|
fail "should detect pmdMain task"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Test: github_release.sh - Release artifact upload support
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== github_release.sh Artifact Upload Tests ==="
|
|
|
|
echo -n " TEST: supports MUNITOR_RELEASE_ARTIFACTS env var... "
|
|
if grep -q 'MUNITOR_RELEASE_ARTIFACTS' "${SRC_SCRIPTS}/github_release.sh"; then
|
|
pass
|
|
else
|
|
fail "should support MUNITOR_RELEASE_ARTIFACTS"
|
|
fi
|
|
|
|
echo -n " TEST: uses gh release upload for artifacts... "
|
|
if grep -q 'gh release upload' "${SRC_SCRIPTS}/github_release.sh"; then
|
|
pass
|
|
else
|
|
fail "should use gh release upload"
|
|
fi
|
|
|
|
echo -n " TEST: validates artifact files exist before upload... "
|
|
if grep -q 'not found' "${SRC_SCRIPTS}/github_release.sh" && grep -q '! -f' "${SRC_SCRIPTS}/github_release.sh"; then
|
|
pass
|
|
else
|
|
fail "should validate artifact files exist"
|
|
fi
|
|
|
|
echo -n " TEST: uses --clobber for idempotent uploads... "
|
|
if grep -q '\-\-clobber' "${SRC_SCRIPTS}/github_release.sh"; then
|
|
pass
|
|
else
|
|
fail "should use --clobber flag"
|
|
fi
|
|
|
|
echo -n " TEST: skips upload when MUNITOR_RELEASE_ARTIFACTS is empty... "
|
|
if grep -q 'if \[\[ -n "\${MUNITOR_RELEASE_ARTIFACTS:-}"' "${SRC_SCRIPTS}/github_release.sh"; then
|
|
pass
|
|
else
|
|
fail "should skip upload when artifacts is empty"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# Summary
|
|
# =============================================================================
|
|
echo ""
|
|
echo "=== Results: ${PASS} passed, ${FAIL} failed ==="
|
|
|
|
if [[ ${FAIL} -gt 0 ]]; then
|
|
exit 1
|
|
fi
|