summaryrefslogtreecommitdiff
path: root/pkgtools/pkgtasks/files/t/t_lock.sh
diff options
context:
space:
mode:
Diffstat (limited to 'pkgtools/pkgtasks/files/t/t_lock.sh')
-rw-r--r--pkgtools/pkgtasks/files/t/t_lock.sh120
1 files changed, 120 insertions, 0 deletions
diff --git a/pkgtools/pkgtasks/files/t/t_lock.sh b/pkgtools/pkgtasks/files/t/t_lock.sh
new file mode 100644
index 00000000000..a1cc9d2bb2c
--- /dev/null
+++ b/pkgtools/pkgtasks/files/t/t_lock.sh
@@ -0,0 +1,120 @@
+# Copyright (c) 2017 The NetBSD Foundation, Inc.
+# All rights reserved.
+#
+# This code is derived from software contributed to The NetBSD Foundation
+# by Johnny C. Lam.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+task_load createfile
+task_load lock
+task_load unittest
+
+test_setup()
+{
+ : ${CAT:=cat}
+ : ${CMP:=cmp}
+ : ${SLEEP:=sleep}
+
+ lockfile="lock"
+}
+
+test1()
+{
+ describe="create lock"
+ if task_lock "$lockfile"; then
+ : "success"
+ else
+ return 1
+ fi
+ if [ ! -f "$lockfile" ]; then
+ describe="$describe: $lockfile missing!"
+ return 1
+ fi
+ return 0
+}
+
+test2()
+{
+ describe="create nonblocking lock, pre-existing lock file"
+ task_createfile "$lockfile"
+ if task_lock -n "$lockfile"; then
+ return 1
+ fi
+ return 0
+}
+
+test3()
+{
+ describe="release lock"
+ task_lock "$lockfile"
+ if task_lock -r "$lockfile"; then
+ : "success"
+ else
+ return 1
+ fi
+ if [ -f "$lockfile" ]; then
+ describe="$describe: $lockfile exists!"
+ return 1
+ fi
+ return 0
+}
+
+test4()
+{
+ describe="create lock, competing processes"
+ local timeout=3
+ # Create a child process that writes to "value".
+ ( if task_lock "$lockfile"; then
+ echo "child" >> value
+ ${SLEEP} $timeout
+ task_lock -r "$lockfile"
+ fi ) &
+ #
+ # Wait for up to $timeout seconds for the child to write to the
+ # datefile.
+ #
+ while [ $timeout -gt 0 ]; do
+ [ ! -f value ] || break
+ ${SLEEP} 1
+ timeout=$(( $timeout - 1 ))
+ done
+ # Block waiting for background process to unlock.
+ if task_lock "$lockfile"; then
+ echo "parent" >> value
+ task_lock -r "$lockfile"
+ fi
+ # Check that the writes were serialized: child, then parent.
+ ${CAT} > expected << 'EOF'
+child
+parent
+EOF
+ if ${CMP} -s expected value; then
+ : "success"
+ else
+ describe="$describe: child after parent!"
+ return 1
+ fi
+ return 0
+}
+
+task_run_tests "$@"