xref: /llvm-project/lldb/unittests/Utility/StringExtractorGDBRemoteTest.cpp (revision f43886e7ba5abf9ee8c4d3f0ffbd18eee724466f)
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