ptid-selftests.c revision 1.1.1.5 1 1.1 christos /* Self tests for ptid_t for GDB, the GNU debugger.
2 1.1 christos
3 1.1.1.5 christos Copyright (C) 2017-2024 Free Software Foundation, Inc.
4 1.1 christos
5 1.1 christos This file is part of GDB.
6 1.1 christos
7 1.1 christos This program is free software; you can redistribute it and/or modify
8 1.1 christos it under the terms of the GNU General Public License as published by
9 1.1 christos the Free Software Foundation; either version 3 of the License, or
10 1.1 christos (at your option) any later version.
11 1.1 christos
12 1.1 christos This program is distributed in the hope that it will be useful,
13 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 christos GNU General Public License for more details.
16 1.1 christos
17 1.1 christos You should have received a copy of the GNU General Public License
18 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 1.1 christos
20 1.1.1.3 christos #include "gdbsupport/ptid.h"
21 1.1 christos #include <type_traits>
22 1.1 christos
23 1.1 christos namespace selftests {
24 1.1 christos namespace ptid {
25 1.1 christos
26 1.1 christos /* Check that the ptid_t class is POD.
27 1.1 christos
28 1.1 christos This is a requirement for as long as we have ptids embedded in
29 1.1 christos structures allocated with malloc. */
30 1.1 christos
31 1.1.1.5 christos static_assert (gdb::And<std::is_standard_layout<ptid_t>,
32 1.1.1.5 christos std::is_trivial<ptid_t>>::value,
33 1.1.1.5 christos "ptid_t is POD");
34 1.1 christos
35 1.1 christos /* We want to avoid implicit conversion from int to ptid_t. */
36 1.1 christos
37 1.1 christos static_assert (!std::is_convertible<int, ptid_t>::value,
38 1.1 christos "constructor is explicit");
39 1.1 christos
40 1.1 christos /* Build some useful ptids. */
41 1.1 christos
42 1.1 christos static constexpr ptid_t pid = ptid_t (1);
43 1.1 christos static constexpr ptid_t lwp = ptid_t (1, 2, 0);
44 1.1 christos static constexpr ptid_t tid = ptid_t (1, 0, 2);
45 1.1 christos static constexpr ptid_t both = ptid_t (1, 2, 2);
46 1.1 christos
47 1.1 christos /* Build some constexpr version of null_ptid and minus_one_ptid to use in
48 1.1 christos static_assert. Once the real ones are made constexpr, we can get rid of
49 1.1 christos these. */
50 1.1 christos
51 1.1 christos static constexpr ptid_t null = ptid_t::make_null ();
52 1.1 christos static constexpr ptid_t minus_one = ptid_t::make_minus_one ();
53 1.1 christos
54 1.1 christos /* Verify pid. */
55 1.1 christos
56 1.1 christos static_assert (pid.pid () == 1, "pid's pid is right");
57 1.1 christos static_assert (lwp.pid () == 1, "lwp's pid is right");
58 1.1 christos static_assert (tid.pid () == 1, "tid's pid is right");
59 1.1 christos static_assert (both.pid () == 1, "both's pid is right");
60 1.1 christos
61 1.1 christos /* Verify lwp_p. */
62 1.1 christos
63 1.1 christos static_assert (!pid.lwp_p (), "pid's lwp_p is right");
64 1.1 christos static_assert (lwp.lwp_p (), "lwp's lwp_p is right");
65 1.1 christos static_assert (!tid.lwp_p (), "tid's lwp_p is right");
66 1.1 christos static_assert (both.lwp_p (), "both's lwp_p is right");
67 1.1 christos
68 1.1 christos /* Verify lwp. */
69 1.1 christos
70 1.1 christos static_assert (pid.lwp () == 0, "pid's lwp is right");
71 1.1 christos static_assert (lwp.lwp () == 2, "lwp's lwp is right");
72 1.1 christos static_assert (tid.lwp () == 0, "tid's lwp is right");
73 1.1 christos static_assert (both.lwp () == 2, "both's lwp is right");
74 1.1 christos
75 1.1 christos /* Verify tid_p. */
76 1.1 christos
77 1.1 christos static_assert (!pid.tid_p (), "pid's tid_p is right");
78 1.1 christos static_assert (!lwp.tid_p (), "lwp's tid_p is right");
79 1.1 christos static_assert (tid.tid_p (), "tid's tid_p is right");
80 1.1 christos static_assert (both.tid_p (), "both's tid_p is right");
81 1.1 christos
82 1.1 christos /* Verify tid. */
83 1.1 christos
84 1.1 christos static_assert (pid.tid () == 0, "pid's tid is right");
85 1.1 christos static_assert (lwp.tid () == 0, "lwp's tid is right");
86 1.1 christos static_assert (tid.tid () == 2, "tid's tid is right");
87 1.1 christos static_assert (both.tid () == 2, "both's tid is right");
88 1.1 christos
89 1.1 christos /* Verify is_pid. */
90 1.1 christos
91 1.1 christos static_assert (pid.is_pid (), "pid is a pid");
92 1.1 christos static_assert (!lwp.is_pid (), "lwp isn't a pid");
93 1.1 christos static_assert (!tid.is_pid (), "tid isn't a pid");
94 1.1 christos static_assert (!both.is_pid (), "both isn't a pid");
95 1.1 christos static_assert (!null.is_pid (), "null ptid isn't a pid");
96 1.1 christos static_assert (!minus_one.is_pid (), "minus one ptid isn't a pid");
97 1.1 christos
98 1.1 christos /* Verify operator ==. */
99 1.1 christos
100 1.1 christos static_assert (pid == ptid_t (1, 0, 0), "pid operator== is right");
101 1.1 christos static_assert (lwp == ptid_t (1, 2, 0), "lwp operator== is right");
102 1.1 christos static_assert (tid == ptid_t (1, 0, 2), "tid operator== is right");
103 1.1 christos static_assert (both == ptid_t (1, 2, 2), "both operator== is right");
104 1.1 christos
105 1.1 christos /* Verify operator !=. */
106 1.1 christos
107 1.1 christos static_assert (pid != ptid_t (2, 0, 0), "pid isn't equal to a different pid");
108 1.1 christos static_assert (pid != lwp, "pid isn't equal to one of its thread");
109 1.1 christos static_assert (lwp != tid, "lwp isn't equal to tid");
110 1.1 christos static_assert (both != lwp, "both isn't equal to lwp");
111 1.1 christos static_assert (both != tid, "both isn't equal to tid");
112 1.1 christos
113 1.1 christos /* Verify matches against minus_one. */
114 1.1 christos
115 1.1 christos static_assert (pid.matches (minus_one), "pid matches minus one");
116 1.1 christos static_assert (lwp.matches (minus_one), "lwp matches minus one");
117 1.1 christos static_assert (tid.matches (minus_one), "tid matches minus one");
118 1.1 christos static_assert (both.matches (minus_one), "both matches minus one");
119 1.1 christos
120 1.1 christos /* Verify matches against pid. */
121 1.1 christos
122 1.1 christos static_assert (pid.matches (pid), "pid matches pid");
123 1.1 christos static_assert (lwp.matches (pid), "lwp matches pid");
124 1.1 christos static_assert (tid.matches (pid), "tid matches pid");
125 1.1 christos static_assert (both.matches (pid), "both matches pid");
126 1.1 christos static_assert (!ptid_t (2, 0, 0).matches (pid), "other pid doesn't match pid");
127 1.1 christos static_assert (!ptid_t (2, 2, 0).matches (pid), "other lwp doesn't match pid");
128 1.1 christos static_assert (!ptid_t (2, 0, 2).matches (pid), "other tid doesn't match pid");
129 1.1 christos static_assert (!ptid_t (2, 2, 2).matches (pid), "other both doesn't match pid");
130 1.1 christos
131 1.1 christos /* Verify matches against exact matches. */
132 1.1 christos
133 1.1 christos static_assert (!pid.matches (lwp), "pid doesn't match lwp");
134 1.1 christos static_assert (lwp.matches (lwp), "lwp matches lwp");
135 1.1 christos static_assert (!tid.matches (lwp), "tid doesn't match lwp");
136 1.1 christos static_assert (!both.matches (lwp), "both doesn't match lwp");
137 1.1 christos static_assert (!ptid_t (2, 2, 0).matches (lwp), "other lwp doesn't match lwp");
138 1.1 christos
139 1.1 christos static_assert (!pid.matches (tid), "pid doesn't match tid");
140 1.1 christos static_assert (!lwp.matches (tid), "lwp doesn't match tid");
141 1.1 christos static_assert (tid.matches (tid), "tid matches tid");
142 1.1 christos static_assert (!both.matches (tid), "both doesn't match tid");
143 1.1 christos static_assert (!ptid_t (2, 0, 2).matches (tid), "other tid doesn't match tid");
144 1.1 christos
145 1.1 christos static_assert (!pid.matches (both), "pid doesn't match both");
146 1.1 christos static_assert (!lwp.matches (both), "lwp doesn't match both");
147 1.1 christos static_assert (!tid.matches (both), "tid doesn't match both");
148 1.1 christos static_assert (both.matches (both), "both matches both");
149 1.1 christos static_assert (!ptid_t (2, 2, 2).matches (both),
150 1.1 christos "other both doesn't match both");
151 1.1 christos
152 1.1 christos
153 1.1 christos } /* namespace ptid */
154 1.1 christos } /* namespace selftests */
155