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