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