Files
Munitor/tests/test_scripts.sh
james.maesandCodex a56ef1d8e7 feat: add docs-only Java CI and aggregate merge checks
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>
2026-10-19 14:10:56 -05:00

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