|
@@ -1,4 +1,4 @@
|
|
|
-// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
|
|
|
+// Copyright (C) 2011-2012 Internet Systems Consortium, Inc. ("ISC")
|
|
|
//
|
|
|
// Permission to use, copy, modify, and/or distribute this software for any
|
|
|
// purpose with or without fee is hereby granted, provided that the above
|
|
@@ -33,14 +33,13 @@ using namespace isc::util;
|
|
|
namespace {
|
|
|
class OptionTest : public ::testing::Test {
|
|
|
public:
|
|
|
- OptionTest(): outBuffer_(255) {
|
|
|
- buf_ = boost::shared_array<uint8_t>(new uint8_t[255]);
|
|
|
+ OptionTest(): buf_(255), outBuf_(255) {
|
|
|
for (int i = 0; i < 255; i++) {
|
|
|
buf_[i] = 255 - i;
|
|
|
}
|
|
|
}
|
|
|
- boost::shared_array<uint8_t> buf_;
|
|
|
- OutputBuffer outBuffer_;
|
|
|
+ OptionBuffer buf_;
|
|
|
+ OutputBuffer outBuf_;
|
|
|
};
|
|
|
|
|
|
// v4 is not really implemented yet. A simple test will do for now
|
|
@@ -84,9 +83,7 @@ TEST_F(OptionTest, v4_data1) {
|
|
|
// create DHCPv4 option of type 123
|
|
|
// that contains 4 bytes of data
|
|
|
ASSERT_NO_THROW(
|
|
|
- opt= new Option(Option::V4,
|
|
|
- 123, // type
|
|
|
- data);
|
|
|
+ opt= new Option(Option::V4, 123, data);
|
|
|
);
|
|
|
|
|
|
// check that content is reported properly
|
|
@@ -143,10 +140,7 @@ TEST_F(OptionTest, v4_data2) {
|
|
|
// Create DHCPv4 option of type 123 that contains
|
|
|
// 4 bytes (sizeof(dummyPayload).
|
|
|
ASSERT_NO_THROW(
|
|
|
- opt= new Option(Option::V4,
|
|
|
- 123, // type
|
|
|
- data.begin() + 1,
|
|
|
- data.end() - 1);
|
|
|
+ opt= new Option(Option::V4, 123, data.begin() + 1, data.end() - 1);
|
|
|
);
|
|
|
|
|
|
// check that content is reported properly
|
|
@@ -210,30 +204,29 @@ TEST_F(OptionTest, v6_basic) {
|
|
|
// tests contructor used in pkt reception
|
|
|
// option contains actual data
|
|
|
TEST_F(OptionTest, v6_data1) {
|
|
|
- boost::shared_array<uint8_t> buf(new uint8_t[32]);
|
|
|
for (int i = 0; i < 32; i++)
|
|
|
- buf[i] = 100+i;
|
|
|
- Option* opt = new Option(Option::V6, 333, //type
|
|
|
- buf,
|
|
|
- 3, // offset
|
|
|
- 7); // 7 bytes of data
|
|
|
+ buf_[i] = 100+i;
|
|
|
+ Option* opt = new Option(Option::V6, 333, //type
|
|
|
+ buf_.begin() + 3, // begin offset
|
|
|
+ buf_.begin() + 10); // end offset (7 bytes of data)
|
|
|
EXPECT_EQ(333, opt->getType());
|
|
|
|
|
|
ASSERT_EQ(11, opt->len());
|
|
|
ASSERT_EQ(7, opt->getData().size());
|
|
|
- EXPECT_EQ(0, memcmp(&buf[3], &opt->getData()[0], 7) );
|
|
|
+ EXPECT_EQ(0, memcmp(&buf_[3], &opt->getData()[0], 7) );
|
|
|
|
|
|
- int offset = opt->pack(buf, 32, 20);
|
|
|
- EXPECT_EQ(31, offset);
|
|
|
+ opt->pack(outBuf_);
|
|
|
+ EXPECT_EQ(11, outBuf_.getLength());
|
|
|
|
|
|
- EXPECT_EQ(buf[20], 333/256); // type
|
|
|
- EXPECT_EQ(buf[21], 333%256);
|
|
|
+ const uint8_t* out = (const uint8_t*)outBuf_.getData();
|
|
|
+ EXPECT_EQ(out[0], 333/256); // type
|
|
|
+ EXPECT_EQ(out[1], 333%256);
|
|
|
|
|
|
- EXPECT_EQ(buf[22], 0); // len
|
|
|
- EXPECT_EQ(buf[23], 7);
|
|
|
+ EXPECT_EQ(out[2], 0); // len
|
|
|
+ EXPECT_EQ(out[3], 7);
|
|
|
|
|
|
// payload
|
|
|
- EXPECT_EQ(0, memcmp(&buf[3], &buf[24], 7) );
|
|
|
+ EXPECT_EQ(0, memcmp(&buf_[3], out+4, 7) );
|
|
|
|
|
|
EXPECT_NO_THROW(
|
|
|
delete opt;
|
|
@@ -244,40 +237,37 @@ TEST_F(OptionTest, v6_data1) {
|
|
|
// with different input parameters
|
|
|
TEST_F(OptionTest, v6_data2) {
|
|
|
|
|
|
- boost::shared_array<uint8_t> simple_buf(new uint8_t[128]);
|
|
|
- for (int i = 0; i < 128; i++)
|
|
|
- simple_buf[i] = 0;
|
|
|
- simple_buf[0] = 0xa1;
|
|
|
- simple_buf[1] = 0xa2;
|
|
|
- simple_buf[2] = 0xa3;
|
|
|
- simple_buf[3] = 0xa4;
|
|
|
+ buf_[0] = 0xa1;
|
|
|
+ buf_[1] = 0xa2;
|
|
|
+ buf_[2] = 0xa3;
|
|
|
+ buf_[3] = 0xa4;
|
|
|
|
|
|
// create an option (unpack content)
|
|
|
Option* opt = new Option(Option::V6,
|
|
|
D6O_CLIENTID,
|
|
|
- simple_buf,
|
|
|
- 0,
|
|
|
- 4);
|
|
|
+ buf_.begin(),
|
|
|
+ buf_.begin() + 4);
|
|
|
|
|
|
- // pack this option again in the same buffer, but in
|
|
|
- // different place
|
|
|
- int offset18 = opt->pack(simple_buf, 128, 10);
|
|
|
+ // pack this option
|
|
|
+ opt->pack(outBuf_);
|
|
|
|
|
|
// 4 bytes header + 4 bytes content
|
|
|
EXPECT_EQ(8, opt->len());
|
|
|
EXPECT_EQ(D6O_CLIENTID, opt->getType());
|
|
|
|
|
|
- EXPECT_EQ(offset18, 18);
|
|
|
+ EXPECT_EQ(8, outBuf_.getLength());
|
|
|
|
|
|
// check if pack worked properly:
|
|
|
// if option type is correct
|
|
|
- EXPECT_EQ(D6O_CLIENTID, simple_buf[10]*256 + simple_buf[11]);
|
|
|
+ const uint8_t* out = (const uint8_t*)outBuf_.getData();
|
|
|
+
|
|
|
+ EXPECT_EQ(D6O_CLIENTID, out[0]*256 + out[1]);
|
|
|
|
|
|
// if option length is correct
|
|
|
- EXPECT_EQ(4, simple_buf[12]*256 + simple_buf[13]);
|
|
|
+ EXPECT_EQ(4, out[2]*256 + out[3]);
|
|
|
|
|
|
// if option content is correct
|
|
|
- EXPECT_EQ(0, memcmp(&simple_buf[0], &simple_buf[14],4));
|
|
|
+ EXPECT_EQ(0, memcmp(&buf_[0], out + 4, 4));
|
|
|
|
|
|
EXPECT_NO_THROW(
|
|
|
delete opt;
|
|
@@ -291,18 +281,15 @@ TEST_F(OptionTest, v6_data2) {
|
|
|
// +----opt3
|
|
|
//
|
|
|
TEST_F(OptionTest, v6_suboptions1) {
|
|
|
- boost::shared_array<uint8_t> buf(new uint8_t[128]);
|
|
|
for (int i=0; i<128; i++)
|
|
|
- buf[i] = 100+i;
|
|
|
+ buf_[i] = 100+i;
|
|
|
Option* opt1 = new Option(Option::V6, 65535, //type
|
|
|
- buf,
|
|
|
- 0, // offset
|
|
|
- 3); // 3 bytes of data
|
|
|
- boost::shared_ptr<Option> opt2(new Option(Option::V6, 13));
|
|
|
- boost::shared_ptr<Option> opt3(new Option(Option::V6, 7,
|
|
|
- buf,
|
|
|
- 3, // offset
|
|
|
- 5)); // 5 bytes of data
|
|
|
+ buf_.begin(), // 3 bytes of data
|
|
|
+ buf_.begin() + 3);
|
|
|
+ OptionPtr opt2(new Option(Option::V6, 13));
|
|
|
+ OptionPtr opt3(new Option(Option::V6, 7,
|
|
|
+ buf_.begin() + 3,
|
|
|
+ buf_.begin() + 8)); // 5 bytes of data
|
|
|
opt1->addOption(opt2);
|
|
|
opt1->addOption(opt3);
|
|
|
// opt2 len = 4 (just header)
|
|
@@ -319,11 +306,11 @@ TEST_F(OptionTest, v6_suboptions1) {
|
|
|
0, 13, 0, 0 // no data at all
|
|
|
};
|
|
|
|
|
|
- int offset = opt1->pack(buf, 128, 20);
|
|
|
- EXPECT_EQ(40, offset);
|
|
|
+ opt1->pack(outBuf_);
|
|
|
+ EXPECT_EQ(20, outBuf_.getLength());
|
|
|
|
|
|
// payload
|
|
|
- EXPECT_EQ(0, memcmp(&buf[20], expected, 20) );
|
|
|
+ EXPECT_EQ(0, memcmp(outBuf_.getData(), expected, 20) );
|
|
|
|
|
|
EXPECT_NO_THROW(
|
|
|
delete opt1;
|
|
@@ -337,18 +324,15 @@ TEST_F(OptionTest, v6_suboptions1) {
|
|
|
// +----opt3
|
|
|
//
|
|
|
TEST_F(OptionTest, v6_suboptions2) {
|
|
|
- boost::shared_array<uint8_t> buf(new uint8_t[128]);
|
|
|
for (int i=0; i<128; i++)
|
|
|
- buf[i] = 100+i;
|
|
|
+ buf_[i] = 100+i;
|
|
|
Option* opt1 = new Option(Option::V6, 65535, //type
|
|
|
- buf,
|
|
|
- 0, // offset
|
|
|
- 3); // 3 bytes of data
|
|
|
- boost::shared_ptr<Option> opt2(new Option(Option::V6, 13));
|
|
|
- boost::shared_ptr<Option> opt3(new Option(Option::V6, 7,
|
|
|
- buf,
|
|
|
- 3, // offset
|
|
|
- 5)); // 5 bytes of data
|
|
|
+ buf_.begin(),
|
|
|
+ buf_.begin() + 3);
|
|
|
+ OptionPtr opt2(new Option(Option::V6, 13));
|
|
|
+ OptionPtr opt3(new Option(Option::V6, 7,
|
|
|
+ buf_.begin() + 3,
|
|
|
+ buf_.begin() + 8));
|
|
|
opt1->addOption(opt2);
|
|
|
opt2->addOption(opt3);
|
|
|
// opt3 len = 9 4(header)+5(data)
|
|
@@ -361,11 +345,11 @@ TEST_F(OptionTest, v6_suboptions2) {
|
|
|
0, 7, 0, 5, 103, 104, 105, 106, 107,
|
|
|
};
|
|
|
|
|
|
- int offset = opt1->pack(buf, 128, 20);
|
|
|
- EXPECT_EQ(40, offset);
|
|
|
+ opt1->pack(outBuf_);
|
|
|
+ EXPECT_EQ(20, outBuf_.getLength());
|
|
|
|
|
|
// payload
|
|
|
- EXPECT_EQ(0, memcmp(&buf[20], expected, 20) );
|
|
|
+ EXPECT_EQ(0, memcmp(outBuf_.getData(), expected, 20) );
|
|
|
|
|
|
EXPECT_NO_THROW(
|
|
|
delete opt1;
|
|
@@ -373,13 +357,12 @@ TEST_F(OptionTest, v6_suboptions2) {
|
|
|
}
|
|
|
|
|
|
TEST_F(OptionTest, v6_addgetdel) {
|
|
|
- boost::shared_array<uint8_t> buf(new uint8_t[128]);
|
|
|
for (int i=0; i<128; i++)
|
|
|
- buf[i] = 100+i;
|
|
|
+ buf_[i] = 100+i;
|
|
|
Option* parent = new Option(Option::V6, 65535); //type
|
|
|
- boost::shared_ptr<Option> opt1(new Option(Option::V6, 1));
|
|
|
- boost::shared_ptr<Option> opt2(new Option(Option::V6, 2));
|
|
|
- boost::shared_ptr<Option> opt3(new Option(Option::V6, 2));
|
|
|
+ OptionPtr opt1(new Option(Option::V6, 1));
|
|
|
+ OptionPtr opt2(new Option(Option::V6, 2));
|
|
|
+ OptionPtr opt3(new Option(Option::V6, 2));
|
|
|
|
|
|
parent->addOption(opt1);
|
|
|
parent->addOption(opt2);
|
|
@@ -389,7 +372,7 @@ TEST_F(OptionTest, v6_addgetdel) {
|
|
|
EXPECT_EQ(opt2, parent->getOption(2));
|
|
|
|
|
|
// expect NULL
|
|
|
- EXPECT_EQ(boost::shared_ptr<Option>(), parent->getOption(4));
|
|
|
+ EXPECT_EQ(OptionPtr(), parent->getOption(4));
|
|
|
|
|
|
// now there are 2 options of type 2
|
|
|
parent->addOption(opt3);
|
|
@@ -398,13 +381,13 @@ TEST_F(OptionTest, v6_addgetdel) {
|
|
|
EXPECT_EQ(true, parent->delOption(2));
|
|
|
|
|
|
// there still should be the other option 2
|
|
|
- EXPECT_NE(boost::shared_ptr<Option>(), parent->getOption(2));
|
|
|
+ EXPECT_NE(OptionPtr(), parent->getOption(2));
|
|
|
|
|
|
// let's delete the other option 2
|
|
|
EXPECT_EQ(true, parent->delOption(2));
|
|
|
|
|
|
// no more options with type=2
|
|
|
- EXPECT_EQ(boost::shared_ptr<Option>(), parent->getOption(2));
|
|
|
+ EXPECT_EQ(OptionPtr(), parent->getOption(2));
|
|
|
|
|
|
// let's try to delete - should fail
|
|
|
EXPECT_TRUE(false == parent->delOption(2));
|
|
@@ -412,36 +395,31 @@ TEST_F(OptionTest, v6_addgetdel) {
|
|
|
delete parent;
|
|
|
}
|
|
|
|
|
|
-}
|
|
|
-
|
|
|
TEST_F(OptionTest, v6_toText) {
|
|
|
- boost::shared_array<uint8_t> buf(new uint8_t[3]);
|
|
|
- buf[0] = 0;
|
|
|
- buf[1] = 0xf;
|
|
|
- buf[2] = 0xff;
|
|
|
+ buf_[0] = 0;
|
|
|
+ buf_[1] = 0xf;
|
|
|
+ buf_[2] = 0xff;
|
|
|
|
|
|
- boost::shared_ptr<Option> opt(new Option(Option::V6, 258,
|
|
|
- buf, 0, 3));
|
|
|
+ OptionPtr opt(new Option(Option::V6, 258, buf_.begin(), buf_.begin() + 3 ));
|
|
|
|
|
|
EXPECT_EQ("type=258, len=3: 00:0f:ff", opt->toText());
|
|
|
}
|
|
|
|
|
|
+
|
|
|
TEST_F(OptionTest, getUintX) {
|
|
|
|
|
|
- // TODO: Update this test to use buf_ instead of buf
|
|
|
- boost::shared_array<uint8_t> buf(new uint8_t[5]);
|
|
|
- buf[0] = 0x5;
|
|
|
- buf[1] = 0x4;
|
|
|
- buf[2] = 0x3;
|
|
|
- buf[3] = 0x2;
|
|
|
- buf[4] = 0x1;
|
|
|
+ buf_[0] = 0x5;
|
|
|
+ buf_[1] = 0x4;
|
|
|
+ buf_[2] = 0x3;
|
|
|
+ buf_[3] = 0x2;
|
|
|
+ buf_[4] = 0x1;
|
|
|
|
|
|
// five options with varying lengths
|
|
|
- boost::shared_ptr<Option> opt1(new Option(Option::V6, 258, buf, 0, 1));
|
|
|
- boost::shared_ptr<Option> opt2(new Option(Option::V6, 258, buf, 0, 2));
|
|
|
- boost::shared_ptr<Option> opt3(new Option(Option::V6, 258, buf, 0, 3));
|
|
|
- boost::shared_ptr<Option> opt4(new Option(Option::V6, 258, buf, 0, 4));
|
|
|
- boost::shared_ptr<Option> opt5(new Option(Option::V6, 258, buf, 0, 5));
|
|
|
+ OptionPtr opt1(new Option(Option::V6, 258, buf_.begin(), buf_.begin() + 1));
|
|
|
+ OptionPtr opt2(new Option(Option::V6, 258, buf_.begin(), buf_.begin() + 2));
|
|
|
+ OptionPtr opt3(new Option(Option::V6, 258, buf_.begin(), buf_.begin() + 3));
|
|
|
+ OptionPtr opt4(new Option(Option::V6, 258, buf_.begin(), buf_.begin() + 4));
|
|
|
+ OptionPtr opt5(new Option(Option::V6, 258, buf_.begin(), buf_.begin() + 5));
|
|
|
|
|
|
EXPECT_EQ(5, opt1->getUint8());
|
|
|
EXPECT_THROW(opt1->getUint16(), OutOfRange);
|
|
@@ -467,36 +445,37 @@ TEST_F(OptionTest, getUintX) {
|
|
|
}
|
|
|
|
|
|
TEST_F(OptionTest, setUintX) {
|
|
|
- boost::shared_ptr<Option> opt1(new Option(Option::V4, 125));
|
|
|
- boost::shared_ptr<Option> opt2(new Option(Option::V4, 125));
|
|
|
- boost::shared_ptr<Option> opt4(new Option(Option::V4, 125));
|
|
|
+ OptionPtr opt1(new Option(Option::V4, 125));
|
|
|
+ OptionPtr opt2(new Option(Option::V4, 125));
|
|
|
+ OptionPtr opt4(new Option(Option::V4, 125));
|
|
|
|
|
|
// verify setUint8
|
|
|
opt1->setUint8(255);
|
|
|
EXPECT_EQ(255, opt1->getUint8());
|
|
|
- opt1->pack4(outBuffer_);
|
|
|
+ opt1->pack4(outBuf_);
|
|
|
EXPECT_EQ(3, opt1->len());
|
|
|
- EXPECT_EQ(3, outBuffer_.getLength());
|
|
|
+ EXPECT_EQ(3, outBuf_.getLength());
|
|
|
uint8_t exp1[] = {125, 1, 255};
|
|
|
- EXPECT_TRUE(0 == memcmp(exp1, outBuffer_.getData(), 3));
|
|
|
+ EXPECT_TRUE(0 == memcmp(exp1, outBuf_.getData(), 3));
|
|
|
|
|
|
// verify getUint16
|
|
|
- outBuffer_.clear();
|
|
|
+ outBuf_.clear();
|
|
|
opt2->setUint16(12345);
|
|
|
- opt2->pack4(outBuffer_);
|
|
|
+ opt2->pack4(outBuf_);
|
|
|
EXPECT_EQ(12345, opt2->getUint16());
|
|
|
EXPECT_EQ(4, opt2->len());
|
|
|
- EXPECT_EQ(4, outBuffer_.getLength());
|
|
|
+ EXPECT_EQ(4, outBuf_.getLength());
|
|
|
uint8_t exp2[] = {125, 2, 12345/256, 12345%256};
|
|
|
- EXPECT_TRUE(0 == memcmp(exp2, outBuffer_.getData(), 4));
|
|
|
+ EXPECT_TRUE(0 == memcmp(exp2, outBuf_.getData(), 4));
|
|
|
|
|
|
// verity getUint32
|
|
|
- outBuffer_.clear();
|
|
|
+ outBuf_.clear();
|
|
|
opt4->setUint32(0x12345678);
|
|
|
- opt4->pack4(outBuffer_);
|
|
|
+ opt4->pack4(outBuf_);
|
|
|
EXPECT_EQ(0x12345678, opt4->getUint32());
|
|
|
EXPECT_EQ(6, opt4->len());
|
|
|
- EXPECT_EQ(6, outBuffer_.getLength());
|
|
|
+ EXPECT_EQ(6, outBuf_.getLength());
|
|
|
uint8_t exp4[] = {125, 4, 0x12, 0x34, 0x56, 0x78};
|
|
|
- EXPECT_TRUE(0 == memcmp(exp4, outBuffer_.getData(), 6));
|
|
|
+ EXPECT_TRUE(0 == memcmp(exp4, outBuf_.getData(), 6));
|
|
|
+}
|
|
|
}
|