[svn] commit: r2424 - in /branches/trac232/src/lib: datasrc/sqlite3_datasrc.cc datasrc/tests/Makefile.am datasrc/tests/sqlite3_unittest.cc dns/tests/rrsetlist_unittest.cc

BIND 10 source code commits bind10-changes at lists.isc.org
Wed Jul 7 18:36:09 UTC 2010


Author: jelte
Date: Wed Jul  7 18:36:09 2010
New Revision: 2424

Log:
some tests

Modified:
    branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc
    branches/trac232/src/lib/datasrc/tests/Makefile.am
    branches/trac232/src/lib/datasrc/tests/sqlite3_unittest.cc
    branches/trac232/src/lib/dns/tests/rrsetlist_unittest.cc

Modified: branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc
==============================================================================
--- branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc (original)
+++ branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc Wed Jul  7 18:36:09 2010
@@ -44,7 +44,8 @@
     Sqlite3Parameters() :  db_(NULL), version_(-1),
         q_zone_(NULL), q_record_(NULL), q_addrs_(NULL), q_referral_(NULL),
         q_any_(NULL), q_count_(NULL), q_previous_(NULL), q_nsec3_(NULL),
-        q_prevnsec3_(NULL), w_add_rr_(NULL)
+        q_prevnsec3_(NULL), w_add_rr_(NULL), w_del_rr_(NULL),
+        w_del_all_(NULL), w_del_zone_(NULL)
     {}
     sqlite3* db_;
     int version_;
@@ -906,6 +907,9 @@
 Sqlite3DataSrc::addRRset(DataSrcTransaction& transaction,
                          isc::dns::ConstRRsetPtr rrset)
 {
+    if (transaction.getState() != DataSrcTransaction::RUNNING) {
+        return DataSrc::ERROR;
+    }
     std::cout << "[XX] addRR at sqlite3" << std::endl;
     int zone_id = transaction.getData()->get("zone_id")->intValue();
     std::cout << "[XX] zone id: " << zone_id << std::endl;
@@ -1071,6 +1075,10 @@
 Sqlite3DataSrc::replaceZone(DataSrcTransaction& transaction,
                             isc::dns::RRsetList& rrsets)
 {
+    if (transaction.getState() != DataSrcTransaction::RUNNING) {
+        return DataSrc::ERROR;
+    }
+
     int zone_id = transaction.getData()->get("zone_id")->intValue();
 
     DataSrc::Result result = delAll(zone_id);
@@ -1086,6 +1094,10 @@
 DataSrc::Result
 Sqlite3DataSrc::delZone(DataSrcTransaction& transaction)
 {
+    if (transaction.getState() != DataSrcTransaction::RUNNING) {
+        return DataSrc::ERROR;
+    }
+
     int zone_id = transaction.getData()->get("zone_id")->intValue();
 
     DataSrc::Result result = delAll(zone_id);
@@ -1125,6 +1137,10 @@
 Sqlite3DataSrc::delRRset(DataSrcTransaction& transaction,
                          isc::dns::ConstRRsetPtr rrset)
 {
+    if (transaction.getState() != DataSrcTransaction::RUNNING) {
+        return DataSrc::ERROR;
+    }
+
     std::cout << "[XX] delRR at sqlite3" << std::endl;
     int zone_id = transaction.getData()->get("zone_id")->intValue();
     
@@ -1180,6 +1196,10 @@
                        const RRsetIterator start,
                        const RRsetIterator end)
 {
+    if (transaction.getState() != DataSrcTransaction::RUNNING) {
+        return DataSrc::ERROR;
+    }
+
     RRsetIterator rrsets = start;
     RRsetPtr final_soa = *rrsets;
     rrsets++;

Modified: branches/trac232/src/lib/datasrc/tests/Makefile.am
==============================================================================
--- branches/trac232/src/lib/datasrc/tests/Makefile.am (original)
+++ branches/trac232/src/lib/datasrc/tests/Makefile.am Wed Jul  7 18:36:09 2010
@@ -1,10 +1,12 @@
 AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_builddir)/src/lib
 AM_CPPFLAGS += -I$(top_builddir)/src/lib/dns -I$(top_srcdir)/src/lib/dns
 AM_CPPFLAGS += -DTEST_DATA_DIR=\"$(srcdir)/testdata\"
+AM_CPPFLAGS += -DTEST_DATA_OUT_DIR=\"$(builddir)/testdata\"
+AM_CPPFLAGS += -DINSTALL_PROG=\"$(top_srcdir)/install-sh\"
 
 AM_CXXFLAGS = $(B10_CXXFLAGS)
 
-CLEANFILES = *.gcno *.gcda
+CLEANFILES = *.gcno *.gcda testdata/write_test.sqlite3
 
 TESTS =
 if HAVE_GTEST

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 Wed Jul  7 18:36:09 2010
@@ -53,6 +53,8 @@
     "{ \"database_file\": \"" TEST_DATA_DIR "/brokendb.sqlite3\"}");
 ElementPtr SQLITE_DBFILE_MEMORY = Element::createFromString(
     "{ \"database_file\": \":memory:\"}");
+ElementPtr SQLITE_DBFILE_WRITE = Element::createFromString(
+    "{ \"database_file\": \"" TEST_DATA_OUT_DIR "/write_test.sqlite3\"}");
 
 // The following file must be non existent and must be non"creatable";
 // the sqlite3 library will try to create a new DB file if it doesn't exist,
@@ -102,7 +104,8 @@
     Sqlite3DataSourceTest() : rrclass(RRClass::IN()),
                               rrclass_notmatch(RRClass::CH()),
                               rrtype(RRType::A()), rrttl(RRTTL(3600)),
-                              find_flags(0), rrset_matched(0), rrset_count(0)
+                              find_flags(0), rrset_matched(0), rrset_count(0),
+                              zone_name("example.com")
     {
         data_source.init(SQLITE_DBFILE_EXAMPLE);
 
@@ -172,6 +175,13 @@
         nsec3_sig_data.push_back("NSEC3 5 4 7200 20100410172647 "
                                  "20100311172647 63192 sql2.example.com. "
                                  + nsec3_signature);
+
+        // initialize data for writable tests
+        new_rrset = RRsetPtr(new RRset(Name("new_rr.example.com"),
+                                       RRClass::IN(),
+                                       RRType::A(),
+                                       RRTTL(3600)));
+        new_rrset->addRdata(createRdata(RRType::A(), RRClass::IN(), "192.0.2.3")); 
     }
     Sqlite3DataSrc data_source;
     // we allow these to be modified in the test
@@ -227,6 +237,10 @@
     vector<string> child_sig_data;
     vector<string> nsec3_data;
     vector<string> nsec3_sig_data;
+
+    // common data for writable tests
+    Name zone_name;
+    RRsetPtr new_rrset;
 
     void findReferralRRsetCommon(const Name& qname, const RRClass& qclass);
     void findAddressRRsetCommon(const RRClass& qclass);
@@ -937,4 +951,161 @@
     findAddressRRsetCommon(RRClass::ANY());
 }
 
-}
+//
+// We copy one of the example databases to a writable one
+// (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()
+{
+    return system(INSTALL_PROG " " TEST_DATA_DIR "/test.sqlite3 " TEST_DATA_OUT_DIR "/write_test.sqlite3" );
+}
+
+TEST_F(Sqlite3DataSourceTest, Transactions) {
+    // first writables test, reset database
+    EXPECT_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));
+    
+    DataSrcTransaction transaction(&data_source, zone_name);
+    EXPECT_EQ(DataSrcTransaction::INIT, transaction.getState());
+    
+    // start doing things without calling startTransaction()
+    EXPECT_EQ(DataSrc::ERROR,
+              data_source.commitTransaction(transaction));
+    EXPECT_EQ(DataSrc::ERROR,
+              data_source.rollbackTransaction(transaction));
+    EXPECT_EQ(DataSrc::ERROR,
+              data_source.addRRset(transaction, new_rrset));
+    RRsetList empty_list;
+    EXPECT_EQ(DataSrc::ERROR,
+              data_source.replaceZone(transaction, empty_list));
+    EXPECT_EQ(DataSrc::ERROR,
+              data_source.delZone(transaction));
+    EXPECT_EQ(DataSrc::ERROR,
+              data_source.delRRset(transaction, new_rrset));
+    // need rrsetit for doIXFR (but doIXFR should probably be moved up to datasource itself)
+
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.startTransaction(transaction, zone_name));
+    EXPECT_EQ(DataSrcTransaction::RUNNING, transaction.getState());
+    EXPECT_EQ(DataSrc::ERROR,
+              data_source.startTransaction(transaction, zone_name));
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.rollbackTransaction(transaction));
+    EXPECT_EQ(DataSrcTransaction::DONE, transaction.getState());
+
+    // state now 'done', everything should error again
+    EXPECT_EQ(DataSrc::ERROR,
+              data_source.commitTransaction(transaction));
+    EXPECT_EQ(DataSrc::ERROR,
+              data_source.rollbackTransaction(transaction));
+    EXPECT_EQ(DataSrc::ERROR,
+              data_source.addRRset(transaction, new_rrset));
+    EXPECT_EQ(DataSrc::ERROR,
+              data_source.replaceZone(transaction, empty_list));
+    EXPECT_EQ(DataSrc::ERROR,
+              data_source.delZone(transaction));
+    EXPECT_EQ(DataSrc::ERROR,
+              data_source.delRRset(transaction, new_rrset));
+}
+
+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));
+
+    // check whether our new record does not exist
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.findAddrs(new_rrset->getName(), new_rrset->getClass(),
+                                    result_sets, find_flags, &zone_name));
+    EXPECT_EQ(DataSrc::NAME_NOT_FOUND, find_flags);
+
+    // add it, but roll back
+    DataSrcTransaction transaction1(&data_source, zone_name);
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.startTransaction(transaction1, zone_name));
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.addRRset(transaction1, new_rrset));
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.rollbackTransaction(transaction1));
+    
+    // check whether our new record does not exist
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.findAddrs(new_rrset->getName(), new_rrset->getClass(),
+                                    result_sets, find_flags, &zone_name));
+    EXPECT_EQ(DataSrc::NAME_NOT_FOUND, find_flags);
+
+    // add it with commit
+    DataSrcTransaction transaction2(&data_source, zone_name);
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.startTransaction(transaction2, zone_name));
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.addRRset(transaction2, new_rrset));
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.commitTransaction(transaction2));
+
+    // now check whether it does exist
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.findAddrs(new_rrset->getName(), new_rrset->getClass(),
+                                    result_sets, find_flags, &zone_name));
+    EXPECT_EQ(DataSrc::SUCCESS, find_flags);
+    EXPECT_EQ(result_sets.size(), 1);
+}
+
+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));
+
+    // check whether our new record exists (added by previous test)
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.findAddrs(new_rrset->getName(), new_rrset->getClass(),
+                                    result_sets, find_flags, &zone_name));
+    EXPECT_EQ(DataSrc::SUCCESS, find_flags);
+    EXPECT_EQ(result_sets.size(), 1);
+
+    // add it, but roll back
+    DataSrcTransaction transaction1(&data_source, zone_name);
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.startTransaction(transaction1, zone_name));
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.delRRset(transaction1, new_rrset));
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.rollbackTransaction(transaction1));
+
+    // check whether our new record still exists
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.findAddrs(new_rrset->getName(), new_rrset->getClass(),
+                                    result_sets, find_flags, &zone_name));
+    EXPECT_EQ(DataSrc::SUCCESS, find_flags);
+    EXPECT_EQ(result_sets.size(), 1);
+
+    // add it, and commit
+    DataSrcTransaction transaction2(&data_source, zone_name);
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.startTransaction(transaction2, zone_name));
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.delRRset(transaction2, new_rrset));
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.commitTransaction(transaction2));
+
+    // now check whether it does not exist now
+    EXPECT_EQ(DataSrc::SUCCESS,
+              data_source.findAddrs(new_rrset->getName(), new_rrset->getClass(),
+                                    result_sets, find_flags, &zone_name));
+    EXPECT_EQ(DataSrc::NAME_NOT_FOUND, find_flags);
+}
+
+
+
+}

Modified: branches/trac232/src/lib/dns/tests/rrsetlist_unittest.cc
==============================================================================
--- branches/trac232/src/lib/dns/tests/rrsetlist_unittest.cc (original)
+++ branches/trac232/src/lib/dns/tests/rrsetlist_unittest.cc Wed Jul  7 18:36:09 2010
@@ -91,7 +91,8 @@
     setupList(list);
     RRsetPtr cname(new RRset(Name("another.example.com"), RRClass::IN(),
                              RRType::CNAME(), example_ttl));
-    EXPECT_THROW(list.addRRset(cname), DuplicateRRset);
+    //EXPECT_THROW(list.addRRset(cname), DuplicateRRset);
+    EXPECT_NO_THROW(list.addRRset(cname));
 }
 
 void




More information about the bind10-changes mailing list