diff options
Diffstat (limited to 'chromium/base/big_endian_unittest.cc')
-rw-r--r-- | chromium/base/big_endian_unittest.cc | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/chromium/base/big_endian_unittest.cc b/chromium/base/big_endian_unittest.cc index 7f8d9a556d8..07c208a3a1c 100644 --- a/chromium/base/big_endian_unittest.cc +++ b/chromium/base/big_endian_unittest.cc @@ -42,6 +42,64 @@ TEST(BigEndianReaderTest, ReadsValues) { EXPECT_EQ(expected.data(), piece.data()); } +TEST(BigEndianReaderTest, ReadsLengthPrefixedValues) { + { + char u8_prefixed_data[] = {8, 8, 9, 0xA, 0xB, 0xC, 0xD, + 0xE, 0xF, 0x1A, 0x2B, 0x3C, 0x4D, 0x5E}; + BigEndianReader reader(u8_prefixed_data, sizeof(u8_prefixed_data)); + + base::StringPiece piece; + ASSERT_TRUE(reader.ReadU8LengthPrefixed(&piece)); + // |reader| should skip both a u8 and the length-8 length-prefixed field. + EXPECT_EQ(reader.ptr(), u8_prefixed_data + 9); + EXPECT_EQ(piece.size(), 8u); + EXPECT_EQ(piece.data(), u8_prefixed_data + 1); + } + + { + char u16_prefixed_data[] = {0, 8, 0xD, 0xE, 0xF, + 0x1A, 0x2B, 0x3C, 0x4D, 0x5E}; + BigEndianReader reader(u16_prefixed_data, sizeof(u16_prefixed_data)); + base::StringPiece piece; + ASSERT_TRUE(reader.ReadU16LengthPrefixed(&piece)); + // |reader| should skip both a u16 and the length-8 length-prefixed field. + EXPECT_EQ(reader.ptr(), u16_prefixed_data + 10); + EXPECT_EQ(piece.size(), 8u); + EXPECT_EQ(piece.data(), u16_prefixed_data + 2); + + // With no data left, we shouldn't be able to + // read another u8 length prefix (or a u16 length prefix, + // for that matter). + EXPECT_FALSE(reader.ReadU8LengthPrefixed(&piece)); + EXPECT_FALSE(reader.ReadU16LengthPrefixed(&piece)); + } + + { + // Make sure there's no issue reading a zero-value length prefix. + char u16_prefixed_data[3] = {}; + BigEndianReader reader(u16_prefixed_data, sizeof(u16_prefixed_data)); + base::StringPiece piece; + ASSERT_TRUE(reader.ReadU16LengthPrefixed(&piece)); + EXPECT_EQ(reader.ptr(), u16_prefixed_data + 2); + EXPECT_EQ(piece.data(), u16_prefixed_data + 2); + EXPECT_EQ(piece.size(), 0u); + } +} + +TEST(BigEndianReaderTest, LengthPrefixedReadsFailGracefully) { + // We can't read 0xF (or, for that matter, 0xF8) bytes after the length + // prefix: there isn't enough data. + char data[] = {0xF, 8, 9, 0xA, 0xB, 0xC, 0xD, + 0xE, 0xF, 0x1A, 0x2B, 0x3C, 0x4D, 0x5E}; + BigEndianReader reader(data, sizeof(data)); + base::StringPiece piece; + EXPECT_FALSE(reader.ReadU8LengthPrefixed(&piece)); + EXPECT_EQ(data, reader.ptr()); + + EXPECT_FALSE(reader.ReadU16LengthPrefixed(&piece)); + EXPECT_EQ(data, reader.ptr()); +} + TEST(BigEndianReaderTest, RespectsLength) { char data[8]; char buf[2]; |