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