blob: 4cdaa76ce2bae8bb48cab410d6286ca1e51d8785 [file] [log] [blame]
Paul Stewart91a5aac2012-07-20 11:55:40 -07001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "shill/arp_packet.h"
6
7#include <gtest/gtest.h>
8
9#include "shill/mock_log.h"
10
11using testing::_;
12using testing::HasSubstr;
13using testing::Test;
14
15namespace shill {
16
17namespace {
18const uint8 kArpRequestV4[] =
19 { 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x01 };
20const uint8 kArpRequestV6[] =
21 { 0x00, 0x01, 0x86, 0xdd, 0x06, 0x10, 0x00, 0x01 };
22const uint8 kArpReplyV4[] =
23 { 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x02 };
24const uint8 kArpReplyV6[] =
25 { 0x00, 0x01, 0x86, 0xdd, 0x06, 0x10, 0x00, 0x02 };
26const char kIPv4Address0[] = "192.168.0.1";
27const char kIPv4Address1[] = "10.0.12.13";
28const char kIPv6Address0[] = "fe80::1aa9:5ff:7ebf:14c5";
29const char kIPv6Address1[] = "1980:0:0:1000:1b02:1aa9:5ff:7ebf";
30const uint8 kMACAddress0[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 };
31const uint8 kMACAddress1[] = { 0x88, 0x87, 0x86, 0x85, 0x84, 0x83 };
32const uint8 kMACBroadcast[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
33const uint8 kInsertedByte[] = { 0x00 };
34} // namespace {}
35
36class ArpPacketTest : public Test {
37 public:
38 ArpPacketTest()
39 : ipv4_address0_(IPAddress::kFamilyIPv4),
40 ipv4_address1_(IPAddress::kFamilyIPv4),
41 ipv6_address0_(IPAddress::kFamilyIPv6),
42 ipv6_address1_(IPAddress::kFamilyIPv6),
43 mac_address0_(kMACAddress0, arraysize(kMACAddress0)),
44 mac_address1_(kMACAddress1, arraysize(kMACAddress1)),
45 inserted_byte_(kInsertedByte, arraysize(kInsertedByte)) {}
46 virtual ~ArpPacketTest() {}
47
48 virtual void SetUp() {
49 EXPECT_TRUE(ipv4_address0_.SetAddressFromString(kIPv4Address0));
50 EXPECT_TRUE(ipv4_address1_.SetAddressFromString(kIPv4Address1));
51 EXPECT_TRUE(ipv6_address0_.SetAddressFromString(kIPv6Address0));
52 EXPECT_TRUE(ipv6_address1_.SetAddressFromString(kIPv6Address1));
53 }
54
55 protected:
56 IPAddress ipv4_address0_;
57 IPAddress ipv4_address1_;
58 IPAddress ipv6_address0_;
59 IPAddress ipv6_address1_;
60 ByteString mac_address0_;
61 ByteString mac_address1_;
62 ByteString inserted_byte_;
63 ArpPacket packet_;
64};
65
66TEST_F(ArpPacketTest, Constructor) {
67 EXPECT_FALSE(packet_.local_ip_address().IsValid());
68 EXPECT_FALSE(packet_.remote_ip_address().IsValid());
69 EXPECT_TRUE(packet_.local_mac_address().IsEmpty());
70 EXPECT_TRUE(packet_.remote_mac_address().IsEmpty());
71}
72
73TEST_F(ArpPacketTest, GettersAndSetters) {
74 packet_.set_local_ip_address(ipv4_address0_);
75 packet_.set_remote_ip_address(ipv6_address1_);
76 packet_.set_local_mac_address(mac_address0_);
77 packet_.set_remote_mac_address(mac_address1_);
78 EXPECT_TRUE(ipv4_address0_.Equals(packet_.local_ip_address()));
79 EXPECT_TRUE(ipv6_address1_.Equals(packet_.remote_ip_address()));
80 EXPECT_TRUE(mac_address0_.Equals(packet_.local_mac_address()));
81 EXPECT_TRUE(mac_address1_.Equals(packet_.remote_mac_address()));
82}
83
84TEST_F(ArpPacketTest, ParseReplyTinyPacket) {
85 ScopedMockLog log;
86 EXPECT_CALL(log,
87 Log(logging::LOG_ERROR, _,
88 HasSubstr("too short to contain ARP header."))).Times(1);
89
90 ByteString arp_bytes(kArpReplyV4, arraysize(kArpReplyV4));
91 arp_bytes.Resize(arp_bytes.GetLength() - 1);
92 EXPECT_FALSE(packet_.ParseReply(arp_bytes));
93}
94
95TEST_F(ArpPacketTest, ParseReplyBadHRDType) {
96 ScopedMockLog log;
97 EXPECT_CALL(log,
98 Log(logging::LOG_ERROR, _,
99 HasSubstr("Packet is of unknown ARPHRD type 257"))).Times(1);
100
101 ByteString arp_bytes(kArpReplyV4, arraysize(kArpReplyV4));
102 arp_bytes.GetData()[0] = 0x1;
103 EXPECT_FALSE(packet_.ParseReply(arp_bytes));
104}
105
106TEST_F(ArpPacketTest, ParseReplyBadProtocol) {
107 ScopedMockLog log;
108 EXPECT_CALL(log,
109 Log(logging::LOG_ERROR, _,
110 HasSubstr("Packet has unknown protocol 2049"))).Times(1);
111
112 ByteString arp_bytes(kArpReplyV4, arraysize(kArpReplyV4));
113 arp_bytes.GetData()[3] = 0x1;
114 EXPECT_FALSE(packet_.ParseReply(arp_bytes));
115}
116
117TEST_F(ArpPacketTest, ParseReplyBadHardwareLength) {
118 ScopedMockLog log;
119 EXPECT_CALL(log,
120 Log(logging::LOG_ERROR, _,
121 HasSubstr("Packet has unexpected hardware address length"))).Times(1);
122
123 ByteString arp_bytes(kArpReplyV4, arraysize(kArpReplyV4));
124 arp_bytes.GetData()[4] = 0x1;
125 EXPECT_FALSE(packet_.ParseReply(arp_bytes));
126}
127
128TEST_F(ArpPacketTest, ParseReplyBadProtocolLength) {
129 ScopedMockLog log;
130 EXPECT_CALL(log,
131 Log(logging::LOG_ERROR, _,
132 HasSubstr("Packet has unexpected protocol address length"))).Times(1);
133
134 ByteString arp_bytes(kArpReplyV4, arraysize(kArpReplyV4));
135 arp_bytes.GetData()[5] = 0x1;
136 EXPECT_FALSE(packet_.ParseReply(arp_bytes));
137}
138
139TEST_F(ArpPacketTest, ParseReplyBadOpCode) {
140 ScopedMockLog log;
141 EXPECT_CALL(log,
142 Log(logging::LOG_ERROR, _,
143 HasSubstr("Packet is not an ARP reply but of type 258"))).Times(1);
144
145 ByteString arp_bytes(kArpReplyV4, arraysize(kArpReplyV4));
146 arp_bytes.GetData()[6] = 0x1;
147 EXPECT_FALSE(packet_.ParseReply(arp_bytes));
148}
149
150TEST_F(ArpPacketTest, ParseReplyShortPacket) {
151 ScopedMockLog log;
152 EXPECT_CALL(log,
153 Log(logging::LOG_ERROR, _,
154 HasSubstr("is too small to contain entire ARP payload"))).Times(1);
155
156 ByteString arp_bytes(kArpReplyV6, arraysize(kArpReplyV6));
157 arp_bytes.Append(mac_address1_);
158 arp_bytes.Append(ipv6_address0_.address());
159 arp_bytes.Append(mac_address0_);
160 arp_bytes.Append(ipv6_address1_.address());
161 arp_bytes.Resize(arp_bytes.GetLength() - 1);
162 EXPECT_FALSE(packet_.ParseReply(arp_bytes));
163}
164
165TEST_F(ArpPacketTest, ParseReplyIPv4) {
166 ByteString arp_bytes(kArpReplyV4, arraysize(kArpReplyV4));
167 arp_bytes.Append(mac_address0_);
168 arp_bytes.Append(ipv4_address0_.address());
169 arp_bytes.Append(mac_address1_);
170 arp_bytes.Append(ipv4_address1_.address());
171 EXPECT_TRUE(packet_.ParseReply(arp_bytes));
172 EXPECT_TRUE(ipv4_address0_.Equals(packet_.local_ip_address()));
173 EXPECT_TRUE(ipv4_address1_.Equals(packet_.remote_ip_address()));
174 EXPECT_TRUE(mac_address0_.Equals(packet_.local_mac_address()));
175 EXPECT_TRUE(mac_address1_.Equals(packet_.remote_mac_address()));
176}
177
178TEST_F(ArpPacketTest, ParseReplyIPv6) {
179 ByteString arp_bytes(kArpReplyV6, arraysize(kArpReplyV6));
180 arp_bytes.Append(mac_address1_);
181 arp_bytes.Append(ipv6_address0_.address());
182 arp_bytes.Append(mac_address0_);
183 arp_bytes.Append(ipv6_address1_.address());
184 EXPECT_TRUE(packet_.ParseReply(arp_bytes));
185 EXPECT_TRUE(ipv6_address0_.Equals(packet_.local_ip_address()));
186 EXPECT_TRUE(ipv6_address1_.Equals(packet_.remote_ip_address()));
187 EXPECT_TRUE(mac_address1_.Equals(packet_.local_mac_address()));
188 EXPECT_TRUE(mac_address0_.Equals(packet_.remote_mac_address()));
189}
190
191TEST_F(ArpPacketTest, FormatRequestInvalidAddress) {
192 ScopedMockLog log;
193 EXPECT_CALL(log,
194 Log(logging::LOG_ERROR, _,
195 HasSubstr("Local or remote IP address is not valid"))).Times(3);
196
197 ByteString arp_bytes;
198 EXPECT_FALSE(packet_.FormatRequest(&arp_bytes));
199 packet_.set_local_ip_address(ipv4_address0_);
200 EXPECT_FALSE(packet_.FormatRequest(&arp_bytes));
201 packet_.set_local_ip_address(IPAddress(IPAddress::kFamilyUnknown));
202 packet_.set_remote_ip_address(ipv4_address0_);
203 EXPECT_FALSE(packet_.FormatRequest(&arp_bytes));
204}
205
206TEST_F(ArpPacketTest, FormatRequestMismatchedAddresses) {
207 ScopedMockLog log;
208 EXPECT_CALL(log,
209 Log(logging::LOG_ERROR, _,
210 HasSubstr("IP address families do not match"))).Times(1);
211
212 ByteString arp_bytes;
213 packet_.set_local_ip_address(ipv4_address0_);
214 packet_.set_remote_ip_address(ipv6_address1_);
215 EXPECT_FALSE(packet_.FormatRequest(&arp_bytes));
216}
217
218TEST_F(ArpPacketTest, FormatRequestBadMACAddressLength) {
219 ScopedMockLog log;
220 EXPECT_CALL(log,
221 Log(logging::LOG_ERROR, _,
222 HasSubstr("MAC address length is incorrect"))).Times(3);
223
224 ByteString arp_bytes;
225 packet_.set_local_ip_address(ipv4_address0_);
226 packet_.set_remote_ip_address(ipv4_address1_);
227 EXPECT_FALSE(packet_.FormatRequest(&arp_bytes));
228 packet_.set_local_mac_address(mac_address0_);
229 EXPECT_FALSE(packet_.FormatRequest(&arp_bytes));
230 packet_.set_local_mac_address(ByteString());
231 packet_.set_remote_mac_address(mac_address0_);
232 EXPECT_FALSE(packet_.FormatRequest(&arp_bytes));
233}
234
235TEST_F(ArpPacketTest, FormatRequestIPv4) {
236 ByteString arp_bytes;
237 packet_.set_local_ip_address(ipv4_address0_);
238 packet_.set_remote_ip_address(ipv4_address1_);
239 packet_.set_local_mac_address(mac_address0_);
240 packet_.set_remote_mac_address(mac_address1_);
241 EXPECT_TRUE(packet_.FormatRequest(&arp_bytes));
242
243 ByteString expected_bytes(kArpRequestV4, arraysize(kArpRequestV4));
244 expected_bytes.Append(mac_address0_);
245 expected_bytes.Append(ipv4_address0_.address());
246 expected_bytes.Append(mac_address1_);
247 expected_bytes.Append(ipv4_address1_.address());
248 EXPECT_TRUE(expected_bytes.Equals(arp_bytes));
249}
250
251TEST_F(ArpPacketTest, FormatRequestIPv6) {
252 ByteString arp_bytes;
253 packet_.set_local_ip_address(ipv6_address0_);
254 packet_.set_remote_ip_address(ipv6_address1_);
255 packet_.set_local_mac_address(mac_address1_);
256 packet_.set_remote_mac_address(mac_address0_);
257 EXPECT_TRUE(packet_.FormatRequest(&arp_bytes));
258
259 ByteString expected_bytes(kArpRequestV6, arraysize(kArpRequestV6));
260 expected_bytes.Append(mac_address1_);
261 expected_bytes.Append(ipv6_address0_.address());
262 expected_bytes.Append(mac_address0_);
263 expected_bytes.Append(ipv6_address1_.address());
264 EXPECT_TRUE(expected_bytes.Equals(arp_bytes));
265}
266
267} // namespace shill