[svn] commit: r2431 - in /branches/trac232/src/lib/datasrc/tests: sqlite3_unittest.cc testdata/ifxr_bad_remove_nonexisting.rrs testdata/ixfr_ok.rrs

BIND 10 source code commits bind10-changes at lists.isc.org
Thu Jul 8 09:32:04 UTC 2010


Author: jelte
Date: Thu Jul  8 09:32:03 2010
New Revision: 2431

Log:
some ixfr tests

Added:
    branches/trac232/src/lib/datasrc/tests/testdata/ifxr_bad_remove_nonexisting.rrs
    branches/trac232/src/lib/datasrc/tests/testdata/ixfr_ok.rrs
Modified:
    branches/trac232/src/lib/datasrc/tests/sqlite3_unittest.cc

Modified: branches/trac232/src/lib/datasrc/tests/sqlite3_unittest.cc
==============================================================================
--- branches/trac232/src/lib/datasrc/tests/sqlite3_unittest.cc (original)
+++ branches/trac232/src/lib/datasrc/tests/sqlite3_unittest.cc Thu Jul  8 09:32:03 2010
@@ -19,6 +19,7 @@
 #include <algorithm>
 #include <string>
 #include <vector>
+#include <fstream>
 
 #include <sqlite3.h>
 #include <gtest/gtest.h>
@@ -956,10 +957,6 @@
 // (the source one may not be writable, and we modify it, so if
 // one of the tests fail halfway, we want to restart with a clean
 // database next time)
-// This is done from this test (as opposed to, say the makefile),
-// so that there aren't any prerequisites to calling run_unittests 
-// Cleanup will be left to make clean, so that we might inspect the
-// contents should a test fail inexplicably
 //
 int
 install_writable_database()
@@ -969,11 +966,11 @@
 
 TEST_F(Sqlite3DataSourceTest, Transactions) {
     // first writables test, reset database
-    EXPECT_EQ(0, install_writable_database());
+    ASSERT_EQ(0, install_writable_database());
 
     // use our copied writable datasource db
-    EXPECT_EQ(DataSrc::SUCCESS, data_source.close());
-    EXPECT_EQ(DataSrc::SUCCESS, data_source.init(SQLITE_DBFILE_WRITE));
+    ASSERT_EQ(DataSrc::SUCCESS, data_source.close());
+    ASSERT_EQ(DataSrc::SUCCESS, data_source.init(SQLITE_DBFILE_WRITE));
     
     DataSrcTransaction transaction(&data_source, zone_name);
     EXPECT_EQ(DataSrcTransaction::INIT, transaction.getState());
@@ -1021,8 +1018,8 @@
 TEST_F(Sqlite3DataSourceTest, addRRset) {
 
     // use our copied writable datasource db
-    EXPECT_EQ(DataSrc::SUCCESS, data_source.close());
-    EXPECT_EQ(DataSrc::SUCCESS, data_source.init(SQLITE_DBFILE_WRITE));
+    ASSERT_EQ(DataSrc::SUCCESS, data_source.close());
+    ASSERT_EQ(DataSrc::SUCCESS, data_source.init(SQLITE_DBFILE_WRITE));
 
     // check whether our new record does not exist
     EXPECT_EQ(DataSrc::SUCCESS,
@@ -1063,9 +1060,10 @@
 }
 
 TEST_F(Sqlite3DataSourceTest, delRRset) {
+
     // use our copied writable datasource db
-    EXPECT_EQ(DataSrc::SUCCESS, data_source.close());
-    EXPECT_EQ(DataSrc::SUCCESS, data_source.init(SQLITE_DBFILE_WRITE));
+    ASSERT_EQ(DataSrc::SUCCESS, data_source.close());
+    ASSERT_EQ(DataSrc::SUCCESS, data_source.init(SQLITE_DBFILE_WRITE));
 
     // check whether our new record exists (added by previous test)
     EXPECT_EQ(DataSrc::SUCCESS,
@@ -1106,6 +1104,232 @@
     EXPECT_EQ(DataSrc::NAME_NOT_FOUND, find_flags);
 }
 
-
-
-}
+TEST_F(Sqlite3DataSourceTest, replaceZone) {
+    // reset database
+    ASSERT_EQ(0, install_writable_database());
+
+    // use our copied writable datasource db
+    ASSERT_EQ(DataSrc::SUCCESS, data_source.close());
+    ASSERT_EQ(DataSrc::SUCCESS, data_source.init(SQLITE_DBFILE_WRITE));
+
+    // check whether an A exists
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.findRRset(www_name, RRClass::IN(), RRType::A(),
+                                    result_sets, find_flags, &zone_name));
+    EXPECT_EQ(DataSrc::SUCCESS, find_flags);
+    EXPECT_EQ(1, result_sets.size());
+
+    RRsetList new_list;
+
+    // Replace them, roll back
+    DataSrcTransaction transaction1(&data_source, zone_name);
+    data_source.startTransaction(transaction1, zone_name);
+    data_source.replaceZone(transaction1, new_list);
+    data_source.rollbackTransaction(transaction1);
+
+    // check whether it still exists
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.findRRset(www_name, RRClass::IN(), RRType::A(),
+                                    result_sets, find_flags, &zone_name));
+    EXPECT_EQ(DataSrc::SUCCESS, find_flags);
+    EXPECT_EQ(1, result_sets.size());
+
+    // Replace them, commit
+    DataSrcTransaction transaction2(&data_source, zone_name);
+    data_source.startTransaction(transaction2, zone_name);
+    data_source.replaceZone(transaction2, new_list);
+    data_source.commitTransaction(transaction2);
+    
+    // check whether it's gone now
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.findRRset(www_name, RRClass::IN(), RRType::A(),
+                                    result_sets, find_flags, &zone_name));
+    EXPECT_EQ(DataSrc::NAME_NOT_FOUND, find_flags);
+    EXPECT_EQ(1, result_sets.size());
+
+}
+
+TEST_F(Sqlite3DataSourceTest, delZone) {
+    // reset database
+    ASSERT_EQ(0, install_writable_database());
+
+    // use our copied writable datasource db
+    ASSERT_EQ(DataSrc::SUCCESS, data_source.close());
+    ASSERT_EQ(DataSrc::SUCCESS, data_source.init(SQLITE_DBFILE_WRITE));
+
+    // check whether an A exists
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.findRRset(www_name, RRClass::IN(), RRType::A(),
+                                    result_sets, find_flags, &zone_name));
+    EXPECT_EQ(DataSrc::SUCCESS, find_flags);
+    EXPECT_EQ(1, result_sets.size());
+
+    // Delete zone, roll back
+    DataSrcTransaction transaction1(&data_source, zone_name);
+    data_source.startTransaction(transaction1, zone_name);
+    data_source.delZone(transaction1);
+    data_source.rollbackTransaction(transaction1);
+
+    // check whether it still exists
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.findRRset(www_name, RRClass::IN(), RRType::A(),
+                                    result_sets, find_flags, &zone_name));
+    EXPECT_EQ(DataSrc::SUCCESS, find_flags);
+    EXPECT_EQ(1, result_sets.size());
+
+    // Delete zone, commit
+    DataSrcTransaction transaction2(&data_source, zone_name);
+    data_source.startTransaction(transaction2, zone_name);
+    data_source.delZone(transaction2);
+    data_source.commitTransaction(transaction2);
+    
+    // check whether it's gone now
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.findRRset(www_name, RRClass::IN(), RRType::A(),
+                                    result_sets, find_flags, &zone_name));
+    EXPECT_EQ(DataSrc::NO_SUCH_ZONE, find_flags);
+    EXPECT_EQ(1, result_sets.size());
+}
+
+// initialize the message with flags and codes,
+// read a list of rrs and put them in that order in the answer
+// section of the given message
+static int
+ixfrFromFile(Message& m, const char* file_name) {
+    ifstream myfile(file_name);
+
+    m.setHeaderFlag(MessageFlag::AA());
+    m.setHeaderFlag(MessageFlag::QR());
+    m.setQid(1234);
+    m.setOpcode(isc::dns::Opcode::QUERY());
+    m.setRcode(isc::dns::Rcode::NOERROR());
+    if (myfile.is_open()) {
+        while (! myfile.eof() ) {
+            string s;
+            myfile >> s;
+            if (s == "") {
+                continue;
+            }
+            Name n(s);
+            myfile >> s;
+            RRTTL ttl(s);
+            myfile >> s;
+            RRClass rrclass(s);
+            myfile >> s;
+            RRType rrtype(s);
+            string line;
+            getline(myfile, line);
+            while (line[0] == ' ' || line[0] == '\t') {
+                line.erase(0, 1);
+            }
+            RdataPtr rdata = createRdata(rrtype, rrclass, line);
+            RRsetPtr rrset = RRsetPtr(new RRset(n,
+                                      rrclass,
+                                      rrtype,
+                                      ttl));
+            rrset->addRdata(rdata);
+            m.addRRset(Section::ANSWER(), rrset, false);
+        }
+    } else {
+        return -1;
+    }
+    return 0;
+}
+
+// check a single rrset for exact match including rdata
+static void
+checkSingleRRset(const DataSrc& data_source,
+                 const std::string& expected,
+                 const Name& name,
+                 const RRClass& rrclass,
+                 const RRType& rrtype)
+{
+    RRsetList result_sets;
+    uint32_t find_flags;
+    
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.findRRset(name, rrclass, rrtype,
+                                    result_sets, find_flags, &zone_name));
+    EXPECT_EQ(DataSrc::SUCCESS, find_flags);
+    EXPECT_EQ(1, result_sets.size());
+    EXPECT_EQ(expected, (*result_sets.begin())->toText());
+}
+
+TEST_F(Sqlite3DataSourceTest, ixfr_ok) {
+    // reset database
+    ASSERT_EQ(0, install_writable_database());
+
+    // use our copied writable datasource db
+    ASSERT_EQ(DataSrc::SUCCESS, data_source.close());
+    ASSERT_EQ(DataSrc::SUCCESS, data_source.init(SQLITE_DBFILE_WRITE));
+
+    checkSingleRRset(data_source,
+                     "www.example.com. 3600 IN A 192.0.2.1\n",
+                     www_name, RRClass::IN(), RRType::A());
+    
+    Message ixfr_msg(Message::RENDER);
+    ASSERT_EQ(0, ixfrFromFile(ixfr_msg, TEST_DATA_DIR "/ixfr_ok.rrs"));
+
+    // do IXFR, roll back
+    DataSrcTransaction transaction1(&data_source, zone_name);
+    data_source.startTransaction(transaction1, zone_name);
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.doIXFR(transaction1,
+                                 ixfr_msg.beginSection(Section::ANSWER()),
+                                 ixfr_msg.endSection(Section::ANSWER()))
+    );
+    data_source.rollbackTransaction(transaction1);
+
+    checkSingleRRset(data_source,
+                     "www.example.com. 3600 IN A 192.0.2.1\n",
+                     www_name, RRClass::IN(), RRType::A());
+
+    // do IXFR, commit
+    DataSrcTransaction transaction2(&data_source, zone_name);
+    data_source.startTransaction(transaction2, zone_name);
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.doIXFR(transaction2,
+                                 ixfr_msg.beginSection(Section::ANSWER()),
+                                 ixfr_msg.endSection(Section::ANSWER()))
+    );
+    data_source.commitTransaction(transaction2);
+
+    checkSingleRRset(data_source,
+                     "www.example.com. 3600 IN A 192.0.2.3\n",
+                     www_name, RRClass::IN(), RRType::A());
+
+    // same IXFR should now fail, because the start serial doesn't match
+    DataSrcTransaction transaction3(&data_source, zone_name);
+    data_source.startTransaction(transaction3, zone_name);
+    EXPECT_EQ(DataSrc::ERROR,
+              data_source.doIXFR(transaction3,
+                                 ixfr_msg.beginSection(Section::ANSWER()),
+                                 ixfr_msg.endSection(Section::ANSWER()))
+    );
+    data_source.rollbackTransaction(transaction3);
+}
+
+TEST_F(Sqlite3DataSourceTest, ixfr_bad) {
+    // reset database
+    ASSERT_EQ(0, install_writable_database());
+
+    // use our copied writable datasource db
+    ASSERT_EQ(DataSrc::SUCCESS, data_source.close());
+    ASSERT_EQ(DataSrc::SUCCESS, data_source.init(SQLITE_DBFILE_WRITE));
+
+    // a bad ixfr, tries to remove a non-existant RR
+    Message ixfr_msg(Message::RENDER);
+    ASSERT_EQ(0, ixfrFromFile(ixfr_msg, TEST_DATA_DIR
+              "/ifxr_bad_remove_nonexisting.rrs"));
+    DataSrcTransaction transaction1(&data_source, zone_name);
+    data_source.startTransaction(transaction1, zone_name);
+    EXPECT_EQ(DataSrc::ERROR,
+              data_source.doIXFR(transaction1,
+                                 ixfr_msg.beginSection(Section::ANSWER()),
+                                 ixfr_msg.endSection(Section::ANSWER()))
+    );
+    data_source.rollbackTransaction(transaction1);
+    
+}
+
+}




More information about the bind10-changes mailing list