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