annotate gcc/selftest.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* A self-testing framework, for use by -fself-test.
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 Copyright (C) 2015-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 This file is part of GCC.
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 GCC is free software; you can redistribute it and/or modify it under
kono
parents:
diff changeset
7 the terms of the GNU General Public License as published by the Free
kono
parents:
diff changeset
8 Software Foundation; either version 3, or (at your option) any later
kono
parents:
diff changeset
9 version.
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
kono
parents:
diff changeset
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
kono
parents:
diff changeset
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
kono
parents:
diff changeset
14 for more details.
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
17 along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
18 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 #include "config.h"
kono
parents:
diff changeset
21 #include "system.h"
kono
parents:
diff changeset
22 #include "coretypes.h"
kono
parents:
diff changeset
23 #include "selftest.h"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
24 #include "intl.h"
111
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 #if CHECKING_P
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 namespace selftest {
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 int num_passes;
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 /* Record the successful outcome of some aspect of a test. */
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 void
kono
parents:
diff changeset
35 pass (const location &/*loc*/, const char */*msg*/)
kono
parents:
diff changeset
36 {
kono
parents:
diff changeset
37 num_passes++;
kono
parents:
diff changeset
38 }
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 /* Report the failed outcome of some aspect of a test and abort. */
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 void
kono
parents:
diff changeset
43 fail (const location &loc, const char *msg)
kono
parents:
diff changeset
44 {
kono
parents:
diff changeset
45 fprintf (stderr,"%s:%i: %s: FAIL: %s\n", loc.m_file, loc.m_line,
kono
parents:
diff changeset
46 loc.m_function, msg);
kono
parents:
diff changeset
47 abort ();
kono
parents:
diff changeset
48 }
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 /* As "fail", but using printf-style formatted output. */
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 void
kono
parents:
diff changeset
53 fail_formatted (const location &loc, const char *fmt, ...)
kono
parents:
diff changeset
54 {
kono
parents:
diff changeset
55 va_list ap;
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 fprintf (stderr, "%s:%i: %s: FAIL: ", loc.m_file, loc.m_line,
kono
parents:
diff changeset
58 loc.m_function);
kono
parents:
diff changeset
59 va_start (ap, fmt);
kono
parents:
diff changeset
60 vfprintf (stderr, fmt, ap);
kono
parents:
diff changeset
61 va_end (ap);
kono
parents:
diff changeset
62 fprintf (stderr, "\n");
kono
parents:
diff changeset
63 abort ();
kono
parents:
diff changeset
64 }
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 /* Implementation detail of ASSERT_STREQ.
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
67 Compare val1 and val2 with strcmp. They ought
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
68 to be non-NULL; fail gracefully if either or both are NULL. */
111
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 void
kono
parents:
diff changeset
71 assert_streq (const location &loc,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
72 const char *desc_val1, const char *desc_val2,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
73 const char *val1, const char *val2)
111
kono
parents:
diff changeset
74 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
75 /* If val1 or val2 are NULL, fail with a custom error message. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
76 if (val1 == NULL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
77 if (val2 == NULL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
78 fail_formatted (loc, "ASSERT_STREQ (%s, %s) val1=NULL val2=NULL",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
79 desc_val1, desc_val2);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
80 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
81 fail_formatted (loc, "ASSERT_STREQ (%s, %s) val1=NULL val2=\"%s\"",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
82 desc_val1, desc_val2, val2);
111
kono
parents:
diff changeset
83 else
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
84 if (val2 == NULL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
85 fail_formatted (loc, "ASSERT_STREQ (%s, %s) val1=\"%s\" val2=NULL",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
86 desc_val1, desc_val2, val1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
87 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
88 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
89 if (strcmp (val1, val2) == 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
90 pass (loc, "ASSERT_STREQ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
91 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
92 fail_formatted (loc, "ASSERT_STREQ (%s, %s) val1=\"%s\" val2=\"%s\"",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
93 desc_val1, desc_val2, val1, val2);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
94 }
111
kono
parents:
diff changeset
95 }
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 /* Implementation detail of ASSERT_STR_CONTAINS.
kono
parents:
diff changeset
98 Use strstr to determine if val_needle is is within val_haystack.
kono
parents:
diff changeset
99 ::selftest::pass if it is found.
kono
parents:
diff changeset
100 ::selftest::fail if it is not found. */
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 void
kono
parents:
diff changeset
103 assert_str_contains (const location &loc,
kono
parents:
diff changeset
104 const char *desc_haystack,
kono
parents:
diff changeset
105 const char *desc_needle,
kono
parents:
diff changeset
106 const char *val_haystack,
kono
parents:
diff changeset
107 const char *val_needle)
kono
parents:
diff changeset
108 {
kono
parents:
diff changeset
109 /* If val_haystack is NULL, fail with a custom error message. */
kono
parents:
diff changeset
110 if (val_haystack == NULL)
kono
parents:
diff changeset
111 fail_formatted (loc, "ASSERT_STR_CONTAINS (%s, %s) haystack=NULL",
kono
parents:
diff changeset
112 desc_haystack, desc_needle);
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 /* If val_needle is NULL, fail with a custom error message. */
kono
parents:
diff changeset
115 if (val_needle == NULL)
kono
parents:
diff changeset
116 fail_formatted (loc,
kono
parents:
diff changeset
117 "ASSERT_STR_CONTAINS (%s, %s) haystack=\"%s\" needle=NULL",
kono
parents:
diff changeset
118 desc_haystack, desc_needle, val_haystack);
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 const char *test = strstr (val_haystack, val_needle);
kono
parents:
diff changeset
121 if (test)
kono
parents:
diff changeset
122 pass (loc, "ASSERT_STR_CONTAINS");
kono
parents:
diff changeset
123 else
kono
parents:
diff changeset
124 fail_formatted
kono
parents:
diff changeset
125 (loc, "ASSERT_STR_CONTAINS (%s, %s) haystack=\"%s\" needle=\"%s\"",
kono
parents:
diff changeset
126 desc_haystack, desc_needle, val_haystack, val_needle);
kono
parents:
diff changeset
127 }
kono
parents:
diff changeset
128
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
129 /* Implementation detail of ASSERT_STR_STARTSWITH.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
130 Determine if VAL_STR starts with VAL_PREFIX.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
131 ::selftest::pass if VAL_STR does start with VAL_PREFIX.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
132 ::selftest::fail if it does not, or either is NULL (using
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
133 DESC_STR and DESC_PREFIX in the error message). */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
134
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
135 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
136 assert_str_startswith (const location &loc,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
137 const char *desc_str,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
138 const char *desc_prefix,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
139 const char *val_str,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
140 const char *val_prefix)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
141 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
142 /* If val_str is NULL, fail with a custom error message. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
143 if (val_str == NULL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
144 fail_formatted (loc, "ASSERT_STR_STARTSWITH (%s, %s) str=NULL",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
145 desc_str, desc_prefix);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
146
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
147 /* If val_prefix is NULL, fail with a custom error message. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
148 if (val_prefix == NULL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
149 fail_formatted (loc,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
150 "ASSERT_STR_STARTSWITH (%s, %s) str=\"%s\" prefix=NULL",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
151 desc_str, desc_prefix, val_str);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
152
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
153 const char *test = strstr (val_str, val_prefix);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
154 if (test == val_str)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
155 pass (loc, "ASSERT_STR_STARTSWITH");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
156 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
157 fail_formatted
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
158 (loc, "ASSERT_STR_STARTSWITH (%s, %s) str=\"%s\" prefix=\"%s\"",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
159 desc_str, desc_prefix, val_str, val_prefix);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
160 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
161
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
162
111
kono
parents:
diff changeset
163 /* Constructor. Generate a name for the file. */
kono
parents:
diff changeset
164
kono
parents:
diff changeset
165 named_temp_file::named_temp_file (const char *suffix)
kono
parents:
diff changeset
166 {
kono
parents:
diff changeset
167 m_filename = make_temp_file (suffix);
kono
parents:
diff changeset
168 ASSERT_NE (m_filename, NULL);
kono
parents:
diff changeset
169 }
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 /* Destructor. Delete the tempfile. */
kono
parents:
diff changeset
172
kono
parents:
diff changeset
173 named_temp_file::~named_temp_file ()
kono
parents:
diff changeset
174 {
kono
parents:
diff changeset
175 unlink (m_filename);
kono
parents:
diff changeset
176 diagnostics_file_cache_forcibly_evict_file (m_filename);
kono
parents:
diff changeset
177 free (m_filename);
kono
parents:
diff changeset
178 }
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 /* Constructor. Create a tempfile using SUFFIX, and write CONTENT to
kono
parents:
diff changeset
181 it. Abort if anything goes wrong, using LOC as the effective
kono
parents:
diff changeset
182 location in the problem report. */
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 temp_source_file::temp_source_file (const location &loc,
kono
parents:
diff changeset
185 const char *suffix,
kono
parents:
diff changeset
186 const char *content)
kono
parents:
diff changeset
187 : named_temp_file (suffix)
kono
parents:
diff changeset
188 {
kono
parents:
diff changeset
189 FILE *out = fopen (get_filename (), "w");
kono
parents:
diff changeset
190 if (!out)
kono
parents:
diff changeset
191 fail_formatted (loc, "unable to open tempfile: %s", get_filename ());
kono
parents:
diff changeset
192 fprintf (out, "%s", content);
kono
parents:
diff changeset
193 fclose (out);
kono
parents:
diff changeset
194 }
kono
parents:
diff changeset
195
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
196 /* Avoid introducing locale-specific differences in the results
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
197 by hardcoding open_quote and close_quote. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
198
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
199 auto_fix_quotes::auto_fix_quotes ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
200 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
201 m_saved_open_quote = open_quote;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
202 m_saved_close_quote = close_quote;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
203 open_quote = "`";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
204 close_quote = "'";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
205 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
206
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
207 /* Restore old values of open_quote and close_quote. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
208
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
209 auto_fix_quotes::~auto_fix_quotes ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
210 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
211 open_quote = m_saved_open_quote;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
212 close_quote = m_saved_close_quote;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
213 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
214
111
kono
parents:
diff changeset
215 /* Read the contents of PATH into memory, returning a 0-terminated buffer
kono
parents:
diff changeset
216 that must be freed by the caller.
kono
parents:
diff changeset
217 Fail (and abort) if there are any problems, with LOC as the reported
kono
parents:
diff changeset
218 location of the failure. */
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 char *
kono
parents:
diff changeset
221 read_file (const location &loc, const char *path)
kono
parents:
diff changeset
222 {
kono
parents:
diff changeset
223 FILE *f_in = fopen (path, "r");
kono
parents:
diff changeset
224 if (!f_in)
kono
parents:
diff changeset
225 fail_formatted (loc, "unable to open file: %s", path);
kono
parents:
diff changeset
226
kono
parents:
diff changeset
227 /* Read content, allocating FIXME. */
kono
parents:
diff changeset
228 char *result = NULL;
kono
parents:
diff changeset
229 size_t total_sz = 0;
kono
parents:
diff changeset
230 size_t alloc_sz = 0;
kono
parents:
diff changeset
231 char buf[4096];
kono
parents:
diff changeset
232 size_t iter_sz_in;
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 while ( (iter_sz_in = fread (buf, 1, sizeof (buf), f_in)) )
kono
parents:
diff changeset
235 {
kono
parents:
diff changeset
236 gcc_assert (alloc_sz >= total_sz);
kono
parents:
diff changeset
237 size_t old_total_sz = total_sz;
kono
parents:
diff changeset
238 total_sz += iter_sz_in;
kono
parents:
diff changeset
239 /* Allow 1 extra byte for 0-termination. */
kono
parents:
diff changeset
240 if (alloc_sz < (total_sz + 1))
kono
parents:
diff changeset
241 {
kono
parents:
diff changeset
242 size_t new_alloc_sz = alloc_sz ? alloc_sz * 2: total_sz + 1;
kono
parents:
diff changeset
243 result = (char *)xrealloc (result, new_alloc_sz);
kono
parents:
diff changeset
244 alloc_sz = new_alloc_sz;
kono
parents:
diff changeset
245 }
kono
parents:
diff changeset
246 memcpy (result + old_total_sz, buf, iter_sz_in);
kono
parents:
diff changeset
247 }
kono
parents:
diff changeset
248
kono
parents:
diff changeset
249 if (!feof (f_in))
kono
parents:
diff changeset
250 fail_formatted (loc, "error reading from %s: %s", path,
kono
parents:
diff changeset
251 xstrerror (errno));
kono
parents:
diff changeset
252
kono
parents:
diff changeset
253 fclose (f_in);
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 /* 0-terminate the buffer. */
kono
parents:
diff changeset
256 gcc_assert (total_sz < alloc_sz);
kono
parents:
diff changeset
257 result[total_sz] = '\0';
kono
parents:
diff changeset
258
kono
parents:
diff changeset
259 return result;
kono
parents:
diff changeset
260 }
kono
parents:
diff changeset
261
kono
parents:
diff changeset
262 /* The path of SRCDIR/testsuite/selftests. */
kono
parents:
diff changeset
263
kono
parents:
diff changeset
264 const char *path_to_selftest_files = NULL;
kono
parents:
diff changeset
265
kono
parents:
diff changeset
266 /* Convert a path relative to SRCDIR/testsuite/selftests
kono
parents:
diff changeset
267 to a real path (either absolute, or relative to pwd).
kono
parents:
diff changeset
268 The result should be freed by the caller. */
kono
parents:
diff changeset
269
kono
parents:
diff changeset
270 char *
kono
parents:
diff changeset
271 locate_file (const char *name)
kono
parents:
diff changeset
272 {
kono
parents:
diff changeset
273 ASSERT_NE (NULL, path_to_selftest_files);
kono
parents:
diff changeset
274 return concat (path_to_selftest_files, "/", name, NULL);
kono
parents:
diff changeset
275 }
kono
parents:
diff changeset
276
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
277 /* selftest::test_runner's ctor. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
278
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
279 test_runner::test_runner (const char *name)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
280 : m_name (name),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
281 m_start_time (get_run_time ())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
282 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
283 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
284
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
285 /* selftest::test_runner's dtor. Print a summary line to stderr. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
286
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
287 test_runner::~test_runner ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
288 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
289 /* Finished running tests. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
290 long finish_time = get_run_time ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
291 long elapsed_time = finish_time - m_start_time;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
292
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
293 fprintf (stderr,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
294 "%s: %i pass(es) in %ld.%06ld seconds\n",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
295 m_name, num_passes,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
296 elapsed_time / 1000000, elapsed_time % 1000000);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
297 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
298
111
kono
parents:
diff changeset
299 /* Selftests for libiberty. */
kono
parents:
diff changeset
300
kono
parents:
diff changeset
301 /* Verify that xstrndup generates EXPECTED when called on SRC and N. */
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 static void
kono
parents:
diff changeset
304 assert_xstrndup_eq (const char *expected, const char *src, size_t n)
kono
parents:
diff changeset
305 {
kono
parents:
diff changeset
306 char *buf = xstrndup (src, n);
kono
parents:
diff changeset
307 ASSERT_STREQ (expected, buf);
kono
parents:
diff changeset
308 free (buf);
kono
parents:
diff changeset
309 }
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 /* Verify that xstrndup works as expected. */
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 static void
kono
parents:
diff changeset
314 test_xstrndup ()
kono
parents:
diff changeset
315 {
kono
parents:
diff changeset
316 assert_xstrndup_eq ("", "test", 0);
kono
parents:
diff changeset
317 assert_xstrndup_eq ("t", "test", 1);
kono
parents:
diff changeset
318 assert_xstrndup_eq ("te", "test", 2);
kono
parents:
diff changeset
319 assert_xstrndup_eq ("tes", "test", 3);
kono
parents:
diff changeset
320 assert_xstrndup_eq ("test", "test", 4);
kono
parents:
diff changeset
321 assert_xstrndup_eq ("test", "test", 5);
kono
parents:
diff changeset
322
kono
parents:
diff changeset
323 /* Test on an string without zero termination. */
kono
parents:
diff changeset
324 const char src[4] = {'t', 'e', 's', 't'};
kono
parents:
diff changeset
325 assert_xstrndup_eq ("", src, 0);
kono
parents:
diff changeset
326 assert_xstrndup_eq ("t", src, 1);
kono
parents:
diff changeset
327 assert_xstrndup_eq ("te", src, 2);
kono
parents:
diff changeset
328 assert_xstrndup_eq ("tes", src, 3);
kono
parents:
diff changeset
329 assert_xstrndup_eq ("test", src, 4);
kono
parents:
diff changeset
330 }
kono
parents:
diff changeset
331
kono
parents:
diff changeset
332 /* Run selftests for libiberty. */
kono
parents:
diff changeset
333
kono
parents:
diff changeset
334 static void
kono
parents:
diff changeset
335 test_libiberty ()
kono
parents:
diff changeset
336 {
kono
parents:
diff changeset
337 test_xstrndup ();
kono
parents:
diff changeset
338 }
kono
parents:
diff changeset
339
kono
parents:
diff changeset
340 /* Selftests for the selftest system itself. */
kono
parents:
diff changeset
341
kono
parents:
diff changeset
342 /* Sanity-check the ASSERT_ macros with various passing cases. */
kono
parents:
diff changeset
343
kono
parents:
diff changeset
344 static void
kono
parents:
diff changeset
345 test_assertions ()
kono
parents:
diff changeset
346 {
kono
parents:
diff changeset
347 ASSERT_TRUE (true);
kono
parents:
diff changeset
348 ASSERT_FALSE (false);
kono
parents:
diff changeset
349 ASSERT_EQ (1, 1);
kono
parents:
diff changeset
350 ASSERT_EQ_AT (SELFTEST_LOCATION, 1, 1);
kono
parents:
diff changeset
351 ASSERT_NE (1, 2);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
352 ASSERT_GT (2, 1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
353 ASSERT_GT_AT (SELFTEST_LOCATION, 2, 1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
354 ASSERT_LT (1, 2);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
355 ASSERT_LT_AT (SELFTEST_LOCATION, 1, 2);
111
kono
parents:
diff changeset
356 ASSERT_STREQ ("test", "test");
kono
parents:
diff changeset
357 ASSERT_STREQ_AT (SELFTEST_LOCATION, "test", "test");
kono
parents:
diff changeset
358 ASSERT_STR_CONTAINS ("foo bar baz", "bar");
kono
parents:
diff changeset
359 }
kono
parents:
diff changeset
360
kono
parents:
diff changeset
361 /* Verify named_temp_file. */
kono
parents:
diff changeset
362
kono
parents:
diff changeset
363 static void
kono
parents:
diff changeset
364 test_named_temp_file ()
kono
parents:
diff changeset
365 {
kono
parents:
diff changeset
366 named_temp_file t (".txt");
kono
parents:
diff changeset
367 FILE *f = fopen (t.get_filename (), "w");
kono
parents:
diff changeset
368 if (!f)
kono
parents:
diff changeset
369 fail_formatted (SELFTEST_LOCATION,
kono
parents:
diff changeset
370 "unable to open %s for writing", t.get_filename ());
kono
parents:
diff changeset
371 fclose (f);
kono
parents:
diff changeset
372 }
kono
parents:
diff changeset
373
kono
parents:
diff changeset
374 /* Verify read_file (and also temp_source_file). */
kono
parents:
diff changeset
375
kono
parents:
diff changeset
376 static void
kono
parents:
diff changeset
377 test_read_file ()
kono
parents:
diff changeset
378 {
kono
parents:
diff changeset
379 temp_source_file t (SELFTEST_LOCATION, "test1.s",
kono
parents:
diff changeset
380 "\tjmp\t.L2\n");
kono
parents:
diff changeset
381 char *buf = read_file (SELFTEST_LOCATION, t.get_filename ());
kono
parents:
diff changeset
382 ASSERT_STREQ ("\tjmp\t.L2\n", buf);
kono
parents:
diff changeset
383 free (buf);
kono
parents:
diff changeset
384 }
kono
parents:
diff changeset
385
kono
parents:
diff changeset
386 /* Verify locate_file (and read_file). */
kono
parents:
diff changeset
387
kono
parents:
diff changeset
388 static void
kono
parents:
diff changeset
389 test_locate_file ()
kono
parents:
diff changeset
390 {
kono
parents:
diff changeset
391 char *path = locate_file ("example.txt");
kono
parents:
diff changeset
392 char *buf = read_file (SELFTEST_LOCATION, path);
kono
parents:
diff changeset
393 ASSERT_STREQ ("example of a selftest file\n", buf);
kono
parents:
diff changeset
394 free (buf);
kono
parents:
diff changeset
395 free (path);
kono
parents:
diff changeset
396 }
kono
parents:
diff changeset
397
kono
parents:
diff changeset
398 /* Run all of the selftests within this file. */
kono
parents:
diff changeset
399
kono
parents:
diff changeset
400 void
kono
parents:
diff changeset
401 selftest_c_tests ()
kono
parents:
diff changeset
402 {
kono
parents:
diff changeset
403 test_libiberty ();
kono
parents:
diff changeset
404 test_assertions ();
kono
parents:
diff changeset
405 test_named_temp_file ();
kono
parents:
diff changeset
406 test_read_file ();
kono
parents:
diff changeset
407 test_locate_file ();
kono
parents:
diff changeset
408 }
kono
parents:
diff changeset
409
kono
parents:
diff changeset
410 } // namespace selftest
kono
parents:
diff changeset
411
kono
parents:
diff changeset
412 #endif /* #if CHECKING_P */