123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- // Copyright (C) 2009 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
- // copyright notice and this permission notice appear in all copies.
- //
- // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
- // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
- // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- // PERFORMANCE OF THIS SOFTWARE.
- #include <config.h>
- #include <iostream>
- #include <fstream>
- #include <sstream>
- #include <stdexcept>
- #include <vector>
- #include <string>
- #include <gtest/gtest.h>
- #include <dns/rcode.h>
- #include <dns/name.h>
- #include <dns/message.h>
- #include <dns/tests/unittest_util.h>
- using namespace std;
- using namespace isc::dns;
- using isc::UnitTestUtil;
- namespace {
- class UnitTestUtilConfig {
- private:
- // This is a singleton object and cannot be constructed explicitly.
- UnitTestUtilConfig() {}
- UnitTestUtilConfig(const UnitTestUtilConfig& source);
- ~UnitTestUtilConfig() {}
- public:
- /// Return a singleton unit test configuration object. On first invocation
- /// one will be constructed.
- static UnitTestUtilConfig& getConfig();
- /// A list of paths to wire data files.
- /// \c UnitTestUtil::readWireData() (first version)
- /// will search the directories in this list for the specified data file.
- std::vector<string> data_paths_;
- };
- UnitTestUtilConfig&
- UnitTestUtilConfig::getConfig() {
- static UnitTestUtilConfig config;
- return (config);
- }
- }
- void
- UnitTestUtil::readWireData(const char* datafile, vector<unsigned char>& data) {
- ifstream ifs;
- const UnitTestUtilConfig& config = UnitTestUtilConfig::getConfig();
- vector<string>::const_iterator it = config.data_paths_.begin();
- for (; it != config.data_paths_.end(); ++it) {
- string data_path = *it;
- if (data_path.empty() || *data_path.rbegin() != '/') {
- data_path.push_back('/');
- }
- ifs.open((data_path + datafile).c_str(), ios_base::in);
- if ((ifs.rdstate() & istream::failbit) == 0) {
- break;
- }
- }
- if (it == config.data_paths_.end()) {
- throw runtime_error("failed to open data file in data paths: " +
- string(datafile));
- }
- data.clear();
- string s;
- while (getline(ifs, s), !ifs.eof()) {
- if (ifs.bad() || ifs.fail()) {
- throw runtime_error("unexpected data line");
- }
- if (s.empty() || s[0] == '#') {
- continue;
- }
- readWireData(s, data);
- }
- }
- void
- UnitTestUtil::addDataPath(const string& directory) {
- UnitTestUtilConfig::getConfig().data_paths_.push_back(directory);
- }
- void
- UnitTestUtil::readWireData(const string& datastr,
- vector<unsigned char>& data)
- {
- istringstream iss(datastr);
- do {
- string bytes;
- iss >> bytes;
- if (iss.bad() || iss.fail() || (bytes.size() % 2) != 0) {
- ostringstream err_oss;
- err_oss << "unexpected input or I/O error in reading " <<
- datastr;
- throw runtime_error(err_oss.str());
- }
- for (string::size_type pos = 0; pos < bytes.size(); pos += 2) {
- istringstream iss_byte(bytes.substr(pos, 2));
- unsigned int ch;
- iss_byte >> hex >> ch;
- if (iss_byte.rdstate() != istream::eofbit) {
- ostringstream err_oss;
- err_oss << "invalid byte representation: " << iss_byte.str();
- throw runtime_error(err_oss.str());
- }
- data.push_back(static_cast<unsigned char>(ch));
- }
- } while (!iss.eof());
- }
- ::testing::AssertionResult
- UnitTestUtil::matchName(const char*, const char*,
- const isc::dns::Name& name1,
- const isc::dns::Name& name2)
- {
- ::testing::Message msg;
- NameComparisonResult cmpresult = name1.compare(name2);
- if (cmpresult.getOrder() != 0 ||
- cmpresult.getRelation() != NameComparisonResult::EQUAL) {
- msg << "Two names are expected to be equal but not:\n"
- << " One: " << name1 << "\n"
- << "Other: " << name2 << "\n";
- return (::testing::AssertionFailure(msg));
- }
- return (::testing::AssertionSuccess());
- }
- void
- UnitTestUtil::createRequestMessage(Message& message,
- const Opcode& opcode,
- const uint16_t qid,
- const Name& name,
- const RRClass& rrclass,
- const RRType& rrtype)
- {
- message.clear(Message::RENDER);
- message.setOpcode(opcode);
- message.setRcode(Rcode::NOERROR());
- message.setQid(qid);
- message.addQuestion(Question(name, rrclass, rrtype));
- }
- void
- UnitTestUtil::createDNSSECRequestMessage(Message& message,
- const Opcode& opcode,
- const uint16_t qid,
- const Name& name,
- const RRClass& rrclass,
- const RRType& rrtype)
- {
- message.clear(Message::RENDER);
- message.setOpcode(opcode);
- message.setRcode(Rcode::NOERROR());
- message.setQid(qid);
- message.addQuestion(Question(name, rrclass, rrtype));
- EDNSPtr edns(new EDNS());
- edns->setUDPSize(4096);
- edns->setDNSSECAwareness(true);
- message.setEDNS(edns);
- }
|