1679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang//
2679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang// Copyright (C) 2015 The Android Open Source Project
3679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang//
4679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang// Licensed under the Apache License, Version 2.0 (the "License");
5679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang// you may not use this file except in compliance with the License.
6679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang// You may obtain a copy of the License at
7679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang//
8679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang//      http://www.apache.org/licenses/LICENSE-2.0
9679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang//
10679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang// Unless required by applicable law or agreed to in writing, software
11679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang// distributed under the License is distributed on an "AS IS" BASIS,
12679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang// See the License for the specific language governing permissions and
14679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang// limitations under the License.
15679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang//
16679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang
17d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang#include "dhcp_client/dhcp_message.h"
18679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang
193030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#include <netinet/in.h>
203030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang
213030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#include <cstring>
223030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang
23679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang#include <gtest/gtest.h>
243030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#include <shill/net/byte_string.h>
253030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang
263030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#include "dhcp_client/dhcp_options.h"
273030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang
283030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#define SERVER_NAME 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
293030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
303030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
313030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
323030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
333030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
343030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
353030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
363030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang
373030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#define BOOT_FILE 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
383030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
393030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
403030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
413030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
423030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
433030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
443030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
453030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
463030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
473030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
483030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
493030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
503030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
513030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
523030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
533030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#define COOKIE 0x63, 0x82, 0x53, 0x63
543030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang// The fake client hardware address(the first 6 bytes) contains a zero.
553030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#define CLIENT_HARDWARE_ADDRESS 0xbf, 0x78, 0xa2, 0x00, \
563030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                                0x0c, 0xea, 0x00, 0x00, \
573030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                                0x00, 0x00, 0x00, 0x00, \
583030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                                0x00, 0x00, 0x00, 0x00
59679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang
603030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#define TRANSACTION_ID 0x0f, 0x22, 0xa3, 0x50
613030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#define CLIENT_IP_ADDRESS 0x00, 0x00, 0x00, 0x00
623030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#define YOUR_IP_ADDRESS 0xaf, 0x23, 0x11, 0x34
633030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#define NEXT_SERVER_IP_ADDRESS 0x00, 0x00, 0x00, 0x00
643030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#define AGENT_IP_ADDRESS 0x00, 0x00, 0x00, 0x00
653030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#define SECONDS 0x00, 0x00
663030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#define FLAGS 0x00, 0x00
673030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#define HOPS 0x00
683030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#define HARDWARE_ADDRESS_LENGTH 0x06
693030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#define HARDWARE_ADDRESS_TYPE 0x01
703030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#define REQUEST 0x01
713030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#define REPLY 0x02
723030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#define END_TAG 0xff
733030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#define SERVER_ID 0x01, 0xa2, 0x01, 0x1b
743030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang#define LEASE_TIME 0x00, 0x00, 0x11, 0x11
753030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang
763030ddf90560522166c2c25865db084199ca38f7Ningyuan Wangnamespace dhcp_client {
77679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wangnamespace {
78679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wangconst uint8_t kFakeBufferEvenLength[] = {0x08, 0x00, 0x00, 0x00,
79679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang                                         0x71, 0x50, 0x00, 0x00};
80679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wangconst size_t kFakeBufferEvenLengthSize = 8;
81679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wangconst uint16_t kFakeBufferEvenLengthChecksum = 0x86af;
82679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang
83679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wangconst uint8_t kFakeBufferOddLength[] = {0x08, 0x00, 0x00, 0x00, 0xac, 0x51,
84679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang                                        0x00, 0x00, 0x00, 0x00, 0x01};
85679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wangconst size_t kFakeBufferOddLengthSize = 11;
86679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wangconst uint16_t kFakeBufferOddLengthChecksum = 0x4aae;
87679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang
883030ddf90560522166c2c25865db084199ca38f7Ningyuan Wangconst uint8_t kFakeDHCPOfferMessage[] = {
893030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    REPLY,  // op, offer is a reply message
903030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    HARDWARE_ADDRESS_TYPE,  // htype
913030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    HARDWARE_ADDRESS_LENGTH,  // hlen
923030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    HOPS,  // hops
933030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    TRANSACTION_ID,  // xid
943030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    SECONDS,  // secs
953030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    FLAGS,  // flags
963030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    CLIENT_IP_ADDRESS,  // ciaddr
973030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    YOUR_IP_ADDRESS,  // yiaddr
983030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    NEXT_SERVER_IP_ADDRESS,  // siaddr
993030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    AGENT_IP_ADDRESS,  // giaddr
1003030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    CLIENT_HARDWARE_ADDRESS,  // chaddr
1013030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    SERVER_NAME,  // sname
1023030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    BOOT_FILE,  // file
1033030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    COOKIE,  // cookie
1043030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    kDHCPOptionMessageType, 0x01, kDHCPMessageTypeOffer,  // message type option
1053030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    kDHCPOptionLeaseTime, 0x04, LEASE_TIME,  // lease time option
1063030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    kDHCPOptionServerIdentifier, 0x04, SERVER_ID,  // server identifier option
1073030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    END_TAG  // options end tag
1083030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang};
1093030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang
1103030ddf90560522166c2c25865db084199ca38f7Ningyuan Wangconst uint8_t kFakeDHCPAckMessage[] = {
1113030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    REPLY,  // op, ack is a reply message
1123030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    HARDWARE_ADDRESS_TYPE,  // htype
1133030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    HARDWARE_ADDRESS_LENGTH,  // hlen
1143030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    HOPS,  // hops
1153030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    TRANSACTION_ID,  // xid
1163030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    SECONDS,  // secs
1173030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    FLAGS,  // flags
1183030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    CLIENT_IP_ADDRESS,  // ciaddr
1193030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    YOUR_IP_ADDRESS,  // yiaddr
1203030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    NEXT_SERVER_IP_ADDRESS,  // siaddr
1213030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    AGENT_IP_ADDRESS,  // giaddr
1223030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    CLIENT_HARDWARE_ADDRESS,  // chaddr
1233030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    SERVER_NAME,  // sname
1243030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    BOOT_FILE,  // file
1253030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    COOKIE,  // cookie
1263030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    kDHCPOptionMessageType, 0x01, kDHCPMessageTypeAck,  // message type option
1273030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    kDHCPOptionLeaseTime, 0x04, LEASE_TIME,  // lease time option
1283030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    kDHCPOptionServerIdentifier, 0x04, SERVER_ID,  // server identifier option
1293030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    END_TAG  // options end tag
1303030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang};
1313030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang
1323030ddf90560522166c2c25865db084199ca38f7Ningyuan Wangconst uint8_t kFakeDHCPNakMessage[] = {
1333030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    REPLY,  // op, nak is a reply message
1343030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    HARDWARE_ADDRESS_TYPE,  // htype
1353030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    HARDWARE_ADDRESS_LENGTH,  // hlen
1363030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    HOPS,  // hops
1373030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    TRANSACTION_ID,  // xid
1383030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    SECONDS,  // secs
1393030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    FLAGS,  // flags
1403030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    CLIENT_IP_ADDRESS,  // ciaddr
1413030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    YOUR_IP_ADDRESS,  // yiaddr
1423030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    NEXT_SERVER_IP_ADDRESS,  // siaddr
1433030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    AGENT_IP_ADDRESS,  // giaddr
1443030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    CLIENT_HARDWARE_ADDRESS,  // chaddr
1453030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    SERVER_NAME,  // sname
1463030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    BOOT_FILE,  // file
1473030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    COOKIE,  // cookie
1483030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    kDHCPOptionMessageType, 0x01, kDHCPMessageTypeNak,  // message type option
1493030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    kDHCPOptionServerIdentifier, 0x04, SERVER_ID,  // server identifier option
1503030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang    END_TAG  // options end tag
1513030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang};
1523030ddf90560522166c2c25865db084199ca38f7Ningyuan Wangconst uint8_t kFakeTransactionID[] = {TRANSACTION_ID};
1533030ddf90560522166c2c25865db084199ca38f7Ningyuan Wangconst uint8_t kFakeServerIdentifier[] = {SERVER_ID};
1543030ddf90560522166c2c25865db084199ca38f7Ningyuan Wangconst uint8_t kFakeLeaseTime[] = {LEASE_TIME};
1553030ddf90560522166c2c25865db084199ca38f7Ningyuan Wangconst uint8_t kFakeYourIPAddress[] = {YOUR_IP_ADDRESS};
1563030ddf90560522166c2c25865db084199ca38f7Ningyuan Wangconst uint8_t kFakeHardwareAddress[] = {CLIENT_HARDWARE_ADDRESS};
1573030ddf90560522166c2c25865db084199ca38f7Ningyuan Wangsize_t kFakeDHCPOfferMessageLength = sizeof(kFakeDHCPOfferMessage);
1583030ddf90560522166c2c25865db084199ca38f7Ningyuan Wangsize_t kFakeDHCPAckMessageLength = sizeof(kFakeDHCPAckMessage);
1593030ddf90560522166c2c25865db084199ca38f7Ningyuan Wangsize_t kFakeDHCPNakMessageLength = sizeof(kFakeDHCPNakMessage);
1603030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang}  // namespace
161679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang
162679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wangclass DHCPMessageTest : public testing::Test {
163679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang public:
1643030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  DHCPMessageTest() {}
165679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang protected:
166679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang};
167679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang
168679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan WangTEST_F(DHCPMessageTest, ComputeChecksumEvenLengthTest) {
169679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang  uint16_t checksum = DHCPMessage::ComputeChecksum(kFakeBufferEvenLength,
170679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang                                                   kFakeBufferEvenLengthSize);
171679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang  EXPECT_EQ(kFakeBufferEvenLengthChecksum, checksum);
172679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang}
173679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang
174679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan WangTEST_F(DHCPMessageTest, ComputeChecksumOddLengthTest) {
175679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang  uint16_t checksum = DHCPMessage::ComputeChecksum(kFakeBufferOddLength,
176679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang                                                   kFakeBufferOddLengthSize);
177679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang  EXPECT_EQ(kFakeBufferOddLengthChecksum, checksum);
178679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang}
179679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang
1803030ddf90560522166c2c25865db084199ca38f7Ningyuan WangTEST_F(DHCPMessageTest, InitFromBufferMessageTypeOffer) {
1813030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  DHCPMessage msg;
1823030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  EXPECT_TRUE(DHCPMessage::InitFromBuffer(kFakeDHCPOfferMessage,
1833030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                                          kFakeDHCPOfferMessageLength,
1843030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                                          &msg));
1853030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  EXPECT_EQ(kDHCPMessageTypeOffer, msg.message_type());
1863030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  EXPECT_EQ(ntohl(*reinterpret_cast<const uint32_t*>(kFakeTransactionID)),
1873030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang            msg.transaction_id());
1883030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  EXPECT_EQ(ntohl(*reinterpret_cast<const uint32_t*>(kFakeServerIdentifier)),
1893030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang            msg.server_identifier());
1903030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  EXPECT_EQ(ntohl(*reinterpret_cast<const uint32_t*>(kFakeLeaseTime)),
1913030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang            msg.lease_time());
1923030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  EXPECT_EQ(ntohl(*reinterpret_cast<const uint32_t*>(kFakeYourIPAddress)),
1933030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang            msg.your_ip_address());
1943030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  EXPECT_EQ(0, std::memcmp(kFakeHardwareAddress,
1953030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                           msg.client_hardware_address().GetConstData(),
1963030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                           msg.client_hardware_address().GetLength()));
1973030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang}
1983030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang
1993030ddf90560522166c2c25865db084199ca38f7Ningyuan WangTEST_F(DHCPMessageTest, InitFromBufferMessageTypeAck) {
2003030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  DHCPMessage msg;
2013030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  EXPECT_TRUE(DHCPMessage::InitFromBuffer(kFakeDHCPAckMessage,
2023030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                                          kFakeDHCPAckMessageLength,
2033030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                                          &msg));
2043030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  EXPECT_EQ(kDHCPMessageTypeAck, msg.message_type());
2053030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  EXPECT_EQ(ntohl(*reinterpret_cast<const uint32_t*>(kFakeTransactionID)),
2063030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang            msg.transaction_id());
2073030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  EXPECT_EQ(ntohl(*reinterpret_cast<const uint32_t*>(kFakeServerIdentifier)),
2083030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang            msg.server_identifier());
2093030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  EXPECT_EQ(ntohl(*reinterpret_cast<const uint32_t*>(kFakeLeaseTime)),
2103030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang            msg.lease_time());
2113030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  EXPECT_EQ(ntohl(*reinterpret_cast<const uint32_t*>(kFakeYourIPAddress)),
2123030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang            msg.your_ip_address());
2133030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  EXPECT_EQ(0, std::memcmp(kFakeHardwareAddress,
2143030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                           msg.client_hardware_address().GetConstData(),
2153030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                           msg.client_hardware_address().GetLength()));
2163030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang}
2173030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang
2183030ddf90560522166c2c25865db084199ca38f7Ningyuan WangTEST_F(DHCPMessageTest, InitFromBufferMessageTypeNak) {
2193030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  DHCPMessage msg;
2203030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  EXPECT_TRUE(DHCPMessage::InitFromBuffer(kFakeDHCPNakMessage,
2213030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                                          kFakeDHCPNakMessageLength,
2223030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                                          &msg));
2233030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  EXPECT_EQ(kDHCPMessageTypeNak, msg.message_type());
2243030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  EXPECT_EQ(ntohl(*reinterpret_cast<const uint32_t*>(kFakeTransactionID)),
2253030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang            msg.transaction_id());
2263030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  EXPECT_EQ(ntohl(*reinterpret_cast<const uint32_t*>(kFakeServerIdentifier)),
2273030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang            msg.server_identifier());
2283030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang  EXPECT_EQ(0, std::memcmp(kFakeHardwareAddress,
2293030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                           msg.client_hardware_address().GetConstData(),
2303030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang                           msg.client_hardware_address().GetLength()));
2313030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang}
2323030ddf90560522166c2c25865db084199ca38f7Ningyuan Wang
233679654b4a871034b59ceadb98d113ac8cab120d6Ningyuan Wang}  // namespace dhcp_client
234