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