[BACK]Return to t_errors.sh CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / tests / usr.bin / indent

Annotation of src/tests/usr.bin/indent/t_errors.sh, Revision 1.5

1.1       rillig      1: #! /bin/sh
1.5     ! rillig      2: # $NetBSD: t_errors.sh,v 1.4 2021/10/17 18:13:00 rillig Exp $
1.1       rillig      3: #
                      4: # Copyright (c) 2021 The NetBSD Foundation, Inc.
                      5: # All rights reserved.
                      6: #
                      7: # Redistribution and use in source and binary forms, with or without
                      8: # modification, are permitted provided that the following conditions
                      9: # are met:
                     10: # 1. Redistributions of source code must retain the above copyright
                     11: #    notice, this list of conditions and the following disclaimer.
                     12: # 2. Redistributions in binary form must reproduce the above copyright
                     13: #    notice, this list of conditions and the following disclaimer in the
                     14: #    documentation and/or other materials provided with the distribution.
                     15: #
                     16: # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
                     17: # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     18: # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
                     19: # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
                     20: # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     21: # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     22: # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     23: # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     24: # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     25: # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     26: # POSSIBILITY OF SUCH DAMAGE.
                     27: #
                     28: # $FreeBSD$
                     29:
1.2       rillig     30: # Tests for error handling in indent.
                     31:
1.1       rillig     32: indent=$(atf_config_get usr.bin.indent.test_indent /usr/bin/indent)
                     33: nl='
                     34: '
                     35:
1.2       rillig     36: expect_error()
                     37: {
                     38:        local msg
                     39:
                     40:        msg="$1"
                     41:        shift
                     42:
                     43:        atf_check -s 'exit:1' \
                     44:            -e "inline:$msg$nl" \
                     45:            "$indent" "$@"
                     46: }
                     47:
1.1       rillig     48: atf_test_case 'option_unknown'
                     49: option_unknown_body()
                     50: {
1.2       rillig     51:        expect_error \
                     52:            'indent: Command line: unknown option "-Z-unknown"' \
                     53:            -Z-unknown
1.1       rillig     54: }
                     55:
                     56: atf_test_case 'option_bool_trailing_garbage'
                     57: option_bool_trailing_garbage_body()
                     58: {
1.2       rillig     59:        expect_error \
                     60:            'indent: Command line: unknown option "-bacchus"' \
                     61:            -bacchus
1.1       rillig     62: }
                     63:
                     64: atf_test_case 'option_int_missing_parameter'
                     65: option_int_missing_parameter_body()
                     66: {
1.2       rillig     67:        expect_error \
                     68:            'indent: Command line: option "-ts" requires an integer parameter' \
                     69:            -tsx
                     70: }
                     71:
                     72: atf_test_case 'option_profile_not_found'
                     73: option_profile_not_found_body()
                     74: {
                     75:        expect_error \
                     76:            'indent: profile ./nonexistent: No such file or directory' \
                     77:            -P./nonexistent
                     78: }
                     79:
                     80: atf_test_case 'option_typedefs_not_found'
                     81: option_typedefs_not_found_body()
                     82: {
                     83:        expect_error \
                     84:            'indent: cannot open file ./nonexistent' \
                     85:            -U./nonexistent
                     86: }
                     87:
1.3       rillig     88: atf_test_case 'option_tabsize_negative'
                     89: option_tabsize_negative_body()
                     90: {
                     91:        expect_error \
                     92:            'indent: Command line: option "-ts" requires an integer parameter' \
                     93:            -ts-1
                     94: }
                     95:
                     96: atf_test_case 'option_tabsize_zero'
                     97: option_tabsize_zero_body()
                     98: {
                     99:        expect_error \
1.4       rillig    100:            'indent: Command line: invalid argument "0" for option "-ts"' \
1.3       rillig    101:            -ts0
                    102: }
                    103:
                    104: atf_test_case 'option_tabsize_large'
                    105: option_tabsize_large_body()
                    106: {
                    107:        # Integer overflow, on both ILP32 and LP64 platforms.
                    108:        expect_error \
1.4       rillig    109:            'indent: Command line: invalid argument "81" for option "-ts"' \
1.3       rillig    110:            -ts81
                    111: }
                    112:
                    113: atf_test_case 'option_tabsize_very_large'
                    114: option_tabsize_very_large_body()
                    115: {
                    116:        # Integer overflow, on both ILP32 and LP64 platforms.
                    117:        expect_error \
1.4       rillig    118:            'indent: Command line: invalid argument "3000000000" for option "-ts"' \
1.3       rillig    119:            -ts3000000000
                    120: }
                    121:
                    122: atf_test_case 'option_indent_size_zero'
                    123: option_indent_size_zero_body()
                    124: {
                    125:        expect_error \
1.4       rillig    126:            'indent: Command line: invalid argument "0" for option "-i"' \
1.3       rillig    127:            -i0
                    128: }
                    129:
1.4       rillig    130: atf_test_case 'option_int_trailing_garbage'
                    131: option_int_trailing_garbage_body()
                    132: {
                    133:        expect_error \
                    134:            'indent: Command line: invalid argument "3garbage" for option "-i"' \
                    135:            -i3garbage
                    136: }
                    137:
1.2       rillig    138: atf_test_case 'option_buffer_overflow'
                    139: option_buffer_overflow_body()
                    140: {
                    141:        opt='12345678123456781234567812345678'  # 32
                    142:        opt="$opt$opt$opt$opt$opt$opt$opt$opt"  # 256
                    143:        opt="$opt$opt$opt$opt$opt$opt$opt$opt"  # 2048
                    144:        opt="$opt$opt$opt$opt$opt$opt$opt$opt"  # 16384
                    145:        printf '%s\n' "-$opt" > indent.pro
                    146:
                    147:        # TODO: The call to 'diag' should be replaced with 'errx'.
                    148:        expect_error \
1.5     ! rillig    149:            'error: Standard Input:1: buffer overflow in indent.pro, starting with '\''-123456781'\''' \
1.2       rillig    150:            -Pindent.pro
                    151: }
                    152:
                    153: atf_test_case 'option_special_missing_param'
                    154: option_special_missing_param_body()
                    155: {
                    156:        # TODO: Write '-cli' instead of only 'cli'.
                    157:        expect_error \
                    158:            'indent: Command line: ``cli'\'\'' requires a parameter' \
                    159:            -cli
                    160:
                    161:        expect_error \
                    162:            'indent: Command line: ``T'\'\'' requires a parameter' \
                    163:            -T
                    164:
                    165:        expect_error \
                    166:            'indent: Command line: ``U'\'\'' requires a parameter' \
                    167:            -U
                    168: }
                    169:
                    170: atf_test_case 'unterminated_comment'
                    171: unterminated_comment_body()
                    172: {
                    173:        echo '/*' > comment.c
                    174:
1.1       rillig    175:        atf_check -s 'exit:1' \
1.2       rillig    176:            -o 'inline:/*'"$nl"' *'"$nl" \
1.5     ! rillig    177:            -e 'inline:error: Standard Input:2: Unterminated comment'"$nl" \
1.2       rillig    178:            "$indent" -st < comment.c
1.1       rillig    179: }
                    180:
1.3       rillig    181: atf_test_case 'in_place_wrong_backup'
                    182: in_place_wrong_backup_body()
                    183: {
                    184:        cat <<-\EOF > code.c
                    185:                int decl;
                    186:        EOF
                    187:        cp code.c code.c.orig
                    188:
                    189:        # Due to the strange backup suffix '/subdir', indent tries to create
                    190:        # a file named 'code.c/subdir', but 'code.c' is already a regular
                    191:        # file, not a directory.
                    192:        atf_check -s 'exit:1' \
                    193:            -e 'inline:indent: code.c/subdir: Not a directory'"$nl" \
                    194:            env SIMPLE_BACKUP_SUFFIX="/subdir" "$indent" code.c
                    195:
                    196:        # Since there was an early error, the original file is kept as is.
                    197:        atf_check -o 'file:code.c.orig' \
                    198:            cat code.c
                    199: }
                    200:
                    201: atf_test_case 'argument_input_enoent'
                    202: argument_input_enoent_body()
                    203: {
                    204:        atf_check -s 'exit:1' \
                    205:            -e 'inline:indent: ./nonexistent.c: No such file or directory'"$nl" \
                    206:            "$indent" ./nonexistent.c
                    207: }
                    208:
                    209: atf_test_case 'argument_output_equals_input_name'
                    210: argument_output_equals_input_name_body()
                    211: {
                    212:        echo '/* comment */' > code.c
                    213:
                    214:        atf_check -s 'exit:1' \
                    215:            -e 'inline:indent: input and output files must be different'"$nl" \
                    216:            "$indent" code.c code.c
                    217: }
                    218:
                    219: atf_test_case 'argument_output_equals_input_file'
                    220: argument_output_equals_input_file_body()
                    221: {
                    222:        echo '/* comment */' > code.c
                    223:
                    224:        atf_check \
                    225:            "$indent" code.c ./code.c
                    226:
                    227:        # Oops, the file has become empty since the output is first emptied,
                    228:        # before reading any of the input.
                    229:        atf_check \
                    230:            cat code.c
                    231: }
                    232:
                    233: atf_test_case 'argument_output_enoent'
                    234: argument_output_enoent_body()
                    235: {
                    236:        expect_error \
                    237:            'indent: subdir/nonexistent.c: No such file or directory' \
                    238:            /dev/null subdir/nonexistent.c
                    239: }
                    240:
                    241: atf_test_case 'argument_too_many'
                    242: argument_too_many_body()
                    243: {
                    244:        echo '/* comment */' > arg1.c
                    245:
                    246:        expect_error \
                    247:            'indent: unknown parameter: arg3.c' \
                    248:            arg1.c arg2.c arg3.c arg4.c
                    249: }
                    250:
                    251: atf_test_case 'unexpected_end_of_file'
                    252: unexpected_end_of_file_body()
                    253: {
                    254:        echo 'struct{' > code.c
                    255:
                    256:        expect_error \
1.5     ! rillig    257:            'error: code.c:1: Stuff missing from end of file' \
1.3       rillig    258:            code.c
                    259:
                    260:        atf_check \
                    261:            -o 'inline:struct {'"$nl" \
                    262:            cat code.c
                    263: }
                    264:
                    265: atf_test_case 'unexpected_closing_brace_top_level'
                    266: unexpected_closing_brace_top_level_body()
                    267: {
                    268:        echo '}' > code.c
                    269:
                    270:        expect_error \
1.5     ! rillig    271:            'error: code.c:1: Statement nesting error' \
1.3       rillig    272:            code.c
                    273:        atf_check \
                    274:            -o 'inline:}'"$nl" \
                    275:            cat code.c
                    276: }
                    277:
                    278: atf_test_case 'unexpected_closing_brace_decl'
                    279: unexpected_closing_brace_decl_body()
                    280: {
                    281:        echo 'int i = 3};' > code.c
                    282:
                    283:        expect_error \
1.5     ! rillig    284:            'error: code.c:1: Statement nesting error' \
1.3       rillig    285:            code.c
                    286:        # Despite the error message, the original file got overwritten with a
                    287:        # best-effort rewrite of the code.
                    288:        atf_check \
                    289:            -o 'inline:int              i = 3};'"$nl" \
                    290:            cat code.c
                    291: }
                    292:
                    293: atf_test_case 'preprocessing_overflow'
                    294: preprocessing_overflow_body()
                    295: {
                    296:        cat <<-\EOF > code.c
                    297:                #if 1
                    298:                #if 2
                    299:                #if 3
                    300:                #if 4
                    301:                #if 5
                    302:                #if 6
                    303:                #endif 6
                    304:                #endif 5
                    305:                #endif 4
                    306:                #endif 3
                    307:                #endif 2
                    308:                #endif 1
                    309:                #endif too much
                    310:        EOF
                    311:        cat <<-\EOF > stderr.exp
1.5     ! rillig    312:                error: code.c:6: #if stack overflow
        !           313:                error: code.c:12: Unmatched #endif
        !           314:                error: code.c:13: Unmatched #endif
1.3       rillig    315:        EOF
                    316:
                    317:        atf_check -s 'exit:1' \
                    318:            -e 'file:stderr.exp' \
                    319:            "$indent" code.c
                    320: }
                    321:
                    322: atf_test_case 'preprocessing_unrecognized'
                    323: preprocessing_unrecognized_body()
                    324: {
                    325:        cat <<-\EOF > code.c
                    326:                #unknown
                    327:                # 3 "file.c"
                    328:                #elif 3
                    329:                #else
                    330:        EOF
                    331:        cat <<-\EOF > stderr.exp
1.5     ! rillig    332:                error: code.c:1: Unrecognized cpp directive
        !           333:                error: code.c:2: Unrecognized cpp directive
        !           334:                error: code.c:3: Unmatched #elif
        !           335:                error: code.c:4: Unmatched #else
1.3       rillig    336:        EOF
                    337:
                    338:        atf_check -s 'exit:1' \
                    339:            -e 'file:stderr.exp' \
                    340:            "$indent" code.c
                    341: }
                    342:
1.1       rillig    343: atf_init_test_cases()
                    344: {
                    345:        atf_add_test_case 'option_unknown'
                    346:        atf_add_test_case 'option_bool_trailing_garbage'
                    347:        atf_add_test_case 'option_int_missing_parameter'
1.2       rillig    348:        atf_add_test_case 'option_profile_not_found'
                    349:        atf_add_test_case 'option_buffer_overflow'
                    350:        atf_add_test_case 'option_typedefs_not_found'
                    351:        atf_add_test_case 'option_special_missing_param'
1.3       rillig    352:        atf_add_test_case 'option_tabsize_negative'
                    353:        atf_add_test_case 'option_tabsize_zero'
                    354:        atf_add_test_case 'option_tabsize_large'
                    355:        atf_add_test_case 'option_tabsize_very_large'
1.4       rillig    356:        atf_add_test_case 'option_int_trailing_garbage'
1.3       rillig    357:        atf_add_test_case 'option_indent_size_zero'
1.2       rillig    358:        atf_add_test_case 'unterminated_comment'
1.3       rillig    359:        atf_add_test_case 'in_place_wrong_backup'
                    360:        atf_add_test_case 'argument_input_enoent'
                    361:        atf_add_test_case 'argument_output_equals_input_name'
                    362:        atf_add_test_case 'argument_output_equals_input_file'
                    363:        atf_add_test_case 'argument_output_enoent'
                    364:        atf_add_test_case 'argument_too_many'
                    365:        atf_add_test_case 'unexpected_end_of_file'
                    366:        atf_add_test_case 'unexpected_closing_brace_top_level'
                    367:        atf_add_test_case 'unexpected_closing_brace_decl'
                    368:        atf_add_test_case 'preprocessing_overflow'
                    369:        atf_add_test_case 'preprocessing_unrecognized'
1.1       rillig    370: }

CVSweb <webmaster@jp.NetBSD.org>