Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/pkg
Path: blob/main/tests/frontend/info.sh
4743 views
1
#! /usr/bin/env atf-sh
2
3
. $(atf_get_srcdir)/test_environment.sh
4
5
tests_init \
6
raw_json_single \
7
raw_json_multiple \
8
raw_json_compact_multiple \
9
raw_json_all \
10
info_all \
11
info_full \
12
info_name_only \
13
info_comment \
14
info_deps \
15
info_rdeps \
16
info_files \
17
info_size \
18
info_origin \
19
info_prefix \
20
info_quiet \
21
info_exists \
22
info_not_found \
23
info_no_args \
24
info_glob \
25
info_regex \
26
info_locked \
27
info_options \
28
info_pkg_file
29
30
# Helper: register a rich test package with deps, files, options
31
setup_pkg() {
32
touch file1 file2
33
mkdir -p mydir
34
35
atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "dep" "dep" "1.0" "${TMPDIR}"
36
atf_check -o ignore -s exit:0 pkg register -M dep.ucl
37
38
atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "test" "test" "2.5" "${TMPDIR}"
39
cat << EOF >> test.ucl
40
deps: {
41
dep: {
42
origin: dep,
43
version: "1.0"
44
}
45
}
46
files: {
47
${TMPDIR}/file1: "",
48
${TMPDIR}/file2: "",
49
}
50
directories: {
51
${TMPDIR}/mydir: "",
52
}
53
options: {
54
"OPT1": "on",
55
"OPT2": "off",
56
}
57
EOF
58
atf_check -o ignore -s exit:0 pkg register -M test.ucl
59
}
60
61
info_all_body() {
62
setup_pkg
63
64
# pkg info -a lists all installed packages
65
atf_check \
66
-o match:"dep-1.0" \
67
-o match:"test-2.5" \
68
-s exit:0 \
69
pkg info -a
70
71
# quiet mode
72
atf_check \
73
-o match:"dep-1.0" \
74
-o match:"test-2.5" \
75
-s exit:0 \
76
pkg info -qa
77
}
78
79
info_full_body() {
80
setup_pkg
81
82
# Single package with no flags → full info
83
atf_check \
84
-o match:"Name" \
85
-o match:"Version" \
86
-o match:"Comment" \
87
-o match:"Prefix" \
88
-s exit:0 \
89
pkg info test
90
}
91
92
info_name_only_body() {
93
setup_pkg
94
95
# -E: show name only (exit 0 if exists)
96
atf_check \
97
-o match:"test" \
98
-s exit:0 \
99
pkg info -E test
100
}
101
102
info_comment_body() {
103
setup_pkg
104
105
# -I: show comment
106
atf_check \
107
-o match:"a test" \
108
-s exit:0 \
109
pkg info -I test
110
}
111
112
info_deps_body() {
113
setup_pkg
114
115
# -d: show deps
116
atf_check \
117
-o match:"dep-1.0" \
118
-s exit:0 \
119
pkg info -d test
120
}
121
122
info_rdeps_body() {
123
setup_pkg
124
125
# -r: show reverse deps
126
atf_check \
127
-o match:"test-2.5" \
128
-s exit:0 \
129
pkg info -r dep
130
}
131
132
info_files_body() {
133
setup_pkg
134
135
# -l: list files
136
atf_check \
137
-o match:"${TMPDIR}/file1" \
138
-o match:"${TMPDIR}/file2" \
139
-s exit:0 \
140
pkg info -l test
141
142
# quiet mode
143
atf_check \
144
-o match:"${TMPDIR}/file1" \
145
-s exit:0 \
146
pkg info -ql test
147
}
148
149
info_size_body() {
150
setup_pkg
151
152
# -s: show flat size
153
atf_check \
154
-o match:"0.00B" \
155
-s exit:0 \
156
pkg info -s test
157
}
158
159
info_origin_body() {
160
setup_pkg
161
162
# -o: show origin
163
atf_check \
164
-o match:"test" \
165
-s exit:0 \
166
pkg info -o test
167
}
168
169
info_prefix_body() {
170
setup_pkg
171
172
# -p: show prefix
173
atf_check \
174
-o match:"${TMPDIR}" \
175
-s exit:0 \
176
pkg info -p test
177
}
178
179
info_quiet_body() {
180
setup_pkg
181
182
# -q with -a: just name-version
183
OUTPUT=$(pkg info -qa)
184
case "$OUTPUT" in
185
*"Name"*|*"Comment"*|*"Prefix"*)
186
atf_fail "Quiet mode should not show field labels" ;;
187
esac
188
189
# Should still list packages
190
echo "$OUTPUT" | grep -q "test-2.5" || atf_fail "test-2.5 not listed"
191
echo "$OUTPUT" | grep -q "dep-1.0" || atf_fail "dep-1.0 not listed"
192
}
193
194
info_exists_body() {
195
setup_pkg
196
197
# -e: exit 0 if package exists
198
atf_check \
199
-s exit:0 \
200
pkg info -e test
201
202
# exit 1 if not
203
atf_check \
204
-s exit:1 \
205
pkg info -e nonexistent
206
}
207
208
info_not_found_body() {
209
setup_pkg
210
211
# Non-existent package
212
atf_check \
213
-e match:"No package.*matching" \
214
-s exit:1 \
215
pkg info nosuchpkg
216
217
# Quiet: no stderr output
218
atf_check \
219
-e empty \
220
-s exit:1 \
221
pkg info -q nosuchpkg
222
}
223
224
info_no_args_body() {
225
# No packages installed, no args → lists nothing
226
atf_check \
227
-o empty \
228
-s exit:0 \
229
pkg info
230
}
231
232
info_glob_body() {
233
setup_pkg
234
235
# -g: glob matching
236
atf_check \
237
-o match:"test-2.5" \
238
-o not-match:"dep-1.0" \
239
-s exit:0 \
240
pkg info -g 'tes*'
241
242
# Match both
243
atf_check \
244
-o match:"test-2.5" \
245
-o match:"dep-1.0" \
246
-s exit:0 \
247
pkg info -g '*'
248
249
# No match
250
atf_check \
251
-e match:"No package" \
252
-s exit:1 \
253
pkg info -g 'zzz*'
254
}
255
256
info_regex_body() {
257
setup_pkg
258
259
# -x: regex matching
260
atf_check \
261
-o match:"test-2.5" \
262
-o not-match:"dep-1.0" \
263
-s exit:0 \
264
pkg info -x '^tes'
265
266
# Match both
267
atf_check \
268
-o match:"test-2.5" \
269
-o match:"dep-1.0" \
270
-s exit:0 \
271
pkg info -x '.*'
272
}
273
274
info_locked_body() {
275
setup_pkg
276
277
# Lock a package, then info -k should show lock status
278
atf_check -o ignore -s exit:0 pkg lock -y test
279
280
atf_check \
281
-o match:"yes" \
282
-s exit:0 \
283
pkg info -k test
284
285
atf_check -o ignore -s exit:0 pkg unlock -y test
286
}
287
288
info_options_body() {
289
setup_pkg
290
291
# -O: show options (registered via manifest)
292
atf_check \
293
-o match:"OPT1" \
294
-o match:"OPT2" \
295
-s exit:0 \
296
pkg info -f test
297
}
298
299
info_pkg_file_body() {
300
# -F: info from a .pkg file directly
301
atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "filepkg" "filepkg" "3.0" "/"
302
touch a
303
echo ${TMPDIR}/a > plist
304
atf_check -o ignore pkg create -M filepkg.ucl -p plist
305
306
atf_check \
307
-o match:"filepkg" \
308
-o match:"3.0" \
309
-s exit:0 \
310
pkg info -F filepkg-3.0.pkg
311
312
# -l on a file
313
atf_check \
314
-o match:"${TMPDIR}/a" \
315
-s exit:0 \
316
pkg info -lF filepkg-3.0.pkg
317
}
318
319
raw_json_single_body() {
320
atf_require python3 "Requires python3 to run this test"
321
atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkgA" "pkgA" "1.0" "/"
322
touch a
323
echo ${TMPDIR}/a > plist
324
atf_check pkg create -M pkgA.ucl -p plist
325
atf_check -o ignore pkg add pkgA-1.0.pkg
326
# Single package raw JSON should be valid JSON (array with one element)
327
atf_check -o save:out.json pkg info --raw --raw-format json pkgA
328
atf_check -o ignore -e empty python3 -m json.tool out.json
329
}
330
331
raw_json_multiple_body() {
332
atf_require python3 "Requires python3 to run this test"
333
atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkgA" "pkgA" "1.0" "/"
334
touch a
335
echo ${TMPDIR}/a > plist
336
atf_check pkg create -M pkgA.ucl -p plist
337
atf_check -o ignore pkg add pkgA-1.0.pkg
338
339
atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkgB" "pkgB" "2.0" "/"
340
touch b
341
echo ${TMPDIR}/b > plist
342
atf_check pkg create -M pkgB.ucl -p plist
343
atf_check -o ignore pkg add pkgB-2.0.pkg
344
345
# Two packages raw JSON must be a valid JSON array
346
atf_check -o save:out.json pkg info --raw --raw-format json pkgA pkgB
347
atf_check -o ignore -e empty python3 -m json.tool out.json
348
# Verify it is a JSON array with 2 elements
349
atf_check -o inline:"2\n" python3 -c "import json; print(len(json.load(open('out.json'))))"
350
}
351
352
raw_json_compact_multiple_body() {
353
atf_require python3 "Requires python3 to run this test"
354
atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkgA" "pkgA" "1.0" "/"
355
touch a
356
echo ${TMPDIR}/a > plist
357
atf_check pkg create -M pkgA.ucl -p plist
358
atf_check -o ignore pkg add pkgA-1.0.pkg
359
360
atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkgB" "pkgB" "2.0" "/"
361
touch b
362
echo ${TMPDIR}/b > plist
363
atf_check pkg create -M pkgB.ucl -p plist
364
atf_check -o ignore pkg add pkgB-2.0.pkg
365
366
# json-compact with multiple packages must also be valid JSON
367
atf_check -o save:out.json pkg info --raw --raw-format json-compact pkgA pkgB
368
atf_check -o ignore -e empty python3 -m json.tool out.json
369
atf_check -o inline:"2\n" python3 -c "import json; print(len(json.load(open('out.json'))))"
370
}
371
372
raw_json_all_body() {
373
atf_require python3 "Requires python3 to run this test"
374
atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkgA" "pkgA" "1.0" "/"
375
touch a
376
echo ${TMPDIR}/a > plist
377
atf_check pkg create -M pkgA.ucl -p plist
378
atf_check -o ignore pkg add pkgA-1.0.pkg
379
380
atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkgB" "pkgB" "2.0" "/"
381
touch b
382
echo ${TMPDIR}/b > plist
383
atf_check pkg create -M pkgB.ucl -p plist
384
atf_check -o ignore pkg add pkgB-2.0.pkg
385
386
# -a with raw JSON must be a valid JSON array
387
atf_check -o save:out.json pkg info -a --raw --raw-format json
388
atf_check -o ignore -e empty python3 -m json.tool out.json
389
atf_check -o inline:"2\n" python3 -c "import json; print(len(json.load(open('out.json'))))"
390
}
391
392