1 /* Self tests for scoped_fd for GDB, the GNU debugger. 2 3 Copyright (C) 2018-2024 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 21 #include "gdbsupport/filestuff.h" 22 #include "gdbsupport/scoped_fd.h" 23 #include "config.h" 24 #include "gdbsupport/selftest.h" 25 26 namespace selftests { 27 namespace scoped_fd { 28 29 /* Test that the file descriptor is closed. */ 30 static void 31 test_destroy () 32 { 33 char filename[] = "scoped_fd-selftest-XXXXXX"; 34 int fd = gdb_mkostemp_cloexec (filename).release (); 35 SELF_CHECK (fd >= 0); 36 37 unlink (filename); 38 errno = 0; 39 { 40 ::scoped_fd sfd (fd); 41 42 SELF_CHECK (sfd.get () == fd); 43 } 44 45 SELF_CHECK (close (fd) == -1 && errno == EBADF); 46 } 47 48 /* Test that the file descriptor can be released. */ 49 static void 50 test_release () 51 { 52 char filename[] = "scoped_fd-selftest-XXXXXX"; 53 int fd = gdb_mkostemp_cloexec (filename).release (); 54 SELF_CHECK (fd >= 0); 55 56 unlink (filename); 57 errno = 0; 58 { 59 ::scoped_fd sfd (fd); 60 61 SELF_CHECK (sfd.release () == fd); 62 } 63 64 SELF_CHECK (close (fd) == 0 || errno != EBADF); 65 } 66 67 /* Test that the file descriptor can be converted to a FILE *. */ 68 static void 69 test_to_file () 70 { 71 char filename[] = "scoped_fd-selftest-XXXXXX"; 72 73 ::scoped_fd sfd = gdb_mkostemp_cloexec (filename); 74 SELF_CHECK (sfd.get () >= 0); 75 76 unlink (filename); 77 78 gdb_file_up file = sfd.to_file ("rw"); 79 SELF_CHECK (file != nullptr); 80 SELF_CHECK (sfd.get () == -1); 81 } 82 83 /* Run selftests. */ 84 static void 85 run_tests () 86 { 87 test_destroy (); 88 test_release (); 89 test_to_file (); 90 } 91 92 } /* namespace scoped_fd */ 93 } /* namespace selftests */ 94 95 void _initialize_scoped_fd_selftests (); 96 void 97 _initialize_scoped_fd_selftests () 98 { 99 selftests::register_test ("scoped_fd", 100 selftests::scoped_fd::run_tests); 101 } 102