1d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang// 2d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang// Copyright (C) 2015 The Android Open Source Project 3d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang// 4d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang// Licensed under the Apache License, Version 2.0 (the "License"); 5d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang// you may not use this file except in compliance with the License. 6d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang// You may obtain a copy of the License at 7d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang// 8d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang// http://www.apache.org/licenses/LICENSE-2.0 9d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang// 10d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang// Unless required by applicable law or agreed to in writing, software 11d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang// distributed under the License is distributed on an "AS IS" BASIS, 12d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang// See the License for the specific language governing permissions and 14d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang// limitations under the License. 15d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang// 16d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 17d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang#include <dhcp_client/dhcp_options_writer.h> 18d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 19d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang#include <netinet/in.h> 20d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 21d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang#include <memory> 22d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang#include <string> 23d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang#include <utility> 24d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang#include <vector> 25d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 26d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang#include <gtest/gtest.h> 2715c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang#include <shill/net/byte_string.h> 28d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 29d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang#include "dhcp_client/dhcp_options.h" 30d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 3115c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wangusing shill::ByteString; 32d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wangnamespace dhcp_client { 33d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 34d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wangnamespace { 35d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wangconst uint8_t kFakeOptionCode1 = 3; 36d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wangconst uint8_t kFakeOptionCode2 = 45; 37d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wangconst uint8_t kFakeOptionCode3 = 251; 38d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang} // namespace 39d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 40d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 41d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wangclass DHCPOptionsWriterTest : public testing::Test { 42d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang protected: 43d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang DHCPOptionsWriter* options_writer_; 44d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang}; 45d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 46d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan WangTEST_F(DHCPOptionsWriterTest, WriteUInt8) { 4715c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const uint8_t kFakeUInt8Option = 0x22; 4815c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const uint8_t kFakeUInt8OptionResult[] = { 4915c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeOptionCode1, 5015c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang sizeof(uint8_t), 5115c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 0x22}; 5215c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 5315c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang ByteString option; 54d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang options_writer_ = DHCPOptionsWriter::GetInstance(); 5515c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang int length = options_writer_->WriteUInt8Option(&option, 56d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeOptionCode1, 57d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeUInt8Option); 58d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang EXPECT_NE(-1, length); 5915c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang EXPECT_EQ(0, std::memcmp(option.GetConstData(), 6015c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeUInt8OptionResult, 6115c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang length)); 62d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang} 63d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 64d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan WangTEST_F(DHCPOptionsWriterTest, WriteUInt16) { 6515c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const uint16_t kFakeUInt16Option = 0x1516; 6615c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const uint8_t kFakeUInt16OptionResult[] = { 6715c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeOptionCode2, 6815c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang sizeof(uint16_t), 6915c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang // Use the network byte order. 7015c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 0x15, 0x16}; 7115c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 7215c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang ByteString option; 73d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang options_writer_ = DHCPOptionsWriter::GetInstance(); 7415c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang int length = options_writer_->WriteUInt16Option(&option, 75d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeOptionCode2, 76d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeUInt16Option); 77d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang EXPECT_NE(-1, length); 7815c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang EXPECT_EQ(0, std::memcmp(option.GetConstData(), 7915c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeUInt16OptionResult, 8015c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang length)); 81d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang} 82d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 83d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan WangTEST_F(DHCPOptionsWriterTest, WriteUInt32) { 8415c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const uint32_t kFakeUInt32Option = 0x32a0bf01; 8515c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const uint8_t kFakeUInt32OptionResult[] = { 8615c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeOptionCode3, 8715c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang sizeof(uint32_t), 8815c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang // Use the network byte order. 8915c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 0x32, 0xa0, 0xbf, 0x01}; 9015c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 9115c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang ByteString option; 92d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang options_writer_ = DHCPOptionsWriter::GetInstance(); 9315c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang int length = options_writer_->WriteUInt32Option(&option, 94d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeOptionCode3, 95d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeUInt32Option); 96d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang EXPECT_NE(-1, length); 9715c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang EXPECT_EQ(0, std::memcmp(option.GetConstData(), 9815c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeUInt32OptionResult, 9915c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang length)); 100d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang} 101d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 102d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan WangTEST_F(DHCPOptionsWriterTest, WriteUInt8List) { 10315c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const std::vector<uint8_t> kFakeUInt8ListOption = 10415c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang {0x01, 0x02, 0x03, 0x04, 0x05, 0x06}; 10515c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const uint8_t kFakeUInt8ListOptionResult[] = { 10615c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeOptionCode1, 10715c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang static_cast<uint8_t>(kFakeUInt8ListOption.size()), 10815c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 0x01, 0x02, 0x03, 0x04, 0x05, 0x06}; 10915c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 11015c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang ByteString option; 111d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang options_writer_ = DHCPOptionsWriter::GetInstance(); 11215c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang int length = options_writer_->WriteUInt8ListOption(&option, 113d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeOptionCode1, 114d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeUInt8ListOption); 115d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang EXPECT_NE(-1, length); 11615c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang EXPECT_EQ(0, std::memcmp(option.GetConstData(), 11715c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeUInt8ListOptionResult, 11815c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang length)); 119d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang} 120d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 121d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan WangTEST_F(DHCPOptionsWriterTest, WriteUInt16List) { 12215c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const std::vector<uint16_t> kFakeUInt16ListOption = 12315c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang {0xb1a2, 0x0264, 0xdc03, 0x92c4, 0xa500, 0x0010}; 12415c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const uint8_t kFakeUInt16ListOptionResult[] = { 12515c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeOptionCode2, 12615c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang static_cast<uint8_t>(sizeof(uint16_t) * kFakeUInt16ListOption.size()), 12715c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang // Use the network byte order. 12815c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 0xb1, 0xa2, 0x02, 0x64, 0xdc, 0x03, 0x92, 0xc4, 0xa5, 0x00, 0x00, 0x10}; 12915c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 13015c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang ByteString option; 131d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang options_writer_ = DHCPOptionsWriter::GetInstance(); 13215c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang int length = options_writer_->WriteUInt16ListOption(&option, 133d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeOptionCode2, 134d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeUInt16ListOption); 135d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang EXPECT_NE(-1, length); 13615c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang EXPECT_EQ(0, std::memcmp(option.GetConstData(), 13715c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeUInt16ListOptionResult, 13815c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang length)); 139d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang} 140d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 141d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan WangTEST_F(DHCPOptionsWriterTest, WriteUInt32List) { 14215c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const std::vector<uint32_t> kFakeUInt32ListOption = 14315c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang {0x03a64301, 0x03f52614, 0x7c5d9eff, 0x0138b26e}; 14415c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const uint8_t kFakeUInt32ListOptionResult[] = { 14515c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeOptionCode3, 14615c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang static_cast<uint8_t>(sizeof(uint32_t) * kFakeUInt32ListOption.size()), 14715c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang // Use the network byte order. 14815c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 0x03, 0xa6, 0x43, 0x01, 0x03, 0xf5, 0x26, 0x14, 14915c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 0x7c, 0x5d, 0x9e, 0xff, 0x01, 0x38, 0xb2, 0x6e}; 15015c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 15115c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang ByteString option; 152d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang options_writer_ = DHCPOptionsWriter::GetInstance(); 15315c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang int length = options_writer_->WriteUInt32ListOption(&option, 154d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeOptionCode3, 155d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeUInt32ListOption); 156d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang EXPECT_NE(-1, length); 15715c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang EXPECT_EQ(0, std::memcmp(option.GetConstData(), 15815c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeUInt32ListOptionResult, 15915c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang length)); 160d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang} 161d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 162d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan WangTEST_F(DHCPOptionsWriterTest, WriteUInt32PairList) { 16315c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const std::vector<std::pair<uint32_t, uint32_t>> kFakeUInt32PairListOption = 16415c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang {{0x03b576a1, 0xfa070054}, {0x650c3d22, 0x1397e5bb}}; 16515c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const uint8_t kFakeUInt32PairListOptionResult[] = { 16615c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeOptionCode1, 16715c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang static_cast<uint8_t> 16815c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang (sizeof(uint32_t) * 2 * kFakeUInt32PairListOption.size()), 16915c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang // Use the network byte order. 17015c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 0x03, 0xb5, 0x76, 0xa1, 0xfa, 0x07, 0x00, 0x54, 17115c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 0x65, 0x0c, 0x3d, 0x22, 0x13, 0x97, 0xe5, 0xbb}; 17215c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 17315c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang ByteString option; 174d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang options_writer_ = DHCPOptionsWriter::GetInstance(); 175d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang int length = 17615c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang options_writer_->WriteUInt32PairListOption(&option, 177d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeOptionCode1, 178d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeUInt32PairListOption); 179d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang EXPECT_NE(-1, length); 18015c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang EXPECT_EQ(0, std::memcmp(option.GetConstData(), 18115c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeUInt32PairListOptionResult, 18215c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang length)); 183d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang} 184d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 185d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan WangTEST_F(DHCPOptionsWriterTest, WriteString) { 18615c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const std::string kFakeStringOption = "fakestring"; 18715c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const uint8_t kFakeStringOptionResult[] = { 18815c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeOptionCode1, 18915c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang static_cast<uint8_t>(kFakeStringOption.size()), 19015c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 'f', 'a', 'k', 'e', 's', 't', 'r', 'i', 'n', 'g'}; 19115c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 19215c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang ByteString option; 193d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang options_writer_ = DHCPOptionsWriter::GetInstance(); 19415c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang int length = options_writer_->WriteStringOption(&option, 195d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeOptionCode1, 196d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeStringOption); 197d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang EXPECT_NE(-1, length); 19815c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang EXPECT_EQ(0, std::memcmp(option.GetConstData(), 19915c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeStringOptionResult, 20015c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang length)); 201d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang} 202d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 203d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 204d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan WangTEST_F(DHCPOptionsWriterTest, WriteBoolTrue) { 20515c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const uint8_t kFakeBoolOptionTrue = true; 20615c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const uint8_t kFakeBoolOptionResultTrue[] = { 20715c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeOptionCode1, 20815c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang sizeof(uint8_t), 20915c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 0x01}; 21015c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 21115c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang ByteString option; 212d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang options_writer_ = DHCPOptionsWriter::GetInstance(); 21315c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang int length = options_writer_->WriteBoolOption(&option, 214d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeOptionCode1, 215d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeBoolOptionTrue); 216d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang EXPECT_NE(-1, length); 21715c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang EXPECT_EQ(0, std::memcmp(option.GetConstData(), 21815c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeBoolOptionResultTrue, 21915c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang length)); 220d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang} 221d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 222d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan WangTEST_F(DHCPOptionsWriterTest, WriteBoolFalse) { 22315c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const uint8_t kFakeBoolOptionFalse = false; 22415c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const uint8_t kFakeBoolOptionResultFalse[] = { 22515c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeOptionCode2, 22615c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang sizeof(uint8_t), 22715c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 0x00}; 22815c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 22915c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang ByteString option; 230d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang options_writer_ = DHCPOptionsWriter::GetInstance(); 23115c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang int length = options_writer_->WriteBoolOption(&option, 232d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeOptionCode2, 233d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeBoolOptionFalse); 234d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang EXPECT_NE(-1, length); 23515c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang EXPECT_EQ(0, std::memcmp(option.GetConstData(), 23615c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeBoolOptionResultFalse, 23715c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang length)); 23815c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang} 23915c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 24015c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan WangTEST_F(DHCPOptionsWriterTest, WriteByteArray) { 24115c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const ByteString kFakeByteArrayOption = 24215c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang ByteString({0x06, 0x05, 0x04, 0x03, 0x02, 0x01}); 24315c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const uint8_t kFakeByteArrayOptionResult[] = { 24415c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeOptionCode1, 24515c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang static_cast<uint8_t>(kFakeByteArrayOption.GetLength()), 24615c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 0x06, 0x05, 0x04, 0x03, 0x02, 0x01}; 24715c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 24815c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang ByteString option; 24915c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang options_writer_ = DHCPOptionsWriter::GetInstance(); 25015c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang int length = options_writer_->WriteByteArrayOption(&option, 25115c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeOptionCode1, 25215c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeByteArrayOption); 25315c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang EXPECT_NE(-1, length); 25415c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang EXPECT_EQ(0, std::memcmp(option.GetConstData(), 25515c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeByteArrayOptionResult, 25615c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang length)); 257d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang} 258d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 259d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan WangTEST_F(DHCPOptionsWriterTest, WriteEndTag) { 26015c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const std::string kFakeStringOption = "fakestring1"; 26115c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang const uint8_t kFakeStringOptionResult[] = { 26215c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeOptionCode1, 26315c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang static_cast<uint8_t>(kFakeStringOption.size()), 26415c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 'f', 'a', 'k', 'e', 's', 't', 'r', 'i', 'n', 'g', '1'}; 26515c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang 26615c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang ByteString option; 267d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang options_writer_ = DHCPOptionsWriter::GetInstance(); 26815c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang int length = options_writer_->WriteStringOption(&option, 269d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeOptionCode1, 270d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang kFakeStringOption); 271d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang EXPECT_NE(-1, length); 27215c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang EXPECT_NE(-1, options_writer_->WriteEndTag(&option)); 27315c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang EXPECT_EQ(0, std::memcmp(option.GetConstData(), 27415c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang kFakeStringOptionResult, 27515c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang length)); 27615c10d2a1c42c31c68c1d88f85627ff9bdefd29dNingyuan Wang EXPECT_EQ(kDHCPOptionEnd, *(option.GetConstData() + length)); 277d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang} 278d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang 279d4b86841f58d9c4b299e651ce1772cd0b505c614Ningyuan Wang} // namespace dhcp_client 280