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 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).value(), 113 ::testing::Pair(100, StringExtractorGDBRemote::AllThreads)); 114 115 ex.Reset("1234"); 116 EXPECT_THAT(ex.GetPidTid(100).value(), ::testing::Pair(100, 0x1234ULL)); 117 118 ex.Reset("123456789ABCDEF0"); 119 EXPECT_THAT(ex.GetPidTid(100).value(), 120 ::testing::Pair(100, 0x123456789ABCDEF0ULL)); 121 122 // pure process id 123 124 ex.Reset("p-1"); 125 EXPECT_THAT(ex.GetPidTid(100).value(), 126 ::testing::Pair(StringExtractorGDBRemote::AllProcesses, 127 StringExtractorGDBRemote::AllThreads)); 128 129 ex.Reset("p1234"); 130 EXPECT_THAT(ex.GetPidTid(100).value(), 131 ::testing::Pair(0x1234ULL, StringExtractorGDBRemote::AllThreads)); 132 133 ex.Reset("p123456789ABCDEF0"); 134 EXPECT_THAT(ex.GetPidTid(100).value(), 135 ::testing::Pair(0x123456789ABCDEF0ULL, 136 StringExtractorGDBRemote::AllThreads)); 137 138 ex.Reset("pFFFFFFFFFFFFFFFF"); 139 EXPECT_THAT(ex.GetPidTid(100).value(), 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).value(), 147 ::testing::Pair(StringExtractorGDBRemote::AllProcesses, 148 StringExtractorGDBRemote::AllThreads)); 149 150 ex.Reset("p1234.-1"); 151 EXPECT_THAT(ex.GetPidTid(100).value(), 152 ::testing::Pair(0x1234ULL, StringExtractorGDBRemote::AllThreads)); 153 154 ex.Reset("p1234.123456789ABCDEF0"); 155 EXPECT_THAT(ex.GetPidTid(100).value(), 156 ::testing::Pair(0x1234ULL, 0x123456789ABCDEF0ULL)); 157 158 ex.Reset("p123456789ABCDEF0.-1"); 159 EXPECT_THAT(ex.GetPidTid(100).value(), 160 ::testing::Pair(0x123456789ABCDEF0ULL, 161 StringExtractorGDBRemote::AllThreads)); 162 163 ex.Reset("p123456789ABCDEF0.1234"); 164 EXPECT_THAT(ex.GetPidTid(100).value(), 165 ::testing::Pair(0x123456789ABCDEF0ULL, 0x1234ULL)); 166 167 ex.Reset("p123456789ABCDEF0.123456789ABCDEF0"); 168 EXPECT_THAT(ex.GetPidTid(100).value(), 169 ::testing::Pair(0x123456789ABCDEF0ULL, 0x123456789ABCDEF0ULL)); 170 171 ex.Reset("p123456789ABCDEF0.123456789ABCDEF0"); 172 EXPECT_THAT(ex.GetPidTid(100).value(), 173 ::testing::Pair(0x123456789ABCDEF0ULL, 0x123456789ABCDEF0ULL)); 174 } 175 176 TEST(StringExtractorGDBRemoteTest, GetPidTidMultipleValues) { 177 StringExtractorGDBRemote ex("1234;p12;p1234.-1"); 178 ASSERT_THAT(ex.GetPidTid(100).value(), ::testing::Pair(100, 0x1234ULL)); 179 ASSERT_EQ(ex.GetChar(), ';'); 180 ASSERT_THAT(ex.GetPidTid(100).value(), 181 ::testing::Pair(0x12ULL, StringExtractorGDBRemote::AllThreads)); 182 ASSERT_EQ(ex.GetChar(), ';'); 183 ASSERT_THAT(ex.GetPidTid(100).value(), 184 ::testing::Pair(0x1234ULL, StringExtractorGDBRemote::AllThreads)); 185 } 186