b0ee7da5be
Adds tests/ with a tiny bash assert harness, manifest fixtures, and a
runner. No framework dependency — each test file is self-contained
and exits 0 on pass / 1 on fail; tests/run_tests.sh aggregates.
Unit tests (no docker):
- pipelock_naming: container_name, proxy_url, proxy_host_port shape
- pipelock_classify: _pipelock_is_ipv4_literal classifier coverage
- pipelock_allowlist: bottle_allowlist + ssh hostnames/ip_cidrs/
trusted_domains + effective_allowlist union/dedup/sort, plus
rejection of non-string entries
- pipelock_yaml: emitter shape (mode/enforce/api_allowlist/forward_proxy/
dlp), conditional ssrf+trusted_domains blocks, secret hygiene
(manifest env values must not appear in YAML), file mode 600
Integration tests (require docker, skip cleanly otherwise):
- pipelock_image: pinned digest's ENTRYPOINT is /pipelock and CMD
contains 'run' and the binary --version succeeds — would catch a
future image bump that changes the launcher's argv contract
- pipelock_sidecar_smoke: docker create + cp YAML to /etc/pipelock.yaml
+ start, then probe /health — the regression test for the bug
where the YAML was written to /etc/pipelock/ (parent dir absent in
the distroless image)
- dry_run_plan: cli.sh start --dry-run shows the egress line,
counts the bottle's entry into the effective allowlist, prints
the dry-run banner, and creates zero docker resources
- orphan_cleanup: the cleanup primitives the start-flow trap depends
on (network_remove, pipelock_stop) are idempotent against
missing/never-existed resources, so the trap is safe even if
pipelock_start dies before everything is wired up
Assisted-by: Claude Code
35 lines
967 B
Bash
Executable File
35 lines
967 B
Bash
Executable File
#!/usr/bin/env bash
|
|
# Unit: _pipelock_is_ipv4_literal — the classifier that decides
|
|
# whether bottle.ssh[].Hostname goes into ssrf.ip_allowlist (IPv4
|
|
# literal) or trusted_domains (hostname).
|
|
TEST_NAME="pipelock_classify"
|
|
|
|
. "$(dirname "$0")/../lib/common.sh"
|
|
# shellcheck source=../../lib/log.sh
|
|
. "${REPO_ROOT}/lib/log.sh"
|
|
# shellcheck source=../../lib/pipelock.sh
|
|
. "${REPO_ROOT}/lib/pipelock.sh"
|
|
|
|
# Positive cases — these should be classified as IPv4 literals.
|
|
for ip in "127.0.0.1" "10.0.0.5" "100.78.141.42" "0.0.0.0" "255.255.255.255"; do
|
|
assert_exit_zero "ipv4: ${ip}" _pipelock_is_ipv4_literal "$ip"
|
|
done
|
|
|
|
# Negative cases — hostnames, partial IPs, IPv6, and edge garbage
|
|
# should NOT match.
|
|
for hn in \
|
|
"github.com" \
|
|
"gitea.dideric.is" \
|
|
"100.78.141" \
|
|
"100.78.141.42.5" \
|
|
"::1" \
|
|
"fe80::1" \
|
|
"localhost" \
|
|
"" \
|
|
"1.2.3.4.example.com"
|
|
do
|
|
assert_exit_nonzero "non-ipv4: '${hn}'" _pipelock_is_ipv4_literal "$hn"
|
|
done
|
|
|
|
test_summary
|