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