freebsd-nq/usr.bin/xinstall/tests/install_test.sh
Jilles Tjoelker 649a3a5626 install: When preserving timestamps, also copy the nanoseconds part.
Now that we have utimensat in -legacy, install(1) can use it.

This is a revert of r299942 which is itself a revert of r299850.
2016-06-09 21:59:35 +00:00

346 lines
9.8 KiB
Bash
Executable File

#
# Copyright (c) 2016 Jilles Tjoelker
# All rights reserved.
#
# 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 AUTHOR 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 AUTHOR 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.
#
# $FreeBSD$
#
copy_to_nonexistent_with_opts() {
printf 'test\n123\r456\r\n789\0z' >testf
atf_check install "$@" testf copyf
cmp testf copyf || atf_fail "bad copy"
[ ! testf -nt copyf ] || atf_fail "bad timestamp"
[ ! -e copyf.bak ] || atf_fail "no backup expected"
}
atf_test_case copy_to_nonexistent
copy_to_nonexistent_body() {
copy_to_nonexistent_with_opts
}
atf_test_case copy_to_nonexistent_safe
copy_to_nonexistent_safe_body() {
copy_to_nonexistent_with_opts -S
}
atf_test_case copy_to_nonexistent_comparing
copy_to_nonexistent_comparing_body() {
copy_to_nonexistent_with_opts -C
}
atf_test_case copy_to_nonexistent_safe_comparing
copy_to_nonexistent_safe_comparing_body() {
copy_to_nonexistent_with_opts -S -C
}
atf_test_case copy_to_nonexistent_backup
copy_to_nonexistent_backup_body() {
copy_to_nonexistent_with_opts -b -B.bak
}
atf_test_case copy_to_nonexistent_backup_safe
copy_to_nonexistent_backup_safe_body() {
copy_to_nonexistent_with_opts -b -B.bak -S
}
atf_test_case copy_to_nonexistent_preserving
copy_to_nonexistent_preserving_body() {
copy_to_nonexistent_with_opts -p
[ ! testf -ot copyf ] || atf_fail "bad timestamp 2"
}
copy_self_with_opts() {
printf 'test\n123\r456\r\n789\0z' >testf
printf 'test\n123\r456\r\n789\0z' >testf2
atf_check -s not-exit:0 -o empty -e match:. install "$@" testf testf
cmp testf testf2 || atf_fail "file changed after self-copy attempt"
}
atf_test_case copy_self
copy_self_body() {
copy_self_with_opts
}
atf_test_case copy_self_safe
copy_self_safe_body() {
copy_self_with_opts -S
}
atf_test_case copy_self_comparing
copy_self_comparing_body() {
copy_self_with_opts -C
}
atf_test_case copy_self_safe_comparing
copy_self_safe_comparing_body() {
copy_self_with_opts -S -C
}
overwrite_with_opts() {
printf 'test\n123\r456\r\n789\0z' >testf
printf 'test\n123\r456\r\n789\0w' >otherf
atf_check install "$@" testf otherf
cmp testf otherf || atf_fail "bad overwrite"
[ ! testf -nt otherf ] || atf_fail "bad timestamp"
}
atf_test_case overwrite
overwrite_body() {
overwrite_with_opts
}
atf_test_case overwrite_safe
overwrite_safe_body() {
overwrite_with_opts -S
}
atf_test_case overwrite_comparing
overwrite_comparing_body() {
overwrite_with_opts -C
}
atf_test_case overwrite_safe_comparing
overwrite_safe_comparing_body() {
overwrite_with_opts -S -C
}
overwrite_eq_with_opts() {
printf 'test\n123\r456\r\n789\0z' >testf
printf 'test\n123\r456\r\n789\0z' >otherf
atf_check install "$@" testf otherf
cmp testf otherf || atf_fail "bad overwrite"
[ ! testf -nt otherf ] || atf_fail "bad timestamp"
}
atf_test_case overwrite_eq
overwrite_eq_body() {
overwrite_eq_with_opts
}
atf_test_case overwrite_eq_safe
overwrite_eq_safe_body() {
overwrite_eq_with_opts -S
}
atf_test_case overwrite_eq_comparing
overwrite_eq_comparing_body() {
overwrite_eq_with_opts -C
}
atf_test_case overwrite_eq_safe_comparing
overwrite_eq_safe_comparing_body() {
overwrite_eq_with_opts -S -C
}
overwrite_backup_with_opts() {
printf 'test\n123\r456\r\n789\0z' >testf
printf 'test\n123\r456\r\n789\0w' >otherf
printf 'test\n123\r456\r\n789\0w' >otherf2
atf_check install -b -B.bak "$@" testf otherf
cmp testf otherf || atf_fail "bad overwrite"
[ ! testf -nt otherf ] || atf_fail "bad timestamp"
cmp otherf.bak otherf2 || atf_fail "bad backup"
}
atf_test_case overwrite_backup
overwrite_backup_body() {
overwrite_backup_with_opts
}
atf_test_case overwrite_backup_safe
overwrite_backup_safe_body() {
overwrite_backup_with_opts -S
}
atf_test_case overwrite_backup_comparing
overwrite_backup_comparing_body() {
overwrite_backup_with_opts -C
}
atf_test_case overwrite_backup_safe_comparing
overwrite_backup_safe_comparing_body() {
overwrite_backup_with_opts -S -C
}
setup_stripbin() {
cat <<\STRIPBIN >stripbin
#!/bin/sh
tr z @ <"$1" >"$1.new" && mv -- "$1.new" "$1"
STRIPBIN
chmod 755 stripbin
export STRIPBIN="$PWD/stripbin"
}
strip_changing_with_opts() {
setup_stripbin
printf 'test\n123\r456\r\n789\0z' >testf
atf_check install -s "$@" testf copyf
[ ! testf -nt copyf ] || atf_fail "bad timestamp"
printf 'test\n123\r456\r\n789\0@' >otherf
cmp otherf copyf || atf_fail "bad stripped copy"
}
atf_test_case strip_changing
strip_changing_body() {
strip_changing_with_opts
}
atf_test_case strip_changing_comparing
strip_changing_comparing_body() {
strip_changing_with_opts -C
}
strip_changing_overwrite_with_opts() {
setup_stripbin
printf 'test\n123\r456\r\n789\0z' >testf
printf 'test\n123\r456\r\n789\0w' >copyf
atf_check install -s "$@" testf copyf
[ ! testf -nt copyf ] || atf_fail "bad timestamp"
printf 'test\n123\r456\r\n789\0@' >otherf
cmp otherf copyf || atf_fail "bad stripped copy"
}
atf_test_case strip_changing_overwrite
strip_changing_overwrite_body() {
strip_changing_overwrite_with_opts
}
atf_test_case strip_changing_overwrite_comparing
strip_changing_overwrite_comparing_body() {
strip_changing_overwrite_with_opts -C
}
strip_changing_overwrite_eq_with_opts() {
setup_stripbin
printf 'test\n123\r456\r\n789\0z' >testf
printf 'test\n123\r456\r\n789\0@' >copyf
atf_check install -s "$@" testf copyf
[ ! testf -nt copyf ] || atf_fail "bad timestamp"
printf 'test\n123\r456\r\n789\0@' >otherf
cmp otherf copyf || atf_fail "bad stripped copy"
}
atf_test_case strip_changing_overwrite_eq
strip_changing_overwrite_eq_body() {
strip_changing_overwrite_eq_with_opts
}
atf_test_case strip_changing_overwrite_eq_comparing
strip_changing_overwrite_eq_comparing_body() {
strip_changing_overwrite_eq_with_opts -C
}
atf_test_case strip_noop
strip_noop_body() {
export STRIPBIN=true
printf 'test\n123\r456\r\n789\0z' >testf
atf_check install -s testf copyf
[ ! testf -nt copyf ] || atf_fail "bad timestamp"
printf 'test\n123\r456\r\n789\0z' >otherf
cmp otherf copyf || atf_fail "bad stripped copy"
}
atf_test_case hard_link
hard_link_body() {
printf 'test\n123\r456\r\n789\0z' >testf
atf_check install -l h testf copyf
[ testf -ef copyf ] || atf_fail "not same file"
[ ! -L copyf ] || atf_fail "copy is symlink"
}
atf_test_case symbolic_link
symbolic_link_body() {
printf 'test\n123\r456\r\n789\0z' >testf
atf_check install -l s testf copyf
[ testf -ef copyf ] || atf_fail "not same file"
[ -L copyf ] || atf_fail "copy is not symlink"
}
atf_test_case symbolic_link_absolute
symbolic_link_absolute_body() {
printf 'test\n123\r456\r\n789\0z' >testf
atf_check install -l sa testf copyf
[ testf -ef copyf ] || atf_fail "not same file"
[ -L copyf ] || atf_fail "copy is not symlink"
[ "$(readlink copyf)" = "$(pwd -P)/testf" ] || atf_fail "unexpected symlink contents"
}
atf_test_case symbolic_link_relative
symbolic_link_relative_body() {
printf 'test\n123\r456\r\n789\0z' >testf
atf_check install -l sr testf copyf
[ testf -ef copyf ] || atf_fail "not same file"
[ -L copyf ] || atf_fail "copy is not symlink"
[ "$(readlink copyf)" = "testf" ] || atf_fail "unexpected symlink contents"
}
atf_test_case mkdir_simple
mkdir_simple_body() {
atf_check install -d dir1/dir2
[ -d dir1 ] || atf_fail "dir1 missing"
[ -d dir1/dir2 ] || atf_fail "dir2 missing"
atf_check install -d dir1/dir2/dir3
[ -d dir1/dir2/dir3 ] || atf_fail "dir3 missing"
atf_check install -d dir1
atf_check install -d dir1/dir2/dir3
}
atf_init_test_cases() {
atf_add_test_case copy_to_nonexistent
atf_add_test_case copy_to_nonexistent_safe
atf_add_test_case copy_to_nonexistent_comparing
atf_add_test_case copy_to_nonexistent_safe_comparing
atf_add_test_case copy_to_nonexistent_backup
atf_add_test_case copy_to_nonexistent_backup_safe
atf_add_test_case copy_to_nonexistent_preserving
atf_add_test_case copy_self
atf_add_test_case copy_self_safe
atf_add_test_case copy_self_comparing
atf_add_test_case copy_self_safe_comparing
atf_add_test_case overwrite
atf_add_test_case overwrite_safe
atf_add_test_case overwrite_comparing
atf_add_test_case overwrite_safe_comparing
atf_add_test_case overwrite_eq
atf_add_test_case overwrite_eq_safe
atf_add_test_case overwrite_eq_comparing
atf_add_test_case overwrite_eq_safe_comparing
atf_add_test_case overwrite_backup
atf_add_test_case overwrite_backup_safe
atf_add_test_case overwrite_backup_comparing
atf_add_test_case overwrite_backup_safe_comparing
atf_add_test_case strip_changing
atf_add_test_case strip_changing_comparing
atf_add_test_case strip_changing_overwrite
atf_add_test_case strip_changing_overwrite_comparing
atf_add_test_case strip_changing_overwrite_eq
atf_add_test_case strip_changing_overwrite_eq_comparing
atf_add_test_case strip_noop
atf_add_test_case hard_link
atf_add_test_case symbolic_link
atf_add_test_case symbolic_link_absolute
atf_add_test_case symbolic_link_relative
atf_add_test_case mkdir_simple
}