Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
HardenedBSD-pkg tests frontend query.sh
#! /usr/bin/env atf-sh

. $(atf_get_srcdir)/test_environment.sh

tests_init \
	query \
	query_empty_multiline \
	query_empty_provides_requires \
	query_provides_requires \
	query_purely_multiline_no_spurious

query_body() {
	touch plop
	touch bla
	ln -s sym-target sym
	mkdir test-dir
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg test test 1
	cat >> test.ucl << EOF
options: {
	"OPT1": "on"
	"OPT2": "off"
}
directories: {
      "${TMPDIR}/test-dir": {
		"uname": "uroot"
		"gname": "groot"
		"perm": "660"
		"fflags": "nodump,arch"
      }
}
files: {
	"${TMPDIR}/plop": {
		"sum": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
		"uname": "uroot"
		"gname": "groot"
		"perm": "777"
		"fflags": "schg,nodump"
		"mtime": 2342
	}
	"${TMPDIR}/bla": {
		"sum": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
		"uname": "utoor"
		"gname": "gtoor"
		"perm": "1765"
		"mtime": 4223
	}
	"${TMPDIR}/sym": {
		"sum": ""
		"uname": "sym-root"
		"gname": "sym-gtoor"
		"perm": "0644"
		"symlink_target": "sym-target"
		"mtime": 123432
	}
}
EOF
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg test2 test 2
	cat >> test2.ucl << EOF
options: {
	"OPT1": "on"
	"OPT2": "off"
}
files: {
	"${TMPDIR}/plop": ""
	"${TMPDIR}/bla": ""
	"${TMPDIR}/sym": ""
}
EOF
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg plop plop 1
	sed -ie 's/comment: a test/comment: Nothing to see here/' plop.ucl
	cat >> plop.ucl << EOF
deps: {
    test: {
        origin: "test",
        version: "1"
    },

}
EOF

	atf_check \
		-o match:".*Installing.*" \
		-e empty \
		-s exit:0 \
		pkg register -M test.ucl

	atf_check \
		-o match:".*Installing.*" \
		-e empty \
		-s exit:0 \
		pkg register -M plop.ucl

	atf_check \
		-o inline:"plop\ntest\n" \
		-e empty \
		-s exit:0 \
		pkg query "%n"

	atf_check \
		-o inline:"test\n" \
		-e empty \
		-s exit:0 \
		pkg query -e "%#O > 0" "%n"

	atf_check \
		-o inline:"test: plop 1 plop\n" \
		-e empty \
		-s exit:0 \
		pkg query -e "%#r>0" "%n: %rn %rv %ro"

	atf_check \
		-o inline:"test: plop 1 plop\n" \
		-e empty \
		-s exit:0 \
		pkg query -e "%#r>0" "%n: %rn %rv %ro" test

	atf_check \
		-o empty \
		-e empty \
		-s exit:1 \
		pkg query -e "%#r>0" "%n: %rn %rv %ro" plop

	atf_check \
		-o inline:"test: plop 1 plop\n" \
		-e empty \
		-s exit:0 \
		pkg query -e "%#r>0" "%n: %rn %rv %ro" plop test

	atf_check \
		-o inline:"test: plop 1 plop\n" \
		-e empty \
		-s exit:0 \
		pkg query -ge "%#r>0" "%n: %rn %rv %ro" "p*p" "t*t"

	atf_check \
		-o inline:"test: plop 1 plop\n" \
		-e empty \
		-s exit:0 \
		pkg query -xe "%#r>0" "%n: %rn %rv %ro" "p.*p" "t.*t"

	atf_check \
		-o inline:"plop: test 1 test\n" \
		-e empty \
		-s exit:0 \
		pkg query -e "%#d>0" "%n: %dn %dv %do"

	atf_check \
		-o inline:"plop: test 1 test\n" \
		-e empty \
		-s exit:0 \
		pkg query -e "%#d>0" "%n: %dn %dv %do" plop test

	atf_check \
		-o empty \
		-e empty \
		-s exit:0 \
		pkg query -e "%#d>0 && %#r>0" "%n"

	atf_check \
		-o inline:"test\n" \
		-e empty \
		-s exit:0 \
		pkg query -e "%#O > 0 && %#D > 0" "%n"

	atf_check \
		-o inline:"plop\n" \
		-e empty \
		-s exit:0 \
		pkg query -e '%dn = "test"' "%n"

	atf_check \
		-o inline:"test\n" \
		-e empty \
		-s exit:0 \
		pkg query -e '%dn != "test"' "%n"

	atf_check \
		-o inline:"plop\ntest\n" \
		-e empty \
		-s exit:0 \
		pkg query -e '%dn != "plop"' "%n"

	atf_check \
	    -o inline:"${TMPDIR}/test-dir\n" \
	    -e empty \
	    -s exit:0 \
	    pkg query "%D" test

	if [ "${OS}" = "FreeBSD" ]; then
	    atf_check \
		-o match:"^${TMPDIR}/bla utoor gtoor 1765 - 4223 $" \
		-o match:"^${TMPDIR}/plop uroot groot 777 schg,nodump 2342 $" \
		-o match:"^${TMPDIR}/sym sym-root sym-gtoor 644 - 123432 sym-target$" \
		-e empty \
		-s exit:0 \
		pkg query "%Fp %Fu %Fg %Fm %Ff %Fl %Ft" test

	    atf_check \
		-o inline:"${TMPDIR}/test-dir uroot groot 660 arch,nodump\n" \
		-e empty \
		-s exit:0 \
		pkg query "%Sp %Su %Sg %Sm %Sf" test
	fi

	atf_check \
		-o ignore \
		-e empty \
		-s exit:0 \
		pkg delete -y plop

	atf_check \
		-o inline:"test 2\n" \
		-e empty \
		-s exit:0 \
		pkg query "%n %#O"

	atf_check \
		-o inline:"test 1\n" \
		-e empty \
		-s exit:0 \
		pkg query "%n %?O"

	atf_check \
		-o inline:"" \
		-e empty \
		-s exit:0 \
		pkg query -e "%#O == 0" "%n"

	atf_check \
		-o empty \
		-e empty \
		-s exit:0 \
		pkg create -M test.ucl

	atf_check \
		-o empty \
		-e empty \
		-s exit:0 \
		pkg create -M test2.ucl

	sum1=$(pkg query -F ./test-1.pkg '%X')
	sum2=$(pkg query -F ./test-2.pkg '%X')

	atf_check \
		-o empty \
		-e empty \
		-s exit:0 \
		test "${sum1}" = "${sum2}"

	# Test 'pkg query -F'
	atf_check \
		-o empty \
		-e empty \
		-s exit:0 \
		pkg create -M plop.ucl

	atf_check \
		-o inline:"${TMPDIR}/bla\n${TMPDIR}/plop\n${TMPDIR}/sym\n" \
		-e empty \
		-s exit:0 \
		pkg query -F ./test-1.pkg '%Fp'

	atf_check \
		-o inline:"1\n" \
		-e empty \
		-s exit:0 \
		pkg query -F ./test-1.pkg '%?F'

	atf_check \
		-o inline:"3\n" \
		-e empty \
		-s exit:0 \
		pkg query -F ./test-1.pkg '%#F'

	atf_check \
		-o inline:"test 1\n" \
		-e empty \
		-s exit:0 \
		pkg query -F ./test-1.pkg '%n %v'

	atf_check \
		-o inline:"a test\n" \
		-e empty \
		-s exit:0 \
		pkg query -F ./test-1.pkg '%c'

	atf_check \
		-o inline:"Nothing to see here\n" \
		-e empty \
		-s exit:0 \
		pkg query -F ./plop-1.pkg '%c'
}

query_empty_multiline_body() {
	# Packages without licenses should not be skipped by %L queries
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg nolic nolic 1
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg withlicense withlicense 1
	cat >> withlicense.ucl << EOF
licenses: ["BSD2CLAUSE"]
EOF

	atf_check -o ignore pkg register -M nolic.ucl
	atf_check -o ignore pkg register -M withlicense.ucl

	# %n without multiline: both packages listed
	atf_check \
		-o inline:"nolic\nwithlicense\n" \
		-s exit:0 \
		pkg query "%n"

	# %n %L: both packages must appear, nolic with empty license
	atf_check \
		-o inline:"nolic \nwithlicense BSD2CLAUSE\n" \
		-s exit:0 \
		pkg query "%n %L"

	# Same for categories: nolic has no categories in test_subr
	# but test_subr adds categories: [test], so both have one.
	# Test with shlibs instead (no package has shlibs)
	atf_check \
		-o inline:"nolic \nwithlicense \n" \
		-s exit:0 \
		pkg query "%n %B"
}

query_empty_provides_requires_body() {
	# Regression: pkg query "%n-%v %y" used to segfault when the
	# package had no provides (the multiline fallback passed NULL
	# data to fprintf("%s", NULL)). Same for %Y / requires.
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg noprov noprov 1
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg withprov withprov 1
	cat >> withprov.ucl << EOF
provides: ["something"]
requires: ["otherthing"]
EOF

	atf_check -o ignore pkg register -M noprov.ucl
	atf_check -o ignore pkg register -M withprov.ucl

	# %n %y: noprov must appear with empty provides field, no crash
	atf_check \
		-o inline:"noprov \nwithprov something\n" \
		-s exit:0 \
		pkg query "%n %y"

	# Same for %Y / requires
	atf_check \
		-o inline:"noprov \nwithprov otherthing\n" \
		-s exit:0 \
		pkg query "%n %Y"

	# Mixed name-version + multiline (the exact failing case)
	atf_check \
		-o inline:"noprov-1 \nwithprov-1 something\n" \
		-s exit:0 \
		pkg query "%n-%v %y"
}

query_provides_requires_body() {
	# Nominal: package with multiple provides and requires entries.
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg multi multi 1
	cat >> multi.ucl << EOF
provides: ["foo", "bar", "baz"]
requires: ["alpha", "beta"]
EOF

	atf_check -o ignore pkg register -M multi.ucl

	# Bare %y: one line per provide
	atf_check \
		-o inline:"bar\nbaz\nfoo\n" \
		-s exit:0 \
		pkg query "%y" multi

	# Bare %Y: one line per require
	atf_check \
		-o inline:"alpha\nbeta\n" \
		-s exit:0 \
		pkg query "%Y" multi

	# Mixed name + provides: name repeated on each line
	atf_check \
		-o inline:"multi bar\nmulti baz\nmulti foo\n" \
		-s exit:0 \
		pkg query "%n %y" multi

	# Mixed name-version + requires
	atf_check \
		-o inline:"multi-1 alpha\nmulti-1 beta\n" \
		-s exit:0 \
		pkg query "%n-%v %Y" multi

	# Count of provides / requires
	atf_check \
		-o inline:"3\n" \
		-s exit:0 \
		pkg query "%#y" multi

	atf_check \
		-o inline:"2\n" \
		-s exit:0 \
		pkg query "%#Y" multi

	# Boolean has-provides / has-requires
	atf_check \
		-o inline:"1\n" \
		-s exit:0 \
		pkg query "%?y" multi

	atf_check \
		-o inline:"1\n" \
		-s exit:0 \
		pkg query "%?Y" multi
}

query_purely_multiline_no_spurious_body() {
	# A purely multiline format should not produce spurious lines
	# for packages that have no matching multiline data (e.g., no deps).
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg nodeps nodeps 1
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg hasdeps hasdeps 1
	cat >> hasdeps.ucl << EOF
deps: {
    nodeps: {
        origin: "nodeps",
        version: "1"
    },
}
EOF

	atf_check -o ignore pkg register -M nodeps.ucl
	atf_check -o ignore pkg register -M hasdeps.ucl

	# Purely multiline format: only hasdeps has deps, so nodeps
	# must produce no output (no spurious " -" line)
	atf_check \
		-o inline:"nodeps nodeps-1\n" \
		-s exit:0 \
		pkg query "%do %dn-%dv"

	# Mixed format (%n + multiline %d): both packages must appear,
	# nodeps with empty dep fields via the fallback
	atf_check \
		-o inline:"hasdeps nodeps-1\nnodeps -\n" \
		-s exit:0 \
		pkg query "%n %dn-%dv"
}