#!/usr/bin/env nu
use common.nu *
def test-pds-ban-management [url: string, pid: int] {
print "=== test: pds ban management ==="
let initial = (http get $"($url)/pds/banned")
if ($initial | length) != 0 {
fail $"expected empty banned list, got ($initial | length)" $pid
}
print " PUT /pds/banned bans a host..."
http put -f -e -t application/json $"($url)/pds/banned" {
host: "bad.example.com"
} | assert-status 200 "PUT /pds/banned" $pid
let after_ban = (http get $"($url)/pds/banned")
if ($after_ban | length) != 1 {
fail $"expected 1 banned host, got ($after_ban | length)" $pid
}
if ($after_ban | first) != "bad.example.com" {
fail $"expected bad.example.com, got ($after_ban | first)" $pid
}
print " DELETE /pds/banned unbans a host..."
http delete -f -e -t application/json $"($url)/pds/banned" --data {
host: "bad.example.com"
} | assert-status 200 "DELETE /pds/banned" $pid
let after_unban = (http get $"($url)/pds/banned")
if ($after_unban | length) != 0 {
fail "expected empty banned list after unban" $pid
}
print "pds ban management passed!"
}
def test-pds-ban-persistence [binary: string, db_path: string, port: int] {
print "=== test: pds banned hosts persist across restart ==="
let url = $"http://localhost:($port)"
let instance = (with-env { HYDRANT_CRAWLER_URLS: "", HYDRANT_RELAY_HOSTS: "" } {
start-hydrant $binary $db_path $port
})
if not (wait-for-api $url) {
fail "hydrant did not start" $instance.pid
}
http put -t application/json $"($url)/pds/banned" {
host: "persist-ban.example.com"
}
let before = (http get $"($url)/pds/banned")
if ($before | length) != 1 {
fail "host was not banned" $instance.pid
}
print " restarting hydrant..."
kill $instance.pid
sleep 2sec
let instance2 = (with-env { HYDRANT_CRAWLER_URLS: "", HYDRANT_RELAY_HOSTS: "" } {
start-hydrant $binary $db_path $port
})
if not (wait-for-api $url) {
fail "hydrant did not restart" $instance2.pid
}
let after = (http get $"($url)/pds/banned")
if ($after | length) != 1 {
fail $"expected 1 banned host after restart, got ($after | length)" $instance2.pid
}
if ($after | first) != "persist-ban.example.com" {
fail $"expected persist-ban.example.com after restart, got ($after | first)" $instance2.pid
}
kill $instance2.pid
print "pds ban persistence passed!"
}
def main [] {
let port = resolve-test-port 3014
let url = $"http://localhost:($port)"
let binary = build-hydrant
let db = (mktemp -d -t hydrant_api_pds_banned.XXXXXX)
print $"db: ($db)"
let instance = (with-env { HYDRANT_CRAWLER_URLS: "", HYDRANT_RELAY_HOSTS: "" } {
start-hydrant $binary $db $port
})
if not (wait-for-api $url) {
fail "hydrant did not start" $instance.pid
}
test-pds-ban-management $url $instance.pid
kill $instance.pid
sleep 2sec
let db_persist = (mktemp -d -t hydrant_api_pds_banned.XXXXXX)
print $"db: ($db_persist)"
test-pds-ban-persistence $binary $db_persist $port
print ""
print "all pds ban API tests passed!"
}