xref: /netbsd-src/external/gpl3/gdb/dist/gdb/unittests/scoped_fd-selftests.c (revision d32db8d4612ca6060a50acb83ce8551b64c2d595)
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