Paul Stewart | 3ecfa2b | 2011-07-15 10:47:42 -0700 | [diff] [blame] | 1 | // Copyright (c) 2011 The Chromium OS 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 | |
| 5 | #include <endian.h> |
| 6 | |
| 7 | #include <gtest/gtest.h> |
| 8 | |
| 9 | #include "shill/byte_string.h" |
| 10 | |
| 11 | using testing::Test; |
| 12 | |
| 13 | namespace shill { |
| 14 | |
| 15 | namespace { |
| 16 | const unsigned char kTest1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; |
Darin Petkov | e3e1cfa | 2011-08-11 13:41:17 -0700 | [diff] [blame] | 17 | const unsigned char kTest2[] = { 1, 2, 3, 0xa }; |
| 18 | const char kTest2HexString[] = "0102030A"; |
| 19 | const unsigned int kTest2Uint32 = 0x0102030a; |
Paul Stewart | 3ecfa2b | 2011-07-15 10:47:42 -0700 | [diff] [blame] | 20 | const unsigned char kTest3[] = { 0, 0, 0, 0 }; |
Paul Stewart | dd7df79 | 2011-07-15 11:09:50 -0700 | [diff] [blame] | 21 | const char kTest4[] = "Hello world"; |
Paul Stewart | 3ecfa2b | 2011-07-15 10:47:42 -0700 | [diff] [blame] | 22 | } // namespace {} |
| 23 | |
| 24 | class ByteStringTest : public Test { |
| 25 | }; |
| 26 | |
| 27 | TEST_F(ByteStringTest, Empty) { |
| 28 | uint32 val; |
| 29 | |
| 30 | ByteString bs1(0); |
Darin Petkov | e3e1cfa | 2011-08-11 13:41:17 -0700 | [diff] [blame] | 31 | EXPECT_TRUE(bs1.IsEmpty()); |
Paul Stewart | 3ecfa2b | 2011-07-15 10:47:42 -0700 | [diff] [blame] | 32 | EXPECT_EQ(0, bs1.GetLength()); |
| 33 | EXPECT_TRUE(bs1.GetData() == NULL); |
| 34 | EXPECT_FALSE(bs1.ConvertToNetUInt32(&val)); |
| 35 | EXPECT_TRUE(bs1.IsZero()); |
| 36 | } |
| 37 | |
| 38 | TEST_F(ByteStringTest, NonEmpty) { |
| 39 | ByteString bs1(kTest1, sizeof(kTest1)); |
| 40 | uint32 val; |
| 41 | |
Darin Petkov | e3e1cfa | 2011-08-11 13:41:17 -0700 | [diff] [blame] | 42 | EXPECT_FALSE(bs1.IsEmpty()); |
| 43 | |
Paul Stewart | 3ecfa2b | 2011-07-15 10:47:42 -0700 | [diff] [blame] | 44 | EXPECT_EQ(sizeof(kTest1), bs1.GetLength()); |
| 45 | for (unsigned int i = 0; i < sizeof(kTest1); i++) { |
| 46 | EXPECT_EQ(bs1.GetData()[i], kTest1[i]); |
| 47 | } |
| 48 | EXPECT_TRUE(bs1.GetData() != NULL); |
| 49 | EXPECT_FALSE(bs1.ConvertToNetUInt32(&val)); |
| 50 | EXPECT_FALSE(bs1.IsZero()); |
| 51 | |
| 52 | ByteString bs2(kTest2, sizeof(kTest2)); |
| 53 | EXPECT_EQ(sizeof(kTest2), bs2.GetLength()); |
| 54 | for (unsigned int i = 0; i < sizeof(kTest2); i++) { |
| 55 | EXPECT_EQ(bs2.GetData()[i], kTest2[i]); |
| 56 | } |
| 57 | EXPECT_TRUE(bs2.GetData() != NULL); |
| 58 | EXPECT_FALSE(bs2.IsZero()); |
| 59 | |
| 60 | EXPECT_FALSE(bs2.Equals(bs1)); |
| 61 | |
| 62 | ByteString bs3(kTest3, sizeof(kTest3)); |
| 63 | EXPECT_EQ(sizeof(kTest3), bs3.GetLength()); |
| 64 | for (unsigned int i = 0; i < sizeof(kTest3); i++) { |
| 65 | EXPECT_EQ(bs3.GetData()[i], kTest3[i]); |
| 66 | } |
| 67 | EXPECT_TRUE(bs3.GetData() != NULL); |
| 68 | EXPECT_TRUE(bs3.IsZero()); |
| 69 | EXPECT_FALSE(bs2.Equals(bs1)); |
| 70 | EXPECT_FALSE(bs3.Equals(bs1)); |
| 71 | |
Paul Stewart | dd7df79 | 2011-07-15 11:09:50 -0700 | [diff] [blame] | 72 | ByteString bs4(kTest4, false); |
| 73 | EXPECT_EQ(strlen(kTest4), bs4.GetLength()); |
| 74 | EXPECT_EQ(0, memcmp(kTest4, bs4.GetData(), bs4.GetLength())); |
| 75 | |
| 76 | ByteString bs5(kTest4, true); |
| 77 | EXPECT_EQ(strlen(kTest4) + 1, bs5.GetLength()); |
| 78 | EXPECT_EQ(0, memcmp(kTest4, bs5.GetData(), bs5.GetLength())); |
| 79 | |
| 80 | ByteString bs6(kTest1, sizeof(kTest1)); |
| 81 | EXPECT_TRUE(bs6.Equals(bs1)); |
Paul Stewart | 3ecfa2b | 2011-07-15 10:47:42 -0700 | [diff] [blame] | 82 | } |
| 83 | |
| 84 | TEST_F(ByteStringTest, UInt32) { |
Darin Petkov | e3e1cfa | 2011-08-11 13:41:17 -0700 | [diff] [blame] | 85 | ByteString bs1 = ByteString::CreateFromNetUInt32(kTest2Uint32); |
Paul Stewart | 3ecfa2b | 2011-07-15 10:47:42 -0700 | [diff] [blame] | 86 | uint32 val; |
| 87 | |
| 88 | EXPECT_EQ(4, bs1.GetLength()); |
| 89 | EXPECT_TRUE(bs1.GetData() != NULL); |
| 90 | EXPECT_TRUE(bs1.ConvertToNetUInt32(&val)); |
Darin Petkov | e3e1cfa | 2011-08-11 13:41:17 -0700 | [diff] [blame] | 91 | EXPECT_EQ(kTest2Uint32, val); |
Paul Stewart | 3ecfa2b | 2011-07-15 10:47:42 -0700 | [diff] [blame] | 92 | EXPECT_FALSE(bs1.IsZero()); |
| 93 | |
| 94 | ByteString bs2(kTest2, sizeof(kTest2)); |
| 95 | EXPECT_TRUE(bs1.Equals(bs2)); |
| 96 | EXPECT_TRUE(bs2.ConvertToNetUInt32(&val)); |
Darin Petkov | e3e1cfa | 2011-08-11 13:41:17 -0700 | [diff] [blame] | 97 | EXPECT_EQ(kTest2Uint32, val); |
Paul Stewart | 3ecfa2b | 2011-07-15 10:47:42 -0700 | [diff] [blame] | 98 | |
| 99 | ByteString bs3 = ByteString::CreateFromCPUUInt32(0x1020304); |
| 100 | EXPECT_EQ(4, bs1.GetLength()); |
| 101 | EXPECT_TRUE(bs3.GetData() != NULL); |
| 102 | EXPECT_TRUE(bs3.ConvertToCPUUInt32(&val)); |
| 103 | EXPECT_EQ(0x1020304, val); |
| 104 | EXPECT_FALSE(bs3.IsZero()); |
| 105 | |
| 106 | #if __BYTE_ORDER == __LITTLE_ENDIAN |
| 107 | EXPECT_FALSE(bs1.Equals(bs3)); |
| 108 | #else |
| 109 | EXPECT_TRUE(bs1.Equals(bs3)); |
| 110 | #endif |
| 111 | } |
| 112 | |
Paul Stewart | dd7df79 | 2011-07-15 11:09:50 -0700 | [diff] [blame] | 113 | TEST_F(ByteStringTest, Resize) { |
| 114 | ByteString bs1(kTest2, sizeof(kTest2)); |
Paul Stewart | dd7df79 | 2011-07-15 11:09:50 -0700 | [diff] [blame] | 115 | |
| 116 | bs1.Resize(sizeof(kTest2) + 10); |
| 117 | EXPECT_EQ(sizeof(kTest2) + 10, bs1.GetLength()); |
| 118 | EXPECT_TRUE(bs1.GetData() != NULL); |
| 119 | EXPECT_EQ(0, memcmp(bs1.GetData(), kTest2, sizeof(kTest2))); |
| 120 | for (size_t i = sizeof(kTest2); i < sizeof(kTest2) + 10; ++i) { |
| 121 | EXPECT_EQ(0, bs1.GetData()[i]); |
| 122 | } |
| 123 | |
| 124 | bs1.Resize(sizeof(kTest2) - 2); |
| 125 | EXPECT_EQ(sizeof(kTest2) - 2, bs1.GetLength()); |
| 126 | EXPECT_EQ(0, memcmp(bs1.GetData(), kTest2, sizeof(kTest2) - 2)); |
| 127 | } |
| 128 | |
Darin Petkov | e3e1cfa | 2011-08-11 13:41:17 -0700 | [diff] [blame] | 129 | TEST_F(ByteStringTest, HexEncode) { |
| 130 | ByteString bs(kTest2, sizeof(kTest2)); |
| 131 | EXPECT_EQ(kTest2HexString, bs.HexEncode()); |
| 132 | } |
| 133 | |
Paul Stewart | 3ecfa2b | 2011-07-15 10:47:42 -0700 | [diff] [blame] | 134 | } // namespace shill |