| // Copyright 2018 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Standard C Library. |
| #include <string> |
| |
| // Standard C++ Library. |
| |
| // Linux Header Files. |
| #include <linux/if_packet.h> |
| #include <net/if_arp.h> |
| #include <sys/socket.h> |
| |
| // Chrome OS Library. |
| #include <shill/net/byte_string.h> |
| |
| // Chrome OS Testing Library. |
| #include <gtest/gtest.h> |
| |
| // Portier Library. |
| #include "portier/ll_address.h" |
| |
| namespace portier { |
| |
| using ::std::string; |
| using ::shill::ByteString; |
| using Type = LLAddress::Type; |
| |
| // Testing constants. |
| namespace { |
| |
| // clang-format off |
| |
| constexpr unsigned char kEui48UnicastUniversal1[] = { |
| 0xa0, 0x8c, 0xfd, 0xc3, 0xb3, 0xc0 |
| }; |
| const char kEui48UnicastUniversalColonString1[] = "a0:8c:fd:c3:b3:c0"; |
| const char kEui48UnicastUniversalDashString1[] = "a0-8c-fd-c3-b3-c0"; |
| const struct sockaddr_ll kEui48UnicastUniversalSockAddr1 = { |
| .sll_family = AF_PACKET, |
| .sll_hatype = ARPHRD_ETHER, |
| .sll_halen = 6, |
| .sll_addr = { |
| 0xa0, 0x8c, 0xfd, 0xc3, 0xb3, 0xc0 |
| } |
| }; |
| |
| constexpr unsigned char kEui48UnicastLocal1[] = { |
| 0xa2, 0x8c, 0xfd, 0xc3, 0xb3, 0xbf |
| }; |
| const char kEui48UnicastLocalColonString1[] = "a2:8c:fd:c3:b3:bf"; |
| const char kEui48UnicastLocalDashString1[] = "a2-8c-fd-c3-b3-bf"; |
| const struct sockaddr_ll kEui48UnicastLocalSockAddr1 = { |
| .sll_family = AF_PACKET, |
| .sll_hatype = ARPHRD_ETHER, |
| .sll_halen = 6, |
| .sll_addr = { |
| 0xa2, 0x8c, 0xfd, 0xc3, 0xb3, 0xbf |
| } |
| }; |
| |
| constexpr unsigned char kEui48MulticastUniversal1[] = { |
| 0x01, 0x00, 0x0C, 0xCC, 0xCC, 0xCC |
| }; |
| const char kEui48MulticastUniversalColonString1[] = "01:00:0c:cc:cc:cc"; |
| const char kEui48MulticastUniversalDashString1[] = "01-00-0c-cc-cc-cc"; |
| const struct sockaddr_ll kEui48MulticastUniversalSockAddr1 = { |
| .sll_family = AF_PACKET, |
| .sll_hatype = ARPHRD_ETHER, |
| .sll_halen = 6, |
| .sll_addr = { |
| 0x01, 0x00, 0x0C, 0xCC, 0xCC, 0xCC |
| } |
| }; |
| |
| constexpr unsigned char kEui48MulticastLocal1[] = { |
| 0x33, 0x33, 0xfe, 0xdf, 0xdc, 0x4e |
| }; |
| const char kEui48MulticastLocalColonString1[] = "33:33:fe:df:dc:4e"; |
| const char kEui48MulticastLocalDashString1[] = "33-33-fe-df-dc-4e"; |
| const struct sockaddr_ll kEui48MulticastLocalSockAddr1 = { |
| .sll_family = AF_PACKET, |
| .sll_hatype = ARPHRD_ETHER, |
| .sll_halen = 6, |
| .sll_addr = { |
| 0x33, 0x33, 0xfe, 0xdf, 0xdc, 0x4e |
| } |
| }; |
| |
| constexpr unsigned char kEui48Broadcast[] = { |
| 0xff, 0xff, 0xff, 0xff, 0xff, 0xff |
| }; |
| const char kEui48BroadcastColonString[] = "ff:ff:ff:ff:ff:ff"; |
| const char kEui48BroadcastDashString[] = "ff-ff-ff-ff-ff-ff"; |
| const struct sockaddr_ll kEui48BroadcastSockAddr = { |
| .sll_family = AF_PACKET, |
| .sll_hatype = ARPHRD_ETHER, |
| .sll_halen = 6, |
| .sll_addr = { |
| 0xff, 0xff, 0xff, 0xff, 0xff, 0xff |
| } |
| }; |
| |
| const char kEui48MixedCaseString1[] = "eE:fF:3c:22:6A:bB"; |
| const char kEui48MixedCaseString2[] = "EE-fF-3c-22-6a-bb"; |
| const char kEui48MixedCaseString3[] = "ee:ff:3C:22:6A:BB"; |
| |
| // Bad address. |
| |
| constexpr unsigned char kWayTooLong[] = { |
| 0xaa, 0xf3, 0x12, 0x32, 0x03, 0xc3, 0x86, 0xb3, 0x41, 0x96, |
| 0x01, 0x64, 0x0a, 0x79, 0x79, 0xa0, 0x13, 0x28, 0xf4, 0x26 |
| }; |
| constexpr unsigned char kWayTooShort[] = { |
| 0x00 |
| }; |
| |
| const char kNotAnAddress[] = "To be or not to be"; |
| const char kMixedColonsAndDashes[] = "50-ef:1f-61:d1-e7"; |
| const char kNotHexidecimal[] = "50-ef-1g-6z-d1-e7"; |
| |
| constexpr unsigned char kEui48ZeroTestBytes[] = { |
| 0x50, 0xef, 0x0f, 0x61, 0x01, 0xe7 |
| }; |
| const char kWithLeadingZeros[] = "50-ef-f-61-1-e7"; |
| const char kWithoutLeadingZeros[] = "50-ef-0f-61-01-e7"; |
| |
| const struct sockaddr_ll kUnknownHardwareType = { |
| .sll_family = AF_PACKET, |
| .sll_hatype = ARPHRD_HDLC, |
| .sll_halen = 6, |
| .sll_addr = { |
| 0x27, 0xea, 0x87, 0x12, 0x86, 0xc5 |
| } |
| }; |
| const struct sockaddr_ll kBadLengthForType = { |
| .sll_family = AF_PACKET, |
| .sll_hatype = ARPHRD_ETHER, |
| .sll_halen = 8, |
| .sll_addr = { |
| 0x3, 0x38, 0x73, 0x2c, 0xec, 0x1c, 0x37, 0x32 |
| } |
| }; |
| |
| const struct sockaddr_ll kBadLengthForStruct = { |
| .sll_family = AF_PACKET, |
| .sll_hatype = ARPHRD_EUI64, |
| .sll_halen = 19, |
| .sll_addr = { |
| 0x3, 0x38, 0x73, 0x2c, 0xec, 0x1c, 0x37, 0x1c |
| } |
| }; |
| |
| // clang-format on |
| |
| } // namespace |
| |
| TEST(LLAddressTest, EmptyInstance) { |
| // Make an empty LL address and check that all methods return the expected |
| // result. |
| const LLAddress empty_address; |
| |
| EXPECT_FALSE(empty_address.IsValid()); |
| EXPECT_EQ(LLAddress::kTypeInvalid, empty_address.type()); |
| |
| EXPECT_EQ(empty_address.GetLength(), 0); |
| |
| // Routing schemes. |
| EXPECT_FALSE(empty_address.IsUnicast()); |
| EXPECT_FALSE(empty_address.IsMulticast()); |
| EXPECT_FALSE(empty_address.IsBroadcast()); |
| |
| EXPECT_FALSE(empty_address.IsUniversal()); |
| EXPECT_FALSE(empty_address.IsLocal()); |
| |
| const LLAddress other_empty_address = empty_address; |
| |
| EXPECT_FALSE(other_empty_address.Equals(empty_address)); |
| EXPECT_FALSE(empty_address.Equals(other_empty_address)); |
| EXPECT_TRUE(empty_address.Equals(empty_address)); |
| } |
| |
| // EUI-48 Tests. |
| |
| TEST(LLAddressTest, Eui48FromBytes) { |
| // Unicast-Universal. |
| const ByteString uni_uni_address_bytes(kEui48UnicastUniversal1, |
| sizeof(kEui48UnicastUniversal1)); |
| const LLAddress uni_uni_address(LLAddress::kTypeEui48, uni_uni_address_bytes); |
| |
| ASSERT_TRUE(uni_uni_address.IsValid()); |
| |
| EXPECT_EQ(uni_uni_address.type(), LLAddress::kTypeEui48); |
| EXPECT_EQ(uni_uni_address.GetLength(), 6); |
| EXPECT_TRUE(uni_uni_address.address().Equals(uni_uni_address_bytes)); |
| |
| EXPECT_TRUE(uni_uni_address.IsUnicast()); |
| EXPECT_FALSE(uni_uni_address.IsMulticast()); |
| EXPECT_FALSE(uni_uni_address.IsBroadcast()); |
| |
| EXPECT_TRUE(uni_uni_address.IsUniversal()); |
| EXPECT_FALSE(uni_uni_address.IsLocal()); |
| |
| EXPECT_EQ(uni_uni_address.ToString(), kEui48UnicastUniversalDashString1); |
| EXPECT_TRUE(uni_uni_address.Equals(uni_uni_address)); |
| |
| // Unicast-Local. |
| const ByteString uni_loc_address_bytes(kEui48UnicastLocal1, |
| sizeof(kEui48UnicastLocal1)); |
| const LLAddress uni_loc_address(LLAddress::kTypeEui48, uni_loc_address_bytes); |
| |
| ASSERT_TRUE(uni_loc_address.IsValid()); |
| |
| EXPECT_EQ(uni_loc_address.type(), LLAddress::kTypeEui48); |
| EXPECT_EQ(uni_loc_address.GetLength(), 6); |
| EXPECT_TRUE(uni_loc_address.address().Equals(uni_loc_address_bytes)); |
| |
| EXPECT_TRUE(uni_loc_address.IsUnicast()); |
| EXPECT_FALSE(uni_loc_address.IsMulticast()); |
| EXPECT_FALSE(uni_loc_address.IsBroadcast()); |
| |
| EXPECT_FALSE(uni_loc_address.IsUniversal()); |
| EXPECT_TRUE(uni_loc_address.IsLocal()); |
| |
| EXPECT_EQ(uni_loc_address.ToString(), kEui48UnicastLocalDashString1); |
| EXPECT_TRUE(uni_loc_address.Equals(uni_loc_address)); |
| |
| // Multi-Universal. |
| const ByteString multi_uni_address_bytes(kEui48MulticastUniversal1, |
| sizeof(kEui48MulticastUniversal1)); |
| const LLAddress multi_uni_address(LLAddress::kTypeEui48, |
| multi_uni_address_bytes); |
| |
| ASSERT_TRUE(multi_uni_address.IsValid()); |
| |
| EXPECT_EQ(multi_uni_address.type(), LLAddress::kTypeEui48); |
| EXPECT_EQ(multi_uni_address.GetLength(), 6); |
| EXPECT_TRUE(multi_uni_address.address().Equals(multi_uni_address_bytes)); |
| |
| EXPECT_FALSE(multi_uni_address.IsUnicast()); |
| EXPECT_TRUE(multi_uni_address.IsMulticast()); |
| EXPECT_FALSE(multi_uni_address.IsBroadcast()); |
| |
| EXPECT_TRUE(multi_uni_address.IsUniversal()); |
| EXPECT_FALSE(multi_uni_address.IsLocal()); |
| |
| EXPECT_EQ(multi_uni_address.ToString(), kEui48MulticastUniversalDashString1); |
| EXPECT_TRUE(multi_uni_address.Equals(multi_uni_address)); |
| |
| // Multi-Local. |
| const ByteString multi_loc_address_bytes(kEui48MulticastLocal1, |
| sizeof(kEui48MulticastLocal1)); |
| const LLAddress multi_loc_address(LLAddress::kTypeEui48, |
| multi_loc_address_bytes); |
| |
| ASSERT_TRUE(multi_loc_address.IsValid()); |
| |
| EXPECT_EQ(multi_loc_address.type(), LLAddress::kTypeEui48); |
| EXPECT_EQ(multi_loc_address.GetLength(), 6); |
| EXPECT_TRUE(multi_loc_address.address().Equals(multi_loc_address_bytes)); |
| |
| EXPECT_FALSE(multi_loc_address.IsUnicast()); |
| EXPECT_TRUE(multi_loc_address.IsMulticast()); |
| EXPECT_FALSE(multi_loc_address.IsBroadcast()); |
| |
| EXPECT_FALSE(multi_loc_address.IsUniversal()); |
| EXPECT_TRUE(multi_loc_address.IsLocal()); |
| |
| EXPECT_EQ(multi_loc_address.ToString(), kEui48MulticastLocalDashString1); |
| EXPECT_TRUE(multi_loc_address.Equals(multi_loc_address)); |
| |
| // Broadcast. |
| const ByteString broadcast_address_bytes(kEui48Broadcast, |
| sizeof(kEui48Broadcast)); |
| const LLAddress broadcast_address(LLAddress::kTypeEui48, |
| broadcast_address_bytes); |
| |
| ASSERT_TRUE(broadcast_address.IsValid()); |
| |
| EXPECT_EQ(broadcast_address.type(), LLAddress::kTypeEui48); |
| EXPECT_EQ(broadcast_address.GetLength(), 6); |
| EXPECT_TRUE(broadcast_address.address().Equals(broadcast_address_bytes)); |
| |
| EXPECT_FALSE(broadcast_address.IsUnicast()); |
| EXPECT_TRUE(broadcast_address.IsMulticast()); |
| EXPECT_TRUE(broadcast_address.IsBroadcast()); |
| |
| EXPECT_FALSE(broadcast_address.IsUniversal()); |
| EXPECT_TRUE(broadcast_address.IsLocal()); |
| |
| EXPECT_EQ(broadcast_address.ToString(), kEui48BroadcastDashString); |
| EXPECT_TRUE(broadcast_address.Equals(broadcast_address)); |
| |
| // Comparisons. |
| EXPECT_FALSE(uni_uni_address.Equals(uni_loc_address)); |
| EXPECT_FALSE(uni_uni_address.Equals(multi_uni_address)); |
| EXPECT_FALSE(uni_uni_address.Equals(multi_loc_address)); |
| EXPECT_FALSE(uni_uni_address.Equals(broadcast_address)); |
| |
| EXPECT_FALSE(uni_loc_address.Equals(multi_uni_address)); |
| EXPECT_FALSE(uni_loc_address.Equals(multi_loc_address)); |
| EXPECT_FALSE(uni_loc_address.Equals(broadcast_address)); |
| |
| EXPECT_FALSE(multi_uni_address.Equals(multi_loc_address)); |
| EXPECT_FALSE(multi_uni_address.Equals(broadcast_address)); |
| |
| EXPECT_FALSE(multi_loc_address.Equals(broadcast_address)); |
| } |
| |
| TEST(LLAddressTest, Eui48FromOthers) { |
| // Test that each constructor call results in the same object as the |
| // byte derived address. It is assumed that the byte derived address |
| // is correct as it was tested in the Eui48FromBytes testcase. |
| // Unicast-Universal. |
| |
| const LLAddress uni_uni_address( |
| LLAddress::kTypeEui48, |
| ByteString(kEui48UnicastUniversal1, sizeof(kEui48UnicastUniversal1))); |
| const LLAddress uni_uni_col_str_address(LLAddress::kTypeEui48, |
| kEui48UnicastUniversalColonString1); |
| const LLAddress uni_uni_dash_str_address(LLAddress::kTypeEui48, |
| kEui48UnicastUniversalDashString1); |
| const LLAddress uni_uni_ll_struct_address(&kEui48UnicastUniversalSockAddr1); |
| |
| ASSERT_TRUE(uni_uni_address.IsValid()); |
| EXPECT_TRUE(uni_uni_col_str_address.IsValid()); |
| EXPECT_TRUE(uni_uni_dash_str_address.IsValid()); |
| EXPECT_TRUE(uni_uni_ll_struct_address.IsValid()); |
| |
| EXPECT_EQ(uni_uni_ll_struct_address.type(), LLAddress::kTypeEui48); |
| |
| EXPECT_TRUE(uni_uni_address.Equals(uni_uni_col_str_address)); |
| EXPECT_TRUE(uni_uni_address.Equals(uni_uni_dash_str_address)); |
| EXPECT_TRUE(uni_uni_address.Equals(uni_uni_ll_struct_address)); |
| |
| // Unicast-Local. |
| const LLAddress uni_loc_address( |
| LLAddress::kTypeEui48, |
| ByteString(kEui48UnicastLocal1, sizeof(kEui48UnicastLocal1))); |
| const LLAddress uni_loc_col_str_address(LLAddress::kTypeEui48, |
| kEui48UnicastLocalColonString1); |
| const LLAddress uni_loc_dash_str_address(LLAddress::kTypeEui48, |
| kEui48UnicastLocalDashString1); |
| const LLAddress uni_loc_ll_struct_address(&kEui48UnicastLocalSockAddr1); |
| |
| ASSERT_TRUE(uni_loc_address.IsValid()); |
| EXPECT_TRUE(uni_loc_col_str_address.IsValid()); |
| EXPECT_TRUE(uni_loc_dash_str_address.IsValid()); |
| EXPECT_TRUE(uni_loc_ll_struct_address.IsValid()); |
| |
| EXPECT_EQ(uni_loc_ll_struct_address.type(), LLAddress::kTypeEui48); |
| |
| EXPECT_TRUE(uni_loc_address.Equals(uni_loc_col_str_address)); |
| EXPECT_TRUE(uni_loc_address.Equals(uni_loc_dash_str_address)); |
| EXPECT_TRUE(uni_loc_address.Equals(uni_loc_ll_struct_address)); |
| |
| // Multi-Universal. |
| const LLAddress multi_uni_address( |
| LLAddress::kTypeEui48, |
| ByteString(kEui48MulticastUniversal1, sizeof(kEui48MulticastUniversal1))); |
| const LLAddress multi_uni_col_str_address( |
| LLAddress::kTypeEui48, kEui48MulticastUniversalColonString1); |
| const LLAddress multi_uni_dash_str_address( |
| LLAddress::kTypeEui48, kEui48MulticastUniversalDashString1); |
| const LLAddress multi_uni_ll_struct_address( |
| &kEui48MulticastUniversalSockAddr1); |
| |
| ASSERT_TRUE(multi_uni_address.IsValid()); |
| EXPECT_TRUE(multi_uni_col_str_address.IsValid()); |
| EXPECT_TRUE(multi_uni_dash_str_address.IsValid()); |
| EXPECT_TRUE(multi_uni_ll_struct_address.IsValid()); |
| |
| EXPECT_EQ(multi_uni_ll_struct_address.type(), LLAddress::kTypeEui48); |
| |
| EXPECT_TRUE(multi_uni_address.Equals(multi_uni_col_str_address)); |
| EXPECT_TRUE(multi_uni_address.Equals(multi_uni_dash_str_address)); |
| EXPECT_TRUE(multi_uni_address.Equals(multi_uni_ll_struct_address)); |
| |
| // Multi-Local. |
| const LLAddress multi_loc_address( |
| LLAddress::kTypeEui48, |
| ByteString(kEui48MulticastLocal1, sizeof(kEui48MulticastLocal1))); |
| const LLAddress multi_loc_col_str_address(LLAddress::kTypeEui48, |
| kEui48MulticastLocalColonString1); |
| const LLAddress multi_loc_dash_str_address(LLAddress::kTypeEui48, |
| kEui48MulticastLocalDashString1); |
| const LLAddress multi_loc_ll_struct_address(&kEui48MulticastLocalSockAddr1); |
| |
| ASSERT_TRUE(multi_loc_address.IsValid()); |
| EXPECT_TRUE(multi_loc_col_str_address.IsValid()); |
| EXPECT_TRUE(multi_loc_dash_str_address.IsValid()); |
| EXPECT_TRUE(multi_loc_ll_struct_address.IsValid()); |
| |
| EXPECT_EQ(multi_loc_ll_struct_address.type(), LLAddress::kTypeEui48); |
| |
| EXPECT_TRUE(multi_loc_address.Equals(multi_loc_col_str_address)); |
| EXPECT_TRUE(multi_loc_address.Equals(multi_loc_dash_str_address)); |
| EXPECT_TRUE(multi_loc_address.Equals(multi_loc_ll_struct_address)); |
| |
| // Broadcast. |
| const LLAddress broadcast_address( |
| LLAddress::kTypeEui48, |
| ByteString(kEui48Broadcast, sizeof(kEui48Broadcast))); |
| const LLAddress broadcast_col_str_address(LLAddress::kTypeEui48, |
| kEui48BroadcastColonString); |
| const LLAddress broadcast_dash_str_address(LLAddress::kTypeEui48, |
| kEui48BroadcastDashString); |
| const LLAddress broadcast_ll_struct_address(&kEui48BroadcastSockAddr); |
| |
| ASSERT_TRUE(broadcast_address.IsValid()); |
| EXPECT_TRUE(broadcast_col_str_address.IsValid()); |
| EXPECT_TRUE(broadcast_dash_str_address.IsValid()); |
| EXPECT_TRUE(broadcast_ll_struct_address.IsValid()); |
| |
| EXPECT_EQ(broadcast_ll_struct_address.type(), LLAddress::kTypeEui48); |
| |
| EXPECT_TRUE(broadcast_address.Equals(broadcast_col_str_address)); |
| EXPECT_TRUE(broadcast_address.Equals(broadcast_dash_str_address)); |
| EXPECT_TRUE(broadcast_address.Equals(broadcast_ll_struct_address)); |
| } |
| |
| TEST(LLAddressTest, Eui48MixedCase) { |
| // Valid but mixed lowercase and uppercase |
| const LLAddress address1(LLAddress::kTypeEui48, kEui48MixedCaseString1); |
| const LLAddress address2(LLAddress::kTypeEui48, kEui48MixedCaseString2); |
| const LLAddress address3(LLAddress::kTypeEui48, kEui48MixedCaseString3); |
| |
| ASSERT_TRUE(address1.IsValid()); |
| ASSERT_TRUE(address2.IsValid()); |
| ASSERT_TRUE(address3.IsValid()); |
| |
| EXPECT_TRUE(address1.Equals(address2)); |
| EXPECT_TRUE(address1.Equals(address3)); |
| EXPECT_TRUE(address2.Equals(address1)); |
| EXPECT_TRUE(address2.Equals(address3)); |
| EXPECT_TRUE(address3.Equals(address1)); |
| EXPECT_TRUE(address3.Equals(address2)); |
| } |
| |
| TEST(LLAddressTest, Eui48BadStrings) { |
| // Invalid strings. |
| const LLAddress not_an_address(LLAddress::kTypeEui48, kNotAnAddress); |
| const LLAddress mixed_col_n_dash_address(LLAddress::kTypeEui48, |
| kMixedColonsAndDashes); |
| const LLAddress not_hex_address(LLAddress::kTypeEui48, kNotHexidecimal); |
| |
| EXPECT_FALSE(not_an_address.IsValid()); |
| EXPECT_FALSE(mixed_col_n_dash_address.IsValid()); |
| EXPECT_FALSE(not_hex_address.IsValid()); |
| } |
| |
| TEST(LLAddressTest, Eui48LeadingZeros) { |
| const LLAddress zeros_address( |
| LLAddress::kTypeEui48, |
| ByteString(kEui48ZeroTestBytes, sizeof(kEui48ZeroTestBytes))); |
| const LLAddress with_leading_zeros(LLAddress::kTypeEui48, kWithLeadingZeros); |
| const LLAddress without_leading_zeros(LLAddress::kTypeEui48, |
| kWithoutLeadingZeros); |
| |
| ASSERT_TRUE(zeros_address.IsValid()); |
| |
| EXPECT_TRUE(with_leading_zeros.IsValid()); |
| EXPECT_TRUE(without_leading_zeros.IsValid()); |
| |
| EXPECT_TRUE(zeros_address.Equals(with_leading_zeros)); |
| EXPECT_TRUE(zeros_address.Equals(without_leading_zeros)); |
| } |
| |
| TEST(LLAddressTest, BadSizeBytes) { |
| // Invalid bytes. |
| const LLAddress eui_48_too_short( |
| LLAddress::kTypeEui48, ByteString(kWayTooShort, sizeof(kWayTooShort))); |
| const LLAddress eui_64_too_short( |
| LLAddress::kTypeEui64, ByteString(kWayTooShort, sizeof(kWayTooShort))); |
| |
| const LLAddress eui_48_too_long(LLAddress::kTypeEui48, |
| ByteString(kWayTooLong, sizeof(kWayTooLong))); |
| const LLAddress eui_64_too_long(LLAddress::kTypeEui64, |
| ByteString(kWayTooLong, sizeof(kWayTooLong))); |
| |
| EXPECT_FALSE(eui_48_too_short.IsValid()); |
| EXPECT_FALSE(eui_64_too_short.IsValid()); |
| EXPECT_FALSE(eui_48_too_long.IsValid()); |
| EXPECT_FALSE(eui_64_too_long.IsValid()); |
| } |
| |
| TEST(LLAddressTest, BadSockAddrStructs) { |
| // Bad sockaddr_ll structs. |
| const LLAddress unknown_hardware_address(&kUnknownHardwareType); |
| const LLAddress bad_length_for_type_address(&kBadLengthForType); |
| const LLAddress bad_length_for_struct(&kBadLengthForStruct); |
| |
| EXPECT_FALSE(unknown_hardware_address.IsValid()); |
| EXPECT_FALSE(bad_length_for_type_address.IsValid()); |
| EXPECT_FALSE(bad_length_for_struct.IsValid()); |
| } |
| |
| } // namespace portier |