123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- #include <exceptions/exceptions.h>
- #include <util/buffer.h>
- #include <dns/name.h>
- #include <dns/messagerenderer.h>
- #include <dns/tests/unittest_util.h>
- #include <gtest/gtest.h>
- #include <vector>
- using isc::UnitTestUtil;
- using isc::dns::Name;
- using isc::dns::MessageRenderer;
- using isc::util::OutputBuffer;
- namespace {
- class MessageRendererTest : public ::testing::Test {
- protected:
- MessageRendererTest() : expected_size(0) {
- data16 = (2 << 8) | 3;
- data32 = (4 << 24) | (5 << 16) | (6 << 8) | 7;
- }
- size_t expected_size;
- uint16_t data16;
- uint32_t data32;
- MessageRenderer renderer;
- std::vector<unsigned char> data;
- static const uint8_t testdata[5];
- };
- const uint8_t MessageRendererTest::testdata[5] = {1, 2, 3, 4, 5};
- TEST_F(MessageRendererTest, writeIntger) {
- renderer.writeUint16(data16);
- expected_size += sizeof(data16);
- EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, renderer.getData(),
- renderer.getLength(), &testdata[1], sizeof(data16));
- }
- TEST_F(MessageRendererTest, writeName) {
- UnitTestUtil::readWireData("name_toWire1", data);
- renderer.writeName(Name("a.example.com."));
- renderer.writeName(Name("b.example.com."));
- renderer.writeName(Name("a.example.org."));
- EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, renderer.getData(),
- renderer.getLength(), &data[0], data.size());
- }
- TEST_F(MessageRendererTest, writeNameInLargeBuffer) {
- size_t offset = 0x3fff;
- renderer.skip(offset);
- UnitTestUtil::readWireData("name_toWire2", data);
- renderer.writeName(Name("a.example.com."));
- renderer.writeName(Name("a.example.com."));
- renderer.writeName(Name("b.example.com."));
- EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData,
- static_cast<const uint8_t*>(renderer.getData()) +
- offset,
- renderer.getLength() - offset,
- &data[0], data.size());
- }
- TEST_F(MessageRendererTest, writeNameWithUncompressed) {
- UnitTestUtil::readWireData("name_toWire3", data);
- renderer.writeName(Name("a.example.com."));
- renderer.writeName(Name("b.example.com."), false);
- renderer.writeName(Name("b.example.com."));
- EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, renderer.getData(),
- renderer.getLength(), &data[0], data.size());
- }
- TEST_F(MessageRendererTest, writeNamePointerChain) {
- UnitTestUtil::readWireData("name_toWire4", data);
- renderer.writeName(Name("a.example.com."));
- renderer.writeName(Name("b.example.com."));
- renderer.writeName(Name("b.example.com."));
- EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, renderer.getData(),
- renderer.getLength(), &data[0], data.size());
- }
- TEST_F(MessageRendererTest, compressMode) {
-
- EXPECT_EQ(MessageRenderer::CASE_INSENSITIVE, renderer.getCompressMode());
-
- renderer.setCompressMode(MessageRenderer::CASE_SENSITIVE);
- EXPECT_EQ(MessageRenderer::CASE_SENSITIVE, renderer.getCompressMode());
- renderer.setCompressMode(MessageRenderer::CASE_INSENSITIVE);
- EXPECT_EQ(MessageRenderer::CASE_INSENSITIVE, renderer.getCompressMode());
-
- renderer.setCompressMode(MessageRenderer::CASE_SENSITIVE);
- renderer.clear();
- EXPECT_EQ(MessageRenderer::CASE_INSENSITIVE, renderer.getCompressMode());
- }
- TEST_F(MessageRendererTest, writeNameCaseCompress) {
-
- UnitTestUtil::readWireData("name_toWire1", data);
- renderer.writeName(Name("a.example.com."));
-
- renderer.writeName(Name("b.exAmple.CoM."));
- renderer.writeName(Name("a.example.org."));
- EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, renderer.getData(),
- renderer.getLength(), &data[0], data.size());
- }
- TEST_F(MessageRendererTest, writeNameCaseSensitiveCompress) {
-
-
- renderer.setCompressMode(MessageRenderer::CASE_SENSITIVE);
- UnitTestUtil::readWireData("name_toWire5.wire", data);
- renderer.writeName(Name("a.example.com."));
- renderer.writeName(Name("b.eXample.com."));
- renderer.writeName(Name("c.eXample.com."));
- EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, renderer.getData(),
- renderer.getLength(), &data[0], data.size());
- }
- TEST_F(MessageRendererTest, writeNameMixedCaseCompress) {
- renderer.setCompressMode(MessageRenderer::CASE_SENSITIVE);
- UnitTestUtil::readWireData("name_toWire6.wire", data);
- renderer.writeName(Name("a.example.com."));
- renderer.writeName(Name("b.eXample.com."));
-
-
- EXPECT_THROW(renderer.setCompressMode(MessageRenderer::CASE_INSENSITIVE),
- isc::InvalidParameter);
-
- renderer.clear();
- EXPECT_NO_THROW(renderer.setCompressMode(
- MessageRenderer::CASE_INSENSITIVE));
- }
- TEST_F(MessageRendererTest, writeRootName) {
-
-
-
- Name example_name = Name("www.example.com");
- OutputBuffer expected(0);
- expected.writeUint8(0);
- example_name.toWire(expected);
- renderer.writeName(Name("."));
- renderer.writeName(example_name);
- EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData,
- static_cast<const uint8_t*>(renderer.getData()),
- renderer.getLength(),
- static_cast<const uint8_t*>(expected.getData()),
- expected.getLength());
- }
- TEST_F(MessageRendererTest, setBuffer) {
- OutputBuffer new_buffer(0);
- renderer.setBuffer(&new_buffer);
- EXPECT_EQ(0, new_buffer.getLength());
- renderer.writeUint32(42);
- EXPECT_EQ(sizeof(uint32_t), new_buffer.getLength());
- EXPECT_EQ(sizeof(uint32_t), renderer.getLength());
-
- EXPECT_EQ(512, renderer.getLengthLimit());
- renderer.setLengthLimit(4096);
- EXPECT_EQ(4096, renderer.getLengthLimit());
-
-
- renderer.setBuffer(NULL);
- EXPECT_EQ(sizeof(uint32_t), new_buffer.getLength());
- EXPECT_EQ(0, renderer.getLength());
- EXPECT_EQ(512, renderer.getLengthLimit());
- }
- TEST_F(MessageRendererTest, setBufferErrors) {
- OutputBuffer new_buffer(0);
-
- renderer.writeUint32(10);
- EXPECT_THROW(renderer.setBuffer(&new_buffer), isc::InvalidParameter);
- renderer.clear();
- renderer.setBuffer(&new_buffer);
- renderer.writeUint32(10);
- EXPECT_THROW(renderer.setBuffer(&new_buffer), isc::InvalidParameter);
-
- renderer.setBuffer(NULL);
- EXPECT_THROW(renderer.setBuffer(NULL), isc::InvalidParameter);
-
- renderer.setBuffer(&new_buffer);
- EXPECT_NO_THROW(renderer.setBuffer(NULL));
- }
- }
|