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