Browse Source

[2157] check some statistics counters are unaffected

Yoshitaka Aharen 12 years ago
parent
commit
c7c532323f

+ 1 - 0
src/bin/auth/tests/Makefile.am

@@ -46,6 +46,7 @@ run_unittests_SOURCES += ../command.h ../command.cc
 run_unittests_SOURCES += ../common.h ../common.cc
 run_unittests_SOURCES += ../statistics.h ../statistics.cc ../statistics_items.h
 run_unittests_SOURCES += datasrc_util.h datasrc_util.cc
+run_unittests_SOURCES += statistics_util.h statistics_util.cc
 run_unittests_SOURCES += auth_srv_unittest.cc
 run_unittests_SOURCES += config_unittest.cc
 run_unittests_SOURCES += config_syntax_unittest.cc

+ 164 - 133
src/bin/auth/tests/auth_srv_unittest.cc

@@ -47,6 +47,8 @@
 #include <testutils/portconfig.h>
 #include <testutils/socket_request.h>
 
+#include "statistics_util.h"
+
 #include <gtest/gtest.h>
 
 #include <boost/lexical_cast.hpp>
@@ -73,6 +75,7 @@ using namespace isc::asiodns;
 using namespace isc::asiolink;
 using namespace isc::testutils;
 using namespace isc::server_common::portconfig;
+using namespace isc::auth::unittest;
 using isc::UnitTestUtil;
 using boost::scoped_ptr;
 using isc::auth::statistics::Counters;
@@ -92,17 +95,6 @@ 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() :
@@ -206,31 +198,10 @@ protected:
     // Check if the counters exist and are initialized to 0.
     void
     checkCountersAreInitialized() {
+        std::map<std::string, int> expect;
         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);
+        checkStatisticsCounters(stats, expect);
     }
 
     MockDNSService dnss_;
@@ -290,9 +261,15 @@ TEST_F(AuthSrvTest, noClientList) {
 
     ConstElementPtr stats_after = server.getStatistics()->get("zones")->
         get("_SERVER_");
-    expectCounterItem(stats_after->get("opcode"), "query", 1);
-    expectCounterItem(stats_after, "responses", 1);
-    expectCounterItem(stats_after->get("rcode"), "refused", 1);
+    std::map<std::string, int> expect;
+    expect["request.v4"] = 1;
+    expect["request.udp"] = 1;
+    expect["opcode.query"] = 1;
+    expect["responses"] = 1;
+    expect["qrynoauthans"] = 1;
+    expect["authqryrej"] = 1;
+    expect["rcode.refused"] = 1;
+    checkStatisticsCounters(stats_after, expect);
 }
 
 // Unsupported requests.  Should result in NOTIMP.
@@ -313,10 +290,13 @@ TEST_F(AuthSrvTest, multiQuestion) {
 TEST_F(AuthSrvTest, shortMessage) {
     shortMessage();
 
-    checkAllRcodeCountersZero();
     ConstElementPtr stats_after = server.getStatistics()->get("zones")->
         get("_SERVER_");
-    expectCounterItem(stats_after, "responses", 0);
+    std::map<std::string, int> expect;
+    expect["request.v4"] = 1;
+    expect["request.udp"] = 1;
+    expect["opcode.other"] = 1;
+    checkStatisticsCounters(stats_after, expect);
 }
 
 // Response messages.  Must be silently dropped, whether it's a valid response
@@ -324,10 +304,13 @@ TEST_F(AuthSrvTest, shortMessage) {
 TEST_F(AuthSrvTest, response) {
     response();
 
-    checkAllRcodeCountersZero();
     ConstElementPtr stats_after = server.getStatistics()->get("zones")->
         get("_SERVER_");
-    expectCounterItem(stats_after, "responses", 0);
+    std::map<std::string, int> expect;
+    expect["request.v4"] = 3;
+    expect["request.udp"] = 3;
+    expect["opcode.other"] = 3;
+    checkStatisticsCounters(stats_after, expect);
 }
 
 // Query with a broken question
@@ -346,11 +329,16 @@ TEST_F(AuthSrvTest, shortAnswer) {
 TEST_F(AuthSrvTest, ednsBadVers) {
     ednsBadVers();
 
-    checkAllRcodeCountersZeroExcept(Rcode::BADVERS(), 1);
     ConstElementPtr stats_after = server.getStatistics()->get("zones")->
         get("_SERVER_");
-    expectCounterItem(stats_after, "responses", 1);
-    expectCounterItem(stats_after->get("request"), "badednsver", 1);
+    std::map<std::string, int> expect;
+    expect["request.v4"] = 1;
+    expect["request.badednsver"] = 1;
+    expect["request.udp"] = 1;
+    expect["opcode.other"] = 1;
+    expect["responses"] = 1;
+    expect["rcode.badvers"] = 1;
+    checkStatisticsCounters(stats_after, expect);
 }
 
 TEST_F(AuthSrvTest, AXFROverUDP) {
@@ -370,12 +358,13 @@ TEST_F(AuthSrvTest, AXFRSuccess) {
     EXPECT_FALSE(dnsserv.hasAnswer());
     EXPECT_TRUE(xfrout.isConnected());
 
-    checkAllRcodeCountersZero();
     ConstElementPtr stats_after = server.getStatistics()->get("zones")->
         get("_SERVER_");
-    expectCounterItem(stats_after->get("opcode"), "query", 1);
-    expectCounterItem(stats_after, "responses", 0);
-    expectCounterItem(stats_after->get("response"), "truncated", 0);
+    std::map<std::string, int> expect;
+    expect["request.v4"] = 1;
+    expect["request.tcp"] = 1;
+    expect["opcode.query"] = 1;
+    checkStatisticsCounters(stats_after, expect);
 }
 
 // Give the server a signed request, but don't give it the key. It will
@@ -413,10 +402,15 @@ TEST_F(AuthSrvTest, TSIGSignedBadKey) {
     checkAllRcodeCountersZeroExcept(Rcode::NOTAUTH(), 1);
     ConstElementPtr stats_after = server.getStatistics()->get("zones")->
         get("_SERVER_");
-    expectCounterItem(stats_after->get("request"), "tsig", 1);
-    expectCounterItem(stats_after->get("request"), "badsig", 1);
-    expectCounterItem(stats_after, "responses", 1);
-    expectCounterItem(stats_after->get("response"), "tsig", 1);
+    std::map<std::string, int> expect;
+    expect["request.v4"] = 1;
+    expect["request.tsig"] = 1;
+    expect["request.badsig"] = 1;
+    expect["request.udp"] = 1;
+    expect["responses"] = 1;
+    expect["response.tsig"] = 1;
+    expect["rcode.notauth"] = 1;
+    checkStatisticsCounters(stats_after, expect);
 }
 
 // Give the server a signed request, but signed by a different key
@@ -451,13 +445,17 @@ TEST_F(AuthSrvTest, TSIGBadSig) {
     EXPECT_EQ(0, tsig->getRdata().getMACSize()) <<
         "It should be unsigned with this error";
 
-    checkAllRcodeCountersZeroExcept(Rcode::NOTAUTH(), 1);
     ConstElementPtr stats_after = server.getStatistics()->get("zones")->
         get("_SERVER_");
-    expectCounterItem(stats_after->get("request"), "tsig", 1);
-    expectCounterItem(stats_after->get("request"), "badsig", 1);
-    expectCounterItem(stats_after, "responses", 1);
-    expectCounterItem(stats_after->get("response"), "tsig", 1);
+    std::map<std::string, int> expect;
+    expect["request.v4"] = 1;
+    expect["request.tsig"] = 1;
+    expect["request.badsig"] = 1;
+    expect["request.udp"] = 1;
+    expect["responses"] = 1;
+    expect["response.tsig"] = 1;
+    expect["rcode.notauth"] = 1;
+    checkStatisticsCounters(stats_after, expect);
 }
 
 // Give the server a signed unsupported request with a bad signature.
@@ -497,14 +495,15 @@ TEST_F(AuthSrvTest, TSIGCheckFirst) {
 
     ConstElementPtr stats_after = server.getStatistics()->get("zones")->
         get("_SERVER_");
-    expectCounterItem(stats_after->get("request"), "tsig", 1);
-    expectCounterItem(stats_after->get("request"), "badsig", 1);
-    expectCounterItem(stats_after, "responses", 1);
-    expectCounterItem(stats_after->get("response"), "tsig", 1);
-    // TSIG should have failed, and so the per opcode counter shouldn't be
-    // incremented.
-    expectCounterItem(stats_after->get("opcode"), "other", 0);
-    checkAllRcodeCountersZeroExcept(Rcode::NOTAUTH(), 1);
+    std::map<std::string, int> expect;
+    expect["request.v4"] = 1;
+    expect["request.tsig"] = 1;
+    expect["request.badsig"] = 1;
+    expect["request.udp"] = 1;
+    expect["responses"] = 1;
+    expect["response.tsig"] = 1;
+    expect["rcode.notauth"] = 1;
+    checkStatisticsCounters(stats_after, expect);
 }
 
 TEST_F(AuthSrvTest, AXFRConnectFail) {
@@ -661,11 +660,15 @@ TEST_F(AuthSrvTest, notify) {
     EXPECT_EQ(RRClass::IN(), question->getClass());
     EXPECT_EQ(RRType::SOA(), question->getType());
 
-    checkAllRcodeCountersZeroExcept(Rcode::NOERROR(), 1);
     ConstElementPtr stats_after = server.getStatistics()->get("zones")->
         get("_SERVER_");
-    expectCounterItem(stats_after->get("opcode"), "notify", 1);
-    expectCounterItem(stats_after, "responses", 1);
+    std::map<std::string, int> expect;
+    expect["request.v4"] = 1;
+    expect["request.udp"] = 1;
+    expect["opcode.notify"] = 1;
+    expect["responses"] = 1;
+    expect["rcode.noerror"] = 1;
+    checkStatisticsCounters(stats_after, expect);
 }
 
 TEST_F(AuthSrvTest, notifyForCHClass) {
@@ -685,11 +688,15 @@ TEST_F(AuthSrvTest, notifyForCHClass) {
         notify_session.getSentMessage()->get("command")->get(1);
     EXPECT_EQ("CH", notify_args->get("zone_class")->stringValue());
 
-    checkAllRcodeCountersZeroExcept(Rcode::NOERROR(), 1);
     ConstElementPtr stats_after = server.getStatistics()->get("zones")->
         get("_SERVER_");
-    expectCounterItem(stats_after->get("opcode"), "notify", 1);
-    expectCounterItem(stats_after, "responses", 1);
+    std::map<std::string, int> expect;
+    expect["request.v4"] = 1;
+    expect["request.udp"] = 1;
+    expect["opcode.notify"] = 1;
+    expect["responses"] = 1;
+    expect["rcode.noerror"] = 1;
+    checkStatisticsCounters(stats_after, expect);
 }
 
 TEST_F(AuthSrvTest, notifyEmptyQuestion) {
@@ -708,9 +715,13 @@ TEST_F(AuthSrvTest, notifyEmptyQuestion) {
 
     ConstElementPtr stats_after = server.getStatistics()->get("zones")->
         get("_SERVER_");
-    expectCounterItem(stats_after->get("opcode"), "notify", 1);
-    expectCounterItem(stats_after, "responses", 1);
-    expectCounterItem(stats_after->get("rcode"), "formerr", 1);
+    std::map<std::string, int> expect;
+    expect["request.v4"] = 1;
+    expect["request.udp"] = 1;
+    expect["opcode.notify"] = 1;
+    expect["responses"] = 1;
+    expect["rcode.formerr"] = 1;
+    checkStatisticsCounters(stats_after, expect);
 }
 
 TEST_F(AuthSrvTest, notifyMultiQuestions) {
@@ -918,12 +929,17 @@ TEST_F(AuthSrvTest, TSIGSigned) {
     checkAllRcodeCountersZeroExcept(Rcode::NOERROR(), 1);
     ConstElementPtr stats_after = server.getStatistics()->get("zones")->
         get("_SERVER_");
-    expectCounterItem(stats_after->get("request"), "tsig", 1);
-    expectCounterItem(stats_after->get("request"), "sig0", 0);
-    expectCounterItem(stats_after->get("request"), "badsig", 0);
-    expectCounterItem(stats_after, "responses", 1);
-    expectCounterItem(stats_after, "qryauthans", 1);
-    expectCounterItem(stats_after->get("response"), "tsig", 1);
+    std::map<std::string, int> expect;
+    expect["request.v4"] = 1;
+    expect["request.tsig"] = 1;
+    expect["request.udp"] = 1;
+    expect["opcode.query"] = 1;
+    expect["responses"] = 1;
+    expect["response.tsig"] = 1;
+    expect["qrysuccess"] = 1;
+    expect["qryauthans"] = 1;
+    expect["rcode.noerror"] = 1;
+    checkStatisticsCounters(stats_after, expect);
 }
 
 // Same test emulating the UDPServer class behavior (defined in libasiolink).
@@ -1049,7 +1065,14 @@ TEST_F(AuthSrvTest, datasourceFail) {
     checkAllRcodeCountersZeroExcept(Rcode::SERVFAIL(), 1);
     ConstElementPtr stats = server.getStatistics()->get("zones")->
         get("_SERVER_");
-    expectCounterItem(stats, "responses", 1);
+    std::map<std::string, int> expect;
+    expect["request.v4"] = 1;
+    expect["request.udp"] = 1;
+    expect["opcode.query"] = 1;
+    expect["responses"] = 1;
+    expect["qrynoauthans"] = 1;
+    expect["rcode.servfail"] = 1;
+    checkStatisticsCounters(stats, expect);
 }
 
 #ifdef USE_STATIC_LINK
@@ -1166,13 +1189,6 @@ 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, "responses", 0);
-    expectCounterItem(stats_init, "qryauthans", 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(),
@@ -1185,10 +1201,16 @@ TEST_F(AuthSrvTest, queryCounterTruncTest) {
 
     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);
+    std::map<std::string, int> expect;
+    expect["request.v4"] = 1;
+    expect["request.udp"] = 1;
+    expect["opcode.query"] = 1;
+    expect["responses"] = 1;
+    expect["response.truncated"] = 1;
+    expect["qrysuccess"] = 1;
+    expect["qryauthans"] = 1;
+    expect["rcode.noerror"] = 1;
+    checkStatisticsCounters(stats_after, expect);
 }
 // Submit UDP normal query and check query counter
 TEST_F(AuthSrvTest, queryCounterUDPNormal) {
@@ -1202,29 +1224,15 @@ TEST_F(AuthSrvTest, queryCounterUDPNormal) {
 
     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", 0);
-    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", 0);
-    expectCounterItem(stats_after->get("opcode"), "query", 1);
-    expectCounterItem(stats_after, "responses", 1);
-    expectCounterItem(stats_after->get("response"), "truncated", 0);
-    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);
+    std::map<std::string, int> expect;
+    expect["request.v4"] = 1;
+    expect["request.udp"] = 1;
+    expect["opcode.query"] = 1;
+    expect["responses"] = 1;
+    expect["qrynoauthans"] = 1;
+    expect["authqryrej"] = 1;
+    expect["rcode.refused"] = 1;
+    checkStatisticsCounters(stats_after, expect);
 }
 
 // Submit UDP normal query with DNSSEC and check query counter
@@ -1239,11 +1247,20 @@ TEST_F(AuthSrvTest, queryCounterUDPNormalWithDNSSEC) {
 
     ConstElementPtr stats_after = server.getStatistics()->
         get("zones")->get("_SERVER_");
-    expectCounterItem(stats_after->get("request"), "edns0", 1);
-    expectCounterItem(stats_after->get("request"), "dnssec_ok", 1);
+    std::map<std::string, int> expect;
+    expect["request.v4"] = 1;
+    expect["request.edns0"] = 1;
+    expect["request.udp"] = 1;
+    expect["request.dnssec_ok"] = 1;
+    expect["opcode.query"] = 1;
+    expect["responses"] = 1;
+    expect["qrynoauthans"] = 1;
+    expect["authqryrej"] = 1;
+    expect["rcode.refused"] = 1;
     // XXX: with the current implementation, EDNS0 is omitted in
     // makeErrorMessage.
-    expectCounterItem(stats_after->get("response"), "edns0", 0);
+    expect["response.edns0"] = 0;
+    checkStatisticsCounters(stats_after, expect);
 }
 
 // Submit TCP normal query and check query counter
@@ -1258,8 +1275,15 @@ TEST_F(AuthSrvTest, queryCounterTCPNormal) {
 
     ConstElementPtr stats_after = server.getStatistics()->
         get("zones")->get("_SERVER_");
-    expectCounterItem(stats_after->get("request"), "udp", 0);
-    expectCounterItem(stats_after->get("request"), "tcp", 1);
+    std::map<std::string, int> expect;
+    expect["request.v4"] = 1;
+    expect["request.tcp"] = 1;
+    expect["opcode.query"] = 1;
+    expect["responses"] = 1;
+    expect["qrynoauthans"] = 1;
+    expect["authqryrej"] = 1;
+    expect["rcode.refused"] = 1;
+    checkStatisticsCounters(stats_after, expect);
 }
 
 // Submit TCP AXFR query and check query counter
@@ -1275,9 +1299,11 @@ TEST_F(AuthSrvTest, queryCounterTCPAXFR) {
 
     ConstElementPtr stats_after = server.getStatistics()->
         get("zones")->get("_SERVER_");
-    expectCounterItem(stats_after->get("opcode"), "query", 1);
-    expectCounterItem(stats_after, "responses", 0);
-    expectCounterItem(stats_after->get("response"), "truncated", 0);
+    std::map<std::string, int> expect;
+    expect["request.v4"] = 1;
+    expect["request.tcp"] = 1;
+    expect["opcode.query"] = 1;
+    checkStatisticsCounters(stats_after, expect);
 }
 
 // Submit TCP IXFR query and check query counter
@@ -1293,9 +1319,11 @@ TEST_F(AuthSrvTest, queryCounterTCPIXFR) {
 
     ConstElementPtr stats_after = server.getStatistics()->
         get("zones")->get("_SERVER_");
-    expectCounterItem(stats_after->get("opcode"), "query", 1);
-    expectCounterItem(stats_after, "responses", 0);
-    expectCounterItem(stats_after->get("response"), "truncated", 0);
+    std::map<std::string, int> expect;
+    expect["request.v4"] = 1;
+    expect["request.tcp"] = 1;
+    expect["opcode.query"] = 1;
+    checkStatisticsCounters(stats_after, expect);
 }
 
 TEST_F(AuthSrvTest, queryCounterOpcodes) {
@@ -1304,7 +1332,8 @@ TEST_F(AuthSrvTest, queryCounterOpcodes) {
         std::string item_name;
         int expected;
         if (isc::auth::statistics::opcode_to_msgcounter[i] ==
-            isc::auth::statistics::MSG_OPCODE_OTHER) {
+                isc::auth::statistics::MSG_OPCODE_OTHER)
+        {
             item_name = "OTHER";
             other_expected += i + 1;
             expected = other_expected;
@@ -1316,9 +1345,9 @@ TEST_F(AuthSrvTest, queryCounterOpcodes) {
                        ::tolower);
 
         // The counter should be initialized to expected value.
-        expectCounterItem(server.getStatistics()->
-                              get("zones")->get("_SERVER_")->get("opcode"),
-                          item_name, expected - (i + 1));
+        EXPECT_EQ(server.getStatistics()->get("zones")->get("_SERVER_")->
+                      get("opcode")->get(item_name)->intValue(),
+                  expected - (i + 1));
 
         // For each possible opcode, create a request message and send it
         UnitTestUtil::createRequestMessage(request_message, Opcode(i),
@@ -1336,9 +1365,11 @@ TEST_F(AuthSrvTest, queryCounterOpcodes) {
         }
 
         // Confirm the counter.
-        expectCounterItem(server.getStatistics()->
-                              get("zones")->get("_SERVER_")->get("opcode"),
-                          item_name, expected);
+        // This test only checks for opcodes; some part of the other items
+        // depends on the opcode.
+        EXPECT_EQ(server.getStatistics()->get("zones")->get("_SERVER_")->
+                      get("opcode")->get(item_name)->intValue(),
+                  expected);
     }
 }
 

+ 26 - 60
src/bin/auth/tests/statistics_unittest.cc.pre

@@ -29,8 +29,7 @@
 
 #include <dns/tests/unittest_util.h>
 
-#include <string>
-#include <map>
+#include "statistics_util.h"
 
 #include <unistd.h>
 #include <sys/types.h>
@@ -42,6 +41,7 @@ using namespace std;
 using namespace isc::dns;
 using namespace isc::data;
 using namespace isc::auth::statistics;
+using namespace isc::auth::unittest;
 
 namespace {
 
@@ -54,52 +54,6 @@ protected:
     Counters counters;
 };
 
-// flatten counters
-void
-flatten(std::map<std::string, int>& flat_map, const std::string& prefix,
-        const isc::data::ConstElementPtr map_element) {
-    std::map<std::string, ConstElementPtr> map = map_element->mapValue();
-    for (std::map<std::string, ConstElementPtr>::const_iterator
-             i = map.begin(), e = map.end();
-         i != e;
-         ++i)
-    {
-        switch (i->second->getType()) {
-            case isc::data::Element::map:
-                flatten(flat_map, i->first + ".", i->second);
-                break;
-            case isc::data::Element::integer:
-                flat_map[prefix + i->first] = i->second->intValue();
-                break;
-            default:
-                FAIL() << "Element Parse Error";
-        }
-    }
-}
-
-// Test if the counters has expected values specified in expect and the others
-// are zero.
-void
-checkCounters(const isc::data::ConstElementPtr counters,
-              const std::map<std::string, int>& expect)
-{
-    std::map<std::string, int> stats_map;
-    flatten(stats_map, "", counters);
-
-    for (std::map<std::string, int>::const_iterator
-            i = stats_map.begin(), e = stats_map.end();
-            i != e;
-            ++i)
-    {
-        const int value =
-            expect.find(i->first) == expect.end() ?
-                0 : expect.find(i->first)->second;
-        EXPECT_EQ(value, i->second) << "Expected counter "
-            << i->first << " = " << value << ", actual: "
-            << i->second;
-    }
-}
-
 void
 buildSkeletonMessage(MessageAttributes& msgattrs) {
     msgattrs.setRequestIPVersion(MessageAttributes::IP_VERSION_IPV4);
@@ -164,7 +118,8 @@ TEST_F(CountersTest, incrementResponse) {
         expect["qrynoauthans"] = responded ? 1 : 0;
         expect["rcode.refused"] = responded ? 1 : 0;
         expect["authqryrej"] = responded ? 1 : 0;
-        checkCounters(counters.get()->get("zones")->get("_SERVER_"), expect);
+        checkStatisticsCounters(counters.get()->get("zones")->get("_SERVER_"),
+                                expect);
     }
 }
 
@@ -226,7 +181,8 @@ TEST_F(CountersTest, incrementProtocolType) {
         expect["qrynoauthans"] = i+1;
         expect["rcode.refused"] = i+1;
         expect["authqryrej"] = i+1;
-        checkCounters(counters.get()->get("zones")->get("_SERVER_"), expect);
+        checkStatisticsCounters(counters.get()->get("zones")->get("_SERVER_"),
+                                expect);
     }
 }
 
@@ -263,7 +219,8 @@ TEST_F(CountersTest, incrementDO) {
         expect["qrynoauthans"] = i+1;
         expect["rcode.refused"] = i+1;
         expect["authqryrej"] = i+1;
-        checkCounters(counters.get()->get("zones")->get("_SERVER_"), expect);
+        checkStatisticsCounters(counters.get()->get("zones")->get("_SERVER_"),
+                                expect);
     }
 }
 
@@ -316,7 +273,8 @@ TEST_F(CountersTest, incrementEDNS) {
         expect["qrynoauthans"] = i+1;
         expect["rcode.refused"] = i+1;
         expect["authqryrej"] = i+1;
-        checkCounters(counters.get()->get("zones")->get("_SERVER_"), expect);
+        checkStatisticsCounters(counters.get()->get("zones")->get("_SERVER_"),
+                                expect);
     }
 }
 
@@ -375,7 +333,8 @@ TEST_F(CountersTest, incrementTSIG) {
         expect["qrynoauthans"] = i+1 - count_badsig;
         expect["rcode.refused"] = i+1 - count_badsig;
         expect["authqryrej"] = i+1 - count_badsig;
-        checkCounters(counters.get()->get("zones")->get("_SERVER_"), expect);
+        checkStatisticsCounters(counters.get()->get("zones")->get("_SERVER_"),
+                                expect);
     }
 }
 
@@ -430,7 +389,8 @@ TEST_F(CountersTest, incrementOpcode) {
                 expect["opcode."+code_text] = j;
             }
         }
-        checkCounters(counters.get()->get("zones")->get("_SERVER_"), expect);
+        checkStatisticsCounters(counters.get()->get("zones")->get("_SERVER_"),
+                                expect);
     }
 }
 
@@ -489,7 +449,8 @@ TEST_F(CountersTest, incrementRcode) {
                 expect["rcode."+code_text] = j;
             }
         }
-        checkCounters(counters.get()->get("zones")->get("_SERVER_"), expect);
+        checkStatisticsCounters(counters.get()->get("zones")->get("_SERVER_"),
+                                expect);
     }
 }
 
@@ -531,7 +492,8 @@ TEST_F(CountersTest, incrementTruncated) {
         expect["responses"] = i+1;
         expect["rcode.servfail"] = i+1;
         expect["response.truncated"] = count_truncated;
-        checkCounters(counters.get()->get("zones")->get("_SERVER_"), expect);
+        checkStatisticsCounters(counters.get()->get("zones")->get("_SERVER_"),
+                                expect);
     }
 }
 
@@ -575,7 +537,8 @@ TEST_F(CountersTest, incrementQryAuthAnsAndNoAuthAns) {
         expect["rcode.servfail"] = i+1;
         expect["qryauthans"] = count_authans;
         expect["qrynoauthans"] = count_noauthans;
-        checkCounters(counters.get()->get("zones")->get("_SERVER_"), expect);
+        checkStatisticsCounters(counters.get()->get("zones")->get("_SERVER_"),
+                                expect);
     }
 }
 
@@ -617,7 +580,8 @@ TEST_F(CountersTest, incrementQrySuccess) {
     expect["qrysuccess"] = 1;
     // noauthans is also incremented
     expect["qrynoauthans"] = 1;
-    checkCounters(counters.get()->get("zones")->get("_SERVER_"), expect);
+    checkStatisticsCounters(counters.get()->get("zones")->get("_SERVER_"),
+                            expect);
 }
 
 TEST_F(CountersTest, incrementQryReferralAndNxrrset) {
@@ -667,7 +631,8 @@ TEST_F(CountersTest, incrementQryReferralAndNxrrset) {
         // qryauthans or qrynoauthans is also incremented
         expect["qryauthans"] = count_nxrrset;
         expect["qrynoauthans"] = count_referral;
-        checkCounters(counters.get()->get("zones")->get("_SERVER_"), expect);
+        checkStatisticsCounters(counters.get()->get("zones")->get("_SERVER_"),
+                                expect);
     }
 }
 
@@ -702,7 +667,8 @@ TEST_F(CountersTest, incrementAuthQryRej) {
     expect["authqryrej"] = 1;
     // noauthans is also incremented since AA bit is not set
     expect["qrynoauthans"] = 1;
-    checkCounters(counters.get()->get("zones")->get("_SERVER_"), expect);
+    checkStatisticsCounters(counters.get()->get("zones")->get("_SERVER_"),
+                            expect);
 }
 
 int

+ 77 - 0
src/bin/auth/tests/statistics_util.cc

@@ -0,0 +1,77 @@
+// 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.
+
+#include "statistics_util.h"
+
+#include <gtest/gtest.h>
+
+#include <string>
+#include <map>
+
+namespace {
+void
+flatten(std::map<std::string, int>& flat_map, const std::string& prefix,
+        const isc::data::ConstElementPtr map_element)
+{
+    std::map<std::string, isc::data::ConstElementPtr> map =
+        map_element->mapValue();
+    for (std::map<std::string, isc::data::ConstElementPtr>::const_iterator
+             i = map.begin(), e = map.end();
+         i != e;
+         ++i)
+    {
+        switch (i->second->getType()) {
+            case isc::data::Element::map:
+                flatten(flat_map, i->first + ".", i->second);
+                break;
+            case isc::data::Element::integer:
+                flat_map[prefix + i->first] = i->second->intValue();
+                break;
+            default:
+                FAIL() << "Element Parse Error";
+        }
+    }
+}
+}
+
+namespace isc {
+namespace auth {
+namespace unittest {
+
+// Test if the counters has expected values specified in expect and the others
+// are zero.
+void
+checkStatisticsCounters(const isc::data::ConstElementPtr counters,
+                        const std::map<std::string, int>& expect)
+{
+    std::map<std::string, int> stats_map;
+    flatten(stats_map, "", counters);
+
+    for (std::map<std::string, int>::const_iterator
+            i = stats_map.begin(), e = stats_map.end();
+            i != e;
+            ++i)
+    {
+        const int value =
+            expect.find(i->first) == expect.end() ?
+                0 : expect.find(i->first)->second;
+        EXPECT_EQ(value, i->second) << "Expected counter "
+            << i->first << " = " << value << ", actual: "
+            << i->second;
+    }
+}
+
+} // end of unittest
+} // end of auth
+} // end of isc

+ 38 - 0
src/bin/auth/tests/statistics_util.h

@@ -0,0 +1,38 @@
+// 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.
+
+#ifndef __AUTH_STATISTICS_UTIL_H
+#define __AUTH_STATISTICS_UTIL_H 1
+
+#include <cc/data.h>
+
+namespace isc {
+namespace auth {
+namespace unittest {
+
+// Test if the counters has expected values specified in expect and the others
+// are zero.
+void
+checkStatisticsCounters(const isc::data::ConstElementPtr counters,
+                        const std::map<std::string, int>& expect);
+
+} // end of unittest
+} // end of auth
+} // end of isc
+
+#endif  // __AUTH_STATISTICS_UTIL_H
+
+// Local Variables:
+// mode: c++
+// End: