BIND 10 trac2157_2, updated. 40f93b0c0d8957a55fb668c12a20f90d4ac9b9d3 [2157] add test for generated XML file
BIND 10 source code commits
bind10-changes at lists.isc.org
Wed Dec 12 10:39:37 UTC 2012
The branch, trac2157_2 has been updated
via 40f93b0c0d8957a55fb668c12a20f90d4ac9b9d3 (commit)
via 47378a9cbd7221316b4c760e63d04076e30c73e3 (commit)
via 3c564a11e1f20def92a19c61b7af3451eb5401f7 (commit)
via 988a0f092329316e2b371a28f2a1d23424bf9faf (commit)
via 494784a813b1abdaa08e0bb3826ba72d0da5d15e (commit)
via 8cdb5d8c29af3be627e3c7bd5898d08392da4b35 (commit)
via f04b2ebeb31bc3ff1b8866be4b426bfbbb423803 (commit)
via dd62fb425882a361673e52f264b24d2455d9b335 (commit)
via c2165222deb85cb2ff99a7146b28c659624edc24 (commit)
via 2afe3383ec01875950b489b7702b2ec2c3281d64 (commit)
via 9e0f9e4df2927c9ae7173053b2efc57ec8dd82ee (commit)
via e930663b459bf75063193ed08cb3d455adaaccae (commit)
from 36f21c21868230dc6dbf60b898607cca53fceaf4 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 40f93b0c0d8957a55fb668c12a20f90d4ac9b9d3
Author: Yoshitaka Aharen <aharen at jprs.co.jp>
Date: Wed Dec 12 19:13:11 2012 +0900
[2157] add test for generated XML file
commit 47378a9cbd7221316b4c760e63d04076e30c73e3
Author: Yoshitaka Aharen <aharen at jprs.co.jp>
Date: Tue Dec 11 21:11:53 2012 +0900
[2157] test only for concerned counters
commit 3c564a11e1f20def92a19c61b7af3451eb5401f7
Author: Yoshitaka Aharen <aharen at jprs.co.jp>
Date: Tue Dec 11 20:55:44 2012 +0900
[2157] fix checks for response is TSIG signed or not
commit 988a0f092329316e2b371a28f2a1d23424bf9faf
Author: Yoshitaka Aharen <aharen at jprs.co.jp>
Date: Tue Dec 11 20:32:39 2012 +0900
[2157] unify similar test codes
commit 494784a813b1abdaa08e0bb3826ba72d0da5d15e
Author: Yoshitaka Aharen <aharen at jprs.co.jp>
Date: Tue Dec 11 20:19:52 2012 +0900
[2157] add a testcase of truncated message
commit 8cdb5d8c29af3be627e3c7bd5898d08392da4b35
Author: Yoshitaka Aharen <aharen at jprs.co.jp>
Date: Tue Dec 11 19:51:55 2012 +0900
[2157] unify counter initialization check into a method
commit f04b2ebeb31bc3ff1b8866be4b426bfbbb423803
Author: Yoshitaka Aharen <aharen at jprs.co.jp>
Date: Tue Dec 11 19:36:22 2012 +0900
[2157] Counters::get() now returns ConstElementPtr.
commit dd62fb425882a361673e52f264b24d2455d9b335
Author: Yoshitaka Aharen <aharen at jprs.co.jp>
Date: Tue Dec 11 19:26:43 2012 +0900
[2157] update doxygen comment
commit c2165222deb85cb2ff99a7146b28c659624edc24
Author: Yoshitaka Aharen <aharen at jprs.co.jp>
Date: Tue Dec 11 18:45:18 2012 +0900
[2157] pass IP versions and transport protocols with enum
commit 2afe3383ec01875950b489b7702b2ec2c3281d64
Author: Yoshitaka Aharen <aharen at jprs.co.jp>
Date: Tue Dec 11 16:57:46 2012 +0900
[2157] declare MessageAttributes as temporary variable
commit 9e0f9e4df2927c9ae7173053b2efc57ec8dd82ee
Author: Yoshitaka Aharen <aharen at jprs.co.jp>
Date: Mon Dec 10 21:00:23 2012 +0900
[2157] apply review comments
commit e930663b459bf75063193ed08cb3d455adaaccae
Author: Yoshitaka Aharen <aharen at jprs.co.jp>
Date: Fri Dec 7 15:35:27 2012 +0900
[2157] fix indent
-----------------------------------------------------------------------
Summary of changes:
src/bin/auth/auth_srv.cc | 139 ++++++++------
src/bin/auth/gen-statisticsitems.py.pre.in | 179 +++++++++--------
src/bin/auth/statistics.cc.pre | 55 ++----
src/bin/auth/statistics.h | 131 ++++++++-----
src/bin/auth/statistics_msg_items.def | 2 +-
src/bin/auth/tests/Makefile.am | 3 +
src/bin/auth/tests/auth_srv_unittest.cc | 254 +++++++------------------
src/bin/auth/tests/statistics_unittest.cc.pre | 125 ++++++------
src/bin/auth/tests/statisticsitems.py | 91 +++++++++
src/lib/testutils/testdata/example.com | 8 +
src/lib/testutils/testdata/example.sqlite3 | Bin 15360 -> 15360 bytes
11 files changed, 518 insertions(+), 469 deletions(-)
create mode 100644 src/bin/auth/tests/statisticsitems.py
-----------------------------------------------------------------------
diff --git a/src/bin/auth/auth_srv.cc b/src/bin/auth/auth_srv.cc
index a9ea5ac..0c36698 100644
--- a/src/bin/auth/auth_srv.cc
+++ b/src/bin/auth/auth_srv.cc
@@ -100,17 +100,21 @@ namespace {
// user of this class, so we hide it within the implementation.
class RendererHolder {
public:
- RendererHolder(MessageRenderer& renderer, OutputBuffer* buffer) :
- renderer_(renderer)
+ RendererHolder(MessageRenderer& renderer, OutputBuffer* buffer,
+ MessageAttributes& stats_attrs) :
+ renderer_(renderer),
+ stats_attrs_(stats_attrs)
{
renderer.setBuffer(buffer);
}
~RendererHolder() {
+ stats_attrs_.setResponseTruncated(renderer_.isTruncated());
renderer_.setBuffer(NULL);
renderer_.clear();
}
private:
MessageRenderer& renderer_;
+ MessageAttributes& stats_attrs_;
};
// Similar to Renderer holder, this is a very basic RAII-style class
@@ -240,14 +244,18 @@ public:
bool processNormalQuery(const IOMessage& io_message,
ConstEDNSPtr remote_edns, Message& message,
OutputBuffer& buffer,
- auto_ptr<TSIGContext> tsig_context);
+ auto_ptr<TSIGContext> tsig_context,
+ MessageAttributes& stats_attrs);
bool processXfrQuery(const IOMessage& io_message, Message& message,
OutputBuffer& buffer,
- auto_ptr<TSIGContext> tsig_context);
+ auto_ptr<TSIGContext> tsig_context,
+ MessageAttributes& stats_attrs);
bool processNotify(const IOMessage& io_message, Message& message,
OutputBuffer& buffer,
- auto_ptr<TSIGContext> tsig_context);
- bool processUpdate(const IOMessage& io_message);
+ auto_ptr<TSIGContext> tsig_context,
+ MessageAttributes& stats_attrs);
+ bool processUpdate(const IOMessage& io_message,
+ MessageAttributes& stats_attrs);
IOService io_service_;
@@ -272,9 +280,6 @@ public:
std::map<RRClass, boost::shared_ptr<ConfigurableClientList> >
client_lists_;
- /// Message attributes
- MessageAttributes stats_attrs_;
-
boost::shared_ptr<ConfigurableClientList> getClientList(const RRClass&
rrclass)
{
@@ -308,6 +313,7 @@ public:
/// this value will be passed to server->resume(bool)
void resumeServer(isc::asiodns::DNSServer* server,
isc::dns::Message& message,
+ MessageAttributes& stats_attrs,
const bool done);
private:
@@ -425,6 +431,7 @@ public:
void
makeErrorMessage(MessageRenderer& renderer, Message& message,
OutputBuffer& buffer, const Rcode& rcode,
+ MessageAttributes& stats_attrs,
std::auto_ptr<TSIGContext> tsig_context =
std::auto_ptr<TSIGContext>())
{
@@ -457,9 +464,10 @@ makeErrorMessage(MessageRenderer& renderer, Message& message,
message.setRcode(rcode);
- RendererHolder holder(renderer, &buffer);
+ RendererHolder holder(renderer, &buffer, stats_attrs);
if (tsig_context.get() != NULL) {
message.toWire(renderer, *tsig_context);
+ stats_attrs.setResponseSigTSIG(true);
} else {
message.toWire(renderer);
}
@@ -493,11 +501,16 @@ AuthSrv::processMessage(const IOMessage& io_message, Message& message,
OutputBuffer& buffer, DNSServer* server)
{
InputBuffer request_buffer(io_message.getData(), io_message.getDataSize());
+ MessageAttributes stats_attrs;
- impl_->stats_attrs_.setRequestIPVersion(
- io_message.getRemoteEndpoint().getFamily());
- impl_->stats_attrs_.setRequestTransportProtocol(
- io_message.getRemoteEndpoint().getProtocol());
+ stats_attrs.setRequestIPVersion(
+ io_message.getRemoteEndpoint().getFamily() == AF_INET ?
+ MessageAttributes::IP_VERSION_IPV4 :
+ MessageAttributes::IP_VERSION_IPV6);
+ stats_attrs.setRequestTransportProtocol(
+ io_message.getRemoteEndpoint().getProtocol() == IPPROTO_UDP ?
+ MessageAttributes::TRANSPORT_UDP :
+ MessageAttributes::TRANSPORT_TCP);
// First, check the header part. If we fail even for the base header,
// just drop the message.
@@ -507,13 +520,13 @@ AuthSrv::processMessage(const IOMessage& io_message, Message& message,
// Ignore all responses.
if (message.getHeaderFlag(Message::HEADERFLAG_QR)) {
LOG_DEBUG(auth_logger, DBG_AUTH_DETAIL, AUTH_RESPONSE_RECEIVED);
- impl_->resumeServer(server, message, false);
+ impl_->resumeServer(server, message, stats_attrs, false);
return;
}
} catch (const Exception& ex) {
LOG_DEBUG(auth_logger, DBG_AUTH_DETAIL, AUTH_HEADER_PARSE_FAIL)
.arg(ex.what());
- impl_->resumeServer(server, message, false);
+ impl_->resumeServer(server, message, stats_attrs, false);
return;
}
@@ -523,14 +536,16 @@ AuthSrv::processMessage(const IOMessage& io_message, Message& message,
} catch (const DNSProtocolError& error) {
LOG_DEBUG(auth_logger, DBG_AUTH_DETAIL, AUTH_PACKET_PROTOCOL_ERROR)
.arg(error.getRcode().toText()).arg(error.what());
- makeErrorMessage(impl_->renderer_, message, buffer, error.getRcode());
- impl_->resumeServer(server, message, true);
+ makeErrorMessage(impl_->renderer_, message, buffer, error.getRcode(),
+ stats_attrs);
+ impl_->resumeServer(server, message, stats_attrs, true);
return;
} catch (const Exception& ex) {
LOG_DEBUG(auth_logger, DBG_AUTH_DETAIL, AUTH_PACKET_PARSE_ERROR)
.arg(ex.what());
- makeErrorMessage(impl_->renderer_, message, buffer, Rcode::SERVFAIL());
- impl_->resumeServer(server, message, true);
+ makeErrorMessage(impl_->renderer_, message, buffer, Rcode::SERVFAIL(),
+ stats_attrs);
+ impl_->resumeServer(server, message, stats_attrs, true);
return;
} // other exceptions will be handled at a higher layer.
@@ -553,14 +568,13 @@ AuthSrv::processMessage(const IOMessage& io_message, Message& message,
**impl_->keyring_));
tsig_error = tsig_context->verify(tsig_record, io_message.getData(),
io_message.getDataSize());
- impl_->stats_attrs_.setRequestSig(true,
- tsig_error != TSIGError::NOERROR());
+ stats_attrs.setRequestSig(true, tsig_error != TSIGError::NOERROR());
}
if (tsig_error != TSIGError::NOERROR()) {
makeErrorMessage(impl_->renderer_, message, buffer,
- tsig_error.toRcode(), tsig_context);
- impl_->resumeServer(server, message, true);
+ tsig_error.toRcode(), stats_attrs, tsig_context);
+ impl_->resumeServer(server, message, stats_attrs, true);
return;
}
@@ -570,62 +584,68 @@ AuthSrv::processMessage(const IOMessage& io_message, Message& message,
// note: This can only be reliable after TSIG check succeeds.
ConstEDNSPtr edns = message.getEDNS();
if (edns) {
- impl_->stats_attrs_.setRequestEDNS0(true);
- impl_->stats_attrs_.setRequestDO(edns->getDNSSECAwareness());
+ stats_attrs.setRequestEDNS0(true);
+ stats_attrs.setRequestDO(edns->getDNSSECAwareness());
}
// note: This can only be reliable after TSIG check succeeds.
- impl_->stats_attrs_.setRequestOpCode(opcode);
+ stats_attrs.setRequestOpCode(opcode);
if (opcode == Opcode::NOTIFY()) {
send_answer = impl_->processNotify(io_message, message, buffer,
- tsig_context);
+ tsig_context, stats_attrs);
} else if (opcode == Opcode::UPDATE()) {
if (impl_->ddns_forwarder_) {
- send_answer = impl_->processUpdate(io_message);
+ send_answer = impl_->processUpdate(io_message, stats_attrs);
} else {
makeErrorMessage(impl_->renderer_, message, buffer,
- Rcode::NOTIMP(), tsig_context);
+ Rcode::NOTIMP(), stats_attrs, tsig_context);
}
} else if (opcode != Opcode::QUERY()) {
LOG_DEBUG(auth_logger, DBG_AUTH_DETAIL, AUTH_UNSUPPORTED_OPCODE)
.arg(message.getOpcode().toText());
makeErrorMessage(impl_->renderer_, message, buffer,
- Rcode::NOTIMP(), tsig_context);
+ Rcode::NOTIMP(), stats_attrs, tsig_context);
} else if (message.getRRCount(Message::SECTION_QUESTION) != 1) {
makeErrorMessage(impl_->renderer_, message, buffer,
- Rcode::FORMERR(), tsig_context);
+ Rcode::FORMERR(), stats_attrs, tsig_context);
} else {
ConstQuestionPtr question = *message.beginQuestion();
const RRType& qtype = question->getType();
if (qtype == RRType::AXFR()) {
send_answer = impl_->processXfrQuery(io_message, message,
- buffer, tsig_context);
+ buffer, tsig_context,
+ stats_attrs);
} else if (qtype == RRType::IXFR()) {
send_answer = impl_->processXfrQuery(io_message, message,
- buffer, tsig_context);
+ buffer, tsig_context,
+ stats_attrs);
} else {
send_answer = impl_->processNormalQuery(io_message, edns,
message, buffer,
- tsig_context);
+ tsig_context,
+ stats_attrs);
}
}
} catch (const std::exception& ex) {
LOG_DEBUG(auth_logger, DBG_AUTH_DETAIL, AUTH_RESPONSE_FAILURE)
.arg(ex.what());
- makeErrorMessage(impl_->renderer_, message, buffer, Rcode::SERVFAIL());
+ makeErrorMessage(impl_->renderer_, message, buffer, Rcode::SERVFAIL(),
+ stats_attrs);
} catch (...) {
LOG_DEBUG(auth_logger, DBG_AUTH_DETAIL, AUTH_RESPONSE_FAILURE_UNKNOWN);
- makeErrorMessage(impl_->renderer_, message, buffer, Rcode::SERVFAIL());
+ makeErrorMessage(impl_->renderer_, message, buffer, Rcode::SERVFAIL(),
+ stats_attrs);
}
- impl_->resumeServer(server, message, send_answer);
+ impl_->resumeServer(server, message, stats_attrs, send_answer);
}
bool
AuthSrvImpl::processNormalQuery(const IOMessage& io_message,
ConstEDNSPtr remote_edns, Message& message,
OutputBuffer& buffer,
- auto_ptr<TSIGContext> tsig_context)
+ auto_ptr<TSIGContext> tsig_context,
+ MessageAttributes& stats_attrs)
{
const bool dnssec_ok = remote_edns && remote_edns->getDNSSECAwareness();
const uint16_t remote_bufsize = remote_edns ? remote_edns->getUDPSize() :
@@ -651,21 +671,24 @@ AuthSrvImpl::processNormalQuery(const IOMessage& io_message,
const Name& qname = question->getName();
query_.process(*list, qname, qtype, message, dnssec_ok);
} else {
- makeErrorMessage(renderer_, message, buffer, Rcode::REFUSED());
+ makeErrorMessage(renderer_, message, buffer, Rcode::REFUSED(),
+ stats_attrs);
return (true);
}
} catch (const Exception& ex) {
LOG_ERROR(auth_logger, AUTH_PROCESS_FAIL).arg(ex.what());
- makeErrorMessage(renderer_, message, buffer, Rcode::SERVFAIL());
+ makeErrorMessage(renderer_, message, buffer, Rcode::SERVFAIL(),
+ stats_attrs);
return (true);
}
- RendererHolder holder(renderer_, &buffer);
+ RendererHolder holder(renderer_, &buffer, stats_attrs);
const bool udp_buffer =
(io_message.getSocket().getProtocol() == IPPROTO_UDP);
renderer_.setLengthLimit(udp_buffer ? remote_bufsize : 65535);
if (tsig_context.get() != NULL) {
message.toWire(renderer_, *tsig_context);
+ stats_attrs.setResponseSigTSIG(true);
} else {
message.toWire(renderer_);
}
@@ -677,12 +700,13 @@ AuthSrvImpl::processNormalQuery(const IOMessage& io_message,
bool
AuthSrvImpl::processXfrQuery(const IOMessage& io_message, Message& message,
OutputBuffer& buffer,
- auto_ptr<TSIGContext> tsig_context)
+ auto_ptr<TSIGContext> tsig_context,
+ MessageAttributes& stats_attrs)
{
if (io_message.getSocket().getProtocol() == IPPROTO_UDP) {
LOG_DEBUG(auth_logger, DBG_AUTH_DETAIL, AUTH_AXFR_UDP);
makeErrorMessage(renderer_, message, buffer, Rcode::FORMERR(),
- tsig_context);
+ stats_attrs, tsig_context);
return (true);
}
@@ -708,7 +732,7 @@ AuthSrvImpl::processXfrQuery(const IOMessage& io_message, Message& message,
LOG_DEBUG(auth_logger, DBG_AUTH_DETAIL, AUTH_AXFR_ERROR)
.arg(err.what());
makeErrorMessage(renderer_, message, buffer, Rcode::SERVFAIL(),
- tsig_context);
+ stats_attrs, tsig_context);
return (true);
}
@@ -718,7 +742,8 @@ AuthSrvImpl::processXfrQuery(const IOMessage& io_message, Message& message,
bool
AuthSrvImpl::processNotify(const IOMessage& io_message, Message& message,
OutputBuffer& buffer,
- std::auto_ptr<TSIGContext> tsig_context)
+ std::auto_ptr<TSIGContext> tsig_context,
+ MessageAttributes& stats_attrs)
{
// The incoming notify must contain exactly one question for SOA of the
// zone name.
@@ -726,7 +751,7 @@ AuthSrvImpl::processNotify(const IOMessage& io_message, Message& message,
LOG_DEBUG(auth_logger, DBG_AUTH_DETAIL, AUTH_NOTIFY_QUESTIONS)
.arg(message.getRRCount(Message::SECTION_QUESTION));
makeErrorMessage(renderer_, message, buffer, Rcode::FORMERR(),
- tsig_context);
+ stats_attrs, tsig_context);
return (true);
}
ConstQuestionPtr question = *message.beginQuestion();
@@ -734,7 +759,7 @@ AuthSrvImpl::processNotify(const IOMessage& io_message, Message& message,
LOG_DEBUG(auth_logger, DBG_AUTH_DETAIL, AUTH_NOTIFY_RRTYPE)
.arg(question->getType().toText());
makeErrorMessage(renderer_, message, buffer, Rcode::FORMERR(),
- tsig_context);
+ stats_attrs, tsig_context);
return (true);
}
@@ -792,9 +817,10 @@ AuthSrvImpl::processNotify(const IOMessage& io_message, Message& message,
message.setHeaderFlag(Message::HEADERFLAG_AA);
message.setRcode(Rcode::NOERROR());
- RendererHolder holder(renderer_, &buffer);
+ RendererHolder holder(renderer_, &buffer, stats_attrs);
if (tsig_context.get() != NULL) {
message.toWire(renderer_, *tsig_context);
+ stats_attrs.setResponseSigTSIG(true);
} else {
message.toWire(renderer_);
}
@@ -802,7 +828,9 @@ AuthSrvImpl::processNotify(const IOMessage& io_message, Message& message,
}
bool
-AuthSrvImpl::processUpdate(const IOMessage& io_message) {
+AuthSrvImpl::processUpdate(const IOMessage& io_message,
+ MessageAttributes&)
+{
// Push the update request to a separate process via the forwarder.
// On successful push, the request shouldn't be responded from b10-auth,
// so we return false.
@@ -812,13 +840,9 @@ AuthSrvImpl::processUpdate(const IOMessage& io_message) {
void
AuthSrvImpl::resumeServer(DNSServer* server, Message& message,
+ MessageAttributes& stats_attrs,
const bool done) {
- if (done) {
- // isTruncated from MessageRenderer
- stats_attrs_.setResponseTruncated(renderer_.isTruncated());
- }
- counters_.inc(stats_attrs_, message, done);
- stats_attrs_.reset();
+ counters_.inc(stats_attrs, message, done);
server->resume(done);
}
@@ -868,7 +892,8 @@ void
AuthSrv::createDDNSForwarder() {
LOG_DEBUG(auth_logger, DBG_AUTH_OPS, AUTH_START_DDNS_FORWARDER);
impl_->ddns_forwarder_.reset(
- new SocketSessionForwarderHolder("update", impl_->ddns_base_forwarder_));
+ new SocketSessionForwarderHolder("update",
+ impl_->ddns_base_forwarder_));
}
void
diff --git a/src/bin/auth/gen-statisticsitems.py.pre.in b/src/bin/auth/gen-statisticsitems.py.pre.in
index 7ef4e1a..d759a2f 100755
--- a/src/bin/auth/gen-statisticsitems.py.pre.in
+++ b/src/bin/auth/gen-statisticsitems.py.pre.in
@@ -24,6 +24,7 @@ import re
import sys
import json
from xml.etree import ElementTree
+from xml.dom.minidom import parseString
item_list = []
localstatedir = '@@LOCALSTATEDIR@@'
@@ -33,7 +34,7 @@ pre_suffix = '.pre'
xmldocument_command_name = 'b10-auth'
-def need_generate(filepath, mtime):
+def need_generate(filepath, prepath, mtime):
'''Check if we need to generate the specified file.
To avoid unnecessary compilation, we skip (re)generating the file when
@@ -42,7 +43,7 @@ def need_generate(filepath, mtime):
'''
if os.path.exists(filepath) and\
(os.path.getmtime(filepath) > mtime and
- os.path.getmtime(filepath) > os.path.getmtime(filepath+pre_suffix)):
+ os.path.getmtime(filepath) > os.path.getmtime(prepath)):
return False
return True
@@ -72,29 +73,31 @@ def import_definitions():
global item_list
items_definition_file = srcdir + os.sep + 'statistics_msg_items.def'
- item_definition = open(items_definition_file, 'r')
-
- re_splitter = re.compile('\t+')
- l = item_list
- lp = None
- for line in item_definition.readlines():
- element = re_splitter.split(line.rstrip())
- if element[0] == '':
- element.pop(0)
-
- if element[-1] == '=':
- l.append({'name': element[0], 'child': [], 'index': element[1],
- 'description': element[2], 'parent': lp})
- lp = l
- l = l[-1]['child']
- elif element[-1] == ';':
- l = lp
- lp = l[-1]['parent']
- else:
- l.append({'name': element[0], 'child': None, 'index': element[1],
- 'description': element[2], 'parent': lp})
-
- item_definition.close()
+ with open(items_definition_file, 'r') as item_definition:
+ re_splitter = re.compile('\t+')
+ l = item_list
+ lp = None
+ for line in item_definition.readlines():
+ element = re_splitter.split(line.rstrip())
+ # pop first element if it is empty to skip indent
+ if element[0] == '':
+ element.pop(0)
+
+ # last element is '=': a branch node definition.
+ if element[-1] == '=':
+ l.append({'name': element[0], 'child': [], 'index': element[1],
+ 'description': element[2], 'parent': lp})
+ lp = l
+ l = l[-1]['child']
+ # last element is ';': end of a branch node.
+ elif element[-1] == ';':
+ l = lp
+ lp = l[-1]['parent']
+ # otherwise, a leaf node definition.
+ else:
+ l.append({'name': element[0], 'child': None,
+ 'index': element[1], 'description': element[2],
+ 'parent': lp})
return os.path.getmtime(items_definition_file)
def generate_specfile(specfile, def_mtime):
@@ -102,13 +105,12 @@ def generate_specfile(specfile, def_mtime):
If the specfile is newer than both skeleton and def_mtime, file generation
will be skipped.
- This method reads the content of skeleton and replaces
- <!-- ### STATISTICS DATA PLACEHOLDER ### --> with statistics items
- definition. LOCALSTATEDIR is also expanded.
+ This method reads the content of skeleton and append statistics items
+ definition into { "module_spec": { "statistics": } }.
+ LOCALSTATEDIR is also expanded.
Returns nothing.
'''
- global item_list
def convert_list(items, prefix=''):
spec_list = []
@@ -160,18 +162,18 @@ def generate_specfile(specfile, def_mtime):
},
}]
- if need_generate(builddir+os.sep+specfile, def_mtime):
- stats_pre = open(builddir+os.sep+specfile+pre_suffix, 'r')
- stats_pre_json = \
- json.loads(stats_pre.read().replace('@@LOCAL'+'STATEDIR@@',
- localstatedir))
- stats_pre.close()
+ if need_generate(builddir+os.sep+specfile,
+ builddir+os.sep+specfile+pre_suffix, def_mtime):
+ with open(builddir+os.sep+specfile+pre_suffix, 'r') as stats_pre:
+ # split LOCALSTATEDIR to avoid substitution
+ stats_pre_json = \
+ json.loads(stats_pre.read().replace('@@LOCAL'+'STATEDIR@@',
+ localstatedir))
stats_pre_json['module_spec']['statistics'] = statistics_spec_list
statistics_spec_json = json.dumps(stats_pre_json, sort_keys=True,
indent=2)
- stats_spec = open(builddir+os.sep+specfile, 'w')
- stats_spec.write(statistics_spec_json)
- stats_spec.close()
+ with open(builddir+os.sep+specfile, 'w') as stats_spec:
+ stats_spec.write(statistics_spec_json)
else:
print('skip generating ' + specfile)
return
@@ -187,12 +189,24 @@ def generate_docfile(docfile, def_mtime):
Returns nothing.
'''
- global item_list
-
def convert_list(items, tree, prefix=''):
+ '''
+ Build XML tree from items.
+ <varlistentry>
+ <term>##item_full_name##</term>
+ <listitem>
+ <simpara>
+ ##item_description##
+ </simpara>
+ </listitem>
+ <varlistentry>
+ xmldocument_command_name in item_description is surrounded with
+ <command>.
+ '''
for item in items:
full_item_name = prefix + item['name']
if item['child'] is None:
+ # the item is a leaf node: build varlistentry
child_element = ElementTree.SubElement(tree, 'varlistentry')
term = ElementTree.SubElement(child_element, 'term')
term.text = full_item_name
@@ -200,35 +214,47 @@ def generate_docfile(docfile, def_mtime):
sim_para = ElementTree.SubElement(list_item, 'simpara')
sim_para.text = ''
prev = None
+ # put xmldocument_command_name in <command> node
for word in item['description'].split():
if word == xmldocument_command_name:
command = ElementTree.SubElement(sim_para, 'command')
command.text = word
- para_tail = command
- command.tail = ' '
+ command.tail = ''
prev = command
else:
if prev is None:
sim_para.text += word + ' '
else:
prev.tail += word + ' '
+ sim_para.text = sim_para.text.rstrip()
+ if not prev is None:
+ prev.tail = prev.tail.rstrip()
else:
+ # the item is a branch node: call myself for child nodes
convert_list(item['child'], tree, full_item_name + '.')
return
- if need_generate(builddir+os.sep+docfile, def_mtime):
- doc_pre = open(srcdir+os.sep+docfile+pre_suffix, 'r')
- doc_pre_xml = doc_pre.read().replace('@@LOCAL'+'STATEDIR@@',
- localstatedir)
- doc_pre.close
+ if need_generate(builddir+os.sep+docfile,
+ srcdir+os.sep+docfile+pre_suffix, def_mtime):
+ with open(srcdir+os.sep+docfile+pre_suffix, 'r') as doc_pre:
+ # split LOCALSTATEDIR to avoid substitution
+ doc_pre_xml = doc_pre.read().replace('@@LOCAL'+'STATEDIR@@',
+ localstatedir)
variable_tree = ElementTree.Element('variablelist')
convert_list(item_list, variable_tree)
- doc = open(builddir+os.sep+docfile, 'w')
- doc.write(doc_pre_xml.replace(
- '<!-- ### STATISTICS DATA PLACEHOLDER ### -->',
- str(ElementTree.tostring(variable_tree))))
- doc.close()
+ pretty_xml = \
+ parseString(ElementTree.tostring(variable_tree)).toprettyxml()
+ # remove XML declaration
+ pretty_xml = re.sub('<\?xml[^?]+\?>', '', pretty_xml)
+ # remove extra whitespaces inside <command> and <term>
+ pretty_xml = \
+ re.sub(r'<(command|term)>\s+([^<\s]+)\s+</\1>', r'<\1>\2</\1>',
+ pretty_xml)
+ with open(builddir+os.sep+docfile, 'w') as doc:
+ doc.write(doc_pre_xml.replace(
+ '<!-- ### STATISTICS DATA PLACEHOLDER ### -->',
+ pretty_xml))
else:
print('skip generating ' + docfile)
return
@@ -247,8 +273,6 @@ def generate_cxx(itemsfile, ccfile, utfile, def_mtime):
Returns nothing.
'''
- global item_list
-
msg_counter_types = 'enum MSGCounterType {\n'
item_names = ['// using -1 as counter_id to state it is not a '
+ 'counter item\n']
@@ -290,39 +314,38 @@ def generate_cxx(itemsfile, ccfile, utfile, def_mtime):
item_decls = msg_counter_types
item_defs = ''.join(item_names)
- if need_generate(builddir+os.sep+itemsfile, def_mtime):
- statistics_items_h_pre = open(srcdir+os.sep+itemsfile+pre_suffix, 'r')
- items_pre = statistics_items_h_pre.read()
- statistics_items_h_pre.close
+ if need_generate(builddir+os.sep+itemsfile,
+ srcdir+os.sep+itemsfile+pre_suffix, def_mtime):
+ with open(srcdir+os.sep+itemsfile+pre_suffix, 'r') \
+ as statistics_items_h_pre:
+ items_pre = statistics_items_h_pre.read()
- statistics_items_h = open(builddir+os.sep+itemsfile, 'w')
- statistics_items_h.write(items_pre.replace(
- '// ### STATISTICS ITEMS DECLARATION ###', item_decls))
- statistics_items_h.close()
+ with open(builddir+os.sep+itemsfile, 'w') as statistics_items_h:
+ statistics_items_h.write(items_pre.replace(
+ '// ### STATISTICS ITEMS DECLARATION ###', item_decls))
else:
print('skip generating ' + itemsfile)
- if need_generate(builddir+os.sep+ccfile, def_mtime):
- statistics_cc_pre = open(srcdir+os.sep+ccfile+pre_suffix, 'r')
- items_pre = statistics_cc_pre.read()
- statistics_cc_pre.close
+ if need_generate(builddir+os.sep+ccfile,
+ srcdir+os.sep+ccfile+pre_suffix, def_mtime):
+ with open(srcdir+os.sep+ccfile+pre_suffix, 'r') as statistics_cc_pre:
+ items_pre = statistics_cc_pre.read()
- statistics_cc = open(builddir+os.sep+ccfile, 'w')
- statistics_cc.write(items_pre.replace(
- '// ### STATISTICS ITEMS DEFINITION ###', item_defs))
- statistics_cc.close()
+ with open(builddir+os.sep+ccfile, 'w') as statistics_cc:
+ statistics_cc.write(items_pre.replace(
+ '// ### STATISTICS ITEMS DEFINITION ###', item_defs))
else:
print('skip generating ' + ccfile)
- if need_generate(builddir+os.sep+utfile, def_mtime):
- statistics_ut_cc_pre = open(srcdir+os.sep+utfile+pre_suffix, 'r')
- items_pre = statistics_ut_cc_pre.read()
- statistics_ut_cc_pre.close
+ if need_generate(builddir+os.sep+utfile,
+ srcdir+os.sep+utfile+pre_suffix, def_mtime):
+ with open(srcdir+os.sep+utfile+pre_suffix, 'r') \
+ as statistics_ut_cc_pre:
+ items_pre = statistics_ut_cc_pre.read()
- statistics_ut_cc = open(builddir+os.sep+utfile, 'w')
- statistics_ut_cc.write(items_pre.replace(
- '// ### STATISTICS ITEMS DEFINITION ###', item_defs))
- statistics_ut_cc.close()
+ with open(builddir+os.sep+utfile, 'w') as statistics_ut_cc:
+ statistics_ut_cc.write(items_pre.replace(
+ '// ### STATISTICS ITEMS DEFINITION ###', item_defs))
else:
print('skip generating ' + utfile)
diff --git a/src/bin/auth/statistics.cc.pre b/src/bin/auth/statistics.cc.pre
index 2eb9bd2..d87e7a5 100644
--- a/src/bin/auth/statistics.cc.pre
+++ b/src/bin/auth/statistics.cc.pre
@@ -24,19 +24,6 @@
#include <statistics/counter.h>
-#include <algorithm>
-#include <cctype>
-#include <cassert>
-#include <string>
-#include <sstream>
-#include <iostream>
-
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <netdb.h>
-
using namespace isc::dns;
using namespace isc::auth;
using namespace isc::statistics;
@@ -44,23 +31,22 @@ using namespace isc::auth::statistics;
namespace {
-/// \brief Fill ItemTreePtr with given counter.
+/// \brief Fill isc::data::ElementPtr with given counter.
/// \param counter Counter which stores values to fill
/// \param type_tree CounterSpec corresponding to counter for building item
/// name
-/// \param trees ItemTreePtr to be filled in; caller has ownership of
-/// ItemTreePtr
+/// \param trees isc::data::ElementPtr to be filled in; caller has ownership of
+/// isc::data::ElementPtr
void
fillNodes(const Counter& counter,
const struct isc::auth::statistics::CounterSpec type_tree[],
- isc::auth::statistics::Counters::ItemTreePtr& trees)
+ isc::data::ElementPtr& trees)
{
using namespace isc::data;
for (int i = 0; type_tree[i].name != NULL; ++i) {
if (type_tree[i].sub_counters != NULL) {
- isc::auth::statistics::Counters::ItemTreePtr sub_counters =
- Element::createMap();
+ isc::data::ElementPtr sub_counters = Element::createMap();
trees->set(type_tree[i].name, sub_counters);
fillNodes(counter, type_tree[i].sub_counters, sub_counters);
} else {
@@ -132,16 +118,16 @@ Counters::Counters() :
void
Counters::incRequest(const MessageAttributes& msgattrs) {
// protocols carrying request
- if (msgattrs.getRequestIPVersion() == AF_INET) {
- server_msg_counter_.inc(MSG_REQUEST_IPV4);
- } else if (msgattrs.getRequestIPVersion() == AF_INET6) {
- server_msg_counter_.inc(MSG_REQUEST_IPV6);
- }
- if (msgattrs.getRequestTransportProtocol() == IPPROTO_UDP) {
- server_msg_counter_.inc(MSG_REQUEST_UDP);
- } else if (msgattrs.getRequestTransportProtocol() == IPPROTO_TCP) {
- server_msg_counter_.inc(MSG_REQUEST_TCP);
- }
+ server_msg_counter_.inc(
+ msgattrs.getRequestIPVersion() ==
+ MessageAttributes::IP_VERSION_IPV4 ?
+ MSG_REQUEST_IPV4 :
+ MSG_REQUEST_IPV6);
+ server_msg_counter_.inc(
+ msgattrs.getRequestTransportProtocol() ==
+ MessageAttributes::TRANSPORT_UDP ?
+ MSG_REQUEST_UDP :
+ MSG_REQUEST_TCP);
// request TSIG
if (msgattrs.getRequestSigTSIG()) {
@@ -188,8 +174,7 @@ Counters::incResponse(const MessageAttributes& msgattrs,
}
// response TSIG
- if (msgattrs.getRequestSigTSIG()) {
- // assume response is TSIG signed if request is TSIG signed
+ if (msgattrs.getResponseSigTSIG()) {
server_msg_counter_.inc(MSG_RESPONSE_TSIG);
}
@@ -255,16 +240,16 @@ Counters::inc(const MessageAttributes& msgattrs, const Message& response,
}
}
-Counters::ItemTreePtr
+Counters::ConstItemTreePtr
Counters::get() const {
using namespace isc::data;
- Counters::ItemTreePtr item_tree = Element::createMap();
+ isc::data::ElementPtr item_tree = Element::createMap();
- Counters::ItemTreePtr zones = Element::createMap();
+ isc::data::ElementPtr zones = Element::createMap();
item_tree->set("zones", zones);
- Counters::ItemTreePtr server = Element::createMap();
+ isc::data::ElementPtr server = Element::createMap();
fillNodes(server_msg_counter_, msg_counter_tree, server);
zones->set("_SERVER_", server);
diff --git a/src/bin/auth/statistics.h b/src/bin/auth/statistics.h
index 929b2d2..3107a13 100644
--- a/src/bin/auth/statistics.h
+++ b/src/bin/auth/statistics.h
@@ -39,17 +39,32 @@ using isc::dns::Opcode;
/// This class holds some attributes related to a DNS message
/// for statistics data collection.
class MessageAttributes {
+public:
+ /// \brief IP version of DNS message.
+ enum IPVersion {
+ IP_VERSION_UNSPEC, // (initial value; internal use only)
+ IP_VERSION_IPV4, ///< IPv4 message
+ IP_VERSION_IPV6 ///< IPv6 message
+ };
+
+ /// \brief Transport protocol of DNS message.
+ enum TransportProtocol {
+ TRANSPORT_UNSPEC, // (initial value; internal use only)
+ TRANSPORT_UDP, ///< UDP message
+ TRANSPORT_TCP ///< TCP message
+ };
private:
// request attributes
- int req_ip_version_; // IP version
- int req_transport_protocol_; // Transport layer protocol
- Opcode req_opcode_; // OpCode
+ IPVersion req_ip_version_; // IP version
+ TransportProtocol req_transport_protocol_; // Transport layer protocol
+ Opcode req_opcode_; // OpCode
enum BitAttributes {
- REQ_IS_EDNS_0, // EDNS ver.0
- REQ_IS_DNSSEC_OK, // DNSSEC OK (DO) bit is set
- REQ_IS_TSIG, // signed with valid TSIG
- REQ_IS_BADSIG, // signed but bad signature
- RES_IS_TRUNCATED, // DNS message is truncated
+ REQ_IS_EDNS_0, // request is EDNS ver.0
+ REQ_IS_DNSSEC_OK, // DNSSEC OK (DO) bit is set in request
+ REQ_IS_TSIG, // request is signed with valid TSIG
+ REQ_IS_BADSIG, // request is signed but bad signature
+ RES_IS_TRUNCATED, // response is truncated
+ RES_IS_TSIG_SIGNED, // response is TSIG signed
BIT_ATTRIBUTES_TYPES
};
std::bitset<BIT_ATTRIBUTES_TYPES> bit_attributes_;
@@ -57,97 +72,103 @@ public:
/// \brief The constructor.
///
/// \throw None
- MessageAttributes() : req_opcode_(Opcode::RESERVED15_CODE) {
- reset();
- }
-
- /// \brief Get request opcode.
- /// \return opcode of a request
+ MessageAttributes() :
+ req_ip_version_(IP_VERSION_UNSPEC),
+ req_transport_protocol_(TRANSPORT_UNSPEC),
+ req_opcode_(Opcode::RESERVED15_CODE), bit_attributes_()
+ {}
+
+ /// \brief Return request opcode.
+ /// \return opcode of the request
/// \throw None
const Opcode& getRequestOpCode() const {
return (req_opcode_);
}
/// \brief Set request opcode.
+ /// \param opcode Opcode of the request
/// \throw None
void setRequestOpCode(const Opcode& opcode) {
req_opcode_ = opcode;
}
- /// \brief Get IP version carrying a request.
- /// \return IP version carrying a request (AF_INET or AF_INET6)
+ /// \brief Return IP version carrying the request.
+ /// \return IP version carrying the request
/// \throw None
- int getRequestIPVersion() const {
+ IPVersion getRequestIPVersion() const {
return (req_ip_version_);
}
- /// \brief Set IP version carrying a request.
- /// \param ip_version AF_INET or AF_INET6
+ /// \brief Set IP version carrying the request.
+ /// \param ip_version IP version carrying the request
/// \throw None
- void setRequestIPVersion(const int ip_version) {
+ void setRequestIPVersion(const IPVersion ip_version) {
+ assert(ip_version != IP_VERSION_UNSPEC);
req_ip_version_ = ip_version;
}
- /// \brief Get transport protocol carrying a request.
- /// \return Transport protocol carrying a request
- /// (IPPROTO_UDP or IPPROTO_TCP)
+ /// \brief Return transport protocol carrying the request.
+ /// \return Transport protocol carrying the request
/// \throw None
- int getRequestTransportProtocol() const {
+ TransportProtocol getRequestTransportProtocol() const {
return (req_transport_protocol_);
}
- /// \brief Set transport protocol carrying a request.
- /// \param transport_protocol IPPROTO_UDP or IPPROTO_TCP
+ /// \brief Set transport protocol carrying the request.
+ /// \param transport_protocol Transport protocol carrying the request
/// \throw None
- void setRequestTransportProtocol(const int transport_protocol) {
+ void setRequestTransportProtocol(
+ const TransportProtocol transport_protocol)
+ {
+ assert(transport_protocol != TRANSPORT_UNSPEC);
req_transport_protocol_ = transport_protocol;
}
- /// \brief Get request is EDNS version 0.
- /// \return true if EDNS version 0
+ /// \brief Return EDNS attribute of the request.
+ /// \return true if EDNS version of the request is 0
/// \throw None
bool getRequestEDNS0() const {
return (bit_attributes_[REQ_IS_EDNS_0]);
}
- /// \brief Set request EDNS attributes.
- /// \param is_edns_0 true if request is EDNS version 0
+ /// \brief Set EDNS attribute of the request.
+ /// \param is_edns_0 true if EDNS version of the request is 0
/// \throw None
void setRequestEDNS0(const bool is_edns_0) {
bit_attributes_[REQ_IS_EDNS_0] = is_edns_0;
}
- /// \brief Get request DNSSEC OK (DO) bit.
- /// \return true if DNSSEC OK (DO) bit is set
+ /// \brief Return DNSSEC OK (DO) bit of the request.
+ /// \return true if DNSSEC OK (DO) bit of the request is set
/// \throw None
bool getRequestDO() const {
return (bit_attributes_[REQ_IS_DNSSEC_OK]);
}
- /// \brief Set request DNSSEC OK (DO) bit.
- /// \param is_dnssec_ok true if DNSSEC OK (DO) bit is set
+ /// \brief Set DNSSEC OK (DO) bit of the request.
+ /// \param is_dnssec_ok true if DNSSEC OK (DO) bit of the request is set
/// \throw None
void setRequestDO(const bool is_dnssec_ok) {
bit_attributes_[REQ_IS_DNSSEC_OK] = is_dnssec_ok;
}
- /// \brief Get request TSIG signed.
- /// \return true if request is TSIG signed
+ /// \brief Return TSIG attribute of the request.
+ /// \return true if the request is TSIG signed
/// \throw None
bool getRequestSigTSIG() const {
return (bit_attributes_[REQ_IS_TSIG]);
}
- /// \brief Get request signature is bad.
- /// \return true if request signature is bad
+ /// \brief Return the status of the signature of the request.
+ /// \return true if the signature of the request is bad
/// \throw None
bool getRequestSigBadSig() const {
return (bit_attributes_[REQ_IS_BADSIG]);
}
- /// \brief Set request TSIG attributes.
- /// \param is_tsig true if request is TSIG signed
- /// \param is_badsig true if request signature is bad
+ /// \brief Set TSIG attributes of the request.
+ /// \param is_tsig true if the request is TSIG signed
+ /// \param is_badsig true if the signature of the request is bad
/// \throw None
void setRequestSig(const bool is_tsig, const bool is_badsig) {
assert(!(!is_tsig && is_badsig));
@@ -155,27 +176,32 @@ public:
bit_attributes_[REQ_IS_BADSIG] = is_badsig;
}
- /// \brief Get if the response is truncated.
+ /// \brief Return TC (truncated) bit of the response.
/// \return true if the response is truncated
/// \throw None
bool getResponseTruncated() const {
return (bit_attributes_[RES_IS_TRUNCATED]);
}
- /// \brief Set if the response is truncated.
+ /// \brief Set TC (truncated) bit of the response.
/// \param is_truncated true if the response is truncated
/// \throw None
void setResponseTruncated(const bool is_truncated) {
bit_attributes_[RES_IS_TRUNCATED] = is_truncated;
}
- /// \brief Reset attributes.
+ /// \brief Return TSIG attributes of the response.
+ /// \return true if the response is TSIG signed
/// \throw None
- void reset() {
- req_ip_version_ = 0;
- req_transport_protocol_ = 0;
- req_opcode_ = Opcode(Opcode::RESERVED15_CODE);
- bit_attributes_.reset();
+ bool getResponseSigTSIG() const {
+ return (bit_attributes_[RES_IS_TSIG_SIGNED]);
+ }
+
+ /// \brief Set TSIG attributes of the response.
+ /// \param is_tsig_signed true if the response is TSIG signed
+ /// \throw None
+ void setResponseSigTSIG(const bool is_tsig_signed) {
+ bit_attributes_[RES_IS_TSIG_SIGNED] = is_tsig_signed;
}
};
@@ -201,6 +227,7 @@ class Counters : boost::noncopyable {
private:
// counter for DNS message attributes
isc::statistics::Counter server_msg_counter_;
+
void incRequest(const MessageAttributes& msgattrs);
void incResponse(const MessageAttributes& msgattrs,
const isc::dns::Message& response);
@@ -218,7 +245,7 @@ public:
/// item_value is an integer.
/// \endverbatim
///
- typedef isc::data::ElementPtr ItemTreePtr;
+ typedef isc::data::ConstElementPtr ConstItemTreePtr;
/// \brief The constructor.
///
@@ -250,7 +277,7 @@ public:
///
/// \throw std::bad_alloc Internal resource allocation fails
///
- ItemTreePtr get() const;
+ ConstItemTreePtr get() const;
};
} // namespace statistics
diff --git a/src/bin/auth/statistics_msg_items.def b/src/bin/auth/statistics_msg_items.def
index 33cbed0..47a1308 100644
--- a/src/bin/auth/statistics_msg_items.def
+++ b/src/bin/auth/statistics_msg_items.def
@@ -11,7 +11,7 @@ request msg_counter_request Request statistics =
dnssec_ok MSG_REQUEST_DNSSEC_OK Number of requests with "DNSSEC OK" (DO) bit was set received by the b10-auth server.
;
opcode msg_counter_opcode OpCode statistics =
- query MSG_OPCODE_QUERY Number of OpCode=Query requests received by the b10-auth server.
+ query MSG_OPCODE_QUERY Number of OpCode=Query requests received by the b10-auth server.
iquery MSG_OPCODE_IQUERY Number of OpCode=IQuery requests received by the b10-auth server.
status MSG_OPCODE_STATUS Number of OpCode=Status requests received by the b10-auth server.
notify MSG_OPCODE_NOTIFY Number of OpCode=Notify requests received by the b10-auth server.
diff --git a/src/bin/auth/tests/Makefile.am b/src/bin/auth/tests/Makefile.am
index 9401f1d..609164b 100644
--- a/src/bin/auth/tests/Makefile.am
+++ b/src/bin/auth/tests/Makefile.am
@@ -78,8 +78,11 @@ run_unittests_LDADD += $(top_builddir)/src/lib/config/tests/libfake_session.la
run_unittests_LDADD += $(GTEST_LDADD)
run_unittests_LDADD += $(SQLITE_LIBS)
+EXTRA_DIST = statisticsitems.py
+
check-local:
B10_FROM_BUILD=${abs_top_builddir} ./run_unittests
+ $(PYTHON) ./statisticsitems.py $(top_builddir)/src/bin/auth/b10-auth.xml
noinst_PROGRAMS = run_unittests
diff --git a/src/bin/auth/tests/auth_srv_unittest.cc b/src/bin/auth/tests/auth_srv_unittest.cc
index 22cd2ca..dc48070 100644
--- a/src/bin/auth/tests/auth_srv_unittest.cc
+++ b/src/bin/auth/tests/auth_srv_unittest.cc
@@ -92,6 +92,17 @@ const char* const STATIC_DSRC_FILE = DSRC_DIR "/static.zone";
const char* const CONFIG_INMEMORY_EXAMPLE =
TEST_DATA_DIR "/rfc5155-example.zone.signed";
+// Check if the item has expected value.
+// Before reading the item, check the item exists.
+void
+expectCounterItem(ConstElementPtr stats,
+ const std::string& item, const int expected) {
+ ConstElementPtr value(Element::create(0));
+ ASSERT_TRUE(stats->find(item, value)) << " Item: " << item;
+ value = stats->find(item);
+ EXPECT_EQ(expected, value->intValue()) << " Item: " << item;
+}
+
class AuthSrvTest : public SrvTestBase {
protected:
AuthSrvTest() :
@@ -105,6 +116,7 @@ protected:
server.setDNSService(dnss_);
server.setXfrinSession(¬ify_session);
server.createDDNSForwarder();
+ checkCountersAreInitialized();
}
~AuthSrvTest() {
@@ -191,6 +203,36 @@ protected:
&dnsserv);
}
+ // Check if the counters exist and are initialized to 0.
+ void
+ checkCountersAreInitialized() {
+ ConstElementPtr stats = server.getStatistics()->
+ get("zones")->get("_SERVER_");
+ expectCounterItem(stats->get("request"), "v4", 0);
+ expectCounterItem(stats->get("request"), "v6", 0);
+ expectCounterItem(stats->get("request"), "udp", 0);
+ expectCounterItem(stats->get("request"), "tcp", 0);
+ expectCounterItem(stats->get("request"), "edns0", 0);
+ expectCounterItem(stats->get("request"), "badednsver", 0);
+ expectCounterItem(stats->get("request"), "tsig", 0);
+ expectCounterItem(stats->get("request"), "sig0", 0);
+ expectCounterItem(stats->get("request"), "badsig", 0);
+ expectCounterItem(stats->get("request"), "dnssec_ok", 0);
+ expectCounterItem(stats->get("opcode"), "query", 0);
+ expectCounterItem(stats, "responses", 0);
+ expectCounterItem(stats->get("response"), "truncated", 0);
+ expectCounterItem(stats->get("response"), "edns0", 0);
+ expectCounterItem(stats->get("response"), "tsig", 0);
+ expectCounterItem(stats->get("response"), "sig0", 0);
+ expectCounterItem(stats->get("rcode"), "refused", 0);
+ expectCounterItem(stats, "qrysuccess", 0);
+ expectCounterItem(stats, "qryauthans", 0);
+ expectCounterItem(stats, "qrynoauthans", 0);
+ expectCounterItem(stats, "qryreferral", 0);
+ expectCounterItem(stats, "qrynxrrset", 0);
+ expectCounterItem(stats, "authqryrej", 0);
+ }
+
MockDNSService dnss_;
MockXfroutClient xfrout;
MockSocketSessionForwarder ddns_forwarder;
@@ -233,26 +275,8 @@ createBuiltinVersionResponse(const qid_t qid, vector<uint8_t>& data) {
renderer.getLength());
}
-// Check if the item has expected value.
-// Before reading the item, check the item exists.
-void
-expectCounterItem(ConstElementPtr stats,
- const std::string& item, const int expected) {
- ConstElementPtr value(Element::create(0));
- ASSERT_TRUE(stats->find(item, value)) << " Item: " << item;
- value = stats->find(item);
- EXPECT_EQ(expected, value->intValue()) << " Item: " << item;
-}
-
// We did not configure any client lists. Therefore it should be REFUSED
TEST_F(AuthSrvTest, noClientList) {
- // The counters should be initialized to 0.
- ConstElementPtr stats_init = server.getStatistics()->
- get("zones")->get("_SERVER_");
- expectCounterItem(stats_init->get("opcode"), "query", 0);
- expectCounterItem(stats_init, "responses", 0);
- expectCounterItem(stats_init->get("rcode"), "refused", 0);
-
UnitTestUtil::createRequestMessage(request_message, Opcode::QUERY(),
default_qid, Name("version.bind"),
RRClass::CH(), RRType::TXT());
@@ -287,11 +311,6 @@ TEST_F(AuthSrvTest, multiQuestion) {
// Incoming data doesn't even contain the complete header. Must be silently
// dropped.
TEST_F(AuthSrvTest, shortMessage) {
- // The counters should be initialized to 0.
- ConstElementPtr stats_init = server.getStatistics()->get("zones")->
- get("_SERVER_");
- expectCounterItem(stats_init, "responses", 0);
-
shortMessage();
checkAllRcodeCountersZero();
@@ -303,11 +322,6 @@ TEST_F(AuthSrvTest, shortMessage) {
// Response messages. Must be silently dropped, whether it's a valid response
// or malformed or could otherwise cause a protocol error.
TEST_F(AuthSrvTest, response) {
- // The counters should be initialized to 0.
- ConstElementPtr stats_init = server.getStatistics()->get("zones")->
- get("_SERVER_");
- expectCounterItem(stats_init, "responses", 0);
-
response();
checkAllRcodeCountersZero();
@@ -330,12 +344,6 @@ TEST_F(AuthSrvTest, shortAnswer) {
// Query with unsupported version of EDNS.
TEST_F(AuthSrvTest, ednsBadVers) {
- // The counters should be initialized to 0.
- ConstElementPtr stats_init = server.getStatistics()->get("zones")->
- get("_SERVER_");
- expectCounterItem(stats_init, "responses", 0);
- expectCounterItem(stats_init->get("request"), "badednsver", 0);
-
ednsBadVers();
checkAllRcodeCountersZeroExcept(Rcode::BADVERS(), 1);
@@ -350,13 +358,6 @@ TEST_F(AuthSrvTest, AXFROverUDP) {
}
TEST_F(AuthSrvTest, AXFRSuccess) {
- // The counters should be initialized to 0.
- ConstElementPtr stats_init = server.getStatistics()->get("zones")->
- get("_SERVER_");
- expectCounterItem(stats_init->get("opcode"), "query", 0);
- expectCounterItem(stats_init, "responses", 0);
- expectCounterItem(stats_init->get("response"), "truncated", 0);
-
EXPECT_FALSE(xfrout.isConnected());
UnitTestUtil::createRequestMessage(request_message, opcode, default_qid,
Name("example.com"), RRClass::IN(),
@@ -380,14 +381,6 @@ TEST_F(AuthSrvTest, AXFRSuccess) {
// Give the server a signed request, but don't give it the key. It will
// not be able to verify it, returning BADKEY
TEST_F(AuthSrvTest, TSIGSignedBadKey) {
- // The counters should be initialized to 0.
- ConstElementPtr stats_init = server.getStatistics()->get("zones")->
- get("_SERVER_");
- expectCounterItem(stats_init->get("request"), "tsig", 0);
- expectCounterItem(stats_init->get("request"), "badsig", 0);
- expectCounterItem(stats_init, "responses", 0);
- expectCounterItem(stats_init->get("response"), "tsig", 0);
-
TSIGKey key("key:c2VjcmV0Cg==:hmac-sha1");
TSIGContext context(key);
UnitTestUtil::createRequestMessage(request_message, opcode, default_qid,
@@ -429,14 +422,6 @@ TEST_F(AuthSrvTest, TSIGSignedBadKey) {
// Give the server a signed request, but signed by a different key
// (with the same name). It should return BADSIG
TEST_F(AuthSrvTest, TSIGBadSig) {
- // The counters should be initialized to 0.
- ConstElementPtr stats_init = server.getStatistics()->get("zones")->
- get("_SERVER_");
- expectCounterItem(stats_init->get("request"), "tsig", 0);
- expectCounterItem(stats_init->get("request"), "badsig", 0);
- expectCounterItem(stats_init, "responses", 0);
- expectCounterItem(stats_init->get("response"), "tsig", 0);
-
TSIGKey key("key:c2VjcmV0Cg==:hmac-sha1");
TSIGContext context(key);
UnitTestUtil::createRequestMessage(request_message, opcode, default_qid,
@@ -479,15 +464,6 @@ TEST_F(AuthSrvTest, TSIGBadSig) {
// This checks the server first verifies the signature before anything
// else.
TEST_F(AuthSrvTest, TSIGCheckFirst) {
- // The counters should be initialized to 0.
- ConstElementPtr stats_init = server.getStatistics()->get("zones")->
- get("_SERVER_");
- expectCounterItem(stats_init->get("request"), "tsig", 0);
- expectCounterItem(stats_init->get("request"), "badsig", 0);
- expectCounterItem(stats_init, "responses", 0);
- expectCounterItem(stats_init->get("response"), "tsig", 0);
- expectCounterItem(stats_init->get("opcode"), "other", 0);
-
TSIGKey key("key:c2VjcmV0Cg==:hmac-sha1");
TSIGContext context(key);
// Pass a wrong opcode there. The server shouldn't know what to do
@@ -653,12 +629,6 @@ TEST_F(AuthSrvTest, IXFRDisconnectFail) {
}
TEST_F(AuthSrvTest, notify) {
- // The counters should be initialized to 0.
- ConstElementPtr stats_init = server.getStatistics()->get("zones")->
- get("_SERVER_");
- expectCounterItem(stats_init->get("opcode"), "notify", 0);
- expectCounterItem(stats_init, "responses", 0);
-
UnitTestUtil::createRequestMessage(request_message, Opcode::NOTIFY(),
default_qid, Name("example.com"),
RRClass::IN(), RRType::SOA());
@@ -699,12 +669,6 @@ TEST_F(AuthSrvTest, notify) {
}
TEST_F(AuthSrvTest, notifyForCHClass) {
- // The counters should be initialized to 0.
- ConstElementPtr stats_init = server.getStatistics()->get("zones")->
- get("_SERVER_");
- expectCounterItem(stats_init->get("opcode"), "notify", 0);
- expectCounterItem(stats_init, "responses", 0);
-
// Same as the previous test, but for the CH RRClass.
UnitTestUtil::createRequestMessage(request_message, Opcode::NOTIFY(),
default_qid, Name("example.com"),
@@ -729,13 +693,6 @@ TEST_F(AuthSrvTest, notifyForCHClass) {
}
TEST_F(AuthSrvTest, notifyEmptyQuestion) {
- // The counters should be initialized to 0.
- ConstElementPtr stats_init = server.getStatistics()->get("zones")->
- get("_SERVER_");
- expectCounterItem(stats_init->get("opcode"), "notify", 0);
- expectCounterItem(stats_init, "responses", 0);
- expectCounterItem(stats_init->get("rcode"), "formerr", 0);
-
request_message.clear(Message::RENDER);
request_message.setOpcode(Opcode::NOTIFY());
request_message.setRcode(Rcode::NOERROR());
@@ -926,15 +883,6 @@ TEST_F(AuthSrvTest, DISABLED_TSIGSigned) { // Needs builtin
#else
TEST_F(AuthSrvTest, TSIGSigned) {
#endif
- // The counters should be initialized to 0.
- ConstElementPtr stats_init = server.getStatistics()->get("zones")->
- get("_SERVER_");
- expectCounterItem(stats_init->get("request"), "tsig", 0);
- expectCounterItem(stats_init->get("request"), "sig0", 0);
- expectCounterItem(stats_init->get("request"), "badsig", 0);
- expectCounterItem(stats_init, "responses", 0);
- expectCounterItem(stats_init, "qryauthans", 0);
-
// Prepare key, the client message, etc
updateBuiltin(&server);
const TSIGKey key("key:c2VjcmV0Cg==:hmac-sha1");
@@ -975,6 +923,7 @@ TEST_F(AuthSrvTest, TSIGSigned) {
expectCounterItem(stats_after->get("request"), "badsig", 0);
expectCounterItem(stats_after, "responses", 1);
expectCounterItem(stats_after, "qryauthans", 1);
+ expectCounterItem(stats_after->get("response"), "tsig", 1);
}
// Same test emulating the UDPServer class behavior (defined in libasiolink).
@@ -1209,35 +1158,35 @@ TEST_F(AuthSrvTest,
opcode.getCode(), QR_FLAG | AA_FLAG, 1, 1, 1, 0);
}
-// Submit UDP normal query and check query counter
-TEST_F(AuthSrvTest, queryCounterUDPNormal) {
+TEST_F(AuthSrvTest, queryCounterTruncTest) {
+ // use CONFIG_TESTDB for large-rdata.example.com.
+ updateDatabase(&server, CONFIG_TESTDB);
+
// The counters should be initialized to 0.
ConstElementPtr stats_init = server.getStatistics()->
get("zones")->get("_SERVER_");
- expectCounterItem(stats_init->get("request"), "v4", 0);
- expectCounterItem(stats_init->get("request"), "v6", 0);
- expectCounterItem(stats_init->get("request"), "udp", 0);
- expectCounterItem(stats_init->get("request"), "tcp", 0);
- expectCounterItem(stats_init->get("request"), "edns0", 0);
- expectCounterItem(stats_init->get("request"), "badednsver", 0);
- expectCounterItem(stats_init->get("request"), "tsig", 0);
- expectCounterItem(stats_init->get("request"), "sig0", 0);
- expectCounterItem(stats_init->get("request"), "badsig", 0);
- expectCounterItem(stats_init->get("request"), "dnssec_ok", 0);
- expectCounterItem(stats_init->get("opcode"), "query", 0);
expectCounterItem(stats_init, "responses", 0);
- expectCounterItem(stats_init->get("response"), "truncated", 0);
- expectCounterItem(stats_init->get("response"), "edns0", 0);
- expectCounterItem(stats_init->get("response"), "tsig", 0);
- expectCounterItem(stats_init->get("response"), "sig0", 0);
- expectCounterItem(stats_init->get("rcode"), "refused", 0);
- expectCounterItem(stats_init, "qrysuccess", 0);
expectCounterItem(stats_init, "qryauthans", 0);
- expectCounterItem(stats_init, "qrynoauthans", 0);
- expectCounterItem(stats_init, "qryreferral", 0);
- expectCounterItem(stats_init, "qrynxrrset", 0);
- expectCounterItem(stats_init, "authqryrej", 0);
- //
+ expectCounterItem(stats_init->get("response"), "truncated", 0);
+
+ // Create UDP message and process.
+ // large-rdata.example.com. TXT; expect it exceeds 512 octet
+ UnitTestUtil::createRequestMessage(request_message, Opcode::QUERY(),
+ default_qid, Name("large-rdata.example.com."),
+ RRClass::IN(), RRType::TXT());
+ createRequestPacket(request_message, IPPROTO_UDP);
+ server.processMessage(*io_message, *parse_message, *response_obuffer,
+ &dnsserv);
+
+ ConstElementPtr stats_after = server.getStatistics()->
+ get("zones")->get("_SERVER_");
+ expectCounterItem(stats_after, "responses", 1);
+ expectCounterItem(stats_after, "qryauthans", 1);
+ expectCounterItem(stats_after->get("rcode"), "noerror", 1);
+ expectCounterItem(stats_after->get("response"), "truncated", 1);
+}
+// Submit UDP normal query and check query counter
+TEST_F(AuthSrvTest, queryCounterUDPNormal) {
// Create UDP message and process.
UnitTestUtil::createRequestMessage(request_message, Opcode::QUERY(),
default_qid, Name("example.com"),
@@ -1275,33 +1224,6 @@ TEST_F(AuthSrvTest, queryCounterUDPNormal) {
// Submit UDP normal query with DNSSEC and check query counter
TEST_F(AuthSrvTest, queryCounterUDPNormalWithDNSSEC) {
- // The counters should be initialized to 0.
- ConstElementPtr stats_init = server.getStatistics()->
- get("zones")->get("_SERVER_");
- expectCounterItem(stats_init->get("request"), "v4", 0);
- expectCounterItem(stats_init->get("request"), "v6", 0);
- expectCounterItem(stats_init->get("request"), "udp", 0);
- expectCounterItem(stats_init->get("request"), "tcp", 0);
- expectCounterItem(stats_init->get("request"), "edns0", 0);
- expectCounterItem(stats_init->get("request"), "badednsver", 0);
- expectCounterItem(stats_init->get("request"), "tsig", 0);
- expectCounterItem(stats_init->get("request"), "sig0", 0);
- expectCounterItem(stats_init->get("request"), "badsig", 0);
- expectCounterItem(stats_init->get("request"), "dnssec_ok", 0);
- expectCounterItem(stats_init->get("opcode"), "query", 0);
- expectCounterItem(stats_init, "responses", 0);
- expectCounterItem(stats_init->get("response"), "truncated", 0);
- expectCounterItem(stats_init->get("response"), "edns0", 0);
- expectCounterItem(stats_init->get("response"), "tsig", 0);
- expectCounterItem(stats_init->get("response"), "sig0", 0);
- expectCounterItem(stats_init->get("rcode"), "refused", 0);
- expectCounterItem(stats_init, "qrysuccess", 0);
- expectCounterItem(stats_init, "qryauthans", 0);
- expectCounterItem(stats_init, "qrynoauthans", 0);
- expectCounterItem(stats_init, "qryreferral", 0);
- expectCounterItem(stats_init, "qrynxrrset", 0);
- expectCounterItem(stats_init, "authqryrej", 0);
- //
// Create UDP message and process.
UnitTestUtil::createDNSSECRequestMessage(request_message, Opcode::QUERY(),
default_qid, Name("example.com"),
@@ -1312,40 +1234,15 @@ TEST_F(AuthSrvTest, queryCounterUDPNormalWithDNSSEC) {
ConstElementPtr stats_after = server.getStatistics()->
get("zones")->get("_SERVER_");
- expectCounterItem(stats_after->get("request"), "v4", 1);
- expectCounterItem(stats_after->get("request"), "v6", 0);
- expectCounterItem(stats_after->get("request"), "udp", 1);
- expectCounterItem(stats_after->get("request"), "tcp", 0);
expectCounterItem(stats_after->get("request"), "edns0", 1);
- expectCounterItem(stats_after->get("request"), "badednsver", 0);
- expectCounterItem(stats_after->get("request"), "tsig", 0);
- expectCounterItem(stats_after->get("request"), "sig0", 0);
- expectCounterItem(stats_after->get("request"), "badsig", 0);
expectCounterItem(stats_after->get("request"), "dnssec_ok", 1);
- expectCounterItem(stats_after->get("opcode"), "query", 1);
- expectCounterItem(stats_after, "responses", 1);
- expectCounterItem(stats_after->get("response"), "truncated", 0);
// XXX: with the current implementation, EDNS0 is omitted in
// makeErrorMessage.
expectCounterItem(stats_after->get("response"), "edns0", 0);
- expectCounterItem(stats_after->get("response"), "tsig", 0);
- expectCounterItem(stats_after->get("response"), "sig0", 0);
- expectCounterItem(stats_after->get("rcode"), "refused", 1);
- expectCounterItem(stats_after, "qrysuccess", 0);
- expectCounterItem(stats_after, "qryauthans", 0);
- expectCounterItem(stats_after, "qrynoauthans", 1);
- expectCounterItem(stats_after, "qryreferral", 0);
- expectCounterItem(stats_after, "qrynxrrset", 0);
- expectCounterItem(stats_after, "authqryrej", 1);
}
// Submit TCP normal query and check query counter
TEST_F(AuthSrvTest, queryCounterTCPNormal) {
- // The counters should be initialized to 0.
- ConstElementPtr stats_init = server.getStatistics()->
- get("zones")->get("_SERVER_");
- expectCounterItem(stats_init->get("request"), "udp", 0);
- expectCounterItem(stats_init->get("request"), "tcp", 0);
// Create TCP message and process.
UnitTestUtil::createRequestMessage(request_message, Opcode::QUERY(),
default_qid, Name("example.com"),
@@ -1353,10 +1250,7 @@ TEST_F(AuthSrvTest, queryCounterTCPNormal) {
createRequestPacket(request_message, IPPROTO_TCP);
server.processMessage(*io_message, *parse_message, *response_obuffer,
&dnsserv);
- // After processing the TCP query, these counters should be incremented:
- // request.tcp, opcode.query, rcode.refused, response
- // and these counters should not be incremented:
- // request.udp
+
ConstElementPtr stats_after = server.getStatistics()->
get("zones")->get("_SERVER_");
expectCounterItem(stats_after->get("request"), "udp", 0);
@@ -1365,12 +1259,6 @@ TEST_F(AuthSrvTest, queryCounterTCPNormal) {
// Submit TCP AXFR query and check query counter
TEST_F(AuthSrvTest, queryCounterTCPAXFR) {
- // The counters should be initialized to 0.
- ConstElementPtr stats_init = server.getStatistics()->
- get("zones")->get("_SERVER_");
- expectCounterItem(stats_init->get("opcode"), "query", 0);
- expectCounterItem(stats_init, "responses", 0);
- expectCounterItem(stats_init->get("response"), "truncated", 0);
UnitTestUtil::createRequestMessage(request_message, opcode, default_qid,
Name("example.com"), RRClass::IN(), RRType::AXFR());
createRequestPacket(request_message, IPPROTO_TCP);
@@ -1389,12 +1277,6 @@ TEST_F(AuthSrvTest, queryCounterTCPAXFR) {
// Submit TCP IXFR query and check query counter
TEST_F(AuthSrvTest, queryCounterTCPIXFR) {
- // The counters should be initialized to 0.
- ConstElementPtr stats_init = server.getStatistics()->
- get("zones")->get("_SERVER_");
- expectCounterItem(stats_init->get("opcode"), "query", 0);
- expectCounterItem(stats_init, "responses", 0);
- expectCounterItem(stats_init->get("response"), "truncated", 0);
UnitTestUtil::createRequestMessage(request_message, opcode, default_qid,
Name("example.com"), RRClass::IN(), RRType::IXFR());
createRequestPacket(request_message, IPPROTO_TCP);
diff --git a/src/bin/auth/tests/statistics_unittest.cc.pre b/src/bin/auth/tests/statistics_unittest.cc.pre
index 49b3679..f4762a7 100644
--- a/src/bin/auth/tests/statistics_unittest.cc.pre
+++ b/src/bin/auth/tests/statistics_unittest.cc.pre
@@ -100,6 +100,34 @@ checkCounters(const isc::data::ConstElementPtr counters,
}
}
+void
+buildSkeletonMessage(MessageAttributes& msgattrs) {
+ msgattrs.setRequestIPVersion(MessageAttributes::IP_VERSION_IPV4);
+ msgattrs.setRequestTransportProtocol(MessageAttributes::TRANSPORT_UDP);
+ msgattrs.setRequestOpCode(Opcode::QUERY());
+ msgattrs.setRequestEDNS0(true);
+ msgattrs.setRequestDO(true);
+}
+
+TEST_F(CountersTest, invalidParameter) {
+ MessageAttributes msgattrs;
+
+ // Note: Not all systems have EXPECT_DEATH. As it is a macro we can just
+ // test for its presence and bypass the test if not available.
+#ifdef EXPECT_DEATH
+ // Passing *_UNSPEC should trigger an assertion failure.
+ // Note that we just check that it dies - we don't check what message is
+ // output.
+ EXPECT_DEATH(
+ msgattrs.setRequestIPVersion(MessageAttributes::IP_VERSION_UNSPEC),
+ ".*");
+ EXPECT_DEATH(
+ msgattrs.setRequestTransportProtocol(
+ MessageAttributes::TRANSPORT_UNSPEC),
+ ".*");
+#endif
+}
+
TEST_F(CountersTest, incrementResponse) {
Message response(Message::RENDER);
MessageAttributes msgattrs;
@@ -109,11 +137,7 @@ TEST_F(CountersTest, incrementResponse) {
for (int i = 0; i < 2; ++i) {
const bool responded = i & 1;
- msgattrs.setRequestIPVersion(AF_INET);
- msgattrs.setRequestTransportProtocol(IPPROTO_UDP);
- msgattrs.setRequestOpCode(Opcode::QUERY());
- msgattrs.setRequestEDNS0(true);
- msgattrs.setRequestDO(true);
+ buildSkeletonMessage(msgattrs);
response.setRcode(Rcode::REFUSED());
response.addQuestion(Question(Name("example.com"),
@@ -151,14 +175,16 @@ TEST_F(CountersTest, incrementProtocolType) {
// ipv6 tcp
int count_v4 = 0, count_v6 = 0, count_udp = 0, count_tcp = 0;
for (int i = 0; i < 4; ++i) {
- const int af = i & 1 ? AF_INET : AF_INET6;
- const int proto = i & 2 ? IPPROTO_UDP : IPPROTO_TCP;
-
+ const enum MessageAttributes::IPVersion af = i & 1 ?
+ MessageAttributes::IP_VERSION_IPV4 :
+ MessageAttributes::IP_VERSION_IPV6;
+ const enum MessageAttributes::TransportProtocol proto = i & 2 ?
+ MessageAttributes::TRANSPORT_UDP :
+ MessageAttributes::TRANSPORT_TCP;
+
+ buildSkeletonMessage(msgattrs);
msgattrs.setRequestIPVersion(af);
msgattrs.setRequestTransportProtocol(proto);
- msgattrs.setRequestOpCode(Opcode::QUERY());
- msgattrs.setRequestEDNS0(true);
- msgattrs.setRequestDO(true);
response.setRcode(Rcode::REFUSED());
response.addQuestion(Question(Name("example.com"),
@@ -167,12 +193,12 @@ TEST_F(CountersTest, incrementProtocolType) {
counters.inc(msgattrs, response, true);
- if (af == AF_INET) {
+ if (af == MessageAttributes::IP_VERSION_IPV4) {
++count_v4;
} else {
++count_v6;
}
- if (proto == IPPROTO_UDP) {
+ if (proto == MessageAttributes::TRANSPORT_UDP) {
++count_udp;
} else {
++count_tcp;
@@ -207,10 +233,7 @@ TEST_F(CountersTest, incrementDO) {
// true
for (int i = 0; i < 2; ++i) {
const bool is_dnssec_ok = i & 1;
- msgattrs.setRequestIPVersion(AF_INET);
- msgattrs.setRequestTransportProtocol(IPPROTO_UDP);
- msgattrs.setRequestOpCode(Opcode::QUERY());
- msgattrs.setRequestEDNS0(true);
+ buildSkeletonMessage(msgattrs);
msgattrs.setRequestDO(is_dnssec_ok);
response.setRcode(Rcode::REFUSED());
@@ -250,11 +273,8 @@ TEST_F(CountersTest, incrementEDNS) {
int count_req_edns0 = 0, count_res_edns0 = 0;
for (int i = 0; i < 2; ++i) {
const bool is_edns0 = i & 1;
- msgattrs.setRequestIPVersion(AF_INET);
- msgattrs.setRequestTransportProtocol(IPPROTO_UDP);
- msgattrs.setRequestOpCode(Opcode::QUERY());
+ buildSkeletonMessage(msgattrs);
msgattrs.setRequestEDNS0(is_edns0);
- msgattrs.setRequestDO(true);
if (!is_edns0) {
ConstEDNSPtr edns = EDNSPtr(new EDNS(0));
@@ -297,23 +317,21 @@ TEST_F(CountersTest, incrementTSIG) {
std::map<std::string, int> expect;
// Test these patterns:
- // signature badsig
- // -------------------
- // (none) false
- // TSIG false
- // TSIG true
+ // request signature badsig response signature
+ // -----------------------------------------------
+ // (none) false (none)
+ // TSIG false TSIG
+ // TSIG true (none)
//
// badsig can't be true if the message does not have signature.
int count_req_tsig = 0, count_res_tsig = 0, count_badsig = 0;
for (int i = 0; i < 3; ++i) {
- const bool is_tsig = (i == 2) ? true : i & 1;
+ const bool is_req_tsig = (i == 2) ? true : i & 1;
+ const bool is_res_tsig = i & 1;
const bool is_badsig = i & 2;
- msgattrs.setRequestIPVersion(AF_INET);
- msgattrs.setRequestTransportProtocol(IPPROTO_UDP);
- msgattrs.setRequestOpCode(Opcode::QUERY());
- msgattrs.setRequestEDNS0(true);
- msgattrs.setRequestDO(true);
- msgattrs.setRequestSig(is_tsig, is_badsig);
+ buildSkeletonMessage(msgattrs);
+ msgattrs.setRequestSig(is_req_tsig, is_badsig);
+ msgattrs.setResponseSigTSIG(is_res_tsig);
response.setRcode(Rcode::REFUSED());
response.addQuestion(Question(Name("example.com"),
@@ -323,11 +341,11 @@ TEST_F(CountersTest, incrementTSIG) {
// don't increment response counters if signature is bad
counters.inc(msgattrs, response, !is_badsig);
- if (is_tsig) {
+ if (is_req_tsig) {
++count_req_tsig;
- if (!is_badsig) {
- ++count_res_tsig;
- }
+ }
+ if (is_res_tsig) {
+ ++count_res_tsig;
}
if (is_badsig) {
++count_badsig;
@@ -364,11 +382,8 @@ TEST_F(CountersTest, incrementOpcode) {
i <= e;
++i)
{
- msgattrs.setRequestIPVersion(AF_INET);
- msgattrs.setRequestTransportProtocol(IPPROTO_UDP);
+ buildSkeletonMessage(msgattrs);
msgattrs.setRequestOpCode(Opcode(i));
- msgattrs.setRequestEDNS0(true);
- msgattrs.setRequestDO(true);
msgattrs.setRequestSig(false, false);
response.setRcode(Rcode::REFUSED());
@@ -422,11 +437,8 @@ TEST_F(CountersTest, incrementRcode) {
i <= e;
++i)
{
- msgattrs.setRequestIPVersion(AF_INET);
- msgattrs.setRequestTransportProtocol(IPPROTO_UDP);
+ buildSkeletonMessage(msgattrs);
msgattrs.setRequestOpCode(Opcode::IQUERY());
- msgattrs.setRequestEDNS0(true);
- msgattrs.setRequestDO(true);
msgattrs.setRequestSig(false, false);
response.setRcode(Rcode(i));
@@ -485,11 +497,8 @@ TEST_F(CountersTest, incrementTruncated) {
int count_truncated = 0;
for (int i = 0; i < 2; ++i) {
const bool is_truncated = i & 1;
- msgattrs.setRequestIPVersion(AF_INET);
- msgattrs.setRequestTransportProtocol(IPPROTO_UDP);
+ buildSkeletonMessage(msgattrs);
msgattrs.setRequestOpCode(Opcode::IQUERY());
- msgattrs.setRequestEDNS0(true);
- msgattrs.setRequestDO(true);
msgattrs.setRequestSig(false, false);
msgattrs.setResponseTruncated(is_truncated);
@@ -531,11 +540,7 @@ TEST_F(CountersTest, incrementQryAuthAnsAndNoAuthAns) {
int count_authans = 0, count_noauthans = 0;
for (int i = 0; i < 2; ++i) {
const bool is_aa_set = i & 1;
- msgattrs.setRequestIPVersion(AF_INET);
- msgattrs.setRequestTransportProtocol(IPPROTO_UDP);
- msgattrs.setRequestOpCode(Opcode::QUERY());
- msgattrs.setRequestEDNS0(true);
- msgattrs.setRequestDO(true);
+ buildSkeletonMessage(msgattrs);
msgattrs.setRequestSig(false, false);
response.setRcode(Rcode::SERVFAIL());
@@ -571,8 +576,8 @@ TEST_F(CountersTest, incrementQrySuccess) {
std::map<std::string, int> expect;
// Opcode = QUERY, Rcode = NOERROR, ANCOUNT > 0
- msgattrs.setRequestIPVersion(AF_INET);
- msgattrs.setRequestTransportProtocol(IPPROTO_UDP);
+ msgattrs.setRequestIPVersion(MessageAttributes::IP_VERSION_IPV4);
+ msgattrs.setRequestTransportProtocol(MessageAttributes::TRANSPORT_UDP);
msgattrs.setRequestOpCode(Opcode::QUERY());
msgattrs.setRequestEDNS0(true);
msgattrs.setRequestDO(true);
@@ -620,8 +625,8 @@ TEST_F(CountersTest, incrementQryReferralAndNxrrset) {
int count_referral = 0, count_nxrrset = 0;
for (int i = 0; i < 2; ++i) {
const bool is_aa_set = i & 1;
- msgattrs.setRequestIPVersion(AF_INET);
- msgattrs.setRequestTransportProtocol(IPPROTO_UDP);
+ msgattrs.setRequestIPVersion(MessageAttributes::IP_VERSION_IPV4);
+ msgattrs.setRequestTransportProtocol(MessageAttributes::TRANSPORT_UDP);
msgattrs.setRequestOpCode(Opcode::QUERY());
msgattrs.setRequestEDNS0(true);
msgattrs.setRequestDO(true);
@@ -663,8 +668,8 @@ TEST_F(CountersTest, incrementAuthQryRej) {
std::map<std::string, int> expect;
// Opcode = QUERY, Rcode = REFUSED, ANCOUNT = 0 (don't care)
- msgattrs.setRequestIPVersion(AF_INET);
- msgattrs.setRequestTransportProtocol(IPPROTO_UDP);
+ msgattrs.setRequestIPVersion(MessageAttributes::IP_VERSION_IPV4);
+ msgattrs.setRequestTransportProtocol(MessageAttributes::TRANSPORT_UDP);
msgattrs.setRequestOpCode(Opcode::QUERY());
msgattrs.setRequestEDNS0(true);
msgattrs.setRequestDO(true);
diff --git a/src/bin/auth/tests/statisticsitems.py b/src/bin/auth/tests/statisticsitems.py
new file mode 100644
index 0000000..f6147d3
--- /dev/null
+++ b/src/bin/auth/tests/statisticsitems.py
@@ -0,0 +1,91 @@
+# Copyright (C) 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
+# 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.
+
+"""\
+This script checks output of gen-statisticsitems.py.
+
+This script checks XML file. Spec file, C++ code and header files syntax is
+checked in the other unittests or system tests.
+"""
+
+import os
+import sys
+from xml.etree import ElementTree
+
+"""\
+User-defined exception for parse error. It is thrown if a file is not
+formatted as expected.
+"""
+class ParseError(Exception):
+ pass
+
+"""\
+Test XML file.
+
+It should have <refsect1> which has <title>STATISTICS DATA</title>.
+Inside the section, it should have one or more <varlistentry> of each item
+inside <variablelist>.
+Each <varlistentry> should have <term> for item name and <simpara> inside
+<listitem> for item description.
+
+Example:
+ <refsect1>
+ <title>STATISTICS DATA</title>
+ <variablelist>
+ <varlistentry>
+ <term>item1</term>
+ <listitem>
+ <simpara>
+ statistics item
+ </simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>item2</term>
+ <listitem>
+ <simpara>
+ another statistics item
+ </simpara>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+"""
+def testXMLfile(xmlfilepath):
+ xmltree = ElementTree.parse(xmlfilepath)
+ root = xmltree.getroot()
+ # find <refsect1> which has <title> of 'STATISTICS DATA'
+ stats_node = [t for t in root.findall('./refsect1')
+ if t.find('./title').text == 'STATISTICS DATA']
+ if not stats_node:
+ raise ParseError('Statistics data section does not exist')
+ # find all <varlistentry> inside <variablelist>
+ entries = stats_node[0].find('./variablelist').findall('./varlistentry')
+ if not entries:
+ raise ParseError('<varlistentry> does not exist inside section')
+ for entry in entries:
+ # find <term> for item name
+ name = entry.find('./term')
+ if name is None or name.text == '':
+ raise ParseError('<term> for item name does not exist')
+ # find <simpara> inside <listitem> for item description
+ description = entry.find('./listitem/simpara')
+ if description is None or description.text == '':
+ raise ParseError('<listitem> nor <simpara> for item description'
+ ' does not exist')
+ return
+
+if __name__ == "__main__":
+ xmlfilepath = sys.argv[1]
+ testXMLfile(xmlfilepath)
diff --git a/src/lib/testutils/testdata/example.com b/src/lib/testutils/testdata/example.com
index 5e0e079..24ce218 100644
--- a/src/lib/testutils/testdata/example.com
+++ b/src/lib/testutils/testdata/example.com
@@ -6,3 +6,11 @@ ns.example.com. A 192.0.2.1
;; bogus RDATA for CNAME RR, but the loadzone tool accepts it. looking up this
;; record will trigger an exception.
broken.example.com. CNAME 0123456789012345678901234567890123456789012345678901234567890123456789.example.com.
+
+;; very large RDATA. it exceeds 512 octets.
+large-rdata.example.com. TXT "0-1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
+large-rdata.example.com. TXT "1-1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
+large-rdata.example.com. TXT "2-1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
+large-rdata.example.com. TXT "3-1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
+large-rdata.example.com. TXT "4-1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
+large-rdata.example.com. TXT "5-1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
diff --git a/src/lib/testutils/testdata/example.sqlite3 b/src/lib/testutils/testdata/example.sqlite3
index 0f6ee02..032e7c7 100644
Binary files a/src/lib/testutils/testdata/example.sqlite3 and b/src/lib/testutils/testdata/example.sqlite3 differ
More information about the bind10-changes
mailing list