1 /* Self tests for scoped_fd for GDB, the GNU debugger. 2 3 Copyright (C) 2018-2023 Free Software Foundation, Inc. 4 5 This file is part of GDB. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 20 #include "defs.h" 21 22 #include "gdbsupport/filestuff.h" 23 #include "gdbsupport/scoped_fd.h" 24 #include "config.h" 25 #include "gdbsupport/selftest.h" 26 27 namespace selftests { 28 namespace scoped_fd { 29 30 /* Test that the file descriptor is closed. */ 31 static void 32 test_destroy () 33 { 34 char filename[] = "scoped_fd-selftest-XXXXXX"; 35 int fd = gdb_mkostemp_cloexec (filename).release (); 36 SELF_CHECK (fd >= 0); 37 38 unlink (filename); 39 errno = 0; 40 { 41 ::scoped_fd sfd (fd); 42 43 SELF_CHECK (sfd.get () == fd); 44 } 45 46 SELF_CHECK (close (fd) == -1 && errno == EBADF); 47 } 48 49 /* Test that the file descriptor can be released. */ 50 static void 51 test_release () 52 { 53 char filename[] = "scoped_fd-selftest-XXXXXX"; 54 int fd = gdb_mkostemp_cloexec (filename).release (); 55 SELF_CHECK (fd >= 0); 56 57 unlink (filename); 58 errno = 0; 59 { 60 ::scoped_fd sfd (fd); 61 62 SELF_CHECK (sfd.release () == fd); 63 } 64 65 SELF_CHECK (close (fd) == 0 || errno != EBADF); 66 } 67 68 /* Test that the file descriptor can be converted to a FILE *. */ 69 static void 70 test_to_file () 71 { 72 char filename[] = "scoped_fd-selftest-XXXXXX"; 73 74 ::scoped_fd sfd = gdb_mkostemp_cloexec (filename); 75 SELF_CHECK (sfd.get () >= 0); 76 77 unlink (filename); 78 79 gdb_file_up file = sfd.to_file ("rw"); 80 SELF_CHECK (file != nullptr); 81 SELF_CHECK (sfd.get () == -1); 82 } 83 84 /* Run selftests. */ 85 static void 86 run_tests () 87 { 88 test_destroy (); 89 test_release (); 90 test_to_file (); 91 } 92 93 } /* namespace scoped_fd */ 94 } /* namespace selftests */ 95 96 void _initialize_scoped_fd_selftests (); 97 void 98 _initialize_scoped_fd_selftests () 99 { 100 selftests::register_test ("scoped_fd", 101 selftests::scoped_fd::run_tests); 102 } 103