1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project
3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License");
5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License.
6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at
7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//      http://www.apache.org/licenses/LICENSE-2.0
9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software
11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS,
12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and
14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License.
15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
163ecfa2b733afbc39696102467d9eed827028265dPaul Stewart
17cddd2d09878704128d35ddfeec862109b7d7fdc9Alex Deymo#include "shill/net/byte_string.h"
18cddd2d09878704128d35ddfeec862109b7d7fdc9Alex Deymo
19dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan#include <arpa/inet.h>
203ecfa2b733afbc39696102467d9eed827028265dPaul Stewart#include <endian.h>
213ecfa2b733afbc39696102467d9eed827028265dPaul Stewart
223ecfa2b733afbc39696102467d9eed827028265dPaul Stewart#include <gtest/gtest.h>
233ecfa2b733afbc39696102467d9eed827028265dPaul Stewart
24c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie#include <string>
25c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie
263ecfa2b733afbc39696102467d9eed827028265dPaul Stewartusing testing::Test;
27c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrieusing std::string;
283ecfa2b733afbc39696102467d9eed827028265dPaul Stewart
293ecfa2b733afbc39696102467d9eed827028265dPaul Stewartnamespace shill {
303ecfa2b733afbc39696102467d9eed827028265dPaul Stewart
313ecfa2b733afbc39696102467d9eed827028265dPaul Stewartnamespace {
323ecfa2b733afbc39696102467d9eed827028265dPaul Stewartconst unsigned char kTest1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
33dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chanconst char kTest1HexString[] = "00010203040506070809";
3430508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewartconst char kTest1HexSubstring[] = "0001020304050607";
3530508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewartconst char kTest1HexSubstringReordered[] = "0302010007060504";
36e3e1cfaadc69ea67db55f11e55f404b11a70e354Darin Petkovconst unsigned char kTest2[] = { 1, 2, 3, 0xa };
37e3e1cfaadc69ea67db55f11e55f404b11a70e354Darin Petkovconst char kTest2HexString[] = "0102030A";
38e3e1cfaadc69ea67db55f11e55f404b11a70e354Darin Petkovconst unsigned int kTest2Uint32 = 0x0102030a;
393ecfa2b733afbc39696102467d9eed827028265dPaul Stewartconst unsigned char kTest3[] = { 0, 0, 0, 0 };
40dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewartconst char kTest4[] = "Hello world";
41c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tanconst unsigned char kTest5[] = { 1, 2, 3 };
4230508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewartconst unsigned char kTest6[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
438a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko}  // namespace
443ecfa2b733afbc39696102467d9eed827028265dPaul Stewart
453ecfa2b733afbc39696102467d9eed827028265dPaul Stewartclass ByteStringTest : public Test {
46c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie public:
47dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  bool IsCPUSameAsNetOrder() {
487fab89734d88724a288e96a9996b15548c5294c7Ben Chan    const uint32_t kTestValue = 0x12345678;
49dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan    return htonl(kTestValue) == kTestValue;
50dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  }
513ecfa2b733afbc39696102467d9eed827028265dPaul Stewart};
523ecfa2b733afbc39696102467d9eed827028265dPaul Stewart
533ecfa2b733afbc39696102467d9eed827028265dPaul StewartTEST_F(ByteStringTest, Empty) {
547fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint32_t val;
553ecfa2b733afbc39696102467d9eed827028265dPaul Stewart
563ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  ByteString bs1(0);
57e3e1cfaadc69ea67db55f11e55f404b11a70e354Darin Petkov  EXPECT_TRUE(bs1.IsEmpty());
583ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_EQ(0, bs1.GetLength());
59cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan  EXPECT_EQ(nullptr, bs1.GetData());
603ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_FALSE(bs1.ConvertToNetUInt32(&val));
613ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_TRUE(bs1.IsZero());
623ecfa2b733afbc39696102467d9eed827028265dPaul Stewart}
633ecfa2b733afbc39696102467d9eed827028265dPaul Stewart
643ecfa2b733afbc39696102467d9eed827028265dPaul StewartTEST_F(ByteStringTest, NonEmpty) {
653ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  ByteString bs1(kTest1, sizeof(kTest1));
667fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint32_t val;
673ecfa2b733afbc39696102467d9eed827028265dPaul Stewart
68e3e1cfaadc69ea67db55f11e55f404b11a70e354Darin Petkov  EXPECT_FALSE(bs1.IsEmpty());
69cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan  ASSERT_NE(nullptr, bs1.GetData());
703ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_EQ(sizeof(kTest1), bs1.GetLength());
713ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  for (unsigned int i = 0; i < sizeof(kTest1); i++) {
723ecfa2b733afbc39696102467d9eed827028265dPaul Stewart    EXPECT_EQ(bs1.GetData()[i], kTest1[i]);
733ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  }
743ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_FALSE(bs1.ConvertToNetUInt32(&val));
753ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_FALSE(bs1.IsZero());
763ecfa2b733afbc39696102467d9eed827028265dPaul Stewart
77c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  // Build a ByteString (different to bs1), verify that the new ByteString
78c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  // looks as expected, verify that it's different to bs1.
793ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  ByteString bs2(kTest2, sizeof(kTest2));
80cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan  ASSERT_NE(nullptr, bs2.GetData());
813ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_EQ(sizeof(kTest2), bs2.GetLength());
823ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  for (unsigned int i = 0; i < sizeof(kTest2); i++) {
833ecfa2b733afbc39696102467d9eed827028265dPaul Stewart    EXPECT_EQ(bs2.GetData()[i], kTest2[i]);
843ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  }
853ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_FALSE(bs2.IsZero());
863ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_FALSE(bs2.Equals(bs1));
873ecfa2b733afbc39696102467d9eed827028265dPaul Stewart
88c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  // Build _another_ ByteString (different to bs1 and bs2), verify that the
89c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  // new ByteString looks as expected, verify that it's different to bs1 and
90c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  // bs2.
913ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  ByteString bs3(kTest3, sizeof(kTest3));
92cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan  ASSERT_NE(nullptr, bs3.GetData());
933ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_EQ(sizeof(kTest3), bs3.GetLength());
943ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  for (unsigned int i = 0; i < sizeof(kTest3); i++) {
953ecfa2b733afbc39696102467d9eed827028265dPaul Stewart    EXPECT_EQ(bs3.GetData()[i], kTest3[i]);
963ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  }
973ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_TRUE(bs3.IsZero());
983ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_FALSE(bs2.Equals(bs1));
993ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_FALSE(bs3.Equals(bs1));
1003ecfa2b733afbc39696102467d9eed827028265dPaul Stewart
101c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  // Check two equal ByteStrings.
102c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  ByteString bs6(kTest1, sizeof(kTest1));
103c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  EXPECT_TRUE(bs6.Equals(bs1));
104c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie}
105c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie
106c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade GuthrieTEST_F(ByteStringTest, CopyTerminator) {
107c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  ByteString bs4(string(kTest4), false);
108dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewart  EXPECT_EQ(strlen(kTest4), bs4.GetLength());
109dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewart  EXPECT_EQ(0, memcmp(kTest4, bs4.GetData(), bs4.GetLength()));
110dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewart
111c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  ByteString bs5(string(kTest4), true);
112dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewart  EXPECT_EQ(strlen(kTest4) + 1, bs5.GetLength());
113dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewart  EXPECT_EQ(0, memcmp(kTest4, bs5.GetData(), bs5.GetLength()));
1143ecfa2b733afbc39696102467d9eed827028265dPaul Stewart}
1153ecfa2b733afbc39696102467d9eed827028265dPaul Stewart
11691a5aac3d03883be7d652096b1c018298096edcdPaul StewartTEST_F(ByteStringTest, SubString) {
11791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart  ByteString bs1(kTest1, sizeof(kTest1));
118c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  ByteString fragment(kTest1 + 3, 4);
119c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  EXPECT_TRUE(fragment.Equals(bs1.GetSubstring(3, 4)));
12091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart  const int kMargin = sizeof(kTest1) - 3;
121c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  ByteString end_fragment(kTest1 + kMargin, sizeof(kTest1) - kMargin);
122c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  EXPECT_TRUE(end_fragment.Equals(bs1.GetSubstring(kMargin, sizeof(kTest1))));
123c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie
124c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  // Verify that the ByteString correctly handles accessing a substring
125c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  // outside the range of the ByteString.
126c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  const size_t kBogusOffset = 10;
127c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  EXPECT_TRUE(bs1.GetSubstring(sizeof(kTest1), kBogusOffset).IsEmpty());
12891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart}
12991a5aac3d03883be7d652096b1c018298096edcdPaul Stewart
1303ecfa2b733afbc39696102467d9eed827028265dPaul StewartTEST_F(ByteStringTest, UInt32) {
131e3e1cfaadc69ea67db55f11e55f404b11a70e354Darin Petkov  ByteString bs1 = ByteString::CreateFromNetUInt32(kTest2Uint32);
1327fab89734d88724a288e96a9996b15548c5294c7Ben Chan  uint32_t val;
1333ecfa2b733afbc39696102467d9eed827028265dPaul Stewart
1343ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_EQ(4, bs1.GetLength());
135cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan  ASSERT_NE(nullptr, bs1.GetData());
1363ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_TRUE(bs1.ConvertToNetUInt32(&val));
137e3e1cfaadc69ea67db55f11e55f404b11a70e354Darin Petkov  EXPECT_EQ(kTest2Uint32, val);
1383ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_FALSE(bs1.IsZero());
1393ecfa2b733afbc39696102467d9eed827028265dPaul Stewart
1403ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  ByteString bs2(kTest2, sizeof(kTest2));
1413ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_TRUE(bs1.Equals(bs2));
1423ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_TRUE(bs2.ConvertToNetUInt32(&val));
143e3e1cfaadc69ea67db55f11e55f404b11a70e354Darin Petkov  EXPECT_EQ(kTest2Uint32, val);
1443ecfa2b733afbc39696102467d9eed827028265dPaul Stewart
1453ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  ByteString bs3 = ByteString::CreateFromCPUUInt32(0x1020304);
1463ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_EQ(4, bs1.GetLength());
147cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan  ASSERT_NE(nullptr, bs3.GetData());
1483ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_TRUE(bs3.ConvertToCPUUInt32(&val));
1493ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_EQ(0x1020304, val);
1503ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_FALSE(bs3.IsZero());
1513ecfa2b733afbc39696102467d9eed827028265dPaul Stewart
1523ecfa2b733afbc39696102467d9eed827028265dPaul Stewart#if __BYTE_ORDER == __LITTLE_ENDIAN
1533ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_FALSE(bs1.Equals(bs3));
1543ecfa2b733afbc39696102467d9eed827028265dPaul Stewart#else
1553ecfa2b733afbc39696102467d9eed827028265dPaul Stewart  EXPECT_TRUE(bs1.Equals(bs3));
1563ecfa2b733afbc39696102467d9eed827028265dPaul Stewart#endif
1573ecfa2b733afbc39696102467d9eed827028265dPaul Stewart}
1583ecfa2b733afbc39696102467d9eed827028265dPaul Stewart
159dd7df792d2401741183a954f3f6e97d4c6de1e22Paul StewartTEST_F(ByteStringTest, Resize) {
160c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  ByteString bs(kTest2, sizeof(kTest2));
161c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie
162c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  const size_t kSizeExtension = 10;
163c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  bs.Resize(sizeof(kTest2) + kSizeExtension);
164c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  EXPECT_EQ(sizeof(kTest2) + kSizeExtension, bs.GetLength());
165cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan  ASSERT_NE(nullptr, bs.GetData());
166c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  EXPECT_EQ(0, memcmp(bs.GetData(), kTest2, sizeof(kTest2)));
167c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  for (size_t i = sizeof(kTest2); i < sizeof(kTest2) + kSizeExtension; ++i) {
168c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie    EXPECT_EQ(0, bs.GetData()[i]);
169dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewart  }
170dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewart
171c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  const size_t kSizeReduction = 2;
172c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  bs.Resize(sizeof(kTest2) - kSizeReduction);
173c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  EXPECT_EQ(sizeof(kTest2) - kSizeReduction, bs.GetLength());
174c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  EXPECT_EQ(0, memcmp(bs.GetData(), kTest2, sizeof(kTest2) - kSizeReduction));
175dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewart}
176dd7df792d2401741183a954f3f6e97d4c6de1e22Paul Stewart
177e3e1cfaadc69ea67db55f11e55f404b11a70e354Darin PetkovTEST_F(ByteStringTest, HexEncode) {
178e3e1cfaadc69ea67db55f11e55f404b11a70e354Darin Petkov  ByteString bs(kTest2, sizeof(kTest2));
179e3e1cfaadc69ea67db55f11e55f404b11a70e354Darin Petkov  EXPECT_EQ(kTest2HexString, bs.HexEncode());
180e3e1cfaadc69ea67db55f11e55f404b11a70e354Darin Petkov}
181e3e1cfaadc69ea67db55f11e55f404b11a70e354Darin Petkov
18230508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul StewartTEST_F(ByteStringTest, BitwiseAnd) {
183c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  ByteString bs1(kTest1, sizeof(kTest1));
184c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie
18530508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  // Unequal sizes should fail and not modify bs1.
18630508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  EXPECT_FALSE(bs1.BitwiseAnd(ByteString(kTest2, sizeof(kTest2))));
18730508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  EXPECT_TRUE(bs1.Equals(ByteString(kTest1, sizeof(kTest1))));
188c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie
18930508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  const ByteString bs6(kTest6, sizeof(kTest6));
19030508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  EXPECT_TRUE(bs1.BitwiseAnd(bs6));
191c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie
19230508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  const unsigned char kAndResult[] = { 0, 0, 2, 2, 4, 4, 2, 2, 0, 0 };
19330508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  const ByteString expected_result(kAndResult, sizeof(kAndResult));
19430508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  EXPECT_TRUE(bs1.Equals(expected_result));
195c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie}
196c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie
19730508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul StewartTEST_F(ByteStringTest, BitwiseOr) {
198c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  ByteString bs1(kTest1, sizeof(kTest1));
199c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie
20030508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  // Unequal sizes should fail and not modify bs1.
20130508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  EXPECT_FALSE(bs1.BitwiseOr(ByteString(kTest2, sizeof(kTest2))));
20230508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  EXPECT_TRUE(bs1.Equals(ByteString(kTest1, sizeof(kTest1))));
203c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie
20430508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  const ByteString bs6(kTest6, sizeof(kTest6));
20530508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  EXPECT_TRUE(bs1.BitwiseOr(bs6));
206c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie
20730508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  const unsigned char kOrResult[] = { 9, 9, 7, 7, 5, 5, 7, 7, 9, 9 };
20830508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  const ByteString expected_result(kOrResult, sizeof(kOrResult));
20930508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  EXPECT_TRUE(bs1.Equals(expected_result));
210c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie}
211c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie
21230508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul StewartTEST_F(ByteStringTest, BitwiseInvert) {
213c8f589254f2e14d5b6d9ffd020c8b8ef56d97e0cWade Guthrie  ByteString bs(kTest1, sizeof(kTest1));
21430508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  ByteString invert;
21530508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  for (size_t i = 0; i < sizeof(kTest1); i++) {
21630508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart    unsigned char val = kTest1[i] ^ 0xff;
21730508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart    invert.Append(ByteString(&val, 1));
21830508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  }
21930508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  bs.BitwiseInvert();
22030508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  EXPECT_TRUE(bs.Equals(invert));
221f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart}
222f7bf9bf2d7cb7fe7ebf98c7a575a267c190f6ec1Paul Stewart
223dc80b326997e74bf05587f0a703e7e9a3c50e83cBen ChanTEST_F(ByteStringTest, CreateFromHexString) {
224dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  ByteString bs = ByteString::CreateFromHexString("");
225dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  EXPECT_TRUE(bs.IsEmpty());
226dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan
227dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  ByteString bs1 = ByteString::CreateFromHexString("0");
228dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  EXPECT_TRUE(bs1.IsEmpty());
229dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan
230dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  ByteString bs2 = ByteString::CreateFromHexString("0y");
231dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  EXPECT_TRUE(bs2.IsEmpty());
232dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan
233dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  ByteString bs3 = ByteString::CreateFromHexString("ab");
234dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  EXPECT_EQ(1, bs3.GetLength());
235dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  EXPECT_EQ(0xab, bs3.GetData()[0]);
236dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan
237dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  ByteString bs4 = ByteString::CreateFromHexString(kTest1HexString);
238dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  EXPECT_EQ(kTest1HexString, bs4.HexEncode());
239dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan}
240dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan
241dc80b326997e74bf05587f0a703e7e9a3c50e83cBen ChanTEST_F(ByteStringTest, ConvertFromNetToCPUUInt32Array) {
242dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  ByteString bs1;
243dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  EXPECT_TRUE(bs1.ConvertFromNetToCPUUInt32Array());
244dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  EXPECT_TRUE(bs1.IsEmpty());
245dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan
246dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  // Conversion should fail when the length of ByteString is not a
247dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  // multiple of 4.
248dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  ByteString bs2(kTest1, sizeof(kTest1));
249dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  EXPECT_EQ(kTest1HexString, bs2.HexEncode());
250dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  EXPECT_FALSE(bs2.ConvertFromNetToCPUUInt32Array());
251dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  EXPECT_EQ(kTest1HexString, bs2.HexEncode());
252dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan
253dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  // Conversion should succeed when the length of ByteString is a
25430508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  // multiple of 4.
25530508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  bs2.Resize(8);
256dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  EXPECT_EQ(kTest1HexSubstring, bs2.HexEncode());
257dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  EXPECT_TRUE(bs2.ConvertFromNetToCPUUInt32Array());
258dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  if (IsCPUSameAsNetOrder()) {
259dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan    EXPECT_EQ(kTest1HexSubstring, bs2.HexEncode());
260dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  } else {
261dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan    EXPECT_EQ(kTest1HexSubstringReordered, bs2.HexEncode());
262dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  }
263dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan}
264dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan
265dc80b326997e74bf05587f0a703e7e9a3c50e83cBen ChanTEST_F(ByteStringTest, ConvertFromCPUToNetUInt32Array) {
266dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  ByteString bs1;
267dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  EXPECT_TRUE(bs1.ConvertFromCPUToNetUInt32Array());
268dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  EXPECT_TRUE(bs1.IsEmpty());
269dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan
270dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  // Conversion should fail when the length of ByteString is not a
271dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  // multiple of 4.
272dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  ByteString bs2(kTest1, sizeof(kTest1));
273dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  EXPECT_EQ(kTest1HexString, bs2.HexEncode());
274dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  EXPECT_FALSE(bs2.ConvertFromCPUToNetUInt32Array());
275dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  EXPECT_EQ(kTest1HexString, bs2.HexEncode());
276dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan
277dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  // Conversion should succeed when the length of ByteString is a
27830508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  // multiple of 4.
27930508ced4f8c3cb9eb849e8bc9af80c362d2e229Paul Stewart  bs2.Resize(8);
280dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  EXPECT_EQ(kTest1HexSubstring, bs2.HexEncode());
281dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  EXPECT_TRUE(bs2.ConvertFromCPUToNetUInt32Array());
282dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  if (IsCPUSameAsNetOrder()) {
283dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan    EXPECT_EQ(kTest1HexSubstring, bs2.HexEncode());
284dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  } else {
285dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan    EXPECT_EQ(kTest1HexSubstringReordered, bs2.HexEncode());
286dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan  }
287dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan}
288dc80b326997e74bf05587f0a703e7e9a3c50e83cBen Chan
289c42124e2b3fe8f91020cce6389c74938e72b1659Samuel TanTEST_F(ByteStringTest, LessThan) {
290c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan  ByteString bs1(kTest1, sizeof(kTest1));
291c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan  ByteString bs2(kTest2, sizeof(kTest2));
292c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan  ByteString bs3(kTest3, sizeof(kTest3));
293c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan  ByteString bs5(kTest5, sizeof(kTest5));
294c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan
295c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan  // bs2 is shorter, but the first four bytes of bs1 are less than those in bs2.
296c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan  EXPECT_TRUE(ByteString::IsLessThan(bs1, bs2));
297c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan
298c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan  // bs2 and bs3 are the same length, but bs3 has less byte values.
299c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan  EXPECT_TRUE(ByteString::IsLessThan(bs3, bs2));
300c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan
301c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan  // bs3 is shorter than bs1 and the first four bytes of bs3 are less than
302c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan  // the first four bytes of bs1.
303c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan  EXPECT_TRUE(ByteString::IsLessThan(bs3, bs1));
304c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan
305c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan  // The first three bytes of bs5 are equal to the first three bytes of bs2,
306c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan  // but bs5 is shorter than bs2.
307c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan  EXPECT_TRUE(ByteString::IsLessThan(bs5, bs2));
308c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan
309c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan  // A Bytestring is not less than another identical one.
310c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan  EXPECT_FALSE(ByteString::IsLessThan(bs5, bs5));
311c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan}
312c42124e2b3fe8f91020cce6389c74938e72b1659Samuel Tan
3133ecfa2b733afbc39696102467d9eed827028265dPaul Stewart}  // namespace shill
314