/ tests / frontend / triggers.sh
triggers.sh
  1  #! /usr/bin/env atf-sh
  2  
  3  . $(atf_get_srcdir)/test_environment.sh
  4  
  5  tests_init \
  6  	cleanup_lua \
  7  	deferred \
  8  	glob_trigger \
  9  	regexp_trigger \
 10  	path_trigger \
 11  	pkg_exec_sandbox \
 12  	pkg_exec_no_sandbox \
 13  	pkg_add \
 14  	perpackage_pre_install \
 15  	perpackage_post_install \
 16  	perpackage_pre_deinstall \
 17  	perpackage_post_deinstall
 18  
 19  cleanup_lua_body() {
 20  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "test" "test" "1" "/"
 21  	mkdir trigger_dir/
 22  	cat << EOF >> trigger_dir/trigger.ucl
 23  path: [ "/" ]
 24  cleanup: {
 25  	type: lua
 26  	script: <<EOS
 27  print "Cleaning up"
 28  EOS
 29  }
 30  trigger: {
 31  	type: lua
 32  	script: <<EOS
 33  	return 0
 34  EOS
 35  }
 36  EOF
 37  	echo ${TMPDIR}/trigger_dir/trigger.ucl > plist
 38  	atf_check pkg create -M test.ucl -p plist
 39  	mkdir target
 40  	atf_check pkg -o REPOS_DIR=/dev/null -r ${TMPDIR}/target install -qfy ${TMPDIR}/test-1.pkg
 41  	unset PKG_TRIGGERS_DIR
 42  	atf_check pkg -o REPOS_DIR=/dev/null -o PKG_TRIGGERS_DIR="${TMPDIR}/trigger_dir" install -qfy ${TMPDIR}/test-1.pkg
 43  	atf_check -o inline:"Cleaning up\n" pkg -o REPOS_DIR=/dev/null -o PKG_TRIGGERS_DIR="${TMPDIR}/trigger_dir" delete -qy test
 44  }
 45  
 46  deferred_body() {
 47  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "test" "test" "1" "/"
 48  	mkdir trigger_dir/
 49  	cat << EOF >> trigger_dir/trigger.ucl
 50  path_glob: [ "/*" ]
 51  trigger: {
 52  	type: lua
 53  	sandbox: false
 54  	script: <<EOS
 55  	print("deferred " .. arg[1])
 56  EOS
 57  }
 58  EOF
 59  	echo trigger_dir/trigger.ucl > plist
 60  	atf_check pkg create -M test.ucl -p plist -r .
 61  	mkdir target
 62  	unset PKG_TRIGGERS_DIR
 63  	unset PKG_DBDIR
 64  	atf_check pkg -o REPOS_DIR=/dev/null -o PKG_TRIGGERS_DIR="/trigger_dir" -r ${TMPDIR}/target install -qfy ${TMPDIR}/test-1.pkg
 65  OUTPUT='--begin args
 66  -- /trigger_dir
 67  --end args
 68  --
 69  	print("deferred " .. arg[1])
 70  '
 71  	atf_check -o inline:"${OUTPUT}" cat ${TMPDIR}/target/var/db/pkg/triggers/*
 72  	atf_check -o inline:"deferred /trigger_dir\n" pkg -o PKG_DBDIR=${TMPDIR}/target/var/db/pkg triggers
 73  	# test the deferred trigger has been removed
 74  	atf_check ls ${TMPDIR}/target/var/db/pkg/triggers
 75  }
 76  
 77  glob_trigger_body() {
 78  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "test" "test" "1" "/"
 79  	mkdir trigger_dir/
 80  	cat << EOF >> trigger_dir/trigger.ucl
 81  path_glob: [ "/*" ]
 82  trigger: {
 83  	type: lua
 84  	script: <<EOS
 85  	print("triggered " .. arg[1])
 86  EOS
 87  }
 88  EOF
 89  	echo ${TMPDIR}/trigger_dir/trigger.ucl > plist
 90  	atf_check pkg create -M test.ucl -p plist
 91  	mkdir target
 92  	unset PKG_TRIGGERS_DIR
 93  	atf_check -o inline:"triggered ${TMPDIR}/trigger_dir\n" pkg -o REPOS_DIR=/dev/null -o PKG_TRIGGERS_DIR="${TMPDIR}/trigger_dir" install -qfy ${TMPDIR}/test-1.pkg
 94  }
 95  
 96  regexp_trigger_body() {
 97  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "test" "test" "1" "/"
 98  	mkdir trigger_dir/
 99  	cat << EOF >> trigger_dir/trigger.ucl
100  path_regexp: [ ".*trigger.*" ]
101  trigger: {
102  	type: lua
103  	script: <<EOS
104  	print("triggered " .. arg[1])
105  EOS
106  }
107  EOF
108  	echo ${TMPDIR}/trigger_dir/trigger.ucl > plist
109  	atf_check pkg create -M test.ucl -p plist
110  	mkdir target
111  	unset PKG_TRIGGERS_DIR
112  	atf_check -o inline:"triggered ${TMPDIR}/trigger_dir\n" pkg -o REPOS_DIR=/dev/null -o PKG_TRIGGERS_DIR="${TMPDIR}/trigger_dir" install -qfy ${TMPDIR}/test-1.pkg
113  }
114  
115  path_trigger_body() {
116  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "test" "test" "1" "/"
117  	mkdir trigger_dir/
118  	cat << EOF >> trigger_dir/trigger.ucl
119  path: [ "${TMPDIR}/trigger_dir" ]
120  trigger: {
121  	type: lua
122  	script: <<EOS
123  	print("triggered " .. arg[1])
124  EOS
125  }
126  EOF
127  	echo ${TMPDIR}/trigger_dir/trigger.ucl > plist
128  	atf_check pkg create -M test.ucl -p plist
129  	mkdir target
130  	unset PKG_TRIGGERS_DIR
131  	atf_check -o inline:"triggered ${TMPDIR}/trigger_dir\n" pkg -o REPOS_DIR=/dev/null -o PKG_TRIGGERS_DIR="${TMPDIR}/trigger_dir" install -qfy ${TMPDIR}/test-1.pkg
132  }
133  
134  pkg_exec_sandbox_body() {
135  	atf_skip_on Darwin Requires capsicum
136  	atf_skip_on Linux Requires capsicum
137  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "test" "test" "1" "/"
138  	mkdir trigger_dir/
139  	cat << EOF >> trigger_dir/trigger.ucl
140  path_glob: [ "/*" ]
141  trigger: {
142  	type: lua
143  	script: <<EOS
144  pkg.exec({"echo", "plop"})
145  EOS
146  }
147  EOF
148  	echo ${TMPDIR}/trigger_dir/trigger.ucl > plist
149  	atf_check pkg create -M test.ucl -p plist
150  	mkdir target
151  	unset PKG_TRIGGERS_DIR
152  	atf_check -e inline:"pkg: Failed to execute lua trigger: [string \"pkg.exec({\"echo\", \"plop\"})\"]:1: pkg.exec not available in sandbox\npkg: lua script failed\n" pkg -o REPOS_DIR=/dev/null -o PKG_TRIGGERS_DIR="${TMPDIR}/trigger_dir" install -qfy ${TMPDIR}/test-1.pkg
153  }
154  
155  pkg_exec_no_sandbox_body() {
156  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "test" "test" "1" "/"
157  	mkdir trigger_dir/
158  	cat << EOF >> trigger_dir/trigger.ucl
159  path_glob: [ "/*" ]
160  trigger: {
161  	type: lua
162  	sandbox: false
163  	script: <<EOS
164  pkg.exec({"echo", "plop"})
165  EOS
166  }
167  EOF
168  	echo ${TMPDIR}/trigger_dir/trigger.ucl > plist
169  	atf_check pkg create -M test.ucl -p plist
170  	mkdir target
171  	unset PKG_TRIGGERS_DIR
172  	atf_check -o inline:"plop\n" pkg -o REPOS_DIR=/dev/null -o PKG_TRIGGERS_DIR="${TMPDIR}/trigger_dir" install -qfy ${TMPDIR}/test-1.pkg
173  }
174  
175  pkg_add_body() {
176  	atf_check -s exit:0 ${RESOURCEDIR}/test_subr.sh new_pkg "test" "test" "1" "/"
177  	mkdir trigger_dir/
178  	cat << EOF >> trigger_dir/trigger.ucl
179  path_glob: [ "/*" ]
180  trigger: {
181  	type: lua
182  	sandbox: false
183  	script: <<EOS
184  print("plop")
185  EOS
186  }
187  EOF
188  	echo "${TMPDIR}"/trigger_dir/trigger.ucl > plist
189  	atf_check pkg create -M test.ucl -p plist
190  
191  	atf_check -s exit:0 ${RESOURCEDIR}/test_subr.sh new_pkg "meh" "meh" "1" "/"
192  	cat << EOF >> meh.ucl
193  deps: { test: { version: "1", origin: "dontcare" } }
194  EOF
195  	echo "@dir ${TMPDIR}"/trigger_dir/ > plist
196  	mkdir target
197  	unset PKG_TRIGGERS_DIR
198  	atf_check pkg create -M meh.ucl -p plist
199  OUTPUT="Installing meh-1...
200  \`-- Installing test-1...
201  \`-- Extracting test-1:  done
202  Extracting meh-1:  done
203  ==> Running trigger: trigger.ucl
204  plop
205  "
206  	atf_check -o inline:"${OUTPUT}" pkg -o PKG_TRIGGERS_DIR="${TMPDIR}/trigger_dir" add meh-1.pkg
207  }
208  
209  perpackage_pre_install_body() {
210  	# Create a trigger in the pre_install/ subdirectory
211  	mkdir -p target/trigger_dir/pre_install/
212  	cat << EOF >> target/trigger_dir/pre_install/ldconfig.ucl
213  path_regexp: [ ".*/ldconfig" ]
214  trigger: {
215  	type: lua
216  	sandbox: false
217  	script: <<EOS
218  print("ldconfig: pre_install for " .. pkg_name .. "-" .. pkg_version)
219  print("upgrade: " .. tostring(pkg_upgrade))
220  for i, v in ipairs(arg) do
221  	print("  path: " .. v)
222  end
223  EOS
224  }
225  EOF
226  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "mylib" "mylib" "1.0" "/usr/local"
227  	mkdir -p usr/local/libdata/ldconfig/
228  	echo "# ldconfig hints" > usr/local/libdata/ldconfig/mylib.conf
229  	echo /usr/local/libdata/ldconfig/mylib.conf > plist
230  	atf_check pkg create -M mylib.ucl -p plist -r .
231  	unset PKG_TRIGGERS_DIR
232  	atf_check -o match:"ldconfig: pre_install for mylib-1.0" \
233  	    -o match:"upgrade: false" \
234  	    -o match:"path: /usr/local/libdata/ldconfig" \
235  	    pkg -o REPOS_DIR=/dev/null -o PKG_TRIGGERS_DIR="/trigger_dir" -r ${TMPDIR}/target install -qfy ${TMPDIR}/mylib-1.0.pkg
236  }
237  
238  perpackage_post_install_body() {
239  	# Create a trigger in the post_install/ subdirectory
240  	mkdir -p target/trigger_dir/post_install/
241  	cat << EOF >> target/trigger_dir/post_install/ldconfig.ucl
242  path_regexp: [ ".*/ldconfig" ]
243  trigger: {
244  	type: lua
245  	sandbox: false
246  	script: <<EOS
247  print("ldconfig: post_install for " .. pkg_name .. "-" .. pkg_version)
248  print("upgrade: " .. tostring(pkg_upgrade))
249  for i, v in ipairs(arg) do
250  	print("  path: " .. v)
251  end
252  EOS
253  }
254  EOF
255  	# Create a package that installs a file into /usr/local/libdata/ldconfig/
256  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "mylib" "mylib" "1.0" "/usr/local"
257  	mkdir -p usr/local/libdata/ldconfig/
258  	echo "# ldconfig hints" > usr/local/libdata/ldconfig/mylib.conf
259  	echo /usr/local/libdata/ldconfig/mylib.conf > plist
260  	atf_check pkg create -M mylib.ucl -p plist -r .
261  	unset PKG_TRIGGERS_DIR
262  	atf_check -o match:"ldconfig: post_install for mylib-1.0" \
263  	    -o match:"upgrade: false" \
264  	    -o match:"path: /usr/local/libdata/ldconfig" \
265  	    pkg -o REPOS_DIR=/dev/null -o PKG_TRIGGERS_DIR="/trigger_dir" -r ${TMPDIR}/target install -qfy ${TMPDIR}/mylib-1.0.pkg
266  }
267  
268  perpackage_pre_deinstall_body() {
269  	# Install a package first, then delete it with a pre_deinstall trigger
270  	mkdir -p target/trigger_dir/pre_deinstall/
271  	cat << EOF >> target/trigger_dir/pre_deinstall/ldconfig.ucl
272  path_regexp: [ ".*/ldconfig" ]
273  trigger: {
274  	type: lua
275  	sandbox: false
276  	script: <<EOS
277  print("ldconfig: pre_deinstall for " .. pkg_name .. "-" .. pkg_version)
278  print("upgrade: " .. tostring(pkg_upgrade))
279  for i, v in ipairs(arg) do
280  	print("  path: " .. v)
281  end
282  EOS
283  }
284  EOF
285  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "mylib" "mylib" "1.0" "/usr/local"
286  	mkdir -p usr/local/libdata/ldconfig/
287  	echo "# ldconfig hints" > usr/local/libdata/ldconfig/mylib.conf
288  	echo /usr/local/libdata/ldconfig/mylib.conf > plist
289  	atf_check pkg create -M mylib.ucl -p plist -r .
290  	unset PKG_TRIGGERS_DIR
291  	atf_check pkg -o REPOS_DIR=/dev/null -o PKG_TRIGGERS_DIR="/trigger_dir" -r ${TMPDIR}/target install -qfy ${TMPDIR}/mylib-1.0.pkg
292  	atf_check -o match:"ldconfig: pre_deinstall for mylib-1.0" \
293  	    -o match:"upgrade: false" \
294  	    -o match:"path: /usr/local/libdata/ldconfig" \
295  	    pkg -o REPOS_DIR=/dev/null -o PKG_TRIGGERS_DIR="/trigger_dir" -r ${TMPDIR}/target delete -qy mylib
296  }
297  
298  perpackage_post_deinstall_body() {
299  	# Install a package first, then delete it with a post_deinstall trigger
300  	mkdir -p target/trigger_dir/post_deinstall/
301  	cat << EOF >> target/trigger_dir/post_deinstall/ldconfig.ucl
302  path_regexp: [ ".*/ldconfig" ]
303  trigger: {
304  	type: lua
305  	sandbox: false
306  	script: <<EOS
307  print("ldconfig: post_deinstall for " .. pkg_name .. "-" .. pkg_version)
308  print("upgrade: " .. tostring(pkg_upgrade))
309  for i, v in ipairs(arg) do
310  	print("  path: " .. v)
311  end
312  EOS
313  }
314  EOF
315  	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "mylib" "mylib" "1.0" "/usr/local"
316  	mkdir -p usr/local/libdata/ldconfig/
317  	echo "# ldconfig hints" > usr/local/libdata/ldconfig/mylib.conf
318  	echo /usr/local/libdata/ldconfig/mylib.conf > plist
319  	atf_check pkg create -M mylib.ucl -p plist -r .
320  	unset PKG_TRIGGERS_DIR
321  	atf_check pkg -o REPOS_DIR=/dev/null -o PKG_TRIGGERS_DIR="/trigger_dir" -r ${TMPDIR}/target install -qfy ${TMPDIR}/mylib-1.0.pkg
322  	atf_check -o match:"ldconfig: post_deinstall for mylib-1.0" \
323  	    -o match:"upgrade: false" \
324  	    -o match:"path: /usr/local/libdata/ldconfig" \
325  	    pkg -o REPOS_DIR=/dev/null -o PKG_TRIGGERS_DIR="/trigger_dir" -r ${TMPDIR}/target delete -qy mylib
326  }