[svn] commit: r356 - in /branches/jinmei-dnsmessageapi/src/lib/dns/cpp: messagerenderer_unittest.cc unittest_util.cc unittest_util.h

BIND 10 source code commits bind10-changes at lists.isc.org
Fri Dec 11 09:22:16 UTC 2009


Author: jinmei
Date: Fri Dec 11 09:22:16 2009
New Revision: 356

Log:
improved wire data comparison test by making failure messages more meaningful.

Modified:
    branches/jinmei-dnsmessageapi/src/lib/dns/cpp/messagerenderer_unittest.cc
    branches/jinmei-dnsmessageapi/src/lib/dns/cpp/unittest_util.cc
    branches/jinmei-dnsmessageapi/src/lib/dns/cpp/unittest_util.h

Modified: branches/jinmei-dnsmessageapi/src/lib/dns/cpp/messagerenderer_unittest.cc
==============================================================================
--- branches/jinmei-dnsmessageapi/src/lib/dns/cpp/messagerenderer_unittest.cc (original)
+++ branches/jinmei-dnsmessageapi/src/lib/dns/cpp/messagerenderer_unittest.cc Fri Dec 11 09:22:16 2009
@@ -68,7 +68,7 @@
     renderer.writeName(Name("a.example.com."));
     renderer.writeName(Name("b.example.com."), false);
     renderer.writeName(Name("b.example.com."));
-    EXPECT_EQ(true, buffer.getLength() == data.size() &&
-              memcmp(buffer.getData(), &data[0], data.size()) == 0);
+    EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, buffer.getData(),
+                        buffer.getLength(), &data[0], data.size());
 }
 }

Modified: branches/jinmei-dnsmessageapi/src/lib/dns/cpp/unittest_util.cc
==============================================================================
--- branches/jinmei-dnsmessageapi/src/lib/dns/cpp/unittest_util.cc (original)
+++ branches/jinmei-dnsmessageapi/src/lib/dns/cpp/unittest_util.cc Fri Dec 11 09:22:16 2009
@@ -20,6 +20,8 @@
 #include <stdexcept>
 #include <vector>
 #include <string>
+
+#include <gtest/gtest.h>
 
 #include "unittest_util.h"
 
@@ -72,3 +74,33 @@
         }
     } while (!iss.eof());
 }
+
+::testing::AssertionResult
+UnitTestUtil::matchWireData(const char* dataexp1, const char* lenexp1,
+                            const char* dataexp2, const char* lenexp2,
+                            const void* data1, size_t len1,
+                            const void* data2, size_t len2)
+{
+    ::testing::Message msg;
+    size_t cmplen = std::min(len1, len2);
+
+    for (int i = 0; i < cmplen; i++) {
+        uint8_t ch1 = static_cast<const uint8_t*>(data1)[i];
+        uint8_t ch2 = static_cast<const uint8_t*>(data2)[i];
+        if (ch1 != ch2) {
+            msg << "Wire data mismatch at " << i << "th byte\n"
+                << "  Actual: " << std::dec <<
+                static_cast<int>(ch1) << "\n"
+                << "Expected: " << std::dec <<
+                static_cast<int>(ch2) << "\n";
+            return (::testing::AssertionFailure(msg));
+        }
+    }
+    if (len1 != len2) {
+        msg << "Wire data mismatch in length:\n"
+            << "  Actual: " << len1 << "\n"
+            << "Expected: " << len2 << "\n";
+        return (::testing::AssertionFailure(msg));
+    }
+    return ::testing::AssertionSuccess();
+}

Modified: branches/jinmei-dnsmessageapi/src/lib/dns/cpp/unittest_util.h
==============================================================================
--- branches/jinmei-dnsmessageapi/src/lib/dns/cpp/unittest_util.h (original)
+++ branches/jinmei-dnsmessageapi/src/lib/dns/cpp/unittest_util.h Fri Dec 11 09:22:16 2009
@@ -20,6 +20,8 @@
 #include <vector>
 #include <string>
 
+#include <gtest/gtest.h>
+
 namespace isc {
 
 class UnitTestUtil {
@@ -36,6 +38,27 @@
     ///
     static void readWireData(const std::string& datastr,
                              std::vector<unsigned char>& data);
+
+    ///
+    /// Compare len1 bytes of data1 with len2 bytes of data2 as binary data.
+    /// If they don't match report the point of mismatch in the google test
+    /// format.  This method is expected to be used from the EXPECT_PRED_FORMAT4
+    /// macro of google test as follows:
+    /// \code EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData,
+    ///                           actual_data, actual_data_len,
+    ///                           expected_data, expected_data_len); \endcode
+    /// Parameters from dataexp1 to lenexp2 are passed via the macro but will
+    /// be ignored by this method.
+    /// Note: newer versions of google test supports the direct use of
+    /// AssertionResult with the EXPECT_TRUE macro, which would be more
+    /// intuitive, but to be as compatible as possible we use the more primitive
+    /// macro, i.e., EXPECT_PRED_FORMAT4.
+    ///
+    static ::testing::AssertionResult
+    matchWireData(const char* dataexp1, const char* lenexp1,
+                  const char* dataexp2, const char* lenexp2,
+                  const void* data1, size_t len1,
+                  const void* data2, size_t len2);
 };
 
 }




More information about the bind10-changes mailing list