big_endian_unittest.cc 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "butil/big_endian.h"
  5. #include "butil/strings/string_piece.h"
  6. #include <gtest/gtest.h>
  7. namespace butil {
  8. TEST(BigEndianReaderTest, ReadsValues) {
  9. char data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xA, 0xB, 0xC };
  10. char buf[2];
  11. uint8_t u8;
  12. uint16_t u16;
  13. uint32_t u32;
  14. butil::StringPiece piece;
  15. BigEndianReader reader(data, sizeof(data));
  16. EXPECT_TRUE(reader.Skip(2));
  17. EXPECT_EQ(data + 2, reader.ptr());
  18. EXPECT_EQ(reader.remaining(), static_cast<int>(sizeof(data)) - 2);
  19. EXPECT_TRUE(reader.ReadBytes(buf, sizeof(buf)));
  20. EXPECT_EQ(0x2, buf[0]);
  21. EXPECT_EQ(0x3, buf[1]);
  22. EXPECT_TRUE(reader.ReadU8(&u8));
  23. EXPECT_EQ(0x4, u8);
  24. EXPECT_TRUE(reader.ReadU16(&u16));
  25. EXPECT_EQ(0x0506, u16);
  26. EXPECT_TRUE(reader.ReadU32(&u32));
  27. EXPECT_EQ(0x0708090Au, u32);
  28. butil::StringPiece expected(reader.ptr(), 2);
  29. EXPECT_TRUE(reader.ReadPiece(&piece, 2));
  30. EXPECT_EQ(2u, piece.size());
  31. EXPECT_EQ(expected.data(), piece.data());
  32. }
  33. TEST(BigEndianReaderTest, RespectsLength) {
  34. char data[4];
  35. char buf[2];
  36. uint8_t u8;
  37. uint16_t u16;
  38. uint32_t u32;
  39. butil::StringPiece piece;
  40. BigEndianReader reader(data, sizeof(data));
  41. // 4 left
  42. EXPECT_FALSE(reader.Skip(6));
  43. EXPECT_TRUE(reader.Skip(1));
  44. // 3 left
  45. EXPECT_FALSE(reader.ReadU32(&u32));
  46. EXPECT_FALSE(reader.ReadPiece(&piece, 4));
  47. EXPECT_TRUE(reader.Skip(2));
  48. // 1 left
  49. EXPECT_FALSE(reader.ReadU16(&u16));
  50. EXPECT_FALSE(reader.ReadBytes(buf, 2));
  51. EXPECT_TRUE(reader.Skip(1));
  52. // 0 left
  53. EXPECT_FALSE(reader.ReadU8(&u8));
  54. EXPECT_EQ(0, reader.remaining());
  55. }
  56. TEST(BigEndianWriterTest, WritesValues) {
  57. char expected[] = { 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 0xA };
  58. char data[sizeof(expected)];
  59. char buf[] = { 0x2, 0x3 };
  60. memset(data, 0, sizeof(data));
  61. BigEndianWriter writer(data, sizeof(data));
  62. EXPECT_TRUE(writer.Skip(2));
  63. EXPECT_TRUE(writer.WriteBytes(buf, sizeof(buf)));
  64. EXPECT_TRUE(writer.WriteU8(0x4));
  65. EXPECT_TRUE(writer.WriteU16(0x0506));
  66. EXPECT_TRUE(writer.WriteU32(0x0708090A));
  67. EXPECT_EQ(0, memcmp(expected, data, sizeof(expected)));
  68. }
  69. TEST(BigEndianWriterTest, RespectsLength) {
  70. char data[4];
  71. char buf[2];
  72. uint8_t u8 = 0;
  73. uint16_t u16 = 0;
  74. uint32_t u32 = 0;
  75. BigEndianWriter writer(data, sizeof(data));
  76. // 4 left
  77. EXPECT_FALSE(writer.Skip(6));
  78. EXPECT_TRUE(writer.Skip(1));
  79. // 3 left
  80. EXPECT_FALSE(writer.WriteU32(u32));
  81. EXPECT_TRUE(writer.Skip(2));
  82. // 1 left
  83. EXPECT_FALSE(writer.WriteU16(u16));
  84. EXPECT_FALSE(writer.WriteBytes(buf, 2));
  85. EXPECT_TRUE(writer.Skip(1));
  86. // 0 left
  87. EXPECT_FALSE(writer.WriteU8(u8));
  88. EXPECT_EQ(0, writer.remaining());
  89. }
  90. } // namespace butil