#include "gmock/gmock.h" #include "gtest/gtest.h" #include #include "lldb/Utility/StringExtractorGDBRemote.h" #include "lldb/lldb-defines.h" TEST(StringExtractorGDBRemoteTest, GetPidTid) { StringExtractorGDBRemote ex(""); EXPECT_EQ(ex.GetPidTid(0), std::nullopt); // invalid/short values ex.Reset("narf"); EXPECT_EQ(ex.GetPidTid(0), std::nullopt); ex.Reset(";1234"); EXPECT_EQ(ex.GetPidTid(0), std::nullopt); ex.Reset(".1234"); EXPECT_EQ(ex.GetPidTid(0), std::nullopt); ex.Reset("p"); EXPECT_EQ(ex.GetPidTid(0), std::nullopt); ex.Reset("pnarf"); EXPECT_EQ(ex.GetPidTid(0), std::nullopt); ex.Reset("p;1234"); EXPECT_EQ(ex.GetPidTid(0), std::nullopt); ex.Reset("p.1234"); EXPECT_EQ(ex.GetPidTid(0), std::nullopt); ex.Reset("p1234."); EXPECT_EQ(ex.GetPidTid(0), std::nullopt); EXPECT_EQ(ex.GetPidTid(0), std::nullopt); ex.Reset("p1234.;1234"); EXPECT_EQ(ex.GetPidTid(0), std::nullopt); ex.Reset("-2"); EXPECT_EQ(ex.GetPidTid(0), std::nullopt); ex.Reset("p1234.-2"); EXPECT_EQ(ex.GetPidTid(0), std::nullopt); ex.Reset("p-2"); EXPECT_EQ(ex.GetPidTid(0), std::nullopt); ex.Reset("p-2.1234"); EXPECT_EQ(ex.GetPidTid(0), std::nullopt); // overflow ex.Reset("p10000000000000000"); EXPECT_EQ(ex.GetPidTid(0), std::nullopt); ex.Reset("p10000000000000000.0"); EXPECT_EQ(ex.GetPidTid(0), std::nullopt); ex.Reset("10000000000000000"); EXPECT_EQ(ex.GetPidTid(0), std::nullopt); ex.Reset("p0.10000000000000000"); EXPECT_EQ(ex.GetPidTid(0), std::nullopt); ex.Reset("p10000000000000000.10000000000000000"); EXPECT_EQ(ex.GetPidTid(0), std::nullopt); // invalid: all processes but specific thread ex.Reset("p-1.0"); EXPECT_EQ(ex.GetPidTid(100), std::nullopt); ex.Reset("p-1.1234"); EXPECT_EQ(ex.GetPidTid(100), std::nullopt); ex.Reset("p-1.123456789ABCDEF0"); EXPECT_EQ(ex.GetPidTid(100), std::nullopt); // unsupported: pid/tid 0 ex.Reset("0"); EXPECT_EQ(ex.GetPidTid(100), std::nullopt); ex.Reset("p0"); EXPECT_EQ(ex.GetPidTid(100), std::nullopt); ex.Reset("p0.0"); EXPECT_EQ(ex.GetPidTid(100), std::nullopt); ex.Reset("p0.-1"); EXPECT_EQ(ex.GetPidTid(100), std::nullopt); ex.Reset("p0.1234"); EXPECT_EQ(ex.GetPidTid(100), std::nullopt); ex.Reset("p0.123456789ABCDEF0"); EXPECT_EQ(ex.GetPidTid(100), std::nullopt); ex.Reset("p1234.0"); EXPECT_EQ(ex.GetPidTid(100), std::nullopt); ex.Reset("p123456789ABCDEF0.0"); EXPECT_EQ(ex.GetPidTid(100), std::nullopt); // pure thread id ex.Reset("-1"); EXPECT_THAT(*ex.GetPidTid(100), ::testing::Pair(100, StringExtractorGDBRemote::AllThreads)); ex.Reset("1234"); EXPECT_THAT(*ex.GetPidTid(100), ::testing::Pair(100, 0x1234ULL)); ex.Reset("123456789ABCDEF0"); EXPECT_THAT(*ex.GetPidTid(100), ::testing::Pair(100, 0x123456789ABCDEF0ULL)); // pure process id ex.Reset("p-1"); EXPECT_THAT(*ex.GetPidTid(100), ::testing::Pair(StringExtractorGDBRemote::AllProcesses, StringExtractorGDBRemote::AllThreads)); ex.Reset("p1234"); EXPECT_THAT(*ex.GetPidTid(100), ::testing::Pair(0x1234ULL, StringExtractorGDBRemote::AllThreads)); ex.Reset("p123456789ABCDEF0"); EXPECT_THAT(*ex.GetPidTid(100), ::testing::Pair(0x123456789ABCDEF0ULL, StringExtractorGDBRemote::AllThreads)); ex.Reset("pFFFFFFFFFFFFFFFF"); EXPECT_THAT(*ex.GetPidTid(100), ::testing::Pair(StringExtractorGDBRemote::AllProcesses, StringExtractorGDBRemote::AllThreads)); // combined thread id + process id ex.Reset("p-1.-1"); EXPECT_THAT(*ex.GetPidTid(100), ::testing::Pair(StringExtractorGDBRemote::AllProcesses, StringExtractorGDBRemote::AllThreads)); ex.Reset("p1234.-1"); EXPECT_THAT(*ex.GetPidTid(100), ::testing::Pair(0x1234ULL, StringExtractorGDBRemote::AllThreads)); ex.Reset("p1234.123456789ABCDEF0"); EXPECT_THAT(*ex.GetPidTid(100), ::testing::Pair(0x1234ULL, 0x123456789ABCDEF0ULL)); ex.Reset("p123456789ABCDEF0.-1"); EXPECT_THAT(*ex.GetPidTid(100), ::testing::Pair(0x123456789ABCDEF0ULL, StringExtractorGDBRemote::AllThreads)); ex.Reset("p123456789ABCDEF0.1234"); EXPECT_THAT(*ex.GetPidTid(100), ::testing::Pair(0x123456789ABCDEF0ULL, 0x1234ULL)); ex.Reset("p123456789ABCDEF0.123456789ABCDEF0"); EXPECT_THAT(*ex.GetPidTid(100), ::testing::Pair(0x123456789ABCDEF0ULL, 0x123456789ABCDEF0ULL)); ex.Reset("p123456789ABCDEF0.123456789ABCDEF0"); EXPECT_THAT(*ex.GetPidTid(100), ::testing::Pair(0x123456789ABCDEF0ULL, 0x123456789ABCDEF0ULL)); } TEST(StringExtractorGDBRemoteTest, GetPidTidMultipleValues) { StringExtractorGDBRemote ex("1234;p12;p1234.-1"); ASSERT_THAT(*ex.GetPidTid(100), ::testing::Pair(100, 0x1234ULL)); ASSERT_EQ(ex.GetChar(), ';'); ASSERT_THAT(*ex.GetPidTid(100), ::testing::Pair(0x12ULL, StringExtractorGDBRemote::AllThreads)); ASSERT_EQ(ex.GetChar(), ';'); ASSERT_THAT(*ex.GetPidTid(100), ::testing::Pair(0x1234ULL, StringExtractorGDBRemote::AllThreads)); }