xref: /netbsd-src/tests/usr.bin/xlint/lint1/t_integration.sh (revision 82d56013d7b633d116a93943de88e08335357a7c)
1# $NetBSD: t_integration.sh,v 1.50 2021/05/16 11:11:37 rillig Exp $
2#
3# Copyright (c) 2008, 2010 The NetBSD Foundation, Inc.
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9# 1. Redistributions of source code must retain the above copyright
10#    notice, this list of conditions and the following disclaimer.
11# 2. Redistributions in binary form must reproduce the above copyright
12#    notice, this list of conditions and the following disclaimer in the
13#    documentation and/or other materials provided with the distribution.
14#
15# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25# POSSIBILITY OF SUCH DAMAGE.
26#
27
28LINT1=/usr/libexec/lint1
29
30Names=
31
32extract_flags()
33{
34	local extract_flags_awk
35
36	# shellcheck disable=SC2016
37	extract_flags_awk='
38		BEGIN {
39			flags = "-g -S -w"
40		}
41		/^\/\* (lint1-flags|lint1-extra-flags): .*\*\/$/ {
42			if ($2 == "lint1-flags:")
43				flags = ""
44			for (i = 3; i < NF; i++)
45				flags = flags " " $i
46		}
47		END {
48			print flags
49		}
50	'
51
52	awk "$extract_flags_awk" "$@"
53}
54
55# shellcheck disable=SC2155
56check_lint1()
57{
58	local src="$(atf_get_srcdir)/$1"
59	local exp="${src%.c}.exp"
60	local src_ln="${src%.c}.ln"
61	local wrk_ln="${1%.c}.ln"
62	local flags="$(extract_flags "${src}")"
63
64	if [ ! -f "${src_ln}" ]; then
65		src_ln="/dev/null"
66		wrk_ln="/dev/null"
67	fi
68
69	if [ -f "${exp}" ]; then
70		# shellcheck disable=SC2086
71		atf_check -s not-exit:0 -o "file:${exp}" -e empty \
72		    ${LINT1} ${flags} "${src}" "${wrk_ln}"
73	else
74		# shellcheck disable=SC2086
75		atf_check -s exit:0 \
76		    ${LINT1} ${flags} "${src}" "${wrk_ln}"
77	fi
78
79	if [ "${src_ln}" != "/dev/null" ]; then
80		atf_check -o "file:${src_ln}" cat "${wrk_ln}"
81	fi
82}
83
84test_case()
85{
86	local name="${1}"; shift
87	local descr="${*}"
88
89	atf_test_case ${name}
90	eval "${name}_head() {
91		if [ \"${descr}\" ]; then
92			atf_set \"descr\" \"${descr}\"
93		fi
94		atf_set \"require.progs\" \"${LINT1}\"
95	}"
96	eval "${name}_body() {
97		check_lint1 ${name}.c
98	}"
99
100	Names="${Names} ${name}"
101}
102
103test_case d_bltinoffsetof
104test_case d_c99_anon_struct
105test_case d_c99_anon_union
106test_case d_c99_bool
107test_case d_c99_bool_strict
108test_case d_c99_bool_strict_syshdr
109test_case d_c99_compound_literal_comma
110test_case d_c99_decls_after_stmt2
111test_case d_c99_flex_array_packed
112test_case d_c99_init
113test_case d_c99_nested_struct
114test_case d_c99_union_cast
115test_case d_c99_union_init4
116test_case d_c99_union_init5
117test_case d_cast_fun_array_param
118test_case d_cast_typeof
119test_case d_decl_old_style_arguments
120test_case d_fold_test
121test_case d_gcc_extension
122test_case d_init_array_using_string
123test_case d_init_pop_member
124test_case d_lint_assert
125test_case d_return_type
126test_case d_type_question_colon
127test_case d_typefun
128test_case d_typename_as_var
129
130test_case d_c99_struct_init
131test_case d_c99_union_init1
132test_case d_c99_union_init2
133test_case d_c99_union_init3
134test_case d_c99_recursive_init
135test_case d_c9x_recursive_init
136test_case d_nested_structs
137test_case d_packed_structs
138test_case d_pr_22119
139test_case d_struct_init_nested
140
141test_case d_cast_init
142test_case d_cast_init2
143test_case d_cast_lhs
144
145test_case d_gcc_func
146test_case d_c99_func
147
148test_case d_gcc_variable_array_init
149test_case d_c9x_array_init
150test_case d_c99_decls_after_stmt
151test_case d_c99_decls_after_stmt3
152test_case d_nolimit_init
153test_case d_zero_sized_arrays
154
155test_case d_compound_literals1
156test_case d_compound_literals2
157test_case d_gcc_compound_statements1
158test_case d_gcc_compound_statements2
159test_case d_gcc_compound_statements3
160
161test_case d_cvt_in_ternary
162test_case d_cvt_constant
163test_case d_ellipsis_in_switch
164test_case d_c99_complex_num
165test_case d_c99_complex_split
166test_case d_c99_for_loops
167test_case d_alignof
168test_case d_shift_to_narrower_type
169test_case d_constant_conv1
170test_case d_constant_conv2
171test_case d_type_conv1
172test_case d_type_conv2
173test_case d_type_conv3
174test_case d_incorrect_array_size
175test_case d_long_double_int
176
177test_case emit
178test_case expr_range
179
180test_case gcc_attribute
181test_case gcc_attribute_aligned
182test_case gcc_bit_field_types
183test_case gcc_init_compound_literal
184test_case gcc_typeof_after_statement
185
186test_case op_colon
187
188test_case feat_stacktrace
189
190test_case all_messages
191all_messages_body()
192{
193	local failed msg
194
195	failed=""
196
197	for msg in $(seq 0 344); do
198		name="$(printf 'msg_%03d.c' "${msg}")"
199		check_lint1 "${name}" \
200		|| failed="$failed${failed:+ }$name"
201	done
202
203	if [ "$failed" != "" ]; then
204		atf_check "false" "$failed"
205	fi
206}
207
208
209atf_init_test_cases()
210{
211	for name in ${Names}; do
212		atf_add_test_case ${name}
213	done
214}
215