xref: /netbsd-src/tests/usr.bin/compress/t_pr_19722.sh (revision 33a964ec6703eeed0ed90c0556f742faa7d11418)
1*33a964ecSrillig#	$NetBSD: t_pr_19722.sh,v 1.4 2022/05/22 21:39:44 rillig Exp $
2345652c1Srillig#
3345652c1Srillig# Copyright (c) 2022 The NetBSD Foundation, Inc.
4345652c1Srillig# All rights reserved.
5345652c1Srillig#
6345652c1Srillig# Redistribution and use in source and binary forms, with or without
7345652c1Srillig# modification, are permitted provided that the following conditions
8345652c1Srillig# are met:
9345652c1Srillig# 1. Redistributions of source code must retain the above copyright
10345652c1Srillig#    notice, this list of conditions and the following disclaimer.
11345652c1Srillig# 2. Redistributions in binary form must reproduce the above copyright
12345652c1Srillig#    notice, this list of conditions and the following disclaimer in the
13345652c1Srillig#    documentation and/or other materials provided with the distribution.
14345652c1Srillig#
15345652c1Srillig# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16345652c1Srillig# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17345652c1Srillig# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18345652c1Srillig# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19345652c1Srillig# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20345652c1Srillig# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21345652c1Srillig# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22345652c1Srillig# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23345652c1Srillig# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24345652c1Srillig# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25345652c1Srillig# POSSIBILITY OF SUCH DAMAGE.
26345652c1Srillig#
27345652c1Srillig
2854cb7785Srilligatf_test_case 'compress_small_file'
2954cb7785Srilligcompress_small_file_body()
30345652c1Srillig{
3154cb7785Srillig	# If the compressed version of a file would be larger than the
3254cb7785Srillig	# original file, the original file is kept.
3354cb7785Srillig
3454cb7785Srillig	echo 'hello' > file
3554cb7785Srillig
3654cb7785Srillig	atf_check compress file
3754cb7785Srillig
3854cb7785Srillig	atf_check -o 'inline:hello\n' cat file
3954cb7785Srillig	atf_check test ! -f file.Z
4054cb7785Srillig}
4154cb7785Srillig
4254cb7785Srillig
4354cb7785Srilligatf_test_case 'compress_small_file_force'
4454cb7785Srilligcompress_small_file_force_body()
4554cb7785Srillig{
4654cb7785Srillig	# The option '-f' forces compression to happen, even if the resulting
4754cb7785Srillig	# file becomes larger than the original.
4854cb7785Srillig
4954cb7785Srillig	echo 'hello' > file
5054cb7785Srillig
5154cb7785Srillig	atf_check compress -f file
5254cb7785Srillig
5354cb7785Srillig	atf_check test ! -f file
5454cb7785Srillig	atf_check \
5554cb7785Srillig	    -o 'inline:0000000   1f  9d  90  68  ca  b0  61  f3  46  01                        \n000000a\n' \
5654cb7785Srillig	    od -Ax -tx1 file.Z
5754cb7785Srillig}
5854cb7785Srillig
5954cb7785Srillig
6054cb7785Srilligatf_test_case 'roundtrip'
6154cb7785Srilligroundtrip_body()
6254cb7785Srillig{
6354cb7785Srillig	# Compressing and decompressing a file must preserve every byte.
6454cb7785Srillig
6554cb7785Srillig	atf_check -e 'ignore' dd if=/dev/urandom of=file bs=4k count=10
6654cb7785Srillig	atf_check cp file original
6754cb7785Srillig
6854cb7785Srillig	atf_check compress -f file
6954cb7785Srillig	atf_check uncompress file.Z
7054cb7785Srillig
7154cb7785Srillig	atf_check cmp file original
7254cb7785Srillig}
7354cb7785Srillig
7454cb7785Srillig
7554cb7785Srilligatf_test_case 'uncompress_basename'
7654cb7785Srilliguncompress_basename_body()
7754cb7785Srillig{
7854cb7785Srillig	# To uncompress a file, it suffices to specify the basename of the
7954cb7785Srillig	# file, the filename extension '.Z' is optional.
8054cb7785Srillig
8154cb7785Srillig	atf_check sh -c "echo 'hello' > file"
8254cb7785Srillig	atf_check compress -f file
8354cb7785Srillig
8454cb7785Srillig	atf_check uncompress file
8554cb7785Srillig
8654cb7785Srillig	atf_check -o 'inline:hello\n' cat file
8754cb7785Srillig	atf_check test ! -f file.Z
8854cb7785Srillig}
8954cb7785Srillig
9054cb7785Srillig
9154cb7785Srilligatf_test_case 'uncompress_no_source_no_target'
9254cb7785Srilliguncompress_no_source_no_target_body()
9354cb7785Srillig{
9454cb7785Srillig	# PR 19722: uncompressing a missing source creates empty target
95974afd5aSrillig	#
96974afd5aSrillig	# Before compress.c 1.28 from 2022-05-22, uncompress created an empty
97974afd5aSrillig	# target file and didn't clean it up.
98345652c1Srillig
99345652c1Srillig	atf_check \
100345652c1Srillig	    -s 'not-exit:0' \
101345652c1Srillig	    -e 'inline:uncompress: file.Z: No such file or directory\n' \
10254cb7785Srillig	    uncompress -f file
103345652c1Srillig
104974afd5aSrillig	atf_check test ! -f file
105974afd5aSrillig	atf_check test ! -f file.Z
106345652c1Srillig}
107345652c1Srillig
108345652c1Srillig
10954cb7785Srilligatf_test_case 'uncompress_no_source_existing_target'
11054cb7785Srilliguncompress_no_source_existing_target_body()
111345652c1Srillig{
11254cb7785Srillig	# PR 19722: uncompressing a missing source truncates target
113974afd5aSrillig	#
114974afd5aSrillig	# Before compress.c 1.28 from 2022-05-22, uncompress truncated the
115974afd5aSrillig	# target.
116345652c1Srillig
11754cb7785Srillig	atf_check sh -c "echo 'hello' > file"
118345652c1Srillig
119345652c1Srillig	atf_check \
120345652c1Srillig	    -s 'not-exit:0' \
121345652c1Srillig	    -e 'inline:uncompress: file.Z: No such file or directory\n' \
12254cb7785Srillig	    uncompress -f file
123345652c1Srillig
124974afd5aSrillig	atf_check -o 'inline:hello\n' cat file
12554cb7785Srillig	atf_check test ! -f file.Z
126345652c1Srillig}
127345652c1Srillig
128345652c1Srillig
12954cb7785Srilligatf_test_case 'uncompress_broken_source_no_target'
13054cb7785Srilliguncompress_broken_source_no_target_body()
131345652c1Srillig{
13254cb7785Srillig	# When trying to uncompress a broken source, the target is created
13354cb7785Srillig	# temporarily but deleted again, as part of the cleanup.
134345652c1Srillig
13554cb7785Srillig	echo 'broken' > file.Z
136345652c1Srillig
137345652c1Srillig	atf_check \
138345652c1Srillig	    -s 'not-exit:0' \
139345652c1Srillig	    -e 'inline:uncompress: file.Z: Inappropriate file type or format\n' \
14054cb7785Srillig	    uncompress -f file
141345652c1Srillig
14254cb7785Srillig	atf_check test ! -f file
14354cb7785Srillig	atf_check test -f file.Z
14454cb7785Srillig}
14554cb7785Srillig
14654cb7785Srillig
14754cb7785Srilligatf_test_case 'uncompress_broken_source_existing_target'
14854cb7785Srilliguncompress_broken_source_existing_target_body()
14954cb7785Srillig{
15054cb7785Srillig	# PR 19722: uncompressing a broken source removes existing target
151*33a964ecSrillig	#
152*33a964ecSrillig	# Before compress.c 1.29 from 2022-05-22, uncompress removed an
153*33a964ecSrillig	# existing target before checking that the source has the correct
154*33a964ecSrillig	# format.
15554cb7785Srillig
15654cb7785Srillig	echo 'broken' > file.Z
15754cb7785Srillig	echo 'before' > file
15854cb7785Srillig
15954cb7785Srillig	atf_check \
16054cb7785Srillig	    -s 'not-exit:0' \
16154cb7785Srillig	    -e 'inline:uncompress: file.Z: Inappropriate file type or format\n' \
16254cb7785Srillig	    uncompress -f file.Z
16354cb7785Srillig
16454cb7785Srillig	atf_check -o 'inline:broken\n' cat file.Z
165*33a964ecSrillig	atf_check -o 'inline:before\n' cat file
166345652c1Srillig}
167345652c1Srillig
168345652c1Srillig
169345652c1Srilligatf_init_test_cases()
170345652c1Srillig{
171345652c1Srillig
17254cb7785Srillig	atf_add_test_case compress_small_file
17354cb7785Srillig	atf_add_test_case compress_small_file_force
17454cb7785Srillig	atf_add_test_case roundtrip
17554cb7785Srillig	atf_add_test_case uncompress_basename
17654cb7785Srillig	atf_add_test_case uncompress_no_source_no_target
17754cb7785Srillig	atf_add_test_case uncompress_no_source_existing_target
17854cb7785Srillig	atf_add_test_case uncompress_broken_source_no_target
17954cb7785Srillig	atf_add_test_case uncompress_broken_source_existing_target
180345652c1Srillig}
181