1# $NetBSD: t_hello.sh,v 1.4 2020/02/11 06:26:19 riastradh Exp $ 2# 3# Copyright (c) 2011 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 28atf_test_case hello 29hello_head() { 30 atf_set "descr" "compile and run \"hello world\"" 31 atf_set "require.progs" "c++" 32} 33 34atf_test_case hello_profile 35hello_profile_head() { 36 atf_set "descr" "compile and run \"hello world\" with profiling option" 37 atf_set "require.progs" "c++" 38} 39 40atf_test_case hello_profile 41hello_profile_32_head() { 42 atf_set "descr" "compile and run 32-bit \"hello world\" with profiling option" 43 atf_set "require.progs" "c++" 44} 45 46atf_test_case hello_static 47hello_static_head() { 48 atf_set "descr" "compile and run \"hello world\" with static option" 49 atf_set "require.progs" "c++" 50} 51 52atf_test_case hello_pic 53hello_pic_head() { 54 atf_set "descr" "compile and run PIC \"hello world\"" 55 atf_set "require.progs" "c++" 56} 57 58atf_test_case hello_pic_32 59hello_pic_32_head() { 60 atf_set "descr" "compile and run 32-bit PIC \"hello world\"" 61 atf_set "require.progs" "c++" 62} 63 64atf_test_case hello_pic_profile 65hello_pic_profile_head() { 66 atf_set "descr" "compile and run PIC \"hello world\" with profiling option" 67 atf_set "require.progs" "c++" 68} 69 70atf_test_case hello_pic_profile_32 71hello_pic_profile_32_head() { 72 atf_set "descr" "compile and run 32-bit PIC \"hello world\" with profiling option" 73 atf_set "require.progs" "c++" 74} 75 76atf_test_case hello_pie 77hello_pie_head() { 78 atf_set "descr" "compile and run position independent (PIE) \"hello world\"" 79 atf_set "require.progs" "c++" 80} 81 82atf_test_case hello32 83hello32_head() { 84 atf_set "descr" "compile and run \"hello world\" for/in netbsd32 emulation" 85 atf_set "require.progs" "c++ file diff cat" 86} 87 88hello_body() { 89 cat > test.cpp << EOF 90#include <stdio.h> 91#include <stdlib.h> 92int main(void) {printf("hello world\n");exit(0);} 93EOF 94 atf_check -s exit:0 -o ignore -e ignore c++ -o hello test.cpp 95 atf_check -s exit:0 -o inline:"hello world\n" ./hello 96} 97 98hello_profile_body() { 99 cat > test.cpp << EOF 100#include <stdio.h> 101#include <stdlib.h> 102int main(void) {printf("hello world\n");exit(0);} 103EOF 104 atf_check -s exit:0 -o ignore -e ignore c++ -pg -o hello test.cpp 105 case `uname -p` in 106 aarch64) 107 atf_expect_fail 'cc -pg is busted on aarch64' 108 ;; 109 esac 110 atf_check -s exit:0 -o inline:"hello world\n" ./hello 111} 112 113hello_profile_32_body() { 114 if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 115 atf_skip "this is not a 64 bit architecture" 116 fi 117 if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 118 atf_skip "c++ -m32 not supported on this architecture" 119 else 120 if fgrep -q _LP64 ./def32; then 121 atf_fail "c++ -m32 does not generate netbsd32 binaries" 122 fi 123 fi 124 125 cat > test.cpp << EOF 126#include <stdio.h> 127#include <stdlib.h> 128int main(void) {printf("hello world\n");exit(0);} 129EOF 130 atf_check -s exit:0 -o ignore -e ignore c++ -m32 -pg -o hello test.cpp 131 atf_check -s exit:0 -o inline:"hello world\n" ./hello 132} 133 134 135hello_static_body() { 136 cat > test.cpp << EOF 137#include <stdio.h> 138#include <stdlib.h> 139int main(void) {printf("hello world\n");exit(0);} 140EOF 141 atf_check -s exit:0 -o ignore -e ignore c++ -static -o hello test.cpp 142 atf_check -s exit:0 -o inline:"hello world\n" ./hello 143} 144 145hello_pic_body() { 146 cat > test.cpp << EOF 147#include <stdlib.h> 148int callpic(void); 149int main(void) {callpic();exit(0);} 150EOF 151 cat > pic.cpp << EOF 152#include <stdio.h> 153int callpic(void) {printf("hello world\n");return 0;} 154EOF 155 156 atf_check -s exit:0 -o ignore -e ignore \ 157 c++ -fPIC -shared -o libtest.so pic.cpp 158 atf_check -s exit:0 -o ignore -e ignore \ 159 c++ -o hello test.cpp -L. -ltest 160 161 export LD_LIBRARY_PATH=. 162 atf_check -s exit:0 -o inline:"hello world\n" ./hello 163} 164 165hello_pic_32_body() { 166 if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 167 atf_skip "this is not a 64 bit architecture" 168 fi 169 if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 170 atf_skip "c++ -m32 not supported on this architecture" 171 else 172 if fgrep -q _LP64 ./def32; then 173 atf_fail "c++ -m32 does not generate netbsd32 binaries" 174 fi 175 fi 176 cat > test.cpp << EOF 177#include <stdlib.h> 178int callpic(void); 179int main(void) {callpic();exit(0);} 180EOF 181 cat > pic.cpp << EOF 182#include <stdio.h> 183int callpic(void) {printf("hello world\n");return 0;} 184EOF 185 186 atf_check -s exit:0 -o ignore -e ignore \ 187 c++ -m32 -fPIC -shared -o libtest.so pic.cpp 188 atf_check -s exit:0 -o ignore -e ignore \ 189 c++ -m32 -o hello test.cpp -L. -ltest 190 191 export LD_LIBRARY_PATH=. 192 atf_check -s exit:0 -o inline:"hello world\n" ./hello 193} 194 195hello_pic_profile_body() { 196 cat > test.cpp << EOF 197#include <stdlib.h> 198int callpic(void); 199int main(void) {callpic();exit(0);} 200EOF 201 cat > pic.cpp << EOF 202#include <stdio.h> 203int callpic(void) {printf("hello world\n");return 0;} 204EOF 205 206 atf_check -s exit:0 -o ignore -e ignore \ 207 c++ -pg -fPIC -shared -o libtest.so pic.cpp 208 atf_check -s exit:0 -o ignore -e ignore \ 209 c++ -pg -o hello test.cpp -L. -ltest 210 211 case `uname -p` in 212 aarch64) 213 atf_expect_fail 'cc -pg is busted on aarch64' 214 ;; 215 esac 216 export LD_LIBRARY_PATH=. 217 atf_check -s exit:0 -o inline:"hello world\n" ./hello 218} 219 220hello_pic_profile_32_body() { 221 if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 222 atf_skip "this is not a 64 bit architecture" 223 fi 224 if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 225 atf_skip "c++ -m32 not supported on this architecture" 226 else 227 if fgrep -q _LP64 ./def32; then 228 atf_fail "c++ -m32 does not generate netbsd32 binaries" 229 fi 230 fi 231 232 cat > test.cpp << EOF 233#include <stdlib.h> 234int callpic(void); 235int main(void) {callpic();exit(0);} 236EOF 237 cat > pic.cpp << EOF 238#include <stdio.h> 239int callpic(void) {printf("hello world\n");return 0;} 240EOF 241 242 atf_check -s exit:0 -o ignore -e ignore \ 243 c++ -m32 -pg -fPIC -shared -o libtest.so pic.cpp 244 atf_check -s exit:0 -o ignore -e ignore \ 245 c++ -m32 -pg -o hello test.cpp -L. -ltest 246 247 export LD_LIBRARY_PATH=. 248 atf_check -s exit:0 -o inline:"hello world\n" ./hello 249} 250 251hello_pie_body() { 252 # check whether this arch supports -pie 253 if ! c++ -pie -dM -E - < /dev/null 2>/dev/null >/dev/null; then 254 atf_skip "c++ -pie not supported on this architecture" 255 fi 256 cat > test.cpp << EOF 257#include <stdio.h> 258#include <stdlib.h> 259int main(void) {printf("hello world\n");exit(0);} 260EOF 261 atf_check -s exit:0 -o ignore -e ignore c++ -fpie -pie -o hello test.cpp 262 atf_check -s exit:0 -o inline:"hello world\n" ./hello 263} 264 265hello32_body() { 266 # check whether this arch is 64bit 267 if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then 268 atf_skip "this is not a 64 bit architecture" 269 fi 270 if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 271 atf_skip "c++ -m32 not supported on this architecture" 272 else 273 if fgrep -q _LP64 ./def32; then 274 atf_fail "c++ -m32 does not generate netbsd32 binaries" 275 fi 276 fi 277 278 cat > test.cpp << EOF 279#include <stdio.h> 280#include <stdlib.h> 281int main(void) {printf("hello world\n");exit(0);} 282EOF 283 atf_check -s exit:0 -o ignore -e ignore c++ -o hello32 -m32 test.cpp 284 atf_check -s exit:0 -o ignore -e ignore c++ -o hello64 test.cpp 285 file -b ./hello32 > ./ftype32 286 file -b ./hello64 > ./ftype64 287 if diff ./ftype32 ./ftype64 >/dev/null; then 288 atf_fail "generated binaries do not differ" 289 fi 290 echo "32bit binaries on this platform are:" 291 cat ./ftype32 292 echo "While native (64bit) binaries are:" 293 cat ./ftype64 294 atf_check -s exit:0 -o inline:"hello world\n" ./hello32 295 296 # do another test with static 32bit binaries 297 cat > test.cpp << EOF 298#include <stdio.h> 299#include <stdlib.h> 300int main(void) {printf("hello static world\n");exit(0);} 301EOF 302 atf_check -s exit:0 -o ignore -e ignore c++ -o hello -m32 \ 303 -static test.cpp 304 atf_check -s exit:0 -o inline:"hello static world\n" ./hello 305} 306 307atf_init_test_cases() 308{ 309 310 atf_add_test_case hello 311 atf_add_test_case hello_profile 312 atf_add_test_case hello_pic 313 atf_add_test_case hello_pie 314 atf_add_test_case hello32 315 atf_add_test_case hello_static 316 atf_add_test_case hello_pic_32 317 atf_add_test_case hello_pic_profile 318 atf_add_test_case hello_pic_profile_32 319 atf_add_test_case hello_profile_32 320} 321