From 1f9b8f8e0db814dfd3f004f27ebe31c6fb4f6b51 Mon Sep 17 00:00:00 2001 From: Jilles Tjoelker Date: Sun, 8 May 2016 21:11:24 +0000 Subject: [PATCH] install: Add some tests. --- etc/mtree/BSD.tests.dist | 2 + usr.bin/xinstall/Makefile | 6 + usr.bin/xinstall/tests/Makefile | 5 + usr.bin/xinstall/tests/install_test.sh | 338 +++++++++++++++++++++++++ 4 files changed, 351 insertions(+) create mode 100644 usr.bin/xinstall/tests/Makefile create mode 100755 usr.bin/xinstall/tests/install_test.sh diff --git a/etc/mtree/BSD.tests.dist b/etc/mtree/BSD.tests.dist index ed394e402e24..970979fd42bc 100644 --- a/etc/mtree/BSD.tests.dist +++ b/etc/mtree/BSD.tests.dist @@ -634,6 +634,8 @@ .. xargs .. + xinstall + .. xo .. yacc diff --git a/usr.bin/xinstall/Makefile b/usr.bin/xinstall/Makefile index c1056b5ad7b6..dcb486bdf8ec 100644 --- a/usr.bin/xinstall/Makefile +++ b/usr.bin/xinstall/Makefile @@ -1,6 +1,8 @@ # @(#)Makefile 8.1 (Berkeley) 6/6/93 # $FreeBSD$ +.include + PROG= xinstall PROGNAME= install SRCS= xinstall.c getid.c @@ -12,4 +14,8 @@ CFLAGS+= -I${.CURDIR}/../../lib/libnetbsd LIBADD= md +.if ${MK_TESTS} != "no" +SUBDIR+= tests +.endif + .include diff --git a/usr.bin/xinstall/tests/Makefile b/usr.bin/xinstall/tests/Makefile new file mode 100644 index 000000000000..55c189eeadca --- /dev/null +++ b/usr.bin/xinstall/tests/Makefile @@ -0,0 +1,5 @@ +# $FreeBSD$ + +ATF_TESTS_SH+= install_test + +.include diff --git a/usr.bin/xinstall/tests/install_test.sh b/usr.bin/xinstall/tests/install_test.sh new file mode 100755 index 000000000000..24a8a4d45521 --- /dev/null +++ b/usr.bin/xinstall/tests/install_test.sh @@ -0,0 +1,338 @@ +# +# 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 +} + +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_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 +}