t_call_once.sh revision 1.5 1 # $NetBSD: t_call_once.sh,v 1.5 2022/06/12 08:55:36 skrll Exp $
2 #
3 # Copyright (c) 2018 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
28 atf_test_case call_once
29 call_once_head() {
30 atf_set "descr" "compile and run std::call_once"
31 atf_set "require.progs" "c++"
32 }
33
34 atf_test_case call_once_profile
35 call_once_profile_head() {
36 atf_set "descr" "compile and run std::call_once with profiling option"
37 atf_set "require.progs" "c++"
38 }
39
40 atf_test_case call_once_pic
41 call_once_pic_head() {
42 atf_set "descr" "compile and run PIC std::call_once"
43 atf_set "require.progs" "c++"
44 }
45
46 atf_test_case call_once_pic_32
47 call_once_pic_32_head() {
48 atf_set "descr" "compile and run 32-bit PIC std::call_once"
49 atf_set "require.progs" "c++"
50 }
51
52 atf_test_case call_once_pic_profile
53 call_once_pic_head() {
54 atf_set "descr" "compile and run PIC std::call_once with profiling flag"
55 atf_set "require.progs" "c++"
56 }
57
58 atf_test_case call_once_pic_profile_32
59 call_once_pic_profile_32_head() {
60 atf_set "descr" "compile and run 32-bit PIC std::call_once with profiling flag"
61 atf_set "require.progs" "c++"
62 }
63
64 atf_test_case call_once_profile_32
65 call_once_profile_32_head() {
66 atf_set "descr" "compile and run 32-bit std::call_once with profiling flag"
67 atf_set "require.progs" "c++"
68 }
69
70 atf_test_case call_once_pie
71 call_once_pie_head() {
72 atf_set "descr" "compile and run position independent (PIE) std::call_once"
73 atf_set "require.progs" "c++"
74 }
75
76 atf_test_case call_once_32
77 call_once_32_head() {
78 atf_set "descr" "compile and run std::call_once for/in netbsd32 emulation"
79 atf_set "require.progs" "c++ file diff cat"
80 }
81
82 atf_test_case call_once_static
83 call_once_static_head() {
84 atf_set "descr" "compile and run std::call_once with static flag"
85 atf_set "require.progs" "c++"
86 }
87
88 call_once_body() {
89 cat > test.cpp << EOF
90 #include <cstdio>
91 #include <thread>
92 #include <mutex>
93 std::once_flag flag;
94 int main(void) {
95 std::call_once(flag, [](){ printf("hello, world!\n"); });
96 return 0;
97 }
98 EOF
99 atf_check -s exit:0 -o ignore -e ignore c++ -o call_once test.cpp -pthread
100 atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once
101 }
102
103 call_once_profile_body() {
104 cat > test.cpp << EOF
105 #include <cstdio>
106 #include <thread>
107 #include <mutex>
108 std::once_flag flag;
109 int main(void) {
110 std::call_once(flag, [](){ printf("hello, world!\n"); });
111 return 0;
112 }
113 EOF
114 atf_check -s exit:0 -static -o ignore -e ignore c++ -pg -o call_once test.cpp -pthread
115 atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once
116 }
117
118 call_once_profile_32_body() {
119 # check whether this arch is 64bit
120 if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
121 atf_skip "this is not a 64 bit architecture"
122 fi
123 if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
124 atf_skip "c++ -m32 not supported on this architecture"
125 else
126 if fgrep -q _LP64 ./def32; then
127 atf_fail "c++ -m32 does not generate netbsd32 binaries"
128 fi
129 fi
130
131 cat > test.cpp << EOF
132 #include <cstdio>
133 #include <thread>
134 #include <mutex>
135 std::once_flag flag;
136 int main(void) {
137 std::call_once(flag, [](){ printf("hello, world!\n"); });
138 return 0;
139 }
140 EOF
141 atf_check -s exit:0 -static -o ignore -e ignore c++ -m32 -pg -o call_once test.cpp -pthread
142 atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once
143 }
144
145 call_once_pic_body() {
146 cat > test.cpp << EOF
147 #include <stdlib.h>
148 int callpic(void);
149 int main(void) {callpic();exit(0);}
150 EOF
151 cat > pic.cpp << EOF
152 #include <cstdio>
153 #include <thread>
154 #include <mutex>
155 std::once_flag flag;
156 int callpic(void) {
157 std::call_once(flag, [](){ printf("hello, world!\n"); });
158 return 0;
159 }
160 EOF
161
162 atf_check -s exit:0 -o ignore -e ignore \
163 c++ -fPIC -shared -o libtest.so pic.cpp
164 atf_check -s exit:0 -o ignore -e ignore \
165 c++ -o call_once test.cpp -L. -ltest -pthread
166
167 export LD_LIBRARY_PATH=.
168 atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once
169 }
170
171 call_once_pic_32_body() {
172 # check whether this arch is 64bit
173 if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
174 atf_skip "this is not a 64 bit architecture"
175 fi
176 if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
177 atf_skip "c++ -m32 not supported on this architecture"
178 else
179 if fgrep -q _LP64 ./def32; then
180 atf_fail "c++ -m32 does not generate netbsd32 binaries"
181 fi
182 fi
183
184 cat > test.cpp << EOF
185 #include <stdlib.h>
186 int callpic(void);
187 int main(void) {callpic();exit(0);}
188 EOF
189 cat > pic.cpp << EOF
190 #include <cstdio>
191 #include <thread>
192 #include <mutex>
193 std::once_flag flag;
194 int callpic(void) {
195 std::call_once(flag, [](){ printf("hello, world!\n"); });
196 return 0;
197 }
198 EOF
199
200 atf_check -s exit:0 -o ignore -e ignore \
201 c++ -m32 -fPIC -shared -o libtest.so pic.cpp
202 atf_check -s exit:0 -o ignore -e ignore \
203 c++ -m32 -o call_once test.cpp -L. -ltest -pthread
204
205 export LD_LIBRARY_PATH=.
206 atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once
207 }
208
209 call_once_pic_profile_body() {
210 cat > test.cpp << EOF
211 #include <stdlib.h>
212 int callpic(void);
213 int main(void) {callpic();exit(0);}
214 EOF
215 cat > pic.cpp << EOF
216 #include <cstdio>
217 #include <thread>
218 #include <mutex>
219 std::once_flag flag;
220 int callpic(void) {
221 std::call_once(flag, [](){ printf("hello, world!\n"); });
222 return 0;
223 }
224 EOF
225
226 atf_check -s exit:0 -o ignore -e ignore \
227 c++ -pg -fPIC -shared -o libtest.so pic.cpp
228 atf_check -s exit:0 -o ignore -e ignore \
229 c++ -pg -o call_once test.cpp -L. -ltest -pthread
230
231 export LD_LIBRARY_PATH=.
232 atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once
233 }
234
235 call_once_pic_profile_32_body() {
236 # check whether this arch is 64bit
237 if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
238 atf_skip "this is not a 64 bit architecture"
239 fi
240 if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
241 atf_skip "c++ -m32 not supported on this architecture"
242 else
243 if fgrep -q _LP64 ./def32; then
244 atf_fail "c++ -m32 does not generate netbsd32 binaries"
245 fi
246 fi
247
248 cat > test.cpp << EOF
249 #include <stdlib.h>
250 int callpic(void);
251 int main(void) {callpic();exit(0);}
252 EOF
253 cat > pic.cpp << EOF
254 #include <cstdio>
255 #include <thread>
256 #include <mutex>
257 std::once_flag flag;
258 int callpic(void) {
259 std::call_once(flag, [](){ printf("hello, world!\n"); });
260 return 0;
261 }
262 EOF
263
264 atf_check -s exit:0 -o ignore -e ignore \
265 c++ -m32 -pg -fPIC -shared -o libtest.so pic.cpp
266 atf_check -s exit:0 -o ignore -e ignore \
267 c++ -m32 -pg -o call_once test.cpp -L. -ltest -pthread
268
269 export LD_LIBRARY_PATH=.
270 atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once
271 }
272
273 call_once_pie_body() {
274 # check whether this arch supports -pie
275 if ! c++ -pie -dM -E - < /dev/null 2>/dev/null >/dev/null; then
276 atf_skip "c++ -pie not supported on this architecture"
277 fi
278 cat > test.cpp << EOF
279 #include <cstdio>
280 #include <thread>
281 #include <mutex>
282 std::once_flag flag;
283 int main(void) {
284 std::call_once(flag, [](){ printf("hello, world!\n"); });
285 return 0;
286 }
287 EOF
288 atf_check -s exit:0 -o ignore -e ignore c++ -fpie -pie -o call_once test.cpp -pthread
289 atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once
290 }
291
292 call_once_32_body() {
293 # check whether this arch is 64bit
294 if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
295 atf_skip "this is not a 64 bit architecture"
296 fi
297 if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
298 atf_skip "c++ -m32 not supported on this architecture"
299 else
300 if fgrep -q _LP64 ./def32; then
301 atf_fail "c++ -m32 does not generate netbsd32 binaries"
302 fi
303 fi
304
305 cat > test.cpp << EOF
306 #include <cstdio>
307 #include <thread>
308 #include <mutex>
309 std::once_flag flag;
310 int main(void) {
311 std::call_once(flag, [](){ printf("hello, world!\n"); });
312 return 0;
313 }
314 EOF
315 atf_check -s exit:0 -o ignore -e ignore c++ -o call_once_32 -m32 test.cpp -pthread
316 atf_check -s exit:0 -o ignore -e ignore c++ -o call_once_64 test.cpp -pthread
317 file -b ./call_once_32 > ./ftype32
318 file -b ./call_once_64 > ./ftype64
319 if diff ./ftype32 ./ftype64 >/dev/null; then
320 atf_fail "generated binaries do not differ"
321 fi
322 echo "32bit binaries on this platform are:"
323 cat ./ftype32
324 echo "While native (64bit) binaries are:"
325 cat ./ftype64
326 atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once_32
327
328 # do another test with static 32bit binaries
329 cat > test.cpp << EOF
330 #include <cstdio>
331 #include <thread>
332 #include <mutex>
333 std::once_flag flag;
334 int main(void) {
335 std::call_once(flag, [](){ printf("hello, world!\n"); });
336 return 0;
337 }
338 EOF
339 atf_check -s exit:0 -o ignore -e ignore c++ -o call_once -m32 -pthread \
340 -static test.cpp
341 atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once
342 }
343
344 call_once_static_body() {
345 cat > test.cpp << EOF
346 #include <cstdio>
347 #include <thread>
348 #include <mutex>
349 std::once_flag flag;
350 int main(void) {
351 std::call_once(flag, [](){ printf("hello, world!\n"); });
352 return 0;
353 }
354 EOF
355 atf_check -s exit:0 -o ignore -e ignore c++ -static -o call_once test.cpp -pthread
356 atf_check -s exit:0 -o inline:"hello, world!\n" ./call_once
357 }
358
359 atf_init_test_cases()
360 {
361
362 atf_add_test_case call_once
363 atf_add_test_case call_once_profile
364 atf_add_test_case call_once_pic
365 atf_add_test_case call_once_pie
366 atf_add_test_case call_once_32
367 atf_add_test_case call_once_static
368 atf_add_test_case call_once_pic_32
369 atf_add_test_case call_once_pic_profile
370 atf_add_test_case call_once_pic_profile_32
371 atf_add_test_case call_once_profile_32
372 }
373