16c1a8039SMichał Górny #include "gmock/gmock.h"
26c1a8039SMichał Górny #include "gtest/gtest.h"
36c1a8039SMichał Górny #include <limits.h>
46c1a8039SMichał Górny 
56c1a8039SMichał Górny #include "lldb/Utility/StringExtractorGDBRemote.h"
66c1a8039SMichał Górny #include "lldb/lldb-defines.h"
76c1a8039SMichał Górny 
TEST(StringExtractorGDBRemoteTest,GetPidTid)86c1a8039SMichał Górny TEST(StringExtractorGDBRemoteTest, GetPidTid) {
96c1a8039SMichał Górny   StringExtractorGDBRemote ex("");
106c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(0), llvm::None);
116c1a8039SMichał Górny 
126c1a8039SMichał Górny   // invalid/short values
136c1a8039SMichał Górny 
146c1a8039SMichał Górny   ex.Reset("narf");
156c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(0), llvm::None);
166c1a8039SMichał Górny 
176c1a8039SMichał Górny   ex.Reset(";1234");
186c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(0), llvm::None);
196c1a8039SMichał Górny 
206c1a8039SMichał Górny   ex.Reset(".1234");
216c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(0), llvm::None);
226c1a8039SMichał Górny 
236c1a8039SMichał Górny   ex.Reset("p");
246c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(0), llvm::None);
256c1a8039SMichał Górny 
266c1a8039SMichał Górny   ex.Reset("pnarf");
276c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(0), llvm::None);
286c1a8039SMichał Górny 
296c1a8039SMichał Górny   ex.Reset("p;1234");
306c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(0), llvm::None);
316c1a8039SMichał Górny 
326c1a8039SMichał Górny   ex.Reset("p.1234");
336c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(0), llvm::None);
346c1a8039SMichał Górny 
356c1a8039SMichał Górny   ex.Reset("p1234.");
366c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(0), llvm::None);
376c1a8039SMichał Górny 
386c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(0), llvm::None);
396c1a8039SMichał Górny 
406c1a8039SMichał Górny   ex.Reset("p1234.;1234");
416c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(0), llvm::None);
426c1a8039SMichał Górny 
436c1a8039SMichał Górny   ex.Reset("-2");
446c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(0), llvm::None);
456c1a8039SMichał Górny 
466c1a8039SMichał Górny   ex.Reset("p1234.-2");
476c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(0), llvm::None);
486c1a8039SMichał Górny 
496c1a8039SMichał Górny   ex.Reset("p-2");
506c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(0), llvm::None);
516c1a8039SMichał Górny 
526c1a8039SMichał Górny   ex.Reset("p-2.1234");
536c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(0), llvm::None);
546c1a8039SMichał Górny 
556c1a8039SMichał Górny   // overflow
566c1a8039SMichał Górny 
576c1a8039SMichał Górny   ex.Reset("p10000000000000000");
586c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(0), llvm::None);
596c1a8039SMichał Górny 
606c1a8039SMichał Górny   ex.Reset("p10000000000000000.0");
616c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(0), llvm::None);
626c1a8039SMichał Górny 
636c1a8039SMichał Górny   ex.Reset("10000000000000000");
646c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(0), llvm::None);
656c1a8039SMichał Górny 
666c1a8039SMichał Górny   ex.Reset("p0.10000000000000000");
676c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(0), llvm::None);
686c1a8039SMichał Górny 
696c1a8039SMichał Górny   ex.Reset("p10000000000000000.10000000000000000");
706c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(0), llvm::None);
716c1a8039SMichał Górny 
726c1a8039SMichał Górny   // invalid: all processes but specific thread
736c1a8039SMichał Górny 
746c1a8039SMichał Górny   ex.Reset("p-1.0");
756c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(100), llvm::None);
766c1a8039SMichał Górny 
776c1a8039SMichał Górny   ex.Reset("p-1.1234");
786c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(100), llvm::None);
796c1a8039SMichał Górny 
806c1a8039SMichał Górny   ex.Reset("p-1.123456789ABCDEF0");
816c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(100), llvm::None);
826c1a8039SMichał Górny 
836c1a8039SMichał Górny   // unsupported: pid/tid 0
846c1a8039SMichał Górny 
856c1a8039SMichał Górny   ex.Reset("0");
866c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(100), llvm::None);
876c1a8039SMichał Górny 
886c1a8039SMichał Górny   ex.Reset("p0");
896c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(100), llvm::None);
906c1a8039SMichał Górny 
916c1a8039SMichał Górny   ex.Reset("p0.0");
926c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(100), llvm::None);
936c1a8039SMichał Górny 
946c1a8039SMichał Górny   ex.Reset("p0.-1");
956c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(100), llvm::None);
966c1a8039SMichał Górny 
976c1a8039SMichał Górny   ex.Reset("p0.1234");
986c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(100), llvm::None);
996c1a8039SMichał Górny 
1006c1a8039SMichał Górny   ex.Reset("p0.123456789ABCDEF0");
1016c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(100), llvm::None);
1026c1a8039SMichał Górny 
1036c1a8039SMichał Górny   ex.Reset("p1234.0");
1046c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(100), llvm::None);
1056c1a8039SMichał Górny 
1066c1a8039SMichał Górny   ex.Reset("p123456789ABCDEF0.0");
1076c1a8039SMichał Górny   EXPECT_EQ(ex.GetPidTid(100), llvm::None);
1086c1a8039SMichał Górny 
1096c1a8039SMichał Górny   // pure thread id
1106c1a8039SMichał Górny 
1116c1a8039SMichał Górny   ex.Reset("-1");
112*5cff5142SKazu Hirata   EXPECT_THAT(ex.GetPidTid(100).value(),
1136c1a8039SMichał Górny               ::testing::Pair(100, StringExtractorGDBRemote::AllThreads));
1146c1a8039SMichał Górny 
1156c1a8039SMichał Górny   ex.Reset("1234");
116*5cff5142SKazu Hirata   EXPECT_THAT(ex.GetPidTid(100).value(), ::testing::Pair(100, 0x1234ULL));
1176c1a8039SMichał Górny 
1186c1a8039SMichał Górny   ex.Reset("123456789ABCDEF0");
119*5cff5142SKazu Hirata   EXPECT_THAT(ex.GetPidTid(100).value(),
1206c1a8039SMichał Górny               ::testing::Pair(100, 0x123456789ABCDEF0ULL));
1216c1a8039SMichał Górny 
1226c1a8039SMichał Górny   // pure process id
1236c1a8039SMichał Górny 
1246c1a8039SMichał Górny   ex.Reset("p-1");
125*5cff5142SKazu Hirata   EXPECT_THAT(ex.GetPidTid(100).value(),
1266c1a8039SMichał Górny               ::testing::Pair(StringExtractorGDBRemote::AllProcesses,
1276c1a8039SMichał Górny                               StringExtractorGDBRemote::AllThreads));
1286c1a8039SMichał Górny 
1296c1a8039SMichał Górny   ex.Reset("p1234");
130*5cff5142SKazu Hirata   EXPECT_THAT(ex.GetPidTid(100).value(),
1316c1a8039SMichał Górny               ::testing::Pair(0x1234ULL, StringExtractorGDBRemote::AllThreads));
1326c1a8039SMichał Górny 
1336c1a8039SMichał Górny   ex.Reset("p123456789ABCDEF0");
134*5cff5142SKazu Hirata   EXPECT_THAT(ex.GetPidTid(100).value(),
1356c1a8039SMichał Górny               ::testing::Pair(0x123456789ABCDEF0ULL,
1366c1a8039SMichał Górny                               StringExtractorGDBRemote::AllThreads));
1376c1a8039SMichał Górny 
1386c1a8039SMichał Górny   ex.Reset("pFFFFFFFFFFFFFFFF");
139*5cff5142SKazu Hirata   EXPECT_THAT(ex.GetPidTid(100).value(),
1406c1a8039SMichał Górny               ::testing::Pair(StringExtractorGDBRemote::AllProcesses,
1416c1a8039SMichał Górny                               StringExtractorGDBRemote::AllThreads));
1426c1a8039SMichał Górny 
1436c1a8039SMichał Górny   // combined thread id + process id
1446c1a8039SMichał Górny 
1456c1a8039SMichał Górny   ex.Reset("p-1.-1");
146*5cff5142SKazu Hirata   EXPECT_THAT(ex.GetPidTid(100).value(),
1476c1a8039SMichał Górny               ::testing::Pair(StringExtractorGDBRemote::AllProcesses,
1486c1a8039SMichał Górny                               StringExtractorGDBRemote::AllThreads));
1496c1a8039SMichał Górny 
1506c1a8039SMichał Górny   ex.Reset("p1234.-1");
151*5cff5142SKazu Hirata   EXPECT_THAT(ex.GetPidTid(100).value(),
1526c1a8039SMichał Górny               ::testing::Pair(0x1234ULL, StringExtractorGDBRemote::AllThreads));
1536c1a8039SMichał Górny 
1546c1a8039SMichał Górny   ex.Reset("p1234.123456789ABCDEF0");
155*5cff5142SKazu Hirata   EXPECT_THAT(ex.GetPidTid(100).value(),
1566c1a8039SMichał Górny               ::testing::Pair(0x1234ULL, 0x123456789ABCDEF0ULL));
1576c1a8039SMichał Górny 
1586c1a8039SMichał Górny   ex.Reset("p123456789ABCDEF0.-1");
159*5cff5142SKazu Hirata   EXPECT_THAT(ex.GetPidTid(100).value(),
1606c1a8039SMichał Górny               ::testing::Pair(0x123456789ABCDEF0ULL,
1616c1a8039SMichał Górny                               StringExtractorGDBRemote::AllThreads));
1626c1a8039SMichał Górny 
1636c1a8039SMichał Górny   ex.Reset("p123456789ABCDEF0.1234");
164*5cff5142SKazu Hirata   EXPECT_THAT(ex.GetPidTid(100).value(),
1656c1a8039SMichał Górny               ::testing::Pair(0x123456789ABCDEF0ULL, 0x1234ULL));
1666c1a8039SMichał Górny 
1676c1a8039SMichał Górny   ex.Reset("p123456789ABCDEF0.123456789ABCDEF0");
168*5cff5142SKazu Hirata   EXPECT_THAT(ex.GetPidTid(100).value(),
1696c1a8039SMichał Górny               ::testing::Pair(0x123456789ABCDEF0ULL, 0x123456789ABCDEF0ULL));
1706c1a8039SMichał Górny 
1716c1a8039SMichał Górny   ex.Reset("p123456789ABCDEF0.123456789ABCDEF0");
172*5cff5142SKazu Hirata   EXPECT_THAT(ex.GetPidTid(100).value(),
1736c1a8039SMichał Górny               ::testing::Pair(0x123456789ABCDEF0ULL, 0x123456789ABCDEF0ULL));
1746c1a8039SMichał Górny }
1756c1a8039SMichał Górny 
TEST(StringExtractorGDBRemoteTest,GetPidTidMultipleValues)1766c1a8039SMichał Górny TEST(StringExtractorGDBRemoteTest, GetPidTidMultipleValues) {
1776c1a8039SMichał Górny   StringExtractorGDBRemote ex("1234;p12;p1234.-1");
178*5cff5142SKazu Hirata   ASSERT_THAT(ex.GetPidTid(100).value(), ::testing::Pair(100, 0x1234ULL));
1796c1a8039SMichał Górny   ASSERT_EQ(ex.GetChar(), ';');
180*5cff5142SKazu Hirata   ASSERT_THAT(ex.GetPidTid(100).value(),
1816c1a8039SMichał Górny               ::testing::Pair(0x12ULL, StringExtractorGDBRemote::AllThreads));
1826c1a8039SMichał Górny   ASSERT_EQ(ex.GetChar(), ';');
183*5cff5142SKazu Hirata   ASSERT_THAT(ex.GetPidTid(100).value(),
1846c1a8039SMichał Górny               ::testing::Pair(0x1234ULL, StringExtractorGDBRemote::AllThreads));
1856c1a8039SMichał Górny }
186