| git.druid.rocks | index | druid520 | mp | test/ | suites/ | dependencies.sh |
test/suites/dependencies.sh
# suite: dependency-list correctness -- slotted %tag buildlink/revdep
# wiring, prune's runtime-dep closure, port class inheritance, and
# use-flag-contributed deps' interaction with DEPS/DEPS+/DEPS-.
# tag_satisfied / resolved_slotted_deps: a slotted %tag dependency must
# get real buildlink prefix wiring and linkdeps.db tracking, and a second
# consumer must reuse it (not redundantly re-resolve, or resolve wrong).
test_slotted_tag_dep_wiring() {
t_begin "slotted_tag_dep_wiring"
reset_state
mkport rt05provA <<'EOF'
pkg_name="rt05prov"
pkg_ver="1.0"
pkg_slot="sA"
pkg_tags="rt05tag"
pkg_pref="20"
install:
touch $MP_PREFIX/rt05provA-installed
remove:
rm -f $MP_PREFIX/rt05provA-installed
EOF
mkport rt05provB <<'EOF'
pkg_name="rt05prov"
pkg_ver="1.0"
pkg_slot="sB"
pkg_tags="rt05tag"
pkg_pref="10"
install:
touch $MP_PREFIX/rt05provB-installed
remove:
rm -f $MP_PREFIX/rt05provB-installed
EOF
mkport rt05consumer <<'EOF'
pkg_name="rt05consumer"
pkg_ver="1.0"
pkg_deps="%rt05tag"
install:
echo "MP_DEP_PREFIXES=[$MP_DEP_PREFIXES]" > $MP_PREFIX/rt05-deplog
touch $MP_PREFIX/rt05consumer-installed
remove:
rm -f $MP_PREFIX/rt05consumer-installed $MP_PREFIX/rt05-deplog
EOF
mp install rt05consumer >/tmp/rt05.out 2>&1
deplog=$(cat "$MP_PREFIX/rt05-deplog" 2>/dev/null)
linkdeps=$(cat "$WD/linkdeps.db" 2>/dev/null)
assert_contains "$deplog" "rt05prov-sB" "$CUR_TEST" || return
assert_contains "$linkdeps" "rt05consumer" "$CUR_TEST" || return
t_pass
}
# mp why / mp prune correctly recognize a slotted dependency: a slotted
# still-needed provider must never look prunable.
test_prune_keeps_slotted_dep() {
t_begin "prune_keeps_slotted_dep"
reset_state
mkport rt06prov <<'EOF'
pkg_name="rt06prov"
pkg_ver="1.0"
pkg_slot="sX"
pkg_tags="rt06tag"
install:
touch $MP_PREFIX/rt06prov-installed
remove:
rm -f $MP_PREFIX/rt06prov-installed
EOF
mkport rt06consumer <<'EOF'
pkg_name="rt06consumer"
pkg_ver="1.0"
pkg_deps="%rt06tag"
install:
touch $MP_PREFIX/rt06consumer-installed
remove:
rm -f $MP_PREFIX/rt06consumer-installed
EOF
mp install rt06consumer >/tmp/rt06.out 2>&1
why_out=$(mp why 'rt06prov:sX' 2>&1)
prune_out=$(mp prune --dry-run 2>&1)
assert_contains "$why_out" "rt06consumer" "$CUR_TEST" || return
assert_not_contains "$prune_out" "rt06prov" "$CUR_TEST" || return
t_pass
}
# port classes (inherit=): a class's own pkg_bdepend/pkg_tags/etc. (any
# field beyond pkg_deps) must actually reach the inheriting port, and a
# typo'd/missing inherit= name must warn, not silently no-op.
test_class_inheritance() {
t_begin "class_inheritance"
reset_state
mkdir -p /usr/ports/classes
printf 'pkg_bdepend="rt16classdep"\npkg_tags="rt16classtag"\n' > /usr/ports/classes/rt16class.mp
mkport rt16test <<'EOF'
pkg_name="rt16test"
pkg_ver="1.0"
inherit="rt16class"
install:
touch $MP_PREFIX/rt16test-installed
remove:
rm -f $MP_PREFIX/rt16test-installed
EOF
out=$(cd /root/mpbuildtest && perl -I. -Implib -e '
use mplib::config qw($CFG load);
use mplib::resolve qw(init find_portdir effective_deps);
use mplib::portformat qw(resolve_port);
load({ FORCE=>0, NODEPS=>0, UNMASK=>0, DRYRUN=>0, CLIOVERLAY=>[] });
init();
my $dir = find_portdir("rt16test");
my $pc = resolve_port($dir);
print join(",", effective_deps($pc, "rt16test")), "\n";
' 2>&1)
rm -f /usr/ports/classes/rt16class.mp
assert_contains "$out" "rt16classdep" "$CUR_TEST" || return
mkport rt16test2 <<'EOF'
pkg_name="rt16test2"
pkg_ver="1.0"
inherit="rt16classdoesnotexist"
install:
touch $MP_PREFIX/rt16test2-installed
remove:
rm -f $MP_PREFIX/rt16test2-installed
EOF
warn_out=$(mp verify rt16test2 2>&1)
assert_contains "$warn_out" "not found" "$CUR_TEST" || return
t_pass
}
# use-flag-contributed deps (pkg_use="flag:%tag") must be just as
# overridable by DEPS-/DEPS= as a plain pkg_deps entry -- they were
# previously appended AFTER the DEPS/DEPS+/DEPS- filter ran, so DEPS-
# could never remove one.
test_use_flag_deps_overridable() {
t_begin "use_flag_deps_overridable"
reset_state
mkport rt20test <<'EOF'
pkg_name="rt20test"
pkg_ver="1.0"
pkg_use="ssl:%rt20ssltag"
install:
touch $MP_PREFIX/rt20test-installed
remove:
rm -f $MP_PREFIX/rt20test-installed
EOF
cat >> "$CONF" <<'EOF'
rt20test:
USE=ssl
DEPS-=%rt20ssltag
EOF
out=$(cd /root/mpbuildtest && perl -I. -Implib -e '
use mplib::config qw($CFG load);
use mplib::resolve qw(init find_portdir effective_deps);
use mplib::portformat qw(resolve_port);
load({ FORCE=>0, NODEPS=>0, UNMASK=>0, DRYRUN=>0, CLIOVERLAY=>[] });
init();
my $dir = find_portdir("rt20test");
my $pc = resolve_port($dir);
print join(",", effective_deps($pc, "rt20test")), "\n";
' 2>&1)
assert_not_contains "$out" "rt20ssltag" "$CUR_TEST" || return
t_pass
}
# a USE-flag-contributed dependency marked build-only ("b:") must be
# prunable once its consumer is installed -- runtime-mode closure skips
# it, unlike a regular USE dep.
test_use_buildonly_dep_prunable() {
t_begin "use_buildonly_dep_prunable"
reset_state
printf 'GLOBAL_DEPS=" "\n' >> "$CONF"
mkport rt30bdep <<'EOF'
pkg_name="rt30bdep"
pkg_ver="1.0"
install:
touch $MP_PREFIX/rt30bdep-installed
remove:
rm -f $MP_PREFIX/rt30bdep-installed
EOF
mkport rt30user <<'EOF'
pkg_name="rt30user"
pkg_ver="1.0"
pkg_use="x:b:rt30bdep"
install:
touch $MP_PREFIX/rt30user-installed
remove:
rm -f $MP_PREFIX/rt30user-installed
EOF
cat >> "$CONF" <<'EOF'
rt30user:
USE=x
EOF
mp install rt30user >/tmp/rt30.out 2>&1
assert_file_exists "$MP_PREFIX/rt30bdep-installed" "$CUR_TEST" || return
dry=$(mp prune --dry-run 2>&1)
assert_contains "$dry" "would remove: rt30bdep" "$CUR_TEST" || return
assert_not_contains "$dry" "rt30user" "$CUR_TEST" || return
t_pass
}
# DEPS= fully replaces the declared list; DEPS+ adds (after the DEPS-
# filter, so additions are final); DEPS- removes from the declared/
# replacement list only.
test_deps_override_matrix() {
t_begin "deps_override_matrix"
reset_state
printf 'GLOBAL_DEPS=" "\n' >> "$CONF"
mkport rt46d1 <<'EOF'
pkg_name="rt46d1"
pkg_ver="1.0"
install:
touch $MP_PREFIX/rt46d1-installed
remove:
rm -f $MP_PREFIX/rt46d1-installed
EOF
mkport rt46d2 <<'EOF'
pkg_name="rt46d2"
pkg_ver="1.0"
install:
touch $MP_PREFIX/rt46d2-installed
remove:
rm -f $MP_PREFIX/rt46d2-installed
EOF
mkport rt46d3 <<'EOF'
pkg_name="rt46d3"
pkg_ver="1.0"
install:
touch $MP_PREFIX/rt46d3-installed
remove:
rm -f $MP_PREFIX/rt46d3-installed
EOF
mkport rt46t <<'EOF'
pkg_name="rt46t"
pkg_ver="1.0"
pkg_deps="rt46d1 rt46d2"
install:
touch $MP_PREFIX/rt46t-installed
remove:
rm -f $MP_PREFIX/rt46t-installed
EOF
cat >> "$CONF" <<'EOF'
rt46t:
DEPS-=rt46d2
DEPS+=rt46d3
EOF
mp install rt46t >/tmp/rt46.out 2>&1
rc=$?
assert_exit0 "$rc" "$CUR_TEST" || return
assert_file_exists "$MP_PREFIX/rt46d1-installed" "$CUR_TEST" || return
assert_file_exists "$MP_PREFIX/rt46d3-installed" "$CUR_TEST" || return
assert_file_absent "$MP_PREFIX/rt46d2-installed" "$CUR_TEST" || return
t_pass
}
# a pkg_rdepend-only dep IS pulled at install time (rdepend participates
# in install deps too) and, unlike a bdepend-only dep, survives prune's
# runtime closure.
test_rdepend_pulled_and_kept() {
t_begin "rdepend_pulled_and_kept"
reset_state
printf 'GLOBAL_DEPS=" "\n' >> "$CONF"
mkport rt47r <<'EOF'
pkg_name="rt47r"
pkg_ver="1.0"
install:
touch $MP_PREFIX/rt47r-installed
remove:
rm -f $MP_PREFIX/rt47r-installed
EOF
mkport rt47t <<'EOF'
pkg_name="rt47t"
pkg_ver="1.0"
pkg_rdepend="rt47r"
install:
touch $MP_PREFIX/rt47t-installed
remove:
rm -f $MP_PREFIX/rt47t-installed
EOF
mp install rt47t >/tmp/rt47.out 2>&1
rc=$?
assert_exit0 "$rc" "$CUR_TEST" || return
assert_file_exists "$MP_PREFIX/rt47t-installed" "$CUR_TEST" || return
assert_file_exists "$MP_PREFIX/rt47r-installed" "$CUR_TEST" || return
dry=$(mp prune --dry-run 2>&1)
assert_not_contains "$dry" "would remove: rt47r" "$CUR_TEST" || return
t_pass
}
# rdepend and bdepend together: both are pulled at install; prune's
# runtime closure keeps the rdepend and drops the bdepend.
test_bdepend_prunable_rdepend_kept() {
t_begin "bdepend_prunable_rdepend_kept"
reset_state
printf 'GLOBAL_DEPS=" "\n' >> "$CONF"
mkport rt48b <<'EOF'
pkg_name="rt48b"
pkg_ver="1.0"
install:
touch $MP_PREFIX/rt48b-installed
remove:
rm -f $MP_PREFIX/rt48b-installed
EOF
mkport rt48r <<'EOF'
pkg_name="rt48r"
pkg_ver="1.0"
install:
touch $MP_PREFIX/rt48r-installed
remove:
rm -f $MP_PREFIX/rt48r-installed
EOF
mkport rt48t <<'EOF'
pkg_name="rt48t"
pkg_ver="1.0"
pkg_bdepend="rt48b"
pkg_rdepend="rt48r"
install:
touch $MP_PREFIX/rt48t-installed
remove:
rm -f $MP_PREFIX/rt48t-installed
EOF
mp install rt48t >/tmp/rt48.out 2>&1
assert_file_exists "$MP_PREFIX/rt48b-installed" "$CUR_TEST" || return
assert_file_exists "$MP_PREFIX/rt48r-installed" "$CUR_TEST" || return
dry=$(mp prune --dry-run 2>&1)
assert_contains "$dry" "would remove: rt48b" "$CUR_TEST" || return
assert_not_contains "$dry" "would remove: rt48r" "$CUR_TEST" || return
t_pass
}
# --no-deps installs the named package alone, no dependency resolution.
test_nodeps_skips_dep() {
t_begin "nodeps_skips_dep"
reset_state
printf 'GLOBAL_DEPS=" "\n' >> "$CONF"
mkport rt49d <<'EOF'
pkg_name="rt49d"
pkg_ver="1.0"
install:
touch $MP_PREFIX/rt49d-installed
remove:
rm -f $MP_PREFIX/rt49d-installed
EOF
mkport rt49t <<'EOF'
pkg_name="rt49t"
pkg_ver="1.0"
pkg_deps="rt49d"
install:
touch $MP_PREFIX/rt49t-installed
remove:
rm -f $MP_PREFIX/rt49t-installed
EOF
mp install --no-deps rt49t >/tmp/rt49.out 2>&1
rc=$?
assert_exit0 "$rc" "$CUR_TEST" || return
assert_file_exists "$MP_PREFIX/rt49t-installed" "$CUR_TEST" || return
assert_file_absent "$MP_PREFIX/rt49d-installed" "$CUR_TEST" || return
t_pass
}
# a soft dep with no provider anywhere is skipped with a note, and the
# consumer still installs.
test_soft_dep_no_provider_skipped() {
t_begin "soft_dep_no_provider_skipped"
reset_state
printf 'GLOBAL_DEPS=" "\n' >> "$CONF"
mkport rt50t <<'EOF'
pkg_name="rt50t"
pkg_ver="1.0"
pkg_deps_soft="%rt50zzztag"
install:
touch $MP_PREFIX/rt50t-installed
remove:
rm -f $MP_PREFIX/rt50t-installed
EOF
out=$(mp install rt50t 2>&1)
rc=$?
assert_exit0 "$rc" "$CUR_TEST" || return
assert_contains "$out" "skipping" "$CUR_TEST" || return
assert_file_exists "$MP_PREFIX/rt50t-installed" "$CUR_TEST" || return
t_pass
}
# a soft dep whose candidate FAILS (masked) is skipped, but the same
# dep as a HARD requirement fails the whole install.
test_soft_dep_masked_skipped_hard_fails() {
t_begin "soft_dep_masked_skipped_hard_fails"
reset_state
printf 'GLOBAL_DEPS=" "\n' >> "$CONF"
mkport rt51d <<'EOF'
pkg_name="rt51d"
pkg_ver="1.0"
install:
touch $MP_PREFIX/rt51d-installed
remove:
rm -f $MP_PREFIX/rt51d-installed
EOF
mkport rt51s <<'EOF'
pkg_name="rt51s"
pkg_ver="1.0"
pkg_deps_soft="rt51d"
install:
touch $MP_PREFIX/rt51s-installed
remove:
rm -f $MP_PREFIX/rt51s-installed
EOF
mkport rt51h <<'EOF'
pkg_name="rt51h"
pkg_ver="1.0"
pkg_deps="rt51d"
install:
touch $MP_PREFIX/rt51h-installed
remove:
rm -f $MP_PREFIX/rt51h-installed
EOF
cat >> "$CONF" <<'EOF'
rt51d:
MASK=yes
EOF
out=$(mp install rt51s 2>&1)
rc=$?
assert_exit0 "$rc" "$CUR_TEST" || return
assert_contains "$out" "skipping" "$CUR_TEST" || return
assert_file_exists "$MP_PREFIX/rt51s-installed" "$CUR_TEST" || return
out=$(mp install rt51h 2>&1)
rc=$?
assert_exit_nonzero "$rc" "$CUR_TEST" || return
assert_contains "$out" "masked" "$CUR_TEST" || return
assert_file_absent "$MP_PREFIX/rt51h-installed" "$CUR_TEST" || return
t_pass
}
run_dependencies_suite() {
test_slotted_tag_dep_wiring
test_prune_keeps_slotted_dep
test_class_inheritance
test_use_flag_deps_overridable
test_use_buildonly_dep_prunable
test_deps_override_matrix
test_rdepend_pulled_and_kept
test_bdepend_prunable_rdepend_kept
test_nodeps_skips_dep
test_soft_dep_no_provider_skipped
test_soft_dep_masked_skipped_hard_fails
}