[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