1 #include "gmock/gmock.h"
2 #include "gtest/gtest.h"
3 #include <limits.h>
4
5 #include "lldb/Utility/StringExtractorGDBRemote.h"
6 #include "lldb/lldb-defines.h"
7
TEST(StringExtractorGDBRemoteTest,GetPidTid)8 TEST(StringExtractorGDBRemoteTest, GetPidTid) {
9 StringExtractorGDBRemote ex("");
10 EXPECT_EQ(ex.GetPidTid(0), std::nullopt);
11
12 // invalid/short values
13
14 ex.Reset("narf");
15 EXPECT_EQ(ex.GetPidTid(0), std::nullopt);
16
17 ex.Reset(";1234");
18 EXPECT_EQ(ex.GetPidTid(0), std::nullopt);
19
20 ex.Reset(".1234");
21 EXPECT_EQ(ex.GetPidTid(0), std::nullopt);
22
23 ex.Reset("p");
24 EXPECT_EQ(ex.GetPidTid(0), std::nullopt);
25
26 ex.Reset("pnarf");
27 EXPECT_EQ(ex.GetPidTid(0), std::nullopt);
28
29 ex.Reset("p;1234");
30 EXPECT_EQ(ex.GetPidTid(0), std::nullopt);
31
32 ex.Reset("p.1234");
33 EXPECT_EQ(ex.GetPidTid(0), std::nullopt);
34
35 ex.Reset("p1234.");
36 EXPECT_EQ(ex.GetPidTid(0), std::nullopt);
37
38 EXPECT_EQ(ex.GetPidTid(0), std::nullopt);
39
40 ex.Reset("p1234.;1234");
41 EXPECT_EQ(ex.GetPidTid(0), std::nullopt);
42
43 ex.Reset("-2");
44 EXPECT_EQ(ex.GetPidTid(0), std::nullopt);
45
46 ex.Reset("p1234.-2");
47 EXPECT_EQ(ex.GetPidTid(0), std::nullopt);
48
49 ex.Reset("p-2");
50 EXPECT_EQ(ex.GetPidTid(0), std::nullopt);
51
52 ex.Reset("p-2.1234");
53 EXPECT_EQ(ex.GetPidTid(0), std::nullopt);
54
55 // overflow
56
57 ex.Reset("p10000000000000000");
58 EXPECT_EQ(ex.GetPidTid(0), std::nullopt);
59
60 ex.Reset("p10000000000000000.0");
61 EXPECT_EQ(ex.GetPidTid(0), std::nullopt);
62
63 ex.Reset("10000000000000000");
64 EXPECT_EQ(ex.GetPidTid(0), std::nullopt);
65
66 ex.Reset("p0.10000000000000000");
67 EXPECT_EQ(ex.GetPidTid(0), std::nullopt);
68
69 ex.Reset("p10000000000000000.10000000000000000");
70 EXPECT_EQ(ex.GetPidTid(0), std::nullopt);
71
72 // invalid: all processes but specific thread
73
74 ex.Reset("p-1.0");
75 EXPECT_EQ(ex.GetPidTid(100), std::nullopt);
76
77 ex.Reset("p-1.1234");
78 EXPECT_EQ(ex.GetPidTid(100), std::nullopt);
79
80 ex.Reset("p-1.123456789ABCDEF0");
81 EXPECT_EQ(ex.GetPidTid(100), std::nullopt);
82
83 // unsupported: pid/tid 0
84
85 ex.Reset("0");
86 EXPECT_EQ(ex.GetPidTid(100), std::nullopt);
87
88 ex.Reset("p0");
89 EXPECT_EQ(ex.GetPidTid(100), std::nullopt);
90
91 ex.Reset("p0.0");
92 EXPECT_EQ(ex.GetPidTid(100), std::nullopt);
93
94 ex.Reset("p0.-1");
95 EXPECT_EQ(ex.GetPidTid(100), std::nullopt);
96
97 ex.Reset("p0.1234");
98 EXPECT_EQ(ex.GetPidTid(100), std::nullopt);
99
100 ex.Reset("p0.123456789ABCDEF0");
101 EXPECT_EQ(ex.GetPidTid(100), std::nullopt);
102
103 ex.Reset("p1234.0");
104 EXPECT_EQ(ex.GetPidTid(100), std::nullopt);
105
106 ex.Reset("p123456789ABCDEF0.0");
107 EXPECT_EQ(ex.GetPidTid(100), std::nullopt);
108
109 // pure thread id
110
111 ex.Reset("-1");
112 EXPECT_THAT(*ex.GetPidTid(100),
113 ::testing::Pair(100, StringExtractorGDBRemote::AllThreads));
114
115 ex.Reset("1234");
116 EXPECT_THAT(*ex.GetPidTid(100), ::testing::Pair(100, 0x1234ULL));
117
118 ex.Reset("123456789ABCDEF0");
119 EXPECT_THAT(*ex.GetPidTid(100), ::testing::Pair(100, 0x123456789ABCDEF0ULL));
120
121 // pure process id
122
123 ex.Reset("p-1");
124 EXPECT_THAT(*ex.GetPidTid(100),
125 ::testing::Pair(StringExtractorGDBRemote::AllProcesses,
126 StringExtractorGDBRemote::AllThreads));
127
128 ex.Reset("p1234");
129 EXPECT_THAT(*ex.GetPidTid(100),
130 ::testing::Pair(0x1234ULL, StringExtractorGDBRemote::AllThreads));
131
132 ex.Reset("p123456789ABCDEF0");
133 EXPECT_THAT(*ex.GetPidTid(100),
134 ::testing::Pair(0x123456789ABCDEF0ULL,
135 StringExtractorGDBRemote::AllThreads));
136
137 ex.Reset("pFFFFFFFFFFFFFFFF");
138 EXPECT_THAT(*ex.GetPidTid(100),
139 ::testing::Pair(StringExtractorGDBRemote::AllProcesses,
140 StringExtractorGDBRemote::AllThreads));
141
142 // combined thread id + process id
143
144 ex.Reset("p-1.-1");
145 EXPECT_THAT(*ex.GetPidTid(100),
146 ::testing::Pair(StringExtractorGDBRemote::AllProcesses,
147 StringExtractorGDBRemote::AllThreads));
148
149 ex.Reset("p1234.-1");
150 EXPECT_THAT(*ex.GetPidTid(100),
151 ::testing::Pair(0x1234ULL, StringExtractorGDBRemote::AllThreads));
152
153 ex.Reset("p1234.123456789ABCDEF0");
154 EXPECT_THAT(*ex.GetPidTid(100),
155 ::testing::Pair(0x1234ULL, 0x123456789ABCDEF0ULL));
156
157 ex.Reset("p123456789ABCDEF0.-1");
158 EXPECT_THAT(*ex.GetPidTid(100),
159 ::testing::Pair(0x123456789ABCDEF0ULL,
160 StringExtractorGDBRemote::AllThreads));
161
162 ex.Reset("p123456789ABCDEF0.1234");
163 EXPECT_THAT(*ex.GetPidTid(100),
164 ::testing::Pair(0x123456789ABCDEF0ULL, 0x1234ULL));
165
166 ex.Reset("p123456789ABCDEF0.123456789ABCDEF0");
167 EXPECT_THAT(*ex.GetPidTid(100),
168 ::testing::Pair(0x123456789ABCDEF0ULL, 0x123456789ABCDEF0ULL));
169
170 ex.Reset("p123456789ABCDEF0.123456789ABCDEF0");
171 EXPECT_THAT(*ex.GetPidTid(100),
172 ::testing::Pair(0x123456789ABCDEF0ULL, 0x123456789ABCDEF0ULL));
173 }
174
TEST(StringExtractorGDBRemoteTest,GetPidTidMultipleValues)175 TEST(StringExtractorGDBRemoteTest, GetPidTidMultipleValues) {
176 StringExtractorGDBRemote ex("1234;p12;p1234.-1");
177 ASSERT_THAT(*ex.GetPidTid(100), ::testing::Pair(100, 0x1234ULL));
178 ASSERT_EQ(ex.GetChar(), ';');
179 ASSERT_THAT(*ex.GetPidTid(100),
180 ::testing::Pair(0x12ULL, StringExtractorGDBRemote::AllThreads));
181 ASSERT_EQ(ex.GetChar(), ';');
182 ASSERT_THAT(*ex.GetPidTid(100),
183 ::testing::Pair(0x1234ULL, StringExtractorGDBRemote::AllThreads));
184 }
185