]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[2382] Consume to end of line / file in createRdata().
authorJINMEI Tatuya <jinmei@isc.org>
Fri, 30 Nov 2012 06:30:56 +0000 (22:30 -0800)
committerJINMEI Tatuya <jinmei@isc.org>
Sat, 1 Dec 2012 03:41:13 +0000 (19:41 -0800)
src/lib/dns/rdata.cc
src/lib/dns/tests/rdata_unittest.cc
src/lib/dns/tests/rdata_unittest.h

index ddb4b77258e119c35c2997f3706d7ae421c06cd0..cc7c58274345aa616f33390ba895de7d9e0f386e 100644 (file)
@@ -30,6 +30,7 @@
 #include <util/buffer.h>
 #include <dns/name.h>
 #include <dns/messagerenderer.h>
+#include <dns/master_lexer.h>
 #include <dns/rdata.h>
 #include <dns/rrparamregistry.h>
 #include <dns/rrtype.h>
@@ -87,17 +88,17 @@ createRdata(const RRType& rrtype, const RRClass& rrclass,
             MasterLoader::Options options,
             MasterLoaderCallbacks& callbacks)
 {
-    RdataPtr ret;
-
-    try {
-        ret = RRParamRegistry::getRegistry().createRdata(rrtype, rrclass,
-                                                         lexer, origin,
-                                                         options, callbacks);
-    } catch (...) {
-        // ret is NULL here.
-    }
+    const RdataPtr rdata = RRParamRegistry::getRegistry().createRdata(
+        rrtype, rrclass, lexer, origin, options, callbacks);
+
+    // Consume to end of line / file.
+    // If not at end of line initially set error code.
+    // Call callback via fromtext_error once if there was an error.
+    const MasterToken& token = lexer.getNextToken();
+    assert(token.getType() == MasterToken::END_OF_LINE ||
+           token.getType() == MasterToken::END_OF_FILE);
 
-    return (ret);
+    return (rdata);
 }
 
 int
index bc91f7ad0d83a00f156de97f7016f920f518c0b7..08d9628d193e82d4ec30a6e696138f4a134fd0f0 100644 (file)
@@ -82,6 +82,30 @@ createRdataUsingLexer(const RRType& rrtype, const RRClass& rrclass,
 
 } // end of namespace isc::dns::rdata::test
 
+// Test class/type-independent behavior of createRdata().
+TEST_F(RdataTest, createRdataWithLexer) {
+    const generic::NS ns_rdata("ns.example.com.");
+    const in::AAAA aaaa_rdata("2001:db8::1");
+
+    stringstream ss;
+    ss << ns_rdata.toText() << "\n"; // valid case
+    ss << aaaa_rdata.toText() << " extra-token\n"; // extra token
+    lexer.pushSource(ss);
+
+    const MasterLoaderCallbacks::IssueCallback callback
+        (boost::bind(&test::dummyCallback, _1, _2, _3));
+    MasterLoaderCallbacks callbacks(callback, callback);
+    ConstRdataPtr rdata = createRdata(RRType::NS(), RRClass::IN(), lexer, NULL,
+                                      MasterLoader::MANY_ERRORS, callbacks);
+    EXPECT_EQ(0, ns_rdata.compare(*rdata));
+
+#ifdef notyet
+    rdata = createRdata(RRType::AAAA(), RRClass::IN(), lexer, NULL,
+                        MasterLoader::MANY_ERRORS, callbacks);
+    EXPECT_EQ(0, aaaa_rdata.compare(*rdata));
+#endif
+}
+
 }
 }
 }
index 3efb5d8346b801a066d7b0195e3cf4bf13eb9f7c..af19311794486ab9cb443f8b179d83f4062e4647 100644 (file)
@@ -20,6 +20,7 @@
 #include <dns/rrclass.h>
 #include <dns/rrtype.h>
 #include <dns/rdata.h>
+#include <dns/master_lexer.h>
 
 #include <gtest/gtest.h>
 
@@ -40,6 +41,7 @@ protected:
     /// This is an RDATA object of some "unknown" RR type so that it can be
     /// used to test the compare() method against a well-known RR type.
     RdataPtr rdata_nomatch;
+    MasterLexer lexer;
 };
 
 namespace test {