#!/usr/bin/env bash # Control for prohibition-as-query: the compiler records, the checker decides. set -uo pipefail ELC="${1:?usage: prohibition_query.sh }" LANG_DIR="${2:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}" W=$(mktemp -d); trap 'rm -rf "$W"' EXIT; F=0 chk(){ [ "$2" = "$3" ] && printf ' ok %s\n' "$1" || { printf ' FAIL %s\n expected %s got %s\n' "$1" "$2" "$3"; F=$((F+1)); }; } cat > "$W/p.el" <<'EOF' @decorator("prohibits_outside", "raw_sql") fn repository() {} fn sneaky() -> Int { raw_sql("DROP") return 1 } @repository fn allowed() -> Int { raw_sql("SELECT") return 2 } fn main() { println("ok") } EOF EL_RELATIONS_OUT="$W/rel.txt" "$ELC" "$W/p.el" >/dev/null 2>&1 "$LANG_DIR/tools/check/prohibitions.sh" "$W/rel.txt" > "$W/out.txt" 2>&1; rc=$? chk "a violation outside the boundary is caught" "1" "$rc" chk "the offending fn is named" "1" "$(grep -c 'sneaky is not one' "$W/out.txt")" chk "a call inside the boundary is NOT flagged" "0" "$(grep -c 'allowed is not one' "$W/out.txt")" cat > "$W/q.el" <<'EOF' @decorator("prohibits_outside", "raw_sql") fn repository() {} @repository fn only_allowed() -> Int { raw_sql("SELECT") return 1 } fn main() { println("ok") } EOF EL_RELATIONS_OUT="$W/rel2.txt" "$ELC" "$W/q.el" >/dev/null 2>&1 "$LANG_DIR/tools/check/prohibitions.sh" "$W/rel2.txt" >/dev/null 2>&1 chk "a clean program exits 0" "0" "$?" echo; echo " 4 assertions, $((4-F)) passed, $F failed"; exit $F