Path: blob/main/libexec/pkg-serve/tests/pkg_serve_test.sh
178586 views
#-1# SPDX-License-Identifier: BSD-2-Clause2#3# Copyright (c) 2026 Baptiste Daroussin <[email protected]>45PKG_SERVE="${PKG_SERVE:-/usr/libexec/pkg-serve}"67serve()8{9printf "$1" | "${PKG_SERVE}" "$2"10}1112check_output()13{14local pattern="$1" ; shift15output=$(serve "$@")16case "$output" in17*${pattern}*)18return 019;;20*)21echo "Expected pattern: ${pattern}"22echo "Got: ${output}"23return 124;;25esac26}2728atf_test_case greeting29greeting_head()30{31atf_set "descr" "Server sends greeting on connect"32}33greeting_body()34{35mkdir repo36check_output "ok: pkg-serve " "quit\n" repo ||37atf_fail "greeting not found"38}3940atf_test_case unknown_command41unknown_command_head()42{43atf_set "descr" "Unknown commands get ko response"44}45unknown_command_body()46{47mkdir repo48check_output "ko: unknown command 'plop'" "plop\nquit\n" repo ||49atf_fail "expected ko for unknown command"50}5152atf_test_case get_missing_file53get_missing_file_head()54{55atf_set "descr" "Requesting a missing file returns ko"56}57get_missing_file_body()58{59mkdir repo60check_output "ko: file not found" "get nonexistent.pkg 0\nquit\n" repo ||61atf_fail "expected file not found"62}6364atf_test_case get_file65get_file_head()66{67atf_set "descr" "Requesting an existing file returns its content"68}69get_file_body()70{71mkdir repo72echo "testcontent" > repo/test.pkg73output=$(serve "get test.pkg 0\nquit\n" repo)74echo "$output" | grep -q "ok: 12" ||75atf_fail "expected ok: 12, got: ${output}"76echo "$output" | grep -q "testcontent" ||77atf_fail "expected testcontent in output"78}7980atf_test_case get_file_leading_slash81get_file_leading_slash_head()82{83atf_set "descr" "Leading slash in path is stripped"84}85get_file_leading_slash_body()86{87mkdir repo88echo "testcontent" > repo/test.pkg89check_output "ok: 12" "get /test.pkg 0\nquit\n" repo ||90atf_fail "leading slash not stripped"91}9293atf_test_case get_file_uptodate94get_file_uptodate_head()95{96atf_set "descr" "File with old mtime returns ok: 0"97}98get_file_uptodate_body()99{100mkdir repo101echo "testcontent" > repo/test.pkg102check_output "ok: 0" "get test.pkg 9999999999\nquit\n" repo ||103atf_fail "expected ok: 0 for up-to-date file"104}105106atf_test_case get_directory107get_directory_head()108{109atf_set "descr" "Requesting a directory returns ko"110}111get_directory_body()112{113mkdir -p repo/subdir114check_output "ko: not a file" "get subdir 0\nquit\n" repo ||115atf_fail "expected not a file"116}117118atf_test_case get_missing_age119get_missing_age_head()120{121atf_set "descr" "get without age argument returns error"122}123get_missing_age_body()124{125mkdir repo126check_output "ko: bad command get" "get test.pkg\nquit\n" repo ||127atf_fail "expected bad command get"128}129130atf_test_case get_bad_age131get_bad_age_head()132{133atf_set "descr" "get with non-numeric age returns error"134}135get_bad_age_body()136{137mkdir repo138check_output "ko: bad number" "get test.pkg notanumber\nquit\n" repo ||139atf_fail "expected bad number"140}141142atf_test_case get_empty_arg143get_empty_arg_head()144{145atf_set "descr" "get with no arguments returns error"146}147get_empty_arg_body()148{149mkdir repo150check_output "ko: bad command get" "get \nquit\n" repo ||151atf_fail "expected bad command get"152}153154atf_test_case path_traversal155path_traversal_head()156{157atf_set "descr" "Path traversal with .. is rejected"158}159path_traversal_body()160{161mkdir repo162check_output "ko: file not found" \163"get ../etc/passwd 0\nquit\n" repo ||164atf_fail "path traversal not rejected"165}166167atf_test_case get_subdir_file168get_subdir_file_head()169{170atf_set "descr" "Files in subdirectories are served"171}172get_subdir_file_body()173{174mkdir -p repo/sub175echo "subcontent" > repo/sub/file.pkg176output=$(serve "get sub/file.pkg 0\nquit\n" repo)177echo "$output" | grep -q "ok: 11" ||178atf_fail "expected ok: 11, got: ${output}"179echo "$output" | grep -q "subcontent" ||180atf_fail "expected subcontent in output"181}182183atf_test_case multiple_gets184multiple_gets_head()185{186atf_set "descr" "Multiple get commands in one session"187}188multiple_gets_body()189{190mkdir repo191echo "aaa" > repo/a.pkg192echo "bbb" > repo/b.pkg193output=$(serve "get a.pkg 0\nget b.pkg 0\nquit\n" repo)194echo "$output" | grep -q "ok: 4" ||195atf_fail "expected ok: 4 for a.pkg"196echo "$output" | grep -q "aaa" ||197atf_fail "expected content of a.pkg"198echo "$output" | grep -q "bbb" ||199atf_fail "expected content of b.pkg"200}201202atf_test_case bad_basedir203bad_basedir_head()204{205atf_set "descr" "Non-existent basedir causes exit failure"206}207bad_basedir_body()208{209atf_check -s not-exit:0 -e match:"open" \210"${PKG_SERVE}" /nonexistent/path211}212213atf_init_test_cases()214{215atf_add_test_case greeting216atf_add_test_case unknown_command217atf_add_test_case get_missing_file218atf_add_test_case get_file219atf_add_test_case get_file_leading_slash220atf_add_test_case get_file_uptodate221atf_add_test_case get_directory222atf_add_test_case get_missing_age223atf_add_test_case get_bad_age224atf_add_test_case get_empty_arg225atf_add_test_case path_traversal226atf_add_test_case get_subdir_file227atf_add_test_case multiple_gets228atf_add_test_case bad_basedir229}230231232