VirtualBox

source: vbox/trunk/src/VBox/Installer/linux/testcase/tstInstallInit.sh@ 46727

Last change on this file since 46727 was 45255, checked in by vboxsync, 12 years ago

tstInstallInit.sh: Use TESTBOX_PATH_SCRATCH instead of /tmp if possible. (The test is probably not cleaning up properly, which causes trouble if run by different users on the same box.)

  • Property svn:eol-style set to LF
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 12.6 KB
Line 
1#!/bin/sh
2# $Id: tstInstallInit.sh 45255 2013-03-30 20:15:31Z vboxsync $
3## @file
4# VirtualBox init file creator unit test.
5#
6
7#
8# Copyright (C) 2012-2013 Oracle Corporation
9#
10# This file is part of VirtualBox Open Source Edition (OSE), as
11# available from http://www.virtualbox.org. This file is free software;
12# you can redistribute it and/or modify it under the terms of the GNU
13# General Public License (GPL) as published by the Free Software
14# Foundation, in version 2 as it comes in the "COPYING" file of the
15# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17#
18
19# This will initially be a skeleton with a couple of tests - add more for quick
20# debugging when you suspect that something isn't working as specified.
21
22tab=" "
23tmpbase="/tmp/tstInstallInit 99" # Space in the name for a little stress...
24if [ -n "${TESTBOX_PATH_SCRATCH}" ]; then
25 tmpbase="${TESTBOX_PATH_SCRATCH}/tstInstallInit 99"
26fi
27
28## The function definition at the start of every non-trivial shell script!
29abort()
30{
31 ## $1 Error text to output to standard error in printf format.
32 cat >&2 << EOF
33${TEST_NAME}: $1
34EOF
35 exit 1
36}
37
38## Print a TESTING line.
39print_line()
40{
41 cat >&2 << EOF
42${TEST_NAME}: TESTING $1
43EOF
44}
45
46## Set the failure message if it is not yet set.
47fail_msg()
48{
49 test -z "${failed}" && failed="FAILED: ${1}"
50}
51
52# Get the directory where the script is located and the parent.
53OUR_FOLDER=`dirname "$0"`
54OUR_FOLDER=`cd "${OUR_FOLDER}" && pwd`
55VBOX_FOLDER=`cd "${OUR_FOLDER}/.." && pwd`
56[ -d "${VBOX_FOLDER}" ] ||
57 abort "Failed to change to directory ${VBOX_FOLDER}.\n"
58cd "${VBOX_FOLDER}"
59
60# Get our name for output.
61TEST_NAME="$(basename "$0" .sh)"
62
63# Create a trivial test service in temporary directory $1 with name $2.
64test_service()
65{
66 cat > "${1}/${2}" << EOF
67#!/bin/sh
68trap "touch \"${1}/stopped\"; exit" TERM
69echo "1: \${1} 2: \${2} 3: \${3}" > "${1}/started"
70while true; do true; done
71EOF
72chmod u+x "${1}/${2}"
73}
74
75# Create a trivial test command in temporary directory $1 with name $2.
76test_oneshot()
77{
78 cat > "${1}/${2}" << EOF
79#!/bin/sh
80if test "\${1}" = start; then
81 touch "${1}/started"
82else
83 rm "${1}/started"
84fi
85exit 0
86EOF
87chmod u+x "${1}/${2}"
88}
89
90# Test some dodgy input values against generate_service_file.
91# Make sure there is a substitution pattern at the end too.
92print_line "generation of shell script from template."
93input='TEST1%DESCRIPTION%%%%SERVICE_NAME%%STOP_COMMAND% TST2 TEST %ARGUMENTS%%COMMAND%'
94out=`echo "${input}" |
95 helpers/generate_service_file --command '/usr/bin
96aries/hello
97world' --arguments 'p\x0a0\n\ \t' --format shell --description ''`
98expected='TEST1%hello
99world TST2 TEST '\''p
1000
101 '"${tab}"\'\''/usr/bin
102aries/hello
103world'\'
104case "${out}" in ${expected})
105echo "SUCCESS (1)";;
106*)
107cat << EOF
108FAILED: expected
109${expected}
110but got
111${out}
112EOF
113esac
114input='TEST%HAVE_STOP_COMMAND%%SERVICE_NAME%%STOP_COMMAND% TST2
115 TEST %COMMAND%'
116out=`echo "${input}" |
117 helpers/generate_service_file --command '/usr/bin/hello' --format shell --description ''`
118expected='TEST TEST '\''/usr/bin/hello'\'''
119case "${out}" in ${expected})
120echo "SUCCESS (2)";;
121*)
122cat << EOF
123FAILED: expected
124${expected}
125but got
126${out}
127EOF
128esac
129input='TEST%HAVE_STOP_COMMAND%%SERVICE_NAME%%STOP_COMMAND% %STOP_ARGUMENTS% TST2
130 TEST %COMMAND%'
131out=`echo "${input}" |
132 helpers/generate_service_file --command '/usr/bin/hello' --format shell --description '' --stop-command /usr/bin/stop --stop-arguments hello`
133expected='TESThello'\''/usr/bin/stop'\'' '\''hello'\'' TST2
134 TEST '\''/usr/bin/hello'\'''
135case "${out}" in ${expected})
136echo "SUCCESS (3)";;
137*)
138cat << EOF
139FAILED: expected
140${expected}
141but got
142${out}
143EOF
144esac
145
146# Create a simulated init system layout.
147create_simulated_init_tree()
148{
149 tmpdir="${1}"
150 rm -rf "${tmpdir}"
151 mkdir -m 0700 "${tmpdir}" || abort "Failed to create a temporary folder."
152 mkdir -p "${tmpdir}/init.d/" "${tmpdir}/rc.d/init.d/"
153 for i in 0 1 2 3 4 5 6; do
154 mkdir "${tmpdir}/rc${i}.d/" "${tmpdir}/rc.d/rc${i}.d/"
155 done
156 mkdir -p "${tmpdir}/runlevel/default" "${tmpdir}/runlevel/boot"
157 mkdir "${tmpdir}/run"
158}
159
160# Test an init script installation.
161print_line "installing an init script."
162failed=""
163# Create a simulated init system layout.
164tmpdir="${tmpbase}0"
165create_simulated_init_tree "${tmpdir}"
166# Create the service binary.
167test_service "${tmpdir}" "service"
168# And install it.
169scripts/install_service --prefix "${tmpdir}" --enable -- --command "${tmpdir}/service" --arguments "test of my\ arguments" --description "My description" ||
170 fail_msg "\"scripts/install_service\" failed."
171# Check that the main service file was created as specified.
172if test -x "${tmpdir}/init.d/service"; then
173 grep "Short-Description: My description" "${tmpdir}/init.d/service" >/dev/null ||
174 fail_msg "Description not set in \"${tmpdir}/init.d/service\""
175else
176 fail_msg "\"${tmpdir}/init.d/service\" not correctly created."
177fi
178test -x "${tmpdir}/init.d/rc.d/service" &&
179 fail_msg "\"${tmpdir}/init.d/rc.d/service\" created but shouldn't have been."
180# Try to start the service using the symbolic links which should have been
181# created.
182if "${tmpdir}/rc3.d/S20service" --prefix "${tmpdir}" --lsb-functions "" start >/dev/null 2>&1; then
183 if grep "1: test 2: of 3: my arguments" "${tmpdir}/started" >/dev/null; then
184 test -f "${tmpdir}/stopped" &&
185 fail_msg "\"${tmpdir}/rc3.d/S20service\" stopped immediately."
186 else
187 fail_msg "\"${tmpdir}/rc3.d/S20service\" did not start correctly."
188 fi
189else
190 fail_msg "could not start \"${tmpdir}/rc3.d/S20service\"."
191fi
192# Check the status.
193"${tmpdir}/rc.d/rc5.d/S20service" --prefix "${tmpdir}" --lsb-functions "" status >/dev/null 2>&1 ||
194 fail_msg "\"${tmpdir}/rc.d/rc5.d/S20service\" reported the wrong status."
195# Try to stop the service using the symbolic links which should have been
196# created.
197if "${tmpdir}/rc.d/rc6.d/K80service" --prefix "${tmpdir}" --lsb-functions "" stop >/dev/null 2>&1; then
198 test -f "${tmpdir}/stopped" ||
199 echo "\"${tmpdir}/rc.d/rc6.d/K80service\" did not stop correctly."
200else
201 fail_msg "could not stop \"${tmpdir}/rc.d/rc6.d/K80service\"."
202fi
203# Check the status again - now it should be stopped.
204"${tmpdir}/runlevel/service" --prefix "${tmpdir}" --lsb-functions "" status >/dev/null 2>&1 &&
205 fail_msg "\"${tmpdir}/runlevel/service\" reported the wrong status."
206# Final summary.
207if test -n "${failed}"; then
208 echo "${failed}"
209else
210 echo SUCCESS
211fi
212
213# Test an one shot init script installation.
214print_line "installing a one shot init script."
215failed=""
216# Create a simulated init system layout.
217tmpdir="${tmpbase}0"
218create_simulated_init_tree "${tmpdir}"
219# Create the command binary.
220test_oneshot "${tmpdir}" "command"
221# And install the script.
222scripts/install_service --prefix "${tmpdir}" --enable -- --command "${tmpdir}/command" --arguments "start" --description "My description" --stop-command "${tmpdir}/command" --stop-arguments "stop" --one-shot ||
223 fail_msg "\"scripts/install_service\" failed."
224# Sanity test.
225test -f "${tmpdir}/started" &&
226 fail_msg "\"${tmpdir}/started\" already exists!"
227# Try to start the service using the symbolic links which should have been
228# created.
229if "${tmpdir}/rc3.d/S20command" --prefix "${tmpdir}" --lsb-functions "" start >/dev/null 2>&1; then
230 test -f "${tmpdir}/started" ||
231 fail_msg "\"${tmpdir}/rc3.d/S20command\" did not start correctly."
232else
233 fail_msg "could not start \"${tmpdir}/rc3.d/S20command\"."
234fi
235# Try to stop the service using the symbolic links which should have been
236# created.
237if "${tmpdir}/rc.d/rc6.d/K80command" --prefix "${tmpdir}" --lsb-functions "" stop >/dev/null 2>&1; then
238 test -f "${tmpdir}/started" &&
239 echo "\"${tmpdir}/rc.d/rc6.d/K80command\" did not stop correctly."
240else
241 fail_msg "could not stop \"${tmpdir}/rc.d/rc6.d/K80command\"."
242fi
243# Final summary.
244if test -n "${failed}"; then
245 echo "${failed}"
246else
247 echo SUCCESS
248fi
249
250# Test an init script removal.
251print_line "removing an init script."
252failed=""
253# Create a simulated init system layout.
254tmpdir="${tmpbase}0"
255create_simulated_init_tree "${tmpdir}"
256# Create the service binary.
257test_service "${tmpdir}" "service"
258# Install it.
259scripts/install_service --prefix "${tmpdir}" --enable -- --command "${tmpdir}/service" --arguments "test of my\ arguments" --description "My description" ||
260 fail_msg "\"scripts/install_service\" failed."
261# And remove it again.
262scripts/install_service --prefix "${tmpdir}" --remove -- --command "${tmpdir}/service" ||
263 fail_msg "\"scripts/install_service\" failed."
264# After uninstallation this should be the only file left in the init tree.
265rm "${tmpdir}/service"
266test "x`find "${tmpdir}" -type f -o -type l`" = "x" ||
267 fail_msg "not all files were removed."
268# Final summary.
269if test -n "${failed}"; then
270 echo "${failed}"
271else
272 echo SUCCESS
273fi
274
275# Test an enabled init script update with --disable.
276print_line "updating an enabled init script with --disable."
277failed=""
278# Create a simulated init system layout.
279tmpdir="${tmpbase}1"
280create_simulated_init_tree "${tmpdir}"
281# Create the service binary.
282test_service "${tmpdir}" "service"
283# Install it.
284scripts/install_service --prefix "${tmpdir}" --enable -- --command "${tmpdir}/service" --arguments "test of my\ arguments" --description "My description" ||
285 fail_msg "\"scripts/install_service\" failed."
286# Install it disabled without forcing.
287scripts/install_service --prefix "${tmpdir}" --disable -- --command "${tmpdir}/service" --arguments "test of my\ arguments" --description "My description" ||
288 fail_msg "\"scripts/install_service\" failed."
289test "x`find "${tmpdir}"/rc*.d "${tmpdir}/runlevel" -type l | wc -l`" = "x15" ||
290 fail_msg "links were removed on non-forced disable."
291# Final summary.
292if test -n "${failed}"; then
293 echo "${failed}"
294else
295 echo SUCCESS
296fi
297
298# Test updating a disabled init script with --enable.
299print_line "updating a disabled init script with --enable."
300failed=""
301# Create a simulated init system layout.
302tmpdir="${tmpbase}2"
303create_simulated_init_tree "${tmpdir}"
304# Create the service binary.
305test_service "${tmpdir}" "service"
306# Install it.
307scripts/install_service --prefix "${tmpdir}" --disable -- --command "${tmpdir}/service" --arguments "test of my\ arguments" --description "My description" ||
308 fail_msg "\"scripts/install_service\" failed."
309# Install it disabled without forcing.
310scripts/install_service --prefix "${tmpdir}" --enable -- --command "${tmpdir}/service" --arguments "test of my\ arguments" --description "My description" ||
311 fail_msg "\"scripts/install_service\" failed."
312test "x`find "${tmpdir}"/rc*.d "${tmpdir}/runlevel" -type l`" = "x" ||
313 fail_msg "files were installed on non-forced enable."
314# Final summary.
315if test -n "${failed}"; then
316 echo "${failed}"
317else
318 echo SUCCESS
319fi
320
321# Test an enabled init script update with --force-disable.
322print_line "updating an enabled init script with --force-disable."
323failed=""
324# Create a simulated init system layout.
325tmpdir="${tmpbase}3"
326create_simulated_init_tree "${tmpdir}"
327# Create the service binary.
328test_service "${tmpdir}" "service"
329# Install it.
330scripts/install_service --prefix "${tmpdir}" --enable -- --command "${tmpdir}/service" --arguments "test of my\ arguments" --description "My description" ||
331 fail_msg "\"scripts/install_service\" failed."
332# Install it disabled without forcing.
333scripts/install_service --prefix "${tmpdir}" --force-disable -- --command "${tmpdir}/service" --arguments "test of my\ arguments" --description "My description" ||
334 fail_msg "\"scripts/install_service\" failed."
335test "x`find "${tmpdir}"/rc*.d "${tmpdir}/runlevel" -type l`" = "x" ||
336 fail_msg "links were not removed on forced disable."
337# Final summary.
338if test -n "${failed}"; then
339 echo "${failed}"
340else
341 echo SUCCESS
342fi
343
344# Test updating a disabled init script with --force-enable.
345print_line "updating a disabled init script with --force-enable."
346failed=""
347# Create a simulated init system layout.
348tmpdir="${tmpbase}4"
349create_simulated_init_tree "${tmpdir}"
350# Create the service binary.
351test_service "${tmpdir}" "service"
352# Install it.
353scripts/install_service --prefix "${tmpdir}" --disable -- --command "${tmpdir}/service" --arguments "test of my\ arguments" --description "My description" ||
354 fail_msg "\"scripts/install_service\" failed."
355# Install it disabled without forcing.
356scripts/install_service --prefix "${tmpdir}" --force-enable -- --command "${tmpdir}/service" --arguments "test of my\ arguments" --description "My description" ||
357 fail_msg "\"scripts/install_service\" failed."
358test "x`find "${tmpdir}"/rc*.d "${tmpdir}/runlevel" -type l | wc -l`" = "x15" ||
359 fail_msg "files were not installed on forced enable."
360# Final summary.
361if test -n "${failed}"; then
362 echo "${failed}"
363else
364 echo SUCCESS
365fi
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette