1 # $NetBSD: t_gcov.sh,v 1.1 2025/01/18 22:31:22 rillig Exp $ 2 # 3 # Copyright (c) 2025 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 after_exec_head() 29 { 30 } 31 after_exec_body() 32 { 33 atf_require_prog cat 34 atf_require_prog gcc 35 atf_require_prog gcov 36 atf_require_prog grep 37 38 cat <<EOF >prog.c 39 #include <unistd.h> 40 41 int 42 main(void) 43 { 44 pid_t pid = vfork(); 45 switch (pid) { 46 case 0: 47 execl("/bin/sh", "sh", "-c", ":", (const char *)0); 48 /* FALLTHROUGH */ 49 case -1: 50 write(2, "error\n", 6); 51 _exit(1); 52 } 53 54 write(1, "reached\n", 8); 55 return 0; 56 } 57 EOF 58 59 cat <<EOF >prog.c.gcov.expected 60 -: 0:Source:prog.c 61 -: 0:Graph:prog.gcno 62 -: 0:Data:prog.gcda 63 -: 0:Runs:1 64 -: 1:#include <unistd.h> 65 -: 2: 66 -: 3:int 67 1: 4:main(void) 68 -: 5:{ 69 1: 6: pid_t pid = vfork(); 70 1: 7: switch (pid) { 71 1: 8: case 0: 72 1: 9: execl("/bin/sh", "sh", "-c", ":", (const char *)0); 73 -: 10: /* FALLTHROUGH */ 74 #####: 11: case -1: 75 #####: 12: write(2, "error\n", 6); 76 #####: 13: _exit(1); 77 -: 14: } 78 -: 15: 79 #####: 16: write(1, "reached\n", 8); 80 #####: 17: return 0; 81 -: 18:} 82 EOF 83 84 atf_check \ 85 gcc --coverage -c prog.c 86 atf_check \ 87 gcc --coverage -o prog prog.o 88 atf_check -o inline:'reached\n' \ 89 ./prog 90 atf_check -o ignore \ 91 gcov prog.c 92 93 atf_check -o file:prog.c.gcov.expected \ 94 cat prog.c.gcov 95 96 # FIXME: The code was reached once but is reported as unreached. 97 atf_check -o ignore \ 98 grep "#####.*reached" prog.c.gcov 99 } 100 101 atf_init_test_cases() 102 { 103 atf_add_test_case after_exec 104 } 105