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// 1691a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 1791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart#include "shill/arp_packet.h" 1891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 1991a5aac3d03883be7d652096b1c018298096edcdPaul Stewart#include <gtest/gtest.h> 2091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 2191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart#include "shill/mock_log.h" 2291a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 2391a5aac3d03883be7d652096b1c018298096edcdPaul Stewartusing testing::_; 2491a5aac3d03883be7d652096b1c018298096edcdPaul Stewartusing testing::HasSubstr; 2591a5aac3d03883be7d652096b1c018298096edcdPaul Stewartusing testing::Test; 2691a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 2791a5aac3d03883be7d652096b1c018298096edcdPaul Stewartnamespace shill { 2891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 2991a5aac3d03883be7d652096b1c018298096edcdPaul Stewartnamespace { 307fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst uint8_t kArpRequestV4[] = 3191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart { 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x01 }; 327fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst uint8_t kArpRequestV6[] = 3391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart { 0x00, 0x01, 0x86, 0xdd, 0x06, 0x10, 0x00, 0x01 }; 347fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst uint8_t kArpReplyV4[] = 3591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart { 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x02 }; 367fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst uint8_t kArpReplyV6[] = 3791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart { 0x00, 0x01, 0x86, 0xdd, 0x06, 0x10, 0x00, 0x02 }; 3891a5aac3d03883be7d652096b1c018298096edcdPaul Stewartconst char kIPv4Address0[] = "192.168.0.1"; 3991a5aac3d03883be7d652096b1c018298096edcdPaul Stewartconst char kIPv4Address1[] = "10.0.12.13"; 4091a5aac3d03883be7d652096b1c018298096edcdPaul Stewartconst char kIPv6Address0[] = "fe80::1aa9:5ff:7ebf:14c5"; 4191a5aac3d03883be7d652096b1c018298096edcdPaul Stewartconst char kIPv6Address1[] = "1980:0:0:1000:1b02:1aa9:5ff:7ebf"; 427fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst uint8_t kMACAddress0[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 }; 437fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst uint8_t kMACAddress1[] = { 0x88, 0x87, 0x86, 0x85, 0x84, 0x83 }; 447fab89734d88724a288e96a9996b15548c5294c7Ben Chanconst uint8_t kInsertedByte[] = { 0x00 }; 45ac1328e5143f6ee0054d5cb2f7d17754c16a3814Paul Stewartconst size_t kArpPaddingSizeV4 = 18; 46ac1328e5143f6ee0054d5cb2f7d17754c16a3814Paul Stewartconst size_t kArpPaddingSizeV6 = 0; 478a5322984f2d81bcbfd8d44c59747a11bd9b904bAlex Vakulenko} // namespace 4891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 4991a5aac3d03883be7d652096b1c018298096edcdPaul Stewartclass ArpPacketTest : public Test { 5091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart public: 5191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ArpPacketTest() 5291a5aac3d03883be7d652096b1c018298096edcdPaul Stewart : ipv4_address0_(IPAddress::kFamilyIPv4), 5391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ipv4_address1_(IPAddress::kFamilyIPv4), 5491a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ipv6_address0_(IPAddress::kFamilyIPv6), 5591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ipv6_address1_(IPAddress::kFamilyIPv6), 5691a5aac3d03883be7d652096b1c018298096edcdPaul Stewart mac_address0_(kMACAddress0, arraysize(kMACAddress0)), 5791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart mac_address1_(kMACAddress1, arraysize(kMACAddress1)), 5891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart inserted_byte_(kInsertedByte, arraysize(kInsertedByte)) {} 5991a5aac3d03883be7d652096b1c018298096edcdPaul Stewart virtual ~ArpPacketTest() {} 6091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 6191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart virtual void SetUp() { 6291a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(ipv4_address0_.SetAddressFromString(kIPv4Address0)); 6391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(ipv4_address1_.SetAddressFromString(kIPv4Address1)); 6491a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(ipv6_address0_.SetAddressFromString(kIPv6Address0)); 6591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(ipv6_address1_.SetAddressFromString(kIPv6Address1)); 6691a5aac3d03883be7d652096b1c018298096edcdPaul Stewart } 6791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 6891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart protected: 6991a5aac3d03883be7d652096b1c018298096edcdPaul Stewart IPAddress ipv4_address0_; 7091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart IPAddress ipv4_address1_; 7191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart IPAddress ipv6_address0_; 7291a5aac3d03883be7d652096b1c018298096edcdPaul Stewart IPAddress ipv6_address1_; 7391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ByteString mac_address0_; 7491a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ByteString mac_address1_; 7591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ByteString inserted_byte_; 7691a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ArpPacket packet_; 7791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart}; 7891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 7991a5aac3d03883be7d652096b1c018298096edcdPaul StewartTEST_F(ArpPacketTest, Constructor) { 8091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_FALSE(packet_.local_ip_address().IsValid()); 8191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_FALSE(packet_.remote_ip_address().IsValid()); 8291a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(packet_.local_mac_address().IsEmpty()); 8391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(packet_.remote_mac_address().IsEmpty()); 8491a5aac3d03883be7d652096b1c018298096edcdPaul Stewart} 8591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 8691a5aac3d03883be7d652096b1c018298096edcdPaul StewartTEST_F(ArpPacketTest, GettersAndSetters) { 8791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_local_ip_address(ipv4_address0_); 8891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_remote_ip_address(ipv6_address1_); 8991a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_local_mac_address(mac_address0_); 9091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_remote_mac_address(mac_address1_); 9191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(ipv4_address0_.Equals(packet_.local_ip_address())); 9291a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(ipv6_address1_.Equals(packet_.remote_ip_address())); 9391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(mac_address0_.Equals(packet_.local_mac_address())); 9491a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(mac_address1_.Equals(packet_.remote_mac_address())); 9591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart} 9691a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 97417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul StewartTEST_F(ArpPacketTest, ParseTinyPacket) { 9891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ScopedMockLog log; 9991a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_CALL(log, 10091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart Log(logging::LOG_ERROR, _, 10191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart HasSubstr("too short to contain ARP header."))).Times(1); 10291a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 10391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ByteString arp_bytes(kArpReplyV4, arraysize(kArpReplyV4)); 10491a5aac3d03883be7d652096b1c018298096edcdPaul Stewart arp_bytes.Resize(arp_bytes.GetLength() - 1); 105417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart EXPECT_FALSE(packet_.Parse(arp_bytes)); 10691a5aac3d03883be7d652096b1c018298096edcdPaul Stewart} 10791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 108417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul StewartTEST_F(ArpPacketTest, ParseBadHRDType) { 10991a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ScopedMockLog log; 11091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_CALL(log, 11191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart Log(logging::LOG_ERROR, _, 11291a5aac3d03883be7d652096b1c018298096edcdPaul Stewart HasSubstr("Packet is of unknown ARPHRD type 257"))).Times(1); 11391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 11491a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ByteString arp_bytes(kArpReplyV4, arraysize(kArpReplyV4)); 11591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart arp_bytes.GetData()[0] = 0x1; 116417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart EXPECT_FALSE(packet_.Parse(arp_bytes)); 11791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart} 11891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 119417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul StewartTEST_F(ArpPacketTest, ParseBadProtocol) { 12091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ScopedMockLog log; 12191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_CALL(log, 12291a5aac3d03883be7d652096b1c018298096edcdPaul Stewart Log(logging::LOG_ERROR, _, 12391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart HasSubstr("Packet has unknown protocol 2049"))).Times(1); 12491a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 12591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ByteString arp_bytes(kArpReplyV4, arraysize(kArpReplyV4)); 12691a5aac3d03883be7d652096b1c018298096edcdPaul Stewart arp_bytes.GetData()[3] = 0x1; 127417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart EXPECT_FALSE(packet_.Parse(arp_bytes)); 12891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart} 12991a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 130417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul StewartTEST_F(ArpPacketTest, ParseBadHardwareLength) { 13191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ScopedMockLog log; 13291a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_CALL(log, 13391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart Log(logging::LOG_ERROR, _, 13491a5aac3d03883be7d652096b1c018298096edcdPaul Stewart HasSubstr("Packet has unexpected hardware address length"))).Times(1); 13591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 13691a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ByteString arp_bytes(kArpReplyV4, arraysize(kArpReplyV4)); 13791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart arp_bytes.GetData()[4] = 0x1; 138417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart EXPECT_FALSE(packet_.Parse(arp_bytes)); 13991a5aac3d03883be7d652096b1c018298096edcdPaul Stewart} 14091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 141417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul StewartTEST_F(ArpPacketTest, ParseBadProtocolLength) { 14291a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ScopedMockLog log; 14391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_CALL(log, 14491a5aac3d03883be7d652096b1c018298096edcdPaul Stewart Log(logging::LOG_ERROR, _, 14591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart HasSubstr("Packet has unexpected protocol address length"))).Times(1); 14691a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 14791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ByteString arp_bytes(kArpReplyV4, arraysize(kArpReplyV4)); 14891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart arp_bytes.GetData()[5] = 0x1; 149417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart EXPECT_FALSE(packet_.Parse(arp_bytes)); 15091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart} 15191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 152417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul StewartTEST_F(ArpPacketTest, ParseBadOpCode) { 15391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ScopedMockLog log; 15491a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_CALL(log, 15591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart Log(logging::LOG_ERROR, _, 156417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart HasSubstr("Packet is not an ARP reply or request but of type 258"))) 157417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart .Times(1); 15891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 15991a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ByteString arp_bytes(kArpReplyV4, arraysize(kArpReplyV4)); 16091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart arp_bytes.GetData()[6] = 0x1; 161417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart EXPECT_FALSE(packet_.Parse(arp_bytes)); 16291a5aac3d03883be7d652096b1c018298096edcdPaul Stewart} 16391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 164417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul StewartTEST_F(ArpPacketTest, ParseShortPacket) { 16591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ScopedMockLog log; 16691a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_CALL(log, 16791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart Log(logging::LOG_ERROR, _, 16891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart HasSubstr("is too small to contain entire ARP payload"))).Times(1); 16991a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 17091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ByteString arp_bytes(kArpReplyV6, arraysize(kArpReplyV6)); 17191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart arp_bytes.Append(mac_address1_); 17291a5aac3d03883be7d652096b1c018298096edcdPaul Stewart arp_bytes.Append(ipv6_address0_.address()); 17391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart arp_bytes.Append(mac_address0_); 17491a5aac3d03883be7d652096b1c018298096edcdPaul Stewart arp_bytes.Append(ipv6_address1_.address()); 17591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart arp_bytes.Resize(arp_bytes.GetLength() - 1); 176417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart EXPECT_FALSE(packet_.Parse(arp_bytes)); 17791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart} 17891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 179417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul StewartTEST_F(ArpPacketTest, ParseIPv4) { 18091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ByteString arp_bytes(kArpReplyV4, arraysize(kArpReplyV4)); 18191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart arp_bytes.Append(mac_address0_); 18291a5aac3d03883be7d652096b1c018298096edcdPaul Stewart arp_bytes.Append(ipv4_address0_.address()); 18391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart arp_bytes.Append(mac_address1_); 18491a5aac3d03883be7d652096b1c018298096edcdPaul Stewart arp_bytes.Append(ipv4_address1_.address()); 185417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart EXPECT_TRUE(packet_.Parse(arp_bytes)); 186417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart EXPECT_TRUE(packet_.IsReply()); 18791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(ipv4_address0_.Equals(packet_.local_ip_address())); 18891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(ipv4_address1_.Equals(packet_.remote_ip_address())); 18991a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(mac_address0_.Equals(packet_.local_mac_address())); 19091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(mac_address1_.Equals(packet_.remote_mac_address())); 191ac1328e5143f6ee0054d5cb2f7d17754c16a3814Paul Stewart 192ac1328e5143f6ee0054d5cb2f7d17754c16a3814Paul Stewart // Parse should succeed with arbitrary trailing padding. 193ac1328e5143f6ee0054d5cb2f7d17754c16a3814Paul Stewart arp_bytes.Append(ByteString(1000)); 194417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart EXPECT_TRUE(packet_.Parse(arp_bytes)); 19591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart} 19691a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 197417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul StewartTEST_F(ArpPacketTest, ParseIPv6) { 19891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ByteString arp_bytes(kArpReplyV6, arraysize(kArpReplyV6)); 19991a5aac3d03883be7d652096b1c018298096edcdPaul Stewart arp_bytes.Append(mac_address1_); 20091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart arp_bytes.Append(ipv6_address0_.address()); 20191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart arp_bytes.Append(mac_address0_); 20291a5aac3d03883be7d652096b1c018298096edcdPaul Stewart arp_bytes.Append(ipv6_address1_.address()); 203417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart EXPECT_TRUE(packet_.Parse(arp_bytes)); 204417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart EXPECT_TRUE(packet_.IsReply()); 20591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(ipv6_address0_.Equals(packet_.local_ip_address())); 20691a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(ipv6_address1_.Equals(packet_.remote_ip_address())); 20791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(mac_address1_.Equals(packet_.local_mac_address())); 20891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(mac_address0_.Equals(packet_.remote_mac_address())); 20991a5aac3d03883be7d652096b1c018298096edcdPaul Stewart} 21091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 211417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul StewartTEST_F(ArpPacketTest, ParseRequest) { 212417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart ByteString arp_bytes(kArpRequestV4, arraysize(kArpRequestV4)); 213417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart arp_bytes.Append(mac_address0_); 214417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart arp_bytes.Append(ipv4_address0_.address()); 215417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart arp_bytes.Append(mac_address1_); 216417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart arp_bytes.Append(ipv4_address1_.address()); 217417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart EXPECT_TRUE(packet_.Parse(arp_bytes)); 218417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart EXPECT_FALSE(packet_.IsReply()); 219417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart EXPECT_TRUE(ipv4_address0_.Equals(packet_.local_ip_address())); 220417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart EXPECT_TRUE(ipv4_address1_.Equals(packet_.remote_ip_address())); 221417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart EXPECT_TRUE(mac_address0_.Equals(packet_.local_mac_address())); 222417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart EXPECT_TRUE(mac_address1_.Equals(packet_.remote_mac_address())); 223417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart} 224417e5f079a1ccbc068c67f9cbf34f13c40330abcPaul Stewart 22591a5aac3d03883be7d652096b1c018298096edcdPaul StewartTEST_F(ArpPacketTest, FormatRequestInvalidAddress) { 22691a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ScopedMockLog log; 22791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_CALL(log, 22891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart Log(logging::LOG_ERROR, _, 22991a5aac3d03883be7d652096b1c018298096edcdPaul Stewart HasSubstr("Local or remote IP address is not valid"))).Times(3); 23091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 23191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ByteString arp_bytes; 23291a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_FALSE(packet_.FormatRequest(&arp_bytes)); 23391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_local_ip_address(ipv4_address0_); 23491a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_FALSE(packet_.FormatRequest(&arp_bytes)); 23591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_local_ip_address(IPAddress(IPAddress::kFamilyUnknown)); 23691a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_remote_ip_address(ipv4_address0_); 23791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_FALSE(packet_.FormatRequest(&arp_bytes)); 23891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart} 23991a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 24091a5aac3d03883be7d652096b1c018298096edcdPaul StewartTEST_F(ArpPacketTest, FormatRequestMismatchedAddresses) { 24191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ScopedMockLog log; 24291a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_CALL(log, 24391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart Log(logging::LOG_ERROR, _, 24491a5aac3d03883be7d652096b1c018298096edcdPaul Stewart HasSubstr("IP address families do not match"))).Times(1); 24591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 24691a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ByteString arp_bytes; 24791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_local_ip_address(ipv4_address0_); 24891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_remote_ip_address(ipv6_address1_); 24991a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_FALSE(packet_.FormatRequest(&arp_bytes)); 25091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart} 25191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 25291a5aac3d03883be7d652096b1c018298096edcdPaul StewartTEST_F(ArpPacketTest, FormatRequestBadMACAddressLength) { 25391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ScopedMockLog log; 25491a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_CALL(log, 25591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart Log(logging::LOG_ERROR, _, 25691a5aac3d03883be7d652096b1c018298096edcdPaul Stewart HasSubstr("MAC address length is incorrect"))).Times(3); 25791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 25891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ByteString arp_bytes; 25991a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_local_ip_address(ipv4_address0_); 26091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_remote_ip_address(ipv4_address1_); 26191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_FALSE(packet_.FormatRequest(&arp_bytes)); 26291a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_local_mac_address(mac_address0_); 26391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_FALSE(packet_.FormatRequest(&arp_bytes)); 26491a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_local_mac_address(ByteString()); 26591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_remote_mac_address(mac_address0_); 26691a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_FALSE(packet_.FormatRequest(&arp_bytes)); 26791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart} 26891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 26991a5aac3d03883be7d652096b1c018298096edcdPaul StewartTEST_F(ArpPacketTest, FormatRequestIPv4) { 27091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ByteString arp_bytes; 27191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_local_ip_address(ipv4_address0_); 27291a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_remote_ip_address(ipv4_address1_); 27391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_local_mac_address(mac_address0_); 27491a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_remote_mac_address(mac_address1_); 27591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(packet_.FormatRequest(&arp_bytes)); 27691a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 27791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ByteString expected_bytes(kArpRequestV4, arraysize(kArpRequestV4)); 27891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart expected_bytes.Append(mac_address0_); 27991a5aac3d03883be7d652096b1c018298096edcdPaul Stewart expected_bytes.Append(ipv4_address0_.address()); 28091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart expected_bytes.Append(mac_address1_); 28191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart expected_bytes.Append(ipv4_address1_.address()); 282ac1328e5143f6ee0054d5cb2f7d17754c16a3814Paul Stewart expected_bytes.Append(ByteString(kArpPaddingSizeV4)); 28391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(expected_bytes.Equals(arp_bytes)); 28491a5aac3d03883be7d652096b1c018298096edcdPaul Stewart} 28591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 28691a5aac3d03883be7d652096b1c018298096edcdPaul StewartTEST_F(ArpPacketTest, FormatRequestIPv6) { 28791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ByteString arp_bytes; 28891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_local_ip_address(ipv6_address0_); 28991a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_remote_ip_address(ipv6_address1_); 29091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_local_mac_address(mac_address1_); 29191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart packet_.set_remote_mac_address(mac_address0_); 29291a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(packet_.FormatRequest(&arp_bytes)); 29391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 29491a5aac3d03883be7d652096b1c018298096edcdPaul Stewart ByteString expected_bytes(kArpRequestV6, arraysize(kArpRequestV6)); 29591a5aac3d03883be7d652096b1c018298096edcdPaul Stewart expected_bytes.Append(mac_address1_); 29691a5aac3d03883be7d652096b1c018298096edcdPaul Stewart expected_bytes.Append(ipv6_address0_.address()); 29791a5aac3d03883be7d652096b1c018298096edcdPaul Stewart expected_bytes.Append(mac_address0_); 29891a5aac3d03883be7d652096b1c018298096edcdPaul Stewart expected_bytes.Append(ipv6_address1_.address()); 299ac1328e5143f6ee0054d5cb2f7d17754c16a3814Paul Stewart expected_bytes.Append(ByteString(kArpPaddingSizeV6)); 30091a5aac3d03883be7d652096b1c018298096edcdPaul Stewart EXPECT_TRUE(expected_bytes.Equals(arp_bytes)); 30191a5aac3d03883be7d652096b1c018298096edcdPaul Stewart} 30291a5aac3d03883be7d652096b1c018298096edcdPaul Stewart 30391a5aac3d03883be7d652096b1c018298096edcdPaul Stewart} // namespace shill 304