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