/ tests / frontend / upgrade.sh
upgrade.sh
  1  #! /usr/bin/env atf-sh
  2  
  3  . $(atf_get_srcdir)/test_environment.sh
  4  
  5  tests_init \
  6  	issue1881 \
  7  	issue1881_newdep \
  8  	three_digit_revision \
  9  	dual_conflict \
 10  	file_become_dir \
 11  	dir_become_file \
 12  	dir_is_symlink_to_a_dir \
 13  	vital \
 14  	vital_force \
 15  	vital_force_cant_remove \
 16  	upgrade_with_dependency \
 17  	upgrade_glob_abi_os \
 18  	upgrade_glob_abi_version \
 19  	upgrade_glob_abi_arch \
 20  	upgrade_autoremove \
 21  	upgrade_autoremove_flag \
 22  	symlink_to_dir_upgrade \
 23  	newpkgversion_two_repos \
 24  
 25  issue1881_body() {
 26  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg pkg1 pkg_a 1
 27  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg pkg2 pkg_a 1_1
 28  
 29  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg pkg3 pkg_b 1
 30  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg pkg4 pkg_b 1_1
 31  
 32  	atf_check \
 33  		-o match:".*Installing.*\.\.\.$" \
 34  		-e empty \
 35  		-s exit:0 \
 36  		pkg register -M pkg1.ucl
 37  
 38  	atf_check \
 39  		-o ignore \
 40  		-e empty \
 41  		-s exit:0 \
 42  		pkg create -M ./pkg3.ucl
 43  
 44  	atf_check \
 45  		-o ignore \
 46  		-e empty \
 47  		-s exit:0 \
 48  		pkg create -M ./pkg2.ucl
 49  
 50  	atf_check \
 51  		-o ignore \
 52  		-e empty \
 53  		-s exit:0 \
 54  		pkg create -M ./pkg4.ucl
 55  
 56  	atf_check \
 57  		-o inline:"Creating repository in .:  done\nPacking files for repository:  done\n" \
 58  		-e empty \
 59  		-s exit:0 \
 60  		pkg repo .
 61  
 62  	mkdir repoconf
 63  	cat << EOF > repoconf/repo.conf
 64  local: {
 65  	url: file:///$TMPDIR,
 66  	enabled: true
 67  }
 68  EOF
 69  
 70  	atf_check \
 71  		-o not-match:"^[[:space:]]+pkg_b: 1$" \
 72  		-e ignore \
 73  		-s exit:0 \
 74  		pkg -o REPOS_DIR="$TMPDIR/repoconf" -o PKG_CACHEDIR="$TMPDIR" upgrade -yx '^pkg_'
 75  }
 76  
 77  issue1881_newdep_body() {
 78  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg pkg1 pkg_a 1
 79  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg pkg2 pkg_a 1_1
 80  
 81  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg pkg3 pkg_b 1
 82  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg pkg4 pkg_b 1_1
 83  
 84  	cat <<EOF >> ./pkg2.ucl
 85  deps: {
 86  	pkg_b: {
 87  		origin: "wedontcare",
 88  		version: "1"
 89  	}
 90  }
 91  EOF
 92  
 93  	atf_check \
 94  		-o match:".*Installing.*\.\.\.$" \
 95  		-e empty \
 96  		-s exit:0 \
 97  		pkg register -M pkg1.ucl
 98  
 99  	atf_check \
100  		-o ignore \
101  		-e empty \
102  		-s exit:0 \
103  		pkg create -M ./pkg3.ucl
104  
105  	atf_check \
106  		-o ignore \
107  		-e empty \
108  		-s exit:0 \
109  		pkg create -M ./pkg2.ucl
110  
111  	atf_check \
112  		-o ignore \
113  		-e empty \
114  		-s exit:0 \
115  		pkg create -M ./pkg4.ucl
116  
117  	atf_check \
118  		-o inline:"Creating repository in .:  done\nPacking files for repository:  done\n" \
119  		-e empty \
120  		-s exit:0 \
121  		pkg repo .
122  
123  	mkdir repoconf
124  	cat << EOF > repoconf/repo.conf
125  local: {
126  	url: file:///$TMPDIR,
127  	enabled: true
128  }
129  EOF
130  
131  	atf_check \
132  		-o match:"^[[:space:]]+pkg_b: 1_1$" \
133  		-e ignore \
134  		-s exit:0 \
135  		pkg -o REPOS_DIR="$TMPDIR/repoconf" -o PKG_CACHEDIR="$TMPDIR" upgrade -yx '^pkg_'
136  }
137  
138  three_digit_revision_body() {
139  
140  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg pkg1 pkg_a 1_90
141  
142  	atf_check \
143  		-o ignore \
144  		-e empty \
145  		-s exit:0 \
146  		pkg register -M pkg1.ucl
147  
148  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg pkg1 pkg_a 1_125
149  
150  	atf_check \
151  		-o ignore \
152  		-e empty \
153  		-s exit:0 \
154  		pkg create -M ./pkg1.ucl
155  
156  	atf_check \
157  		-o ignore \
158  		-e empty \
159  		-s exit:0 \
160  		pkg repo .
161  
162  	mkdir repoconf
163  	cat << EOF > repoconf/repo.conf
164  local: {
165  	url: file:///$TMPDIR,
166  	enabled: true
167  }
168  EOF
169  
170  	atf_check \
171  		-o ignore \
172  		-e empty \
173  		-s exit:0 \
174  		pkg -o REPOS_DIR="$TMPDIR/repoconf" -o PKG_CACHEDIR="$TMPDIR" upgrade -yx '^pkg_'
175  	atf_check \
176  		-o inline:"pkg_a-1_125\n" \
177  		-e empty \
178  		-s exit:0 \
179  		pkg info -q
180  }
181  
182  dual_conflict_body()
183  {
184  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkg-1" "pkg-1" "1"
185  	echo "${TMPDIR}/file-pkg-1" > plist-1
186  	echo "entry" > file-pkg-1
187  	atf_check -s exit:0 pkg create -M pkg-1.ucl -p plist-1
188  
189  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkg-2" "pkg-2" "1"
190  	echo "${TMPDIR}/file-pkg-2" > plist-2
191  	echo "entry" > file-pkg-2
192  	atf_check -s exit:0 pkg create -M pkg-2.ucl -p plist-2
193  
194  	mkdir repoconf
195  	cat << EOF > repoconf/repo.conf
196  local: {
197  	url: file:///$TMPDIR,
198  	enabled: true
199  }
200  EOF
201  
202  	atf_check \
203  		-o inline:"Creating repository in .:  done\nPacking files for repository:  done\n" \
204  		-e empty \
205  		-s exit:0 \
206  		pkg repo .
207  
208  	mkdir ${TMPDIR}/target
209  	atf_check \
210  		pkg -o REPOS_DIR="$TMPDIR/repoconf" -o PKG_CACHEDIR="$TMPDIR" -r ${TMPDIR}/target install -qy pkg-1 pkg-2
211  	pkg -r ${TMPDIR}/target which ${TMPDIR}/file-pkg-1
212  	pkg -r ${TMPDIR}/target which ${TMPDIR}/file-pkg-2
213  	test -f ${TMPDIR}/target/${TMPDIR}/file-pkg-1 || atf_fail "file absent"
214  	test -f ${TMPDIR}/target/${TMPDIR}/file-pkg-2 || atf_fail "file absent"
215  
216  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkg-1" "pkg-1" "2"
217  	echo "${TMPDIR}/file-pkg-2" > plist-1
218  	atf_check -s exit:0 pkg create -M pkg-1.ucl -p plist-1
219  
220  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkg-2" "pkg-2" "2"
221  	echo "${TMPDIR}/file-pkg-1" > plist-2
222  	atf_check -s exit:0 pkg create -M pkg-2.ucl -p plist-2
223  
224  	sleep 1
225  	atf_check \
226  		-o inline:"Creating repository in .:  done\nPacking files for repository:  done\n" \
227  		-e empty \
228  		-s exit:0 \
229  		pkg repo -l .
230  
231  	atf_check \
232  		pkg -o REPOS_DIR="$TMPDIR/repoconf" -o PKG_CACHEDIR="$TMPDIR" -r ${TMPDIR}/target update -q
233  
234  	atf_check \
235  		pkg -o REPOS_DIR="$TMPDIR/repoconf" -o PKG_CACHEDIR="$TMPDIR" -r ${TMPDIR}/target upgrade -qy
236  
237  	atf_check \
238  		-o inline:'pkg-2-2\n' \
239  		pkg -r ${TMPDIR}/target which -q ${TMPDIR}/file-pkg-1
240  	atf_check \
241  		-o inline:'pkg-1-2\n' \
242  		pkg -r ${TMPDIR}/target which -q ${TMPDIR}/file-pkg-2
243  }
244  
245  file_become_dir_body() {
246  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkg" "pkg" "1"
247  	echo "${TMPDIR}/file-pkg-1" > plist-1
248  	echo "entry" > file-pkg-1
249  	atf_check pkg create -M pkg.ucl -p plist-1
250  	mkdir target
251  	atf_check -o ignore pkg -o REPOS_DIR="${TMPDIR}" -r ${TMPDIR}/target install -Uy ${TMPDIR}/pkg-1.pkg
252  	atf_check test -f target/${TMPDIR}/file-pkg-1
253  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkg" "pkg" "2"
254  	rm file-pkg-1
255  	mkdir file-pkg-1
256  	echo entry > file-pkg-1/file
257  	echo "${TMPDIR}/file-pkg-1/file" > plist-2
258  	atf_check pkg create -M pkg.ucl -p plist-2
259  	atf_check -o ignore pkg -o REPOS_DIR="${TMPDIR}" -r ${TMPDIR}/target install -Uy ${TMPDIR}/pkg-2.pkg
260  }
261  
262  dir_become_file_body() {
263  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkg" "pkg" "1"
264  	mkdir file-pkg-1
265  	echo entry > file-pkg-1/file
266  	echo "${TMPDIR}/file-pkg-1/file" > plist-1
267  	atf_check pkg create -M pkg.ucl -p plist-1
268  	mkdir target
269  	atf_check -o ignore pkg -o REPOS_DIR="${TMPDIR}" -r ${TMPDIR}/target install -Uy ${TMPDIR}/pkg-1.pkg
270  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkg" "pkg" "2"
271  	rm -rf file-pkg-1
272  	echo entry > file-pkg-1
273  	echo "${TMPDIR}/file-pkg-1" > plist-2
274  	atf_check pkg create -M pkg.ucl -p plist-2
275  	atf_check -o ignore pkg -o REPOS_DIR="${TMPDIR}" -r ${TMPDIR}/target install -Uy ${TMPDIR}/pkg-2.pkg
276  }
277  
278  dir_is_symlink_to_a_dir_body()
279  {
280  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkg" "pkg" "1"
281  	mkdir share lib lib/something
282  	ln -sf ../lib/something share/something
283  	echo "entry" > lib/something/file
284  	echo "${TMPDIR}/lib/something/file" > plist-1
285  	echo "${TMPDIR}/share/something" >> plist-1
286  	atf_check pkg create -M pkg.ucl -p plist-1
287  	mkdir target
288  	atf_check -o ignore pkg -o REPOS_DIR="${TMPDIR}" -r ${TMPDIR}/target install -Uy ${TMPDIR}/pkg-1.pkg
289  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkg" "pkg" "2"
290  	rm share/something
291  	mkdir share/something
292  	echo "entry" > share/something/file
293  	echo "${TMPDIR}/lib/something/file" > plist-2
294  	echo "${TMPDIR}/share/something/file" >> plist-2
295  	atf_check pkg create -M pkg.ucl -p plist-2
296  	atf_check -o ignore pkg -o REPOS_DIR="${TMPDIR}" -r ${TMPDIR}/target install -Uy ${TMPDIR}/pkg-2.pkg
297  }
298  
299  vital_body() {
300  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "meta" "mymeta" "1"
301  	mkdir file-pkg-1
302  	cat << EOF >> meta.ucl
303  vital = true;
304  EOF
305  	echo entry > file-pkg-1/file
306  	echo "${TMPDIR}/file-pkg-1/file" > plist-1
307  	atf_check pkg create -M meta.ucl -p plist-1
308  	mkdir target
309  	atf_check -o ignore pkg -o REPOS_DIR="${TMPDIR}" -r ${TMPDIR}/target install -Uy ${TMPDIR}/mymeta-1.pkg
310  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "plop" "myplop" "1"
311  	atf_check pkg create -M plop.ucl
312  	atf_check -o ignore pkg -o REPOS_DIR="${TMPDIR}" -r ${TMPDIR}/target install -Uy ${TMPDIR}/myplop-1.pkg
313  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "plop" "myplop" "2"
314  	echo "${TMPDIR}/file-pkg-1/file" > plist-2
315  	atf_check pkg create -M plop.ucl -p plist-2
316  	mkdir repoconf
317  	cat << EOF > repoconf/repo.conf
318  local: {
319  	url: file:///$TMPDIR,
320  	enabled: true
321  }
322  EOF
323  
324  	rm ${TMPDIR}/mymeta-1.pkg
325  	atf_check -o ignore pkg repo .
326  	atf_check -o ignore pkg -o REPOS_DIR="$TMPDIR/repoconf" -r ${TMPDIR}/target -o PKG_CACHEDIR="$TMPDIR" update
327  	OUTPUT="Updating local repository catalogue...
328  local repository is up to date.
329  All repositories are up to date.
330  Checking for upgrades (1 candidates):  done
331  Processing candidates (1 candidates):  done
332  Checking integrity... done (1 conflicting)
333    - myplop-2 conflicts with mymeta-1 on ${TMPDIR}/file-pkg-1/file
334  Cannot solve problem using SAT solver, trying another plan
335  Checking integrity... done (0 conflicting)
336  Your packages are up to date.
337  "
338  	ERROR=""
339  	atf_check -o inline:"${OUTPUT}" -e inline:"${ERROR}" -s exit:0 pkg -o REPOS_DIR="$TMPDIR/repoconf" -r ${TMPDIR}/target -o PKG_CACHEDIR="$TMPDIR" upgrade -y
340  }
341  
342  vital_force_body() {
343  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "meta" "mymeta" "1"
344  	mkdir file-pkg-1
345  	cat << EOF >> meta.ucl
346  vital = true;
347  EOF
348  	echo entry > file-pkg-1/file
349  	echo "${TMPDIR}/file-pkg-1/file" > plist-1
350  	atf_check pkg create -M meta.ucl -p plist-1
351  	mkdir target
352  	atf_check -o ignore pkg -o REPOS_DIR="${TMPDIR}" -r ${TMPDIR}/target install -Uy ${TMPDIR}/mymeta-1.pkg
353  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "plop" "myplop" "1"
354  	atf_check pkg create -M plop.ucl
355  	atf_check -o ignore pkg -o REPOS_DIR="${TMPDIR}" -r ${TMPDIR}/target install -Uy ${TMPDIR}/myplop-1.pkg
356  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "plop" "myplop" "2"
357  	echo "${TMPDIR}/file-pkg-1/file" > plist-2
358  	atf_check pkg create -M plop.ucl -p plist-2
359  	mkdir repoconf
360  	cat << EOF > repoconf/repo.conf
361  local: {
362  	url: file:///$TMPDIR,
363  	enabled: true
364  }
365  EOF
366  
367  	atf_check -o ignore pkg repo .
368  	atf_check -o ignore pkg -o REPOS_DIR="$TMPDIR/repoconf" -r ${TMPDIR}/target -o PKG_CACHEDIR="$TMPDIR" update
369  	OUTPUT="Updating local repository catalogue...
370  local repository is up to date.
371  All repositories are up to date.
372  Checking integrity... done (1 conflicting)
373    - myplop-2 conflicts with mymeta-1 on ${TMPDIR}/file-pkg-1/file
374  Checking integrity... done (0 conflicting)
375  The following 2 package(s) will be affected (of 0 checked):
376  
377  Installed packages to be UPGRADED:
378  	myplop: 1 -> 2
379  
380  Installed packages to be REMOVED:
381  	mymeta: 1
382  
383  Number of packages to be removed: 1
384  Number of packages to be upgraded: 1
385  [1/2] Deinstalling mymeta-1...
386  [1/2] Deleting files for mymeta-1:  done
387  [2/2] Upgrading myplop from 1 to 2...
388  [2/2] Extracting myplop-2:  done
389  "
390  	ERROR=""
391  	atf_check -o inline:"${OUTPUT}" -e inline:"${ERROR}" -s exit:0 pkg -o REPOS_DIR="$TMPDIR/repoconf" -r ${TMPDIR}/target -o PKG_CACHEDIR="$TMPDIR" upgrade -fy myplop
392  }
393  
394  vital_force_cant_remove_body() {
395  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "meta" "mymeta" "1"
396  	mkdir file-pkg-1
397  	cat << EOF >> meta.ucl
398  vital = true;
399  EOF
400  	echo entry > file-pkg-1/file
401  	echo "${TMPDIR}/file-pkg-1/file" > plist-1
402  	atf_check pkg create -M meta.ucl -p plist-1
403  	mkdir target
404  	atf_check -o ignore pkg -o REPOS_DIR="${TMPDIR}" -r ${TMPDIR}/target install -Uy ${TMPDIR}/mymeta-1.pkg
405  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "plop" "myplop" "1"
406  	atf_check pkg create -M plop.ucl
407  	atf_check -o ignore pkg -o REPOS_DIR="${TMPDIR}" -r ${TMPDIR}/target install -Uy ${TMPDIR}/myplop-1.pkg
408  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "plop" "myplop" "2"
409  	echo "${TMPDIR}/file-pkg-1/file" > plist-2
410  	atf_check pkg create -M plop.ucl -p plist-2
411  	mkdir repoconf
412  	cat << EOF > repoconf/repo.conf
413  local: {
414  	url: file:///$TMPDIR,
415  	enabled: true
416  }
417  EOF
418  
419  	atf_check -o ignore pkg repo .
420  	atf_check -o ignore pkg -o REPOS_DIR="$TMPDIR/repoconf" -r ${TMPDIR}/target -o PKG_CACHEDIR="$TMPDIR" update
421  	OUTPUT="Updating local repository catalogue...
422  local repository is up to date.
423  All repositories are up to date.
424  Checking integrity... done (1 conflicting)
425    - myplop-2 conflicts with mymeta-1 on ${TMPDIR}/file-pkg-1/file
426  Cannot solve problem using SAT solver, trying another plan
427  Checking integrity... done (0 conflicting)
428  Your packages are up to date.
429  "
430  	ERROR=""
431  	atf_check -o inline:"${OUTPUT}" -e inline:"${ERROR}" -s exit:0 pkg -o REPOS_DIR="$TMPDIR/repoconf" -r ${TMPDIR}/target -o PKG_CACHEDIR="$TMPDIR" -o FORCE_CAN_REMOVE_VITAL=NO upgrade -fy myplop
432  }
433  
434  upgrade_with_dependency_body() {
435  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "testa" "testa" "1.0"
436  	atf_check pkg create -M testa.ucl -o ./repo
437  
438  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "testb" "testb" "1.0"
439  	cat << EOF >> testb.ucl
440  deps: {
441  	testa: {
442  		origin: "testa",
443  	}
444  }
445  EOF
446  	atf_check pkg create -M testb.ucl -o ./repo
447  
448  	cat << EOF > pkg.conf
449  PKG_DBDIR=${TMPDIR}
450  REPOS_DIR=[]
451  repositories: {
452  	local: { url : file://${TMPDIR}/repo }
453  }
454  EOF
455  	atf_check \
456  		-o inline:"Creating repository in ./repo:  done\nPacking files for repository:  done\n" \
457  		-e empty \
458  		-s exit:0 \
459  		pkg -C ./pkg.conf repo ./repo
460  
461  	atf_check \
462  		-o ignore \
463  		-s exit:0 \
464  		pkg -C ./pkg.conf update -f
465  
466  	atf_check \
467  		pkg -C ./pkg.conf install -qy testb
468  
469  	rm -r ./repo
470  
471  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "testa" "testa" "2.0"
472  	atf_check pkg create -M testa.ucl -o ./repo
473  
474  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "testb" "testb" "2.0"
475  	cat << EOF >> testb.ucl
476  deps: {
477  	testa: {
478  		origin: "testa",
479  	}
480  }
481  EOF
482  	atf_check pkg create -M testb.ucl -o ./repo
483  
484  	atf_check \
485  		-o inline:"Creating repository in ./repo:  done\nPacking files for repository:  done\n" \
486  		-e empty \
487  		-s exit:0 \
488  		pkg -C ./pkg.conf repo ./repo
489  
490  	atf_check \
491  		-o ignore \
492  		-e empty \
493  		-s exit:0 \
494  		pkg -C ./pkg.conf update -f
495  
496  OUTPUT="Updating local repository catalogue...
497  local repository is up to date.
498  All repositories are up to date.
499  Checking for upgrades (2 candidates):  done
500  Processing candidates (2 candidates):  done
501  Checking integrity... done (0 conflicting)
502  The following 2 package(s) will be affected (of 0 checked):
503  
504  Installed packages to be UPGRADED:
505  	testa: 1.0 -> 2.0
506  	testb: 1.0 -> 2.0
507  
508  Number of packages to be upgraded: 2
509  ${JAILED}[1/2] Upgrading testa from 1.0 to 2.0...
510  ${JAILED}[2/2] Upgrading testb from 1.0 to 2.0...
511  "
512  
513  	atf_check \
514  		-o inline:"${OUTPUT}" \
515  		-e empty \
516  		-s exit:0 \
517  		pkg -C ./pkg.conf upgrade -y
518  }
519  
520  upgrade_glob_abi_os_body() {
521  	atf_skip_on Darwin Irrelevant on OSX
522  
523  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "testa" "testa" "1.0" "/"
524  	cc -shared -Wl,-soname=libtesta.so.2 -o libtesta.so.2
525  	ln -s libtesta.so.2 libtesta.so
526  	cc -shared -Wl,-rpath=${TMPDIR} -L. -ltesta -o dep.so
527  
528  	cat << EOF >> testa.ucl
529  shlibs_provided: [ "libtesta.so.2" ]
530  files: {
531  ${TMPDIR}/libtesta.so.2: ""
532  }
533  EOF
534  	atf_check pkg create -M testa.ucl -o ./repo
535  	cat << EOF > pkg.conf
536  PKG_DBDIR=${TMPDIR}
537  REPOS_DIR=[]
538  repositories: {
539  	local: { url : file://${TMPDIR}/repo }
540  }
541  EOF
542  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "testb" "testb" "2.0"
543  	cat << EOF >> testb.ucl
544  shlibs_required: [ "libtesta.so.2" ]
545  files: {
546  	${TMPDIR}/dep.so: ""
547  }
548  EOF
549  	atf_check pkg create -M testb.ucl -o ./repo
550  
551  	atf_check \
552  		-o inline:"Creating repository in ./repo:  done\nPacking files for repository:  done\n" \
553  		pkg -C ./pkg.conf repo ./repo
554  
555  	atf_check \
556  		-o ignore \
557  		pkg -C ./pkg.conf update -f
558  
559  	atf_check \
560  		pkg -C ./pkg.conf install -qy testb
561  }
562  
563  upgrade_glob_abi_version_body() {
564  	atf_skip_on Darwin Irrelevant on OSX
565  
566  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "testa" "testa" "1.0" "/" "${OS}:*"
567  	cc -shared -Wl,-soname=libtesta.so.2 -o libtesta.so.2
568  	ln -s libtesta.so.2 libtesta.so
569  	cc -shared -Wl,-rpath=${TMPDIR} -L. -ltesta -o dep.so
570  
571  	cat << EOF >> testa.ucl
572  shlibs_provided: [ "libtesta.so.2" ]
573  files: {
574  ${TMPDIR}/libtesta.so.2: ""
575  }
576  EOF
577  	atf_check pkg create -M testa.ucl -o ./repo
578  	cat << EOF > pkg.conf
579  PKG_DBDIR=${TMPDIR}
580  REPOS_DIR=[]
581  repositories: {
582  	local: { url : file://${TMPDIR}/repo }
583  }
584  EOF
585  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "testb" "testb" "2.0"
586  	cat << EOF >> testb.ucl
587  shlibs_required: [ "libtesta.so.2" ]
588  files: {
589  	${TMPDIR}/dep.so: ""
590  }
591  EOF
592  	atf_check pkg create -M testb.ucl -o ./repo
593  
594  	atf_check \
595  		-o inline:"Creating repository in ./repo:  done\nPacking files for repository:  done\n" \
596  		pkg -C ./pkg.conf repo ./repo
597  
598  	atf_check \
599  		-o ignore \
600  		pkg -C ./pkg.conf update -f
601  
602  	atf_check \
603  		pkg -C ./pkg.conf install -qy testb
604  }
605  
606  upgrade_glob_abi_arch_body() {
607  	atf_skip_on Darwin Irrelevant on OSX
608  	atf_skip_on Linux the versioning does not work for linux
609  
610  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "testa" "testa" "1.0" "/" "${OS}:16:*"
611  	cc -shared -Wl,-soname=libtesta.so.2 -o libtesta.so.2
612  	ln -s libtesta.so.2 libtesta.so
613  	cc -shared -Wl,-rpath=${TMPDIR} -L. -ltesta -o dep.so
614  
615  	cat << EOF >> testa.ucl
616  shlibs_provided: [ "libtesta.so.2" ]
617  files: {
618  ${TMPDIR}/libtesta.so.2: ""
619  }
620  EOF
621  	atf_check pkg create -M testa.ucl -o ./repo
622  	cat << EOF > pkg.conf
623  PKG_DBDIR=${TMPDIR}
624  REPOS_DIR=[]
625  repositories: {
626  	local: { url : file://${TMPDIR}/repo }
627  }
628  EOF
629  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "testb" "testb" "2.0" "/" "${OS}:16:*"
630  	cat << EOF >> testb.ucl
631  shlibs_required: [ "libtesta.so.2" ]
632  files: {
633  	${TMPDIR}/dep.so: ""
634  }
635  EOF
636  	atf_check pkg create -M testb.ucl -o ./repo
637  
638  	atf_check \
639  		-o inline:"Creating repository in ./repo:  done\nPacking files for repository:  done\n" \
640  		pkg -C ./pkg.conf repo ./repo
641  
642  	atf_check \
643  		-o ignore \
644  		-e ignore \
645  		pkg -o IGNORE_OSVERSION=yes -o ABI=${OS}:16:amd64 -o OSVERSION=1600000 -C ./pkg.conf update -f
646  
647  	atf_check \
648  		-e ignore \
649  		pkg -o IGNORE_OSVERSION=yes -o ABI=${OS}:16:amd64 -o OSVERSION=1600000 -C ./pkg.conf install -qy testb
650  }
651  
652  upgrade_autoremove_body() {
653  	# Install master v1 with olddep as automatic dependency
654  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "olddep" "olddep" "1.0"
655  	atf_check -o ignore pkg register -A -M olddep.ucl
656  
657  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "master" "master" "1.0"
658  	cat << EOF >> master.ucl
659  deps: {
660  	olddep {
661  		origin: olddep,
662  		version: "1.0"
663  	}
664  }
665  EOF
666  	atf_check -o ignore pkg register -M master.ucl
667  
668  	# Create master v2 in repo (no longer depends on olddep)
669  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "master2" "master" "2.0"
670  	atf_check pkg create -M master2.ucl -o ./repo
671  
672  	cat << EOF > pkg.conf
673  PKG_DBDIR=${TMPDIR}
674  REPOS_DIR=[]
675  AUTOREMOVE=YES
676  repositories: {
677  	local: { url : file://${TMPDIR}/repo }
678  }
679  EOF
680  
681  	atf_check -o ignore pkg -C ./pkg.conf repo ./repo
682  	atf_check -o ignore pkg -C ./pkg.conf update -f
683  
684  	# Upgrade: master 1.0 -> 2.0, olddep should be autoremoved
685  	atf_check \
686  		-o match:"Upgrading master" \
687  		-o match:"Deinstalling olddep" \
688  		-s exit:0 \
689  		pkg -C ./pkg.conf upgrade -y
690  
691  	atf_check -s exit:0 pkg info -e master
692  	atf_check -s exit:1 pkg info -e olddep
693  }
694  
695  upgrade_autoremove_flag_body() {
696  	# Same but with --autoremove flag instead of config
697  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "olddep" "olddep" "1.0"
698  	atf_check -o ignore pkg register -A -M olddep.ucl
699  
700  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "master" "master" "1.0"
701  	cat << EOF >> master.ucl
702  deps: {
703  	olddep {
704  		origin: olddep,
705  		version: "1.0"
706  	}
707  }
708  EOF
709  	atf_check -o ignore pkg register -M master.ucl
710  
711  	# Create master v2 in repo (no longer depends on olddep)
712  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "master2" "master" "2.0"
713  	atf_check pkg create -M master2.ucl -o ./repo
714  
715  	cat << EOF > pkg.conf
716  PKG_DBDIR=${TMPDIR}
717  REPOS_DIR=[]
718  repositories: {
719  	local: { url : file://${TMPDIR}/repo }
720  }
721  EOF
722  
723  	atf_check -o ignore pkg -C ./pkg.conf repo ./repo
724  	atf_check -o ignore pkg -C ./pkg.conf update -f
725  
726  	# Upgrade with --autoremove: olddep should be removed
727  	atf_check \
728  		-o match:"Upgrading master" \
729  		-o match:"Deinstalling olddep" \
730  		-s exit:0 \
731  		pkg -C ./pkg.conf upgrade -y --autoremove
732  
733  	atf_check -s exit:0 pkg info -e master
734  	atf_check -s exit:1 pkg info -e olddep
735  }
736  
737  symlink_to_dir_upgrade_body() {
738  	# PR #2041: when v1 has a symlink and v2 replaces it with a real
739  	# directory containing files, pkg should remove the symlink before
740  	# renaming the temporary directory into place.
741  
742  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkg" "pkg" "1"
743  	mkdir -p base
744  	echo "content" > base/file
745  	ln -s ../base errors-mx
746  	echo "${TMPDIR}/base/file" > plist-1
747  	echo "${TMPDIR}/errors-mx" >> plist-1
748  	atf_check pkg create -M pkg.ucl -p plist-1
749  	mkdir target
750  	atf_check -o ignore pkg -o REPOS_DIR="${TMPDIR}" -r ${TMPDIR}/target install -Uy ${TMPDIR}/pkg-1.pkg
751  
752  	# Verify symlink was installed
753  	atf_check test -L target/${TMPDIR}/errors-mx
754  
755  	# v2: replaces symlink with a real directory containing a file
756  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkg" "pkg" "2"
757  	rm errors-mx
758  	mkdir errors-mx
759  	echo "new content" > errors-mx/newfile
760  	echo "${TMPDIR}/errors-mx/newfile" > plist-2
761  	atf_check pkg create -M pkg.ucl -p plist-2
762  
763  	# Upgrade: should succeed despite symlink existing at target
764  	atf_check \
765  		-o ignore \
766  		-s exit:0 \
767  		pkg -o REPOS_DIR="${TMPDIR}" -r ${TMPDIR}/target install -Uy ${TMPDIR}/pkg-2.pkg
768  
769  	# Verify the directory replaced the symlink
770  	atf_check test -d target/${TMPDIR}/errors-mx
771  	atf_check test -f target/${TMPDIR}/errors-mx/newfile
772  }
773  
774  newpkgversion_two_repos_body() {
775  	# Issue #2023: when two repos provide the same newer version of "pkg",
776  	# pkg upgrade could loop forever because newpkgversion was not reset
777  	# when the solver found nothing to do.
778  
779  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkg1" "pkg" "1.0"
780  	atf_check -o ignore pkg register -M pkg1.ucl
781  
782  	# Create two repos, both with pkg 2.0
783  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkg2" "pkg" "2.0"
784  	atf_check pkg create -M pkg2.ucl -o ./repo1
785  	atf_check pkg create -M pkg2.ucl -o ./repo2
786  
787  	atf_check -o ignore pkg repo ./repo1
788  	atf_check -o ignore pkg repo ./repo2
789  
790  	cat << EOF > pkg.conf
791  PKG_DBDIR=${TMPDIR}
792  REPOS_DIR=[]
793  repositories: {
794  	repo1: { url : file://${TMPDIR}/repo1 }
795  	repo2: { url : file://${TMPDIR}/repo2 }
796  }
797  EOF
798  
799  	atf_check -o ignore pkg -C ./pkg.conf update -f
800  
801  	# This must not loop forever; should exit 0
802  	atf_check \
803  		-o ignore \
804  		-e empty \
805  		-s exit:0 \
806  		pkg -C ./pkg.conf upgrade -y
807  }