Files
bux-lang/tools/smoke_registry.sh
T
dimgigov a785747c37
ci / build (ubuntu) (push) Has been cancelled
ci / macos smoke (push) Has been cancelled
ci / windows smoke (push) Has been cancelled
selfhost-loop / bootstrap determinism (push) Has been cancelled
ci / unit + fmt (push) Has been cancelled
ci / examples (push) Has been cancelled
ci / goldens + tools (push) Has been cancelled
ci / apps (push) Has been cancelled
ci / selfhost smoke (push) Has been cancelled
ci / CI gate (push) Has been cancelled
feat: Linux/cloud platform stack (TLS, registry, static/cross, selfhost PM)
Ship the QUALITY_PLAN platform focus: thin/minimal runtime, --static/--target,
Nexus HTTPS/mTLS with graceful stop, lock checksums + install --locked,
selfhost registry (search/add/HTTP), containers, and CI smokes for cloud path.
2026-07-23 23:00:55 +03:00

193 lines
5.2 KiB
Bash
Executable File

#!/usr/bin/env bash
# Smoke: registry search + add + install + lock reproducibility + HTTPS (E.1 / session 79)
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
BUXC="$ROOT/buxc"
export BUX_REGISTRY="$ROOT/config/registry.toml"
if [[ ! -x "$BUXC" ]]; then
(cd "$ROOT" && make build >/dev/null)
fi
TMP=$(mktemp -d)
HTTP_PID=""
HTTPS_PID=""
cleanup() {
if [[ -n "$HTTP_PID" ]]; then
kill "$HTTP_PID" 2>/dev/null || true
wait "$HTTP_PID" 2>/dev/null || true
fi
if [[ -n "$HTTPS_PID" ]]; then
kill "$HTTPS_PID" 2>/dev/null || true
wait "$HTTPS_PID" 2>/dev/null || true
fi
rm -rf "$TMP"
}
trap cleanup EXIT
echo "=== bux search greet (local file) ==="
"$BUXC" search greet | tee "$TMP/search.out"
grep -q greet "$TMP/search.out"
echo "=== create consumer project ==="
mkdir -p "$TMP/app/src"
cat > "$TMP/app/bux.toml" <<'EOF'
[Package]
Name = "registry_consumer"
Version = "0.1.0"
Type = "bin"
[Build]
Output = "Bin"
EOF
cat > "$TMP/app/src/Main.bux" <<'EOF'
import Std::Io::{PrintLine};
import Std::String::{String_Eq};
import Std::Test::{Test_AssertTrue, Test_Pass};
func Main() -> int {
let msg: String = Greet_Hello("Bux");
Test_AssertTrue(String_Eq(msg, "Hello, Bux!"));
Test_AssertTrue(String_Eq(Greet_Version(), "0.1.1"));
PrintLine(msg);
Test_Pass("registry_consumer");
return 0;
}
EOF
cd "$TMP/app"
export BUX_STDLIB="$ROOT/lib"
echo "=== bux add greet ==="
"$BUXC" add greet
grep -q greet bux.toml
cat bux.toml
echo "=== bux install (with checksum) ==="
"$BUXC" install
test -f bux.lock
grep -q greet bux.lock
grep -q Checksum bux.lock
cat bux.lock
cp bux.lock "$TMP/lock1"
echo "=== lock reproducibility (second install) ==="
"$BUXC" install
# Source path + version + checksum must match
diff -u "$TMP/lock1" bux.lock
echo "=== bux install --locked ==="
"$BUXC" install --locked
echo "=== install --locked fails without lock ==="
rm -f bux.lock
if "$BUXC" install --locked 2>"$TMP/locked_err"; then
echo "error: expected --locked to fail without lock" >&2
exit 1
fi
grep -qi 'missing\|locked' "$TMP/locked_err"
"$BUXC" install
test -f bux.lock
echo "=== checksum mismatch detected ==="
# Corrupt checksum
python3 - <<'PY'
from pathlib import Path
p = Path("bux.lock")
t = p.read_text()
# flip last hex nibble of Checksum line if present
lines = []
for line in t.splitlines():
if line.startswith("Checksum"):
# Checksum = "abcdef..."
import re
m = re.search(r'"([0-9a-fA-F]+)"', line)
if m:
h = m.group(1)
h2 = h[:-1] + ("0" if h[-1] != "0" else "1")
line = f'Checksum = "{h2}"'
lines.append(line)
p.write_text("\n".join(lines) + "\n")
PY
if "$BUXC" install --locked 2>"$TMP/csum_err"; then
echo "error: expected checksum mismatch failure" >&2
exit 1
fi
grep -qi 'checksum' "$TMP/csum_err"
# restore good lock
"$BUXC" install >/dev/null
echo "=== bux run ==="
"$BUXC" run . | tee "$TMP/run.out"
grep -q "Hello, Bux!" "$TMP/run.out"
# --- HTTP registry index ---
echo "=== HTTP registry index ==="
mkdir -p "$TMP/http"
cat > "$TMP/http/registry.toml" <<EOF
[[package]]
name = "greet"
version = "0.1.1"
source = "file:$ROOT/registry/packages/greet"
description = "HTTP-served greet package"
EOF
PORT=$(python3 -c 'import socket; s=socket.socket(); s.bind(("127.0.0.1",0)); print(s.getsockname()[1]); s.close()')
(
cd "$TMP/http"
python3 -m http.server "$PORT" --bind 127.0.0.1 >/dev/null 2>&1
) &
HTTP_PID=$!
for _ in 1 2 3 4 5 6 7 8 9 10; do
if curl -fsS "http://127.0.0.1:${PORT}/registry.toml" >/dev/null 2>&1; then
break
fi
sleep 0.1
done
export BUX_REGISTRY="http://127.0.0.1:${PORT}/registry.toml"
export BUX_REGISTRY_REFRESH=1
"$BUXC" search greet | tee "$TMP/http_search.out"
grep -q greet "$TMP/http_search.out"
unset BUX_REGISTRY_REFRESH
"$BUXC" search greet | grep -q greet
# --- HTTPS registry (self-signed) ---
echo "=== HTTPS registry index (self-signed + BUX_REGISTRY_INSECURE) ==="
mkdir -p "$TMP/https"
cp "$TMP/http/registry.toml" "$TMP/https/registry.toml"
openssl req -x509 -newkey rsa:2048 -nodes \
-keyout "$TMP/https/key.pem" -out "$TMP/https/cert.pem" \
-days 1 -subj "/CN=localhost" 2>/dev/null
SPORT=$(python3 -c 'import socket; s=socket.socket(); s.bind(("127.0.0.1",0)); print(s.getsockname()[1]); s.close()')
python3 - <<PY &
import http.server, ssl, os
os.chdir("$TMP/https")
httpd = http.server.HTTPServer(("127.0.0.1", $SPORT), http.server.SimpleHTTPRequestHandler)
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ctx.load_cert_chain("$TMP/https/cert.pem", "$TMP/https/key.pem")
httpd.socket = ctx.wrap_socket(httpd.socket, server_side=True)
httpd.serve_forever()
PY
HTTPS_PID=$!
for _ in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15; do
if curl -kfsS "https://127.0.0.1:${SPORT}/registry.toml" >/dev/null 2>&1; then
break
fi
sleep 0.15
done
export BUX_REGISTRY="https://127.0.0.1:${SPORT}/registry.toml"
export BUX_REGISTRY_REFRESH=1
export BUX_REGISTRY_INSECURE=1
"$BUXC" search greet | tee "$TMP/https_search.out"
grep -q greet "$TMP/https_search.out"
grep -q "https://" "$TMP/https_search.out" || grep -q "cached" "$TMP/https_search.out"
unset BUX_REGISTRY_INSECURE
unset BUX_REGISTRY_REFRESH
unset BUX_REGISTRY
echo "PASS: registry smoke (local + lock/checksum + locked + HTTP + HTTPS)"