#!/bin/bash # # Copyright (C) 2026 Danilo M. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # Assert-based self-check for lib.sh pure logic. No docker, no network. # Run: bash test-image-builder.sh set -u cd "$(dirname "$0")" source ./lib.sh pass=0 fail=0 check() { # DESC EXPECTED ACTUAL if [[ "$2" == "$3" ]]; then pass=$((pass+1)); else fail=$((fail+1)); echo "FAIL: $1"; echo " expected: [$2]"; echo " actual: [$3]"; fi } check_rc() { # DESC EXPECTED_RC ACTUAL_RC if [[ "$2" == "$3" ]]; then pass=$((pass+1)); else fail=$((fail+1)); echo "FAIL: $1 (rc expected $2 got $3)"; fi } tmp="$(mktemp -d)" trap 'rm -rf "$tmp"' EXIT # --- mirror_path --- check "mirror_path trailing slash" \ "file:///mnt/nas/slackware64-current/PACKAGES.TXT" \ "$(mirror_path 'file:///mnt/nas/' 'slackware64-current/PACKAGES.TXT')" check "mirror_path no trailing slash" \ "file:///mnt/nas/x/y" "$(mirror_path 'file:///mnt/nas' '/x/y')" # --- is_local_mirror --- is_local_mirror "file:///mnt/nas"; check_rc "is_local file://" 0 $? is_local_mirror "/mnt/nas"; check_rc "is_local bare abs" 0 $? is_local_mirror "https://x/y"; check_rc "is_local https" 1 $? # --- strip_scheme --- check "strip_scheme file://" "/mnt/nas" "$(strip_scheme 'file:///mnt/nas')" check "strip_scheme bare" "/mnt/nas" "$(strip_scheme '/mnt/nas')" # --- fetch: local file resolves --- echo hello > "$tmp/src.txt" fetch "file://$tmp/src.txt" "$tmp/dst.txt"; check_rc "fetch local ok" 0 $? check "fetch local content" "hello" "$(cat "$tmp/dst.txt" 2>/dev/null)" # --- fetch: missing local file errors --- fetch "file://$tmp/nope.txt" "$tmp/x.txt"; check_rc "fetch local missing" 1 $? # --- txz_hash: stable + content-sensitive --- mkdir -p "$tmp/pkgs" printf a > "$tmp/pkgs/sbopkg-1.txz" printf b > "$tmp/pkgs/tools-1.txz" h1="$(txz_hash "$tmp/pkgs")" h2="$(txz_hash "$tmp/pkgs")" check "txz_hash stable" "$h1" "$h2" printf c > "$tmp/pkgs/tools-1.txz" # change content h3="$(txz_hash "$tmp/pkgs")" check_rc "txz_hash changes on content" 0 "$([[ "$h1" != "$h3" ]] && echo 0 || echo 1)" check "txz_hash empty dir" "" "$(txz_hash "$tmp/empty-nope")" # --- require_mount: missing mount errors (subshell to catch _err exit) --- MIRROR="file://$tmp/no-such-root" ( require_mount current ) 2>/dev/null; check_rc "require_mount missing" 1 $? mkdir -p "$tmp/mnt/slackware64-current" MIRROR="file://$tmp/mnt" ( require_mount current ) 2>/dev/null; check_rc "require_mount present" 0 $? MIRROR="https://example/x" ( require_mount current ) 2>/dev/null; check_rc "require_mount http skips" 0 $? echo "----" echo "PASS: $pass FAIL: $fail" [[ "$fail" -eq 0 ]]