Module Name: src Committed By: rillig Date: Sun May 22 20:49:12 UTC 2022
Modified Files: src/tests/usr.bin/compress: t_pr_19722.sh Log Message: tests/compress: extend tests for compressing and uncompressing For PR bin/19722. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/tests/usr.bin/compress/t_pr_19722.sh Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/usr.bin/compress/t_pr_19722.sh diff -u src/tests/usr.bin/compress/t_pr_19722.sh:1.1 src/tests/usr.bin/compress/t_pr_19722.sh:1.2 --- src/tests/usr.bin/compress/t_pr_19722.sh:1.1 Sun May 22 17:55:08 2022 +++ src/tests/usr.bin/compress/t_pr_19722.sh Sun May 22 20:49:12 2022 @@ -1,4 +1,4 @@ -# $NetBSD: t_pr_19722.sh,v 1.1 2022/05/22 17:55:08 rillig Exp $ +# $NetBSD: t_pr_19722.sh,v 1.2 2022/05/22 20:49:12 rillig Exp $ # # Copyright (c) 2022 The NetBSD Foundation, Inc. # All rights reserved. @@ -25,65 +25,149 @@ # POSSIBILITY OF SUCH DAMAGE. # -# https://gnats.netbsd.org/19722 -# -# Before TODO:rev from TODO:date, trying to uncompress a nonexistent or -# malformed source file resulted in a truncated target file. +atf_test_case 'compress_small_file' +compress_small_file_body() +{ + # If the compressed version of a file would be larger than the + # original file, the original file is kept. + + echo 'hello' > file + + atf_check compress file + + atf_check -o 'inline:hello\n' cat file + atf_check test ! -f file.Z +} + + +atf_test_case 'compress_small_file_force' +compress_small_file_force_body() +{ + # The option '-f' forces compression to happen, even if the resulting + # file becomes larger than the original. + + echo 'hello' > file + + atf_check compress -f file + + atf_check test ! -f file + atf_check \ + -o 'inline:0000000 1f 9d 90 68 ca b0 61 f3 46 01 \n000000a\n' \ + od -Ax -tx1 file.Z +} + + +atf_test_case 'roundtrip' +roundtrip_body() +{ + # Compressing and decompressing a file must preserve every byte. + + atf_check -e 'ignore' dd if=/dev/urandom of=file bs=4k count=10 + atf_check cp file original + + atf_check compress -f file + atf_check uncompress file.Z + atf_check cmp file original +} + + +atf_test_case 'uncompress_basename' +uncompress_basename_body() +{ + # To uncompress a file, it suffices to specify the basename of the + # file, the filename extension '.Z' is optional. + + atf_check sh -c "echo 'hello' > file" + atf_check compress -f file -atf_test_case 'no_source_no_target' -no_source_no_target_body() + atf_check uncompress file + + atf_check -o 'inline:hello\n' cat file + atf_check test ! -f file.Z +} + + +atf_test_case 'uncompress_no_source_no_target' +uncompress_no_source_no_target_body() { + # PR 19722: uncompressing a missing source creates empty target atf_check \ -s 'not-exit:0' \ -e 'inline:uncompress: file.Z: No such file or directory\n' \ - uncompress -f 'file' + uncompress -f file # FIXME: The target file must not be created. - atf_check cat 'file' - atf_check test ! -f 'nonexistent.Z' + atf_check cat file + atf_check test ! -f nonexistent.Z } -atf_test_case 'no_source_existing_target' -no_source_existing_target_body() +atf_test_case 'uncompress_no_source_existing_target' +uncompress_no_source_existing_target_body() { + # PR 19722: uncompressing a missing source truncates target - echo 'before' > 'file' + atf_check sh -c "echo 'hello' > file" atf_check \ -s 'not-exit:0' \ -e 'inline:uncompress: file.Z: No such file or directory\n' \ - uncompress -f 'file' + uncompress -f file + + # FIXME: The file must not be truncated. + atf_check cat file + atf_check test ! -f file.Z +} + + +atf_test_case 'uncompress_broken_source_no_target' +uncompress_broken_source_no_target_body() +{ + # When trying to uncompress a broken source, the target is created + # temporarily but deleted again, as part of the cleanup. + + echo 'broken' > file.Z + + atf_check \ + -s 'not-exit:0' \ + -e 'inline:uncompress: file.Z: Inappropriate file type or format\n' \ + uncompress -f file - # FIXME: The target file must not be truncated. - atf_check cat 'file' + atf_check test ! -f file + atf_check test -f file.Z } -atf_test_case 'broken_source_existing_target' -broken_source_existing_target_body() +atf_test_case 'uncompress_broken_source_existing_target' +uncompress_broken_source_existing_target_body() { - # If the source file is not compressed, preserve the target file. + # PR 19722: uncompressing a broken source removes existing target - echo 'broken' > 'file.Z' - echo 'before' > 'file' + echo 'broken' > file.Z + echo 'before' > file atf_check \ -s 'not-exit:0' \ -e 'inline:uncompress: file.Z: Inappropriate file type or format\n' \ - uncompress -f 'file.Z' + uncompress -f file.Z - # FIXME: Must not be removed, must not be truncated. - atf_check test ! -f 'file' + atf_check -o 'inline:broken\n' cat file.Z + # FIXME: Must not be modified. + atf_check test ! -f file } atf_init_test_cases() { - atf_add_test_case no_source_no_target - atf_add_test_case no_source_existing_target - atf_add_test_case broken_source_existing_target + atf_add_test_case compress_small_file + atf_add_test_case compress_small_file_force + atf_add_test_case roundtrip + atf_add_test_case uncompress_basename + atf_add_test_case uncompress_no_source_no_target + atf_add_test_case uncompress_no_source_existing_target + atf_add_test_case uncompress_broken_source_no_target + atf_add_test_case uncompress_broken_source_existing_target }