1719ec93aSZachary Turner #include <limits.h> 2719ec93aSZachary Turner #include "gtest/gtest.h" 3719ec93aSZachary Turner 4*28529f60SBruce Mitchener #include "lldb/Utility/StringExtractor.h" 5719ec93aSZachary Turner 6719ec93aSZachary Turner namespace 7719ec93aSZachary Turner { 8719ec93aSZachary Turner class StringExtractorTest: public ::testing::Test 9719ec93aSZachary Turner { 10719ec93aSZachary Turner }; 11719ec93aSZachary Turner } 12719ec93aSZachary Turner 13719ec93aSZachary Turner TEST_F (StringExtractorTest, InitEmpty) 14719ec93aSZachary Turner { 15719ec93aSZachary Turner const char kEmptyString[] = ""; 16719ec93aSZachary Turner StringExtractor ex (kEmptyString); 17719ec93aSZachary Turner 18719ec93aSZachary Turner ASSERT_EQ (true, ex.IsGood()); 193dfb86b6SDavid Blaikie ASSERT_EQ (0u, ex.GetFilePos()); 20719ec93aSZachary Turner ASSERT_STREQ (kEmptyString, ex.GetStringRef().c_str()); 21719ec93aSZachary Turner ASSERT_EQ (true, ex.Empty()); 223dfb86b6SDavid Blaikie ASSERT_EQ (0u, ex.GetBytesLeft()); 23719ec93aSZachary Turner ASSERT_EQ (nullptr, ex.Peek()); 24719ec93aSZachary Turner } 25719ec93aSZachary Turner 26719ec93aSZachary Turner TEST_F (StringExtractorTest, InitMisc) 27719ec93aSZachary Turner { 28719ec93aSZachary Turner const char kInitMiscString[] = "Hello, StringExtractor!"; 29719ec93aSZachary Turner StringExtractor ex (kInitMiscString); 30719ec93aSZachary Turner 31719ec93aSZachary Turner ASSERT_EQ (true, ex.IsGood()); 323dfb86b6SDavid Blaikie ASSERT_EQ (0u, ex.GetFilePos()); 33719ec93aSZachary Turner ASSERT_STREQ (kInitMiscString, ex.GetStringRef().c_str()); 34719ec93aSZachary Turner ASSERT_EQ (false, ex.Empty()); 35719ec93aSZachary Turner ASSERT_EQ (sizeof(kInitMiscString)-1, ex.GetBytesLeft()); 36719ec93aSZachary Turner ASSERT_EQ (kInitMiscString[0], *ex.Peek()); 37719ec93aSZachary Turner } 38719ec93aSZachary Turner 39719ec93aSZachary Turner TEST_F (StringExtractorTest, DecodeHexU8_Underflow) 40719ec93aSZachary Turner { 41719ec93aSZachary Turner const char kEmptyString[] = ""; 42719ec93aSZachary Turner StringExtractor ex (kEmptyString); 43719ec93aSZachary Turner 44719ec93aSZachary Turner ASSERT_EQ (-1, ex.DecodeHexU8()); 45719ec93aSZachary Turner ASSERT_EQ (true, ex.IsGood()); 463dfb86b6SDavid Blaikie ASSERT_EQ (0u, ex.GetFilePos()); 47719ec93aSZachary Turner ASSERT_EQ (true, ex.Empty()); 483dfb86b6SDavid Blaikie ASSERT_EQ (0u, ex.GetBytesLeft()); 49719ec93aSZachary Turner ASSERT_EQ (nullptr, ex.Peek()); 50719ec93aSZachary Turner } 51719ec93aSZachary Turner 52719ec93aSZachary Turner TEST_F (StringExtractorTest, DecodeHexU8_Underflow2) 53719ec93aSZachary Turner { 54719ec93aSZachary Turner const char kEmptyString[] = "1"; 55719ec93aSZachary Turner StringExtractor ex (kEmptyString); 56719ec93aSZachary Turner 57719ec93aSZachary Turner ASSERT_EQ (-1, ex.DecodeHexU8()); 58719ec93aSZachary Turner ASSERT_EQ (true, ex.IsGood()); 593dfb86b6SDavid Blaikie ASSERT_EQ (0u, ex.GetFilePos()); 603dfb86b6SDavid Blaikie ASSERT_EQ (1u, ex.GetBytesLeft()); 61719ec93aSZachary Turner ASSERT_EQ ('1', *ex.Peek()); 62719ec93aSZachary Turner } 63719ec93aSZachary Turner 64719ec93aSZachary Turner TEST_F (StringExtractorTest, DecodeHexU8_InvalidHex) 65719ec93aSZachary Turner { 66719ec93aSZachary Turner const char kInvalidHex[] = "xa"; 67719ec93aSZachary Turner StringExtractor ex (kInvalidHex); 68719ec93aSZachary Turner 69719ec93aSZachary Turner ASSERT_EQ (-1, ex.DecodeHexU8()); 70719ec93aSZachary Turner ASSERT_EQ (true, ex.IsGood()); 713dfb86b6SDavid Blaikie ASSERT_EQ (0u, ex.GetFilePos()); 723dfb86b6SDavid Blaikie ASSERT_EQ (2u, ex.GetBytesLeft()); 73719ec93aSZachary Turner ASSERT_EQ ('x', *ex.Peek()); 74719ec93aSZachary Turner } 75719ec93aSZachary Turner 76719ec93aSZachary Turner TEST_F (StringExtractorTest, DecodeHexU8_InvalidHex2) 77719ec93aSZachary Turner { 78719ec93aSZachary Turner const char kInvalidHex[] = "ax"; 79719ec93aSZachary Turner StringExtractor ex (kInvalidHex); 80719ec93aSZachary Turner 81719ec93aSZachary Turner ASSERT_EQ (-1, ex.DecodeHexU8()); 82719ec93aSZachary Turner ASSERT_EQ (true, ex.IsGood()); 833dfb86b6SDavid Blaikie ASSERT_EQ (0u, ex.GetFilePos()); 843dfb86b6SDavid Blaikie ASSERT_EQ (2u, ex.GetBytesLeft()); 85719ec93aSZachary Turner ASSERT_EQ ('a', *ex.Peek()); 86719ec93aSZachary Turner } 87719ec93aSZachary Turner 88719ec93aSZachary Turner TEST_F (StringExtractorTest, DecodeHexU8_Exact) 89719ec93aSZachary Turner { 90719ec93aSZachary Turner const char kValidHexPair[] = "12"; 91719ec93aSZachary Turner StringExtractor ex (kValidHexPair); 92719ec93aSZachary Turner 93719ec93aSZachary Turner ASSERT_EQ (0x12, ex.DecodeHexU8()); 94719ec93aSZachary Turner ASSERT_EQ (true, ex.IsGood()); 953dfb86b6SDavid Blaikie ASSERT_EQ (2u, ex.GetFilePos()); 963dfb86b6SDavid Blaikie ASSERT_EQ (0u, ex.GetBytesLeft()); 97719ec93aSZachary Turner ASSERT_EQ (nullptr, ex.Peek()); 98719ec93aSZachary Turner } 99719ec93aSZachary Turner 100719ec93aSZachary Turner TEST_F (StringExtractorTest, DecodeHexU8_Extra) 101719ec93aSZachary Turner { 102719ec93aSZachary Turner const char kValidHexPair[] = "1234"; 103719ec93aSZachary Turner StringExtractor ex (kValidHexPair); 104719ec93aSZachary Turner 105719ec93aSZachary Turner ASSERT_EQ (0x12, ex.DecodeHexU8()); 106719ec93aSZachary Turner ASSERT_EQ (true, ex.IsGood()); 1073dfb86b6SDavid Blaikie ASSERT_EQ (2u, ex.GetFilePos()); 1083dfb86b6SDavid Blaikie ASSERT_EQ (2u, ex.GetBytesLeft()); 109719ec93aSZachary Turner ASSERT_EQ ('3', *ex.Peek()); 110719ec93aSZachary Turner } 111719ec93aSZachary Turner 112719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexU8_Underflow) 113719ec93aSZachary Turner { 114719ec93aSZachary Turner const char kEmptyString[] = ""; 115719ec93aSZachary Turner StringExtractor ex (kEmptyString); 116719ec93aSZachary Turner 117719ec93aSZachary Turner ASSERT_EQ (0xab, ex.GetHexU8(0xab)); 118719ec93aSZachary Turner ASSERT_EQ (false, ex.IsGood()); 119719ec93aSZachary Turner ASSERT_EQ (UINT64_MAX, ex.GetFilePos()); 120719ec93aSZachary Turner ASSERT_EQ (true, ex.Empty()); 1213dfb86b6SDavid Blaikie ASSERT_EQ (0u, ex.GetBytesLeft()); 122719ec93aSZachary Turner ASSERT_EQ (nullptr, ex.Peek()); 123719ec93aSZachary Turner } 124719ec93aSZachary Turner 125719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexU8_Underflow2) 126719ec93aSZachary Turner { 127719ec93aSZachary Turner const char kOneNibble[] = "1"; 128719ec93aSZachary Turner StringExtractor ex (kOneNibble); 129719ec93aSZachary Turner 130719ec93aSZachary Turner ASSERT_EQ (0xbc, ex.GetHexU8(0xbc)); 131719ec93aSZachary Turner ASSERT_EQ (false, ex.IsGood()); 132719ec93aSZachary Turner ASSERT_EQ (UINT64_MAX, ex.GetFilePos()); 1333dfb86b6SDavid Blaikie ASSERT_EQ (0u, ex.GetBytesLeft()); 134719ec93aSZachary Turner ASSERT_EQ (nullptr, ex.Peek()); 135719ec93aSZachary Turner } 136719ec93aSZachary Turner 137719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexU8_InvalidHex) 138719ec93aSZachary Turner { 139719ec93aSZachary Turner const char kInvalidHex[] = "xx"; 140719ec93aSZachary Turner StringExtractor ex (kInvalidHex); 141719ec93aSZachary Turner 142719ec93aSZachary Turner ASSERT_EQ (0xcd, ex.GetHexU8(0xcd)); 143719ec93aSZachary Turner ASSERT_EQ (false, ex.IsGood()); 144719ec93aSZachary Turner ASSERT_EQ (UINT64_MAX, ex.GetFilePos()); 1453dfb86b6SDavid Blaikie ASSERT_EQ (0u, ex.GetBytesLeft()); 146719ec93aSZachary Turner ASSERT_EQ (nullptr, ex.Peek()); 147719ec93aSZachary Turner } 148719ec93aSZachary Turner 149719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexU8_Exact) 150719ec93aSZachary Turner { 151719ec93aSZachary Turner const char kValidHexPair[] = "12"; 152719ec93aSZachary Turner StringExtractor ex (kValidHexPair); 153719ec93aSZachary Turner 154719ec93aSZachary Turner ASSERT_EQ (0x12, ex.GetHexU8(0x12)); 155719ec93aSZachary Turner ASSERT_EQ (true, ex.IsGood()); 1563dfb86b6SDavid Blaikie ASSERT_EQ (2u, ex.GetFilePos()); 1573dfb86b6SDavid Blaikie ASSERT_EQ (0u, ex.GetBytesLeft()); 158719ec93aSZachary Turner ASSERT_EQ (nullptr, ex.Peek()); 159719ec93aSZachary Turner } 160719ec93aSZachary Turner 161719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexU8_Extra) 162719ec93aSZachary Turner { 163719ec93aSZachary Turner const char kValidHexPair[] = "1234"; 164719ec93aSZachary Turner StringExtractor ex (kValidHexPair); 165719ec93aSZachary Turner 166719ec93aSZachary Turner ASSERT_EQ (0x12, ex.GetHexU8(0x12)); 167719ec93aSZachary Turner ASSERT_EQ (true, ex.IsGood()); 1683dfb86b6SDavid Blaikie ASSERT_EQ (2u, ex.GetFilePos()); 1693dfb86b6SDavid Blaikie ASSERT_EQ (2u, ex.GetBytesLeft()); 170719ec93aSZachary Turner ASSERT_EQ ('3', *ex.Peek()); 171719ec93aSZachary Turner } 172719ec93aSZachary Turner 173719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexU8_Underflow_NoEof) 174719ec93aSZachary Turner { 175719ec93aSZachary Turner const char kEmptyString[] = ""; 176719ec93aSZachary Turner StringExtractor ex (kEmptyString); 177719ec93aSZachary Turner const bool kSetEofOnFail = false; 178719ec93aSZachary Turner 179719ec93aSZachary Turner ASSERT_EQ (0xab, ex.GetHexU8(0xab, kSetEofOnFail)); 180719ec93aSZachary Turner ASSERT_EQ (false, ex.IsGood()); // this result seems inconsistent with kSetEofOnFail == false 181719ec93aSZachary Turner ASSERT_EQ (UINT64_MAX, ex.GetFilePos()); 182719ec93aSZachary Turner ASSERT_EQ (true, ex.Empty()); 1833dfb86b6SDavid Blaikie ASSERT_EQ (0u, ex.GetBytesLeft()); 184719ec93aSZachary Turner ASSERT_EQ (nullptr, ex.Peek()); 185719ec93aSZachary Turner } 186719ec93aSZachary Turner 187719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexU8_Underflow2_NoEof) 188719ec93aSZachary Turner { 189719ec93aSZachary Turner const char kOneNibble[] = "1"; 190719ec93aSZachary Turner StringExtractor ex (kOneNibble); 191719ec93aSZachary Turner const bool kSetEofOnFail = false; 192719ec93aSZachary Turner 193719ec93aSZachary Turner ASSERT_EQ (0xbc, ex.GetHexU8(0xbc, kSetEofOnFail)); 194719ec93aSZachary Turner ASSERT_EQ (true, ex.IsGood()); 1953dfb86b6SDavid Blaikie ASSERT_EQ (0u, ex.GetFilePos()); 1963dfb86b6SDavid Blaikie ASSERT_EQ (1u, ex.GetBytesLeft()); 197719ec93aSZachary Turner ASSERT_EQ ('1', *ex.Peek()); 198719ec93aSZachary Turner } 199719ec93aSZachary Turner 200719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexU8_InvalidHex_NoEof) 201719ec93aSZachary Turner { 202719ec93aSZachary Turner const char kInvalidHex[] = "xx"; 203719ec93aSZachary Turner StringExtractor ex (kInvalidHex); 204719ec93aSZachary Turner const bool kSetEofOnFail = false; 205719ec93aSZachary Turner 206719ec93aSZachary Turner ASSERT_EQ (0xcd, ex.GetHexU8(0xcd, kSetEofOnFail)); 207719ec93aSZachary Turner ASSERT_EQ (true, ex.IsGood()); 2083dfb86b6SDavid Blaikie ASSERT_EQ (0u, ex.GetFilePos()); 2093dfb86b6SDavid Blaikie ASSERT_EQ (2u, ex.GetBytesLeft()); 210719ec93aSZachary Turner ASSERT_EQ ('x', *ex.Peek()); 211719ec93aSZachary Turner } 212719ec93aSZachary Turner 213719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexU8_Exact_NoEof) 214719ec93aSZachary Turner { 215719ec93aSZachary Turner const char kValidHexPair[] = "12"; 216719ec93aSZachary Turner StringExtractor ex (kValidHexPair); 217719ec93aSZachary Turner const bool kSetEofOnFail = false; 218719ec93aSZachary Turner 219719ec93aSZachary Turner ASSERT_EQ (0x12, ex.GetHexU8(0x12, kSetEofOnFail)); 220719ec93aSZachary Turner ASSERT_EQ (true, ex.IsGood()); 2213dfb86b6SDavid Blaikie ASSERT_EQ (2u, ex.GetFilePos()); 2223dfb86b6SDavid Blaikie ASSERT_EQ (0u, ex.GetBytesLeft()); 223719ec93aSZachary Turner ASSERT_EQ (nullptr, ex.Peek()); 224719ec93aSZachary Turner } 225719ec93aSZachary Turner 226719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexU8_Extra_NoEof) 227719ec93aSZachary Turner { 228719ec93aSZachary Turner const char kValidHexPair[] = "1234"; 229719ec93aSZachary Turner StringExtractor ex (kValidHexPair); 230719ec93aSZachary Turner const bool kSetEofOnFail = false; 231719ec93aSZachary Turner 232719ec93aSZachary Turner ASSERT_EQ (0x12, ex.GetHexU8(0x12, kSetEofOnFail)); 233719ec93aSZachary Turner ASSERT_EQ (true, ex.IsGood()); 2343dfb86b6SDavid Blaikie ASSERT_EQ (2u, ex.GetFilePos()); 2353dfb86b6SDavid Blaikie ASSERT_EQ (2u, ex.GetBytesLeft()); 236719ec93aSZachary Turner ASSERT_EQ ('3', *ex.Peek()); 237719ec93aSZachary Turner } 238719ec93aSZachary Turner 239719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexBytes) 240719ec93aSZachary Turner { 241719ec93aSZachary Turner const char kHexEncodedBytes[] = "abcdef0123456789xyzw"; 242719ec93aSZachary Turner const size_t kValidHexPairs = 8; 243719ec93aSZachary Turner StringExtractor ex(kHexEncodedBytes); 244719ec93aSZachary Turner 245719ec93aSZachary Turner uint8_t dst[kValidHexPairs]; 246719ec93aSZachary Turner ASSERT_EQ(kValidHexPairs, ex.GetHexBytes (dst, kValidHexPairs, 0xde)); 247719ec93aSZachary Turner EXPECT_EQ(0xab,dst[0]); 248719ec93aSZachary Turner EXPECT_EQ(0xcd,dst[1]); 249719ec93aSZachary Turner EXPECT_EQ(0xef,dst[2]); 250719ec93aSZachary Turner EXPECT_EQ(0x01,dst[3]); 251719ec93aSZachary Turner EXPECT_EQ(0x23,dst[4]); 252719ec93aSZachary Turner EXPECT_EQ(0x45,dst[5]); 253719ec93aSZachary Turner EXPECT_EQ(0x67,dst[6]); 254719ec93aSZachary Turner EXPECT_EQ(0x89,dst[7]); 255719ec93aSZachary Turner 256719ec93aSZachary Turner ASSERT_EQ(true, ex.IsGood()); 257719ec93aSZachary Turner ASSERT_EQ(2*kValidHexPairs, ex.GetFilePos()); 258719ec93aSZachary Turner ASSERT_EQ(false, ex.Empty()); 2593dfb86b6SDavid Blaikie ASSERT_EQ(4u, ex.GetBytesLeft()); 260719ec93aSZachary Turner ASSERT_EQ('x', *ex.Peek()); 261719ec93aSZachary Turner } 262719ec93aSZachary Turner 263719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexBytes_Underflow) 264719ec93aSZachary Turner { 265719ec93aSZachary Turner const char kHexEncodedBytes[] = "abcdef0123456789xyzw"; 266719ec93aSZachary Turner const size_t kValidHexPairs = 8; 267719ec93aSZachary Turner StringExtractor ex(kHexEncodedBytes); 268719ec93aSZachary Turner 269719ec93aSZachary Turner uint8_t dst[12]; 270719ec93aSZachary Turner ASSERT_EQ(kValidHexPairs, ex.GetHexBytes (dst, sizeof(dst), 0xde)); 271719ec93aSZachary Turner EXPECT_EQ(0xab,dst[0]); 272719ec93aSZachary Turner EXPECT_EQ(0xcd,dst[1]); 273719ec93aSZachary Turner EXPECT_EQ(0xef,dst[2]); 274719ec93aSZachary Turner EXPECT_EQ(0x01,dst[3]); 275719ec93aSZachary Turner EXPECT_EQ(0x23,dst[4]); 276719ec93aSZachary Turner EXPECT_EQ(0x45,dst[5]); 277719ec93aSZachary Turner EXPECT_EQ(0x67,dst[6]); 278719ec93aSZachary Turner EXPECT_EQ(0x89,dst[7]); 279719ec93aSZachary Turner // these bytes should be filled with fail_fill_value 0xde 280719ec93aSZachary Turner EXPECT_EQ(0xde,dst[8]); 281719ec93aSZachary Turner EXPECT_EQ(0xde,dst[9]); 282719ec93aSZachary Turner EXPECT_EQ(0xde,dst[10]); 283719ec93aSZachary Turner EXPECT_EQ(0xde,dst[11]); 284719ec93aSZachary Turner 285719ec93aSZachary Turner ASSERT_EQ(false, ex.IsGood()); 286719ec93aSZachary Turner ASSERT_EQ(UINT64_MAX, ex.GetFilePos()); 287719ec93aSZachary Turner ASSERT_EQ(false, ex.Empty()); 2883dfb86b6SDavid Blaikie ASSERT_EQ(0u, ex.GetBytesLeft()); 289719ec93aSZachary Turner ASSERT_EQ(0, ex.Peek()); 290719ec93aSZachary Turner } 291719ec93aSZachary Turner 292719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexBytes_Partial) 293719ec93aSZachary Turner { 294719ec93aSZachary Turner const char kHexEncodedBytes[] = "abcdef0123456789xyzw"; 295719ec93aSZachary Turner const size_t kReadBytes = 4; 296719ec93aSZachary Turner StringExtractor ex(kHexEncodedBytes); 297719ec93aSZachary Turner 298719ec93aSZachary Turner uint8_t dst[12]; 299719ec93aSZachary Turner memset(dst, 0xab, sizeof(dst)); 300719ec93aSZachary Turner ASSERT_EQ(kReadBytes, ex.GetHexBytes (dst, kReadBytes, 0xde)); 301719ec93aSZachary Turner EXPECT_EQ(0xab,dst[0]); 302719ec93aSZachary Turner EXPECT_EQ(0xcd,dst[1]); 303719ec93aSZachary Turner EXPECT_EQ(0xef,dst[2]); 304719ec93aSZachary Turner EXPECT_EQ(0x01,dst[3]); 305719ec93aSZachary Turner // these bytes should be unchanged 306719ec93aSZachary Turner EXPECT_EQ(0xab,dst[4]); 307719ec93aSZachary Turner EXPECT_EQ(0xab,dst[5]); 308719ec93aSZachary Turner EXPECT_EQ(0xab,dst[6]); 309719ec93aSZachary Turner EXPECT_EQ(0xab,dst[7]); 310719ec93aSZachary Turner EXPECT_EQ(0xab,dst[8]); 311719ec93aSZachary Turner EXPECT_EQ(0xab,dst[9]); 312719ec93aSZachary Turner EXPECT_EQ(0xab,dst[10]); 313719ec93aSZachary Turner EXPECT_EQ(0xab,dst[11]); 314719ec93aSZachary Turner 315719ec93aSZachary Turner ASSERT_EQ(true, ex.IsGood()); 316719ec93aSZachary Turner ASSERT_EQ(kReadBytes*2, ex.GetFilePos()); 317719ec93aSZachary Turner ASSERT_EQ(false, ex.Empty()); 3183dfb86b6SDavid Blaikie ASSERT_EQ(12u, ex.GetBytesLeft()); 319719ec93aSZachary Turner ASSERT_EQ('2', *ex.Peek()); 320719ec93aSZachary Turner } 321719ec93aSZachary Turner 322719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexBytesAvail) 323719ec93aSZachary Turner { 324719ec93aSZachary Turner const char kHexEncodedBytes[] = "abcdef0123456789xyzw"; 325719ec93aSZachary Turner const size_t kValidHexPairs = 8; 326719ec93aSZachary Turner StringExtractor ex(kHexEncodedBytes); 327719ec93aSZachary Turner 328719ec93aSZachary Turner uint8_t dst[kValidHexPairs]; 329719ec93aSZachary Turner ASSERT_EQ(kValidHexPairs, ex.GetHexBytesAvail (dst, kValidHexPairs)); 330719ec93aSZachary Turner EXPECT_EQ(0xab,dst[0]); 331719ec93aSZachary Turner EXPECT_EQ(0xcd,dst[1]); 332719ec93aSZachary Turner EXPECT_EQ(0xef,dst[2]); 333719ec93aSZachary Turner EXPECT_EQ(0x01,dst[3]); 334719ec93aSZachary Turner EXPECT_EQ(0x23,dst[4]); 335719ec93aSZachary Turner EXPECT_EQ(0x45,dst[5]); 336719ec93aSZachary Turner EXPECT_EQ(0x67,dst[6]); 337719ec93aSZachary Turner EXPECT_EQ(0x89,dst[7]); 338719ec93aSZachary Turner 339719ec93aSZachary Turner ASSERT_EQ(true, ex.IsGood()); 340719ec93aSZachary Turner ASSERT_EQ(2*kValidHexPairs, ex.GetFilePos()); 341719ec93aSZachary Turner ASSERT_EQ(false, ex.Empty()); 3423dfb86b6SDavid Blaikie ASSERT_EQ(4u, ex.GetBytesLeft()); 343719ec93aSZachary Turner ASSERT_EQ('x', *ex.Peek()); 344719ec93aSZachary Turner } 345719ec93aSZachary Turner 346719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexBytesAvail_Underflow) 347719ec93aSZachary Turner { 348719ec93aSZachary Turner const char kHexEncodedBytes[] = "abcdef0123456789xyzw"; 349719ec93aSZachary Turner const size_t kValidHexPairs = 8; 350719ec93aSZachary Turner StringExtractor ex(kHexEncodedBytes); 351719ec93aSZachary Turner 352719ec93aSZachary Turner uint8_t dst[12]; 353719ec93aSZachary Turner memset(dst, 0xef, sizeof(dst)); 354719ec93aSZachary Turner ASSERT_EQ(kValidHexPairs, ex.GetHexBytesAvail (dst, sizeof(dst))); 355719ec93aSZachary Turner EXPECT_EQ(0xab,dst[0]); 356719ec93aSZachary Turner EXPECT_EQ(0xcd,dst[1]); 357719ec93aSZachary Turner EXPECT_EQ(0xef,dst[2]); 358719ec93aSZachary Turner EXPECT_EQ(0x01,dst[3]); 359719ec93aSZachary Turner EXPECT_EQ(0x23,dst[4]); 360719ec93aSZachary Turner EXPECT_EQ(0x45,dst[5]); 361719ec93aSZachary Turner EXPECT_EQ(0x67,dst[6]); 362719ec93aSZachary Turner EXPECT_EQ(0x89,dst[7]); 363719ec93aSZachary Turner // these bytes should be unchanged 364719ec93aSZachary Turner EXPECT_EQ(0xef,dst[8]); 365719ec93aSZachary Turner EXPECT_EQ(0xef,dst[9]); 366719ec93aSZachary Turner EXPECT_EQ(0xef,dst[10]); 367719ec93aSZachary Turner EXPECT_EQ(0xef,dst[11]); 368719ec93aSZachary Turner 369719ec93aSZachary Turner ASSERT_EQ(true, ex.IsGood()); 370719ec93aSZachary Turner ASSERT_EQ(kValidHexPairs*2, ex.GetFilePos()); 371719ec93aSZachary Turner ASSERT_EQ(false, ex.Empty()); 3723dfb86b6SDavid Blaikie ASSERT_EQ(4u, ex.GetBytesLeft()); 373719ec93aSZachary Turner ASSERT_EQ('x', *ex.Peek()); 374719ec93aSZachary Turner } 375719ec93aSZachary Turner 376719ec93aSZachary Turner TEST_F (StringExtractorTest, GetHexBytesAvail_Partial) 377719ec93aSZachary Turner { 378719ec93aSZachary Turner const char kHexEncodedBytes[] = "abcdef0123456789xyzw"; 379719ec93aSZachary Turner const size_t kReadBytes = 4; 380719ec93aSZachary Turner StringExtractor ex(kHexEncodedBytes); 381719ec93aSZachary Turner 382719ec93aSZachary Turner uint8_t dst[12]; 383719ec93aSZachary Turner memset(dst, 0xab, sizeof(dst)); 384719ec93aSZachary Turner ASSERT_EQ(kReadBytes, ex.GetHexBytesAvail (dst, kReadBytes)); 385719ec93aSZachary Turner EXPECT_EQ(0xab,dst[0]); 386719ec93aSZachary Turner EXPECT_EQ(0xcd,dst[1]); 387719ec93aSZachary Turner EXPECT_EQ(0xef,dst[2]); 388719ec93aSZachary Turner EXPECT_EQ(0x01,dst[3]); 389719ec93aSZachary Turner // these bytes should be unchanged 390719ec93aSZachary Turner EXPECT_EQ(0xab,dst[4]); 391719ec93aSZachary Turner EXPECT_EQ(0xab,dst[5]); 392719ec93aSZachary Turner EXPECT_EQ(0xab,dst[6]); 393719ec93aSZachary Turner EXPECT_EQ(0xab,dst[7]); 394719ec93aSZachary Turner EXPECT_EQ(0xab,dst[8]); 395719ec93aSZachary Turner EXPECT_EQ(0xab,dst[9]); 396719ec93aSZachary Turner EXPECT_EQ(0xab,dst[10]); 397719ec93aSZachary Turner EXPECT_EQ(0xab,dst[11]); 398719ec93aSZachary Turner 399719ec93aSZachary Turner ASSERT_EQ(true, ex.IsGood()); 400719ec93aSZachary Turner ASSERT_EQ(kReadBytes*2, ex.GetFilePos()); 401719ec93aSZachary Turner ASSERT_EQ(false, ex.Empty()); 4023dfb86b6SDavid Blaikie ASSERT_EQ(12u, ex.GetBytesLeft()); 403719ec93aSZachary Turner ASSERT_EQ('2', *ex.Peek()); 404719ec93aSZachary Turner } 405719ec93aSZachary Turner 406719ec93aSZachary Turner 407