Renamed to DarkStruct
This commit is contained in:
@@ -1,11 +1,11 @@
|
||||
using Test
|
||||
using FileServer
|
||||
using DarkStruct
|
||||
using JSON3
|
||||
|
||||
# Pull internals into scope. These aren't exported (only `run` is), but the
|
||||
# whole risk profile of this pipeline lives in these functions, so we test them
|
||||
# directly rather than only through the HTTP surface.
|
||||
using FileServer: Job, Config, ChannelQueue, enqueue!, dequeue!, close!, length,
|
||||
using DarkStruct: Job, Config, ChannelQueue, enqueue!, dequeue!, close!, length,
|
||||
sanitize_filename, recover_dir!, normalize_metadata,
|
||||
build_metadata, finalize_known!, run_exiftool,
|
||||
is_binary, handle_unknown_job, handle_classify_job, worker_loop,
|
||||
@@ -83,11 +83,11 @@ function tmp_config(root; kwargs...)
|
||||
nominated_dir = joinpath(root, "nominated"),
|
||||
kwargs...,
|
||||
)
|
||||
FileServer.ensure_dirs(cfg)
|
||||
DarkStruct.ensure_dirs(cfg)
|
||||
return cfg
|
||||
end
|
||||
|
||||
@testset "FileServer" begin
|
||||
@testset "DarkStruct" begin
|
||||
|
||||
@testset "sanitize_filename" begin
|
||||
@test sanitize_filename("report.pdf") == "report.pdf"
|
||||
@@ -101,7 +101,7 @@ end
|
||||
@test sanitize_filename("a b&c*.d") == "a_b_c_.d"
|
||||
@test sanitize_filename("") == "unnamed"
|
||||
# Length is capped.
|
||||
@test Base.length(sanitize_filename("a"^500)) == FileServer.MAX_NAME_LEN
|
||||
@test Base.length(sanitize_filename("a"^500)) == DarkStruct.MAX_NAME_LEN
|
||||
end
|
||||
|
||||
@testset "multipart_boundary: extraction from Content-Type" begin
|
||||
@@ -297,9 +297,9 @@ end
|
||||
# process that exits instantly, on the hot path of stages 2 and 4. The
|
||||
# bound here is deliberately loose (a loaded CI box is slow) but far
|
||||
# under the 100 ms floor the polling version could not beat.
|
||||
FileServer.run_with_timeout(`true`, 30) # warm up / compile
|
||||
DarkStruct.run_with_timeout(`true`, 30) # warm up / compile
|
||||
t0 = time()
|
||||
out = FileServer.run_with_timeout(`echo hi`, 30)
|
||||
out = DarkStruct.run_with_timeout(`echo hi`, 30)
|
||||
elapsed = time() - t0
|
||||
@test out !== nothing
|
||||
@test strip(String(out)) == "hi"
|
||||
@@ -308,7 +308,7 @@ end
|
||||
|
||||
@testset "run_with_timeout: kills an overrunning child and reports failure" begin
|
||||
t0 = time()
|
||||
out = FileServer.run_with_timeout(`sleep 30`, 1)
|
||||
out = DarkStruct.run_with_timeout(`sleep 30`, 1)
|
||||
elapsed = time() - t0
|
||||
@test out === nothing # timed out → no output, caller degrades
|
||||
@test elapsed < 5 # killed near the timeout, not after 30 s
|
||||
@@ -319,11 +319,11 @@ end
|
||||
# block on wait(proc) forever and the timeout would be unenforceable.
|
||||
cmd = `sh -c "trap '' TERM; sleep 30"`
|
||||
t0 = time()
|
||||
out = FileServer.run_with_timeout(cmd, 1)
|
||||
out = DarkStruct.run_with_timeout(cmd, 1)
|
||||
elapsed = time() - t0
|
||||
@test out === nothing
|
||||
# 1 s timeout + up to KILL_GRACE_SECONDS before SIGKILL lands.
|
||||
@test elapsed < 1 + FileServer.KILL_GRACE_SECONDS + 3
|
||||
@test elapsed < 1 + DarkStruct.KILL_GRACE_SECONDS + 3
|
||||
end
|
||||
|
||||
@testset "run_exiftool: real extraction on a PNG" begin
|
||||
@@ -403,7 +403,7 @@ end
|
||||
# binary: pad to one byte short of the window, then a 2-byte 'é'
|
||||
# (0xc3 0xa9) so only its lead byte lands inside the window.
|
||||
split = joinpath(root, "split.txt")
|
||||
write(split, vcat(fill(UInt8('a'), FileServer.CONTENT_SNIFF_BYTES - 1),
|
||||
write(split, vcat(fill(UInt8('a'), DarkStruct.CONTENT_SNIFF_BYTES - 1),
|
||||
UInt8[0xc3, 0xa9]))
|
||||
@test is_binary(split) == false
|
||||
|
||||
@@ -414,7 +414,7 @@ end
|
||||
|
||||
# Binary garbage past the sniff window is not seen → still text.
|
||||
far = joinpath(root, "far.txt")
|
||||
write(far, vcat(fill(UInt8('a'), FileServer.CONTENT_SNIFF_BYTES), UInt8[0x00]))
|
||||
write(far, vcat(fill(UInt8('a'), DarkStruct.CONTENT_SNIFF_BYTES), UInt8[0x00]))
|
||||
@test is_binary(far) == false
|
||||
end
|
||||
end
|
||||
@@ -503,10 +503,10 @@ end
|
||||
# Reads at most LANG_SAMPLE_BYTES, and doesn't choke on a multi-byte
|
||||
# char straddling that boundary (trailing 'é' half-in the window).
|
||||
big = joinpath(root, "big.txt")
|
||||
write(big, vcat(fill(UInt8('a'), FileServer.LANG_SAMPLE_BYTES - 1),
|
||||
write(big, vcat(fill(UInt8('a'), DarkStruct.LANG_SAMPLE_BYTES - 1),
|
||||
UInt8[0xc3, 0xa9])) # 'é' split by the edge
|
||||
s = read_text_sample(big)
|
||||
@test Base.length(s) == FileServer.LANG_SAMPLE_BYTES - 1 # trailing half-char trimmed
|
||||
@test Base.length(s) == DarkStruct.LANG_SAMPLE_BYTES - 1 # trailing half-char trimmed
|
||||
@test all(==('a'), s)
|
||||
end
|
||||
end
|
||||
@@ -1240,7 +1240,7 @@ end
|
||||
|
||||
# The rest needs a live broker. Point FS_TEST_AMQP_URL at one to run it:
|
||||
# docker compose -f docker-compose.yml -f docker-compose.rabbitmq.yml up -d rabbitmq
|
||||
# FS_TEST_AMQP_URL=amqp://fileserver:fileserver@localhost:5672/ julia --project=. -e 'using Pkg; Pkg.test()'
|
||||
# FS_TEST_AMQP_URL=amqp://darkstruct:darkstruct@localhost:5672/ julia --project=. -e 'using Pkg; Pkg.test()'
|
||||
amqp_url = get(ENV, "FS_TEST_AMQP_URL", "")
|
||||
if isempty(amqp_url)
|
||||
@info "skipping RabbitMQ integration tests (set FS_TEST_AMQP_URL to run them)"
|
||||
|
||||
Reference in New Issue
Block a user