[svn] commit: r3228 - in /branches/trac232/src: bin/xfrin/ lib/datasrc/ lib/datasrc/python/ lib/datasrc/python/tests/ lib/datasrc/tests/
BIND 10 source code commits
bind10-changes at lists.isc.org
Fri Oct 15 13:09:04 UTC 2010
Author: jelte
Date: Fri Oct 15 13:09:04 2010
New Revision: 3228
Log:
general cleanup, and a bit of refactoring, moved a helper function from tests to the datasrc library, and renamed another helper function there
Modified:
branches/trac232/src/bin/xfrin/xfrin.py.in
branches/trac232/src/lib/datasrc/data_source.cc
branches/trac232/src/lib/datasrc/data_source.h
branches/trac232/src/lib/datasrc/python/libdata_source_python.cc
branches/trac232/src/lib/datasrc/python/tests/data_source_python_test.py
branches/trac232/src/lib/datasrc/sqlite3_datasrc.cc
branches/trac232/src/lib/datasrc/tests/sqlite3_unittest.cc
Modified: branches/trac232/src/bin/xfrin/xfrin.py.in
==============================================================================
--- branches/trac232/src/bin/xfrin/xfrin.py.in (original)
+++ branches/trac232/src/bin/xfrin/xfrin.py.in Fri Oct 15 13:09:04 2010
@@ -207,12 +207,9 @@
ds.init("{ \"database_file\": \"" + self._db_file +"\" }")
transaction = libdata_source_python.DataSrcTransaction(ds, Name(self._zone_name), RRClass.IN())
result = ds.start_transaction(transaction, True)
+ #print("[XX] result: " + str(result))
- #result = ds.replace_zone(transaction, XfrinConnection._handle_xfrin_response, self)
- print("[XX] Replacing zone")
result = ds.replace_zone(transaction, self._handle_xfrin_response)
- print("[XX] done replacing zone")
- #result = ds.replace_zone(transaction, test_xx_removeme)
result = ds.commit_transaction(transaction)
ds.close()
@@ -311,8 +308,6 @@
def _handle_xfrin_response(self):
'''Return a generator for the response to a zone transfer. '''
done = False
- print("[XX] HANDLE generator called")
- sys.stdout.flush()
soa_seen = False
while not done:
data_len = self._get_request_response(2)
@@ -323,18 +318,10 @@
self._check_response_status(msg)
answer_section = msg.get_section(Section.ANSWER())
- print("[XX] LIST:")
- for a in answer_section:
- print(a)
for rrset in answer_section:
- print("[XX] Type: " + rrset.get_type().to_text() + " soa seen: " + str(soa_seen))
- sys.stdout.flush()
if rrset.get_type() == RRType.SOA():
- print("[XX] SOA!")
- sys.stdout.flush()
if soa_seen:
# second one, we're done.
- print("[XX] Second SOA, done!")
done = True
break
elif rrset.get_rdata_count() == 2:
@@ -344,17 +331,9 @@
new_soa = RRset(rrset.get_name(), rrset.get_class(),
rrset.get_type(), rrset.get_ttl())
new_soa.add_rdata(rrset.get_rdata()[0])
- print("[XX] YIELDING: ")
- print(new_soa)
- sys.stdout.flush()
- yield new_soa
+ rrset = new_soa
else:
- print("[XX] first soa")
- sys.stdout.flush()
soa_seen = True
- print("[XX] YIELDING: ")
- print(rrset)
- sys.stdout.flush()
yield rrset
if self._soa_rr_count == 2:
Modified: branches/trac232/src/lib/datasrc/data_source.cc
==============================================================================
--- branches/trac232/src/lib/datasrc/data_source.cc (original)
+++ branches/trac232/src/lib/datasrc/data_source.cc Fri Oct 15 13:09:04 2010
@@ -1474,78 +1474,34 @@
return (Rcode::NOERROR());
}
-DataSrc::Result
-DataSrc::doIXFR(DataSrcTransaction& transaction UNUSED_PARAM,
- const isc::dns::RRsetIterator start UNUSED_PARAM,
- const isc::dns::RRsetIterator end UNUSED_PARAM)
-{
- if (transaction.getState() != DataSrcTransaction::RUNNING) {
- return (DataSrc::ERROR);
- }
-
- RRsetIterator rrsets = start;
- if (rrsets == end) {
- return (DataSrc::ERROR);
- }
- RRsetPtr final_soa = *rrsets;
- rrsets++;
- if (rrsets == end) {
- return (DataSrc::ERROR);
- }
- RRsetPtr first_soa = *rrsets;
- rrsets++;
- if (first_soa->getType() == RRType::SOA()) {
- if (!haveRRset(transaction, first_soa)) {
- return (DataSrc::ERROR);
- }
+isc::dns::RRsetPtr
+callbackHelperRRsetIterator(void* arg1, void* arg2)
+{
+ RRsetIterator* cur = reinterpret_cast<RRsetIterator*>(arg1);
+ RRsetIterator* end = reinterpret_cast<RRsetIterator*>(arg2);
+
+ if (cur == NULL || end == NULL || *cur == *end) {
+ return RRsetPtr();
} else {
- // Not a SOA, then this must be an AXFR-type response
- //int zone_id = transaction.getData()->get("zone_id")->intValue();
- //delAll(zone_id);
- RRsetContainer empty;
- replaceZone(transaction, empty);
-
- while (rrsets != end) {
- addRRset(transaction, *rrsets++);
- }
- return (DataSrc::SUCCESS);
- }
- bool deleting = true;
-
- RRsetPtr cur_rrset;
- while (rrsets != end) {
- cur_rrset = *rrsets;
-
- // If we see a SOA, it means we are switching operations (either
- // we start deleting or adding depending on what we were doing
- // before.
- // We don't delete the actual SOA itself,
- if (cur_rrset->getType() == RRType::SOA()) {
- // TODO: check if serial has increased compared to the last soa we saw
- deleting = !deleting;
- } else {
- if (deleting) {
- // check if rrset exists, if not, something is very wrong, abort
- if (haveRRset(transaction, cur_rrset)) {
- delRRset(transaction, cur_rrset);
- } else {
- return (DataSrc::ERROR);
- }
- } else {
- addRRset(transaction, cur_rrset);
- }
- }
- rrsets++;
- }
- if (equalRRsets(cur_rrset, final_soa)) {
- // Finally replace the SOA
- delRRset(transaction, first_soa);
- addRRset(transaction, final_soa);
- return (DataSrc::SUCCESS);
+ RRsetPtr result = **cur;
+ (*cur)++;
+ return (result);
+ }
+}
+
+isc::dns::RRsetPtr
+callbackHelperRRsetVector(void *arg1,
+ void *arg2)
+{
+ std::vector<RRsetPtr>* v = reinterpret_cast<std::vector<RRsetPtr>* >(arg1);
+ size_t* i = reinterpret_cast<size_t*>(arg2);
+
+ if (v && i && *i < v->size()) {
+ RRsetPtr result = ((*v)[(*i)++]);
+ return (result);
} else {
- return (DataSrc::ERROR);
- }
- return (NOT_IMPLEMENTED);
+ return (RRsetPtr());
+ }
}
DataSrc::Result
@@ -1554,18 +1510,15 @@
void* arg1, void* arg2)
{
if (transaction.getState() != DataSrcTransaction::RUNNING) {
- std::cout << "[XX] 1" << std::endl;
return (DataSrc::ERROR);
}
RRsetPtr final_soa = nextRRset(arg1, arg2);
if (!final_soa) {
- std::cout << "[XX] 2" << std::endl;
return (DataSrc::ERROR);
}
RRsetPtr first_soa = nextRRset(arg1, arg2);
if (!final_soa) {
- std::cout << "[XX] 3" << std::endl;
return (DataSrc::ERROR);
}
@@ -1573,7 +1526,6 @@
if (first_soa->getType() == RRType::SOA()) {
if (!haveRRset(transaction, first_soa)) {
- std::cout << "[XX] 4" << std::endl;
return (DataSrc::ERROR);
}
} else {
@@ -1604,7 +1556,6 @@
if (haveRRset(transaction, next_rrset)) {
delRRset(transaction, next_rrset);
} else {
- std::cout << "[XX] 6" << std::endl;
return (DataSrc::ERROR);
}
} else {
@@ -1618,7 +1569,6 @@
addRRset(transaction, final_soa);
return (DataSrc::SUCCESS);
} else {
- std::cout << "[XX] yup" << std::endl;
return (DataSrc::ERROR);
}
return (NOT_IMPLEMENTED);
Modified: branches/trac232/src/lib/datasrc/data_source.h
==============================================================================
--- branches/trac232/src/lib/datasrc/data_source.h (original)
+++ branches/trac232/src/lib/datasrc/data_source.h Fri Oct 15 13:09:04 2010
@@ -58,6 +58,39 @@
isc::Exception(file, line, what) {}
};
+/// \brief Helper function for use as ready-made callback argument
+/// (for instance for DataSrc::replaceZone and DataSrc::doIXFR)
+/// This function takes a pointer to an RRsetIterator (arg1) and a
+/// pointer to an RRsetIterator end value (arg2).
+/// On each call, the next RRsetPtr in the iterator is returned, and
+/// the iterator is advanced. If the last element is reached, and
+/// empty RRsetPtr is returned.
+///
+/// \param arg1, pointer to an RRsetIterator object, for instance as
+/// returned by isc::dns::message::beginSection(). This
+/// iterator is advanced on each call to this function
+/// \param arg2, pointer to an RRsetIterator end object, for instance
+/// as returned by isc::dns::message::endSection().
+/// \return The RRsetPtr as pointed to by the iterator in arg1, or
+/// an empty RRsetPtr if the end is reached.
+isc::dns::RRsetPtr
+callbackHelperRRsetIterator(void* arg1, void* arg2);
+
+/// \brief Helper function for use as ready-made callback argument
+/// (for instance for DataSrc::replaceZone and DataSrc::doIXFR)
+/// This function takes a pointer to an std::vector<RRsetPtr> (arg1)
+/// and a pointer to a size_t value (arg2).
+/// On each call, the RRsetPtr in the vector at arg1 at the position
+/// at arg2 is returned, and arg2 is incremented with 1.
+/// If the size_t value at arg2 is is equal to or greater than the
+/// size of the vector, an empty ElementPtr() is returned.
+///
+/// \param arg1, pointer to an std::vector<RRsetPtr> object
+/// \param arg2, pointer to a size_t value. This value is incremented
+/// on each call to this function
+/// \return The RRsetPtr in the vector *arg1 at position *arg2.
+isc::dns::RRsetPtr
+callbackHelperRRsetVector(void* arg1, void* arg2);
class AbstractDataSrc {
///
@@ -483,18 +516,6 @@
virtual isc::dns::Rcode updateProcessUpdate(DataSrcTransaction& transaction,
isc::dns::RRsetPtr update);
- /// \brief Perform an IXFR operation directly from a dns message
- /// section iterator
- /// The given RRset iterator should point to the section of the
- /// IXFR answer, and is processed as described in RFC1995
- /// \param transaction the transaction to perform the operation in
- /// \param start The start of the rrset iterator to handle
- /// \param end the end of the rrset iterator to handle
- /// \return SUCCESS on success, ERROR on failure.
- virtual Result doIXFR(DataSrcTransaction& transaction,
- const isc::dns::RRsetIterator start,
- const isc::dns::RRsetIterator end);
-
/// \brief Perform an IXFR operation with data provided by the
/// given function.
/// The given function should return one RRset at a time, which
Modified: branches/trac232/src/lib/datasrc/python/libdata_source_python.cc
==============================================================================
--- branches/trac232/src/lib/datasrc/python/libdata_source_python.cc (original)
+++ branches/trac232/src/lib/datasrc/python/libdata_source_python.cc Fri Oct 15 13:09:04 2010
@@ -273,8 +273,6 @@
PyObject* rrclass_obj_str = PyObject_CallMethod(rrclass_obj, const_cast<char*>("to_text"), NULL);
const char* rrclass_str = PyBytes_AS_STRING(PyUnicode_AsUTF8String(rrclass_obj_str));
isc::dns::RRClass rrclass = isc::dns::RRClass(rrclass_str);
- std::cout << "[XX] converted to string" << std::endl;
- std::cout << "[XX] end" << std::endl;
self->datasrc = new DataSrc(rrclass);
*/
@@ -926,13 +924,15 @@
/// function that an object is not an RRset
class NotRRsetException : public std::exception {};
+/// only used in the callback iterator, to propagate the exception
+/// raise in the python callback
+class CallbackException : public std::exception {};
+
isc::dns::RRsetPtr
callback_iterator(void* arg1, void* arg2)
{
PyObject* iterator = reinterpret_cast<PyObject*>(arg1);
- std::cout << "[XX] Getting next value from iterator" << std::endl;
PyObject* rrset_obj = PyIter_Next(iterator);
- std::cout << "[XX] got next value from iterator" << std::endl;
if (rrset_obj) {
if (PyRRset_Check(rrset_obj)) {
return PyRRset_AsRRsetPtr(rrset_obj);
@@ -940,7 +940,11 @@
throw NotRRsetException();
}
} else {
- return isc::dns::RRsetPtr();
+ if (PyErr_Occurred()) {
+ throw CallbackException();
+ } else {
+ return isc::dns::RRsetPtr();
+ }
}
}
@@ -956,7 +960,6 @@
&rrset_list_or_function_obj,
&arg1, &arg2)) {
if (PyList_Check(rrset_list_or_function_obj)) {
- std::cout << "[XX] list argument" << std::endl;
isc::dns::RRsetContainer rrset_list;
for (int i = 0; i < PyList_Size(rrset_list_or_function_obj); ++i) {
PyObject* rrset_obj = PyList_GET_ITEM(rrset_list_or_function_obj, i);
@@ -973,7 +976,6 @@
rrset_list));
return (result);
} else if (PyCallable_Check(rrset_list_or_function_obj)) {
- std::cout << "[XX] callable argument" << std::endl;
PyObject* iterator = PyObject_CallFunctionObjArgs(rrset_list_or_function_obj, arg1, arg2, NULL);
if (!iterator) {
return (NULL);
@@ -995,22 +997,10 @@
PyErr_SetString(PyExc_TypeError,
"non-RRset object returned by iterator in replace_zone()");
return (NULL);
+ } catch (CallbackException) {
+ // specific error already set, just return NULL
+ return (NULL);
}
- /*
- PyObject* rrset_obj;
- while (rrset_obj = PyIter_Next(iterator)) {
- std::cout << "[XX] GOT OBJ!" << std::endl;
- //std::cout << PyObject_Dir(rrset_obj) << std::endl;
- if (!PyRRset_Check(rrset_obj)) {
- PyErr_SetString(PyExc_TypeError,
- "non-RRset object returned by iterator in replace_zone()");
- return (NULL);
- }
- }
- PyErr_SetString(PyExc_TypeError,
- "Callable!!!");
- return (NULL);
- */
} else {
PyErr_SetString(PyExc_TypeError,
"argument 2 of replace_zone() is not a List or a function");
@@ -1083,12 +1073,15 @@
}
m.addRRset(isc::dns::Section::ANSWER(), PyRRset_AsRRsetPtr(rrset_obj), false);
}
-
+
+ isc::dns::RRsetIterator begin = m.beginSection(isc::dns::Section::ANSWER());
+ isc::dns::RRsetIterator end = m.endSection(isc::dns::Section::ANSWER());
PyObject* result = Py_BuildValue("I",
self->datasrc->doIXFR(
*(transaction->datasrc_transaction),
- m.beginSection(isc::dns::Section::ANSWER()),
- m.endSection(isc::dns::Section::ANSWER())));
+ isc::datasrc::callbackHelperRRsetIterator,
+ &begin,
+ &end));
return (result);
}
return (NULL);
Modified: branches/trac232/src/lib/datasrc/python/tests/data_source_python_test.py
==============================================================================
--- branches/trac232/src/lib/datasrc/python/tests/data_source_python_test.py (original)
+++ branches/trac232/src/lib/datasrc/python/tests/data_source_python_test.py Fri Oct 15 13:09:04 2010
@@ -26,8 +26,6 @@
def get_new_rrs(list):
print("[XX] GET_NEW_RRS CALLED")
for l in list:
- print("[XX] get_new_rrs list item: ")
- print(l)
yield l
@@ -38,7 +36,6 @@
def test_init_close(self):
self.assertRaises(DataSrcError, self.ds.close)
self.assertRaises(TypeError, self.ds.close, 1)
- print(testdata_path)
self.assertRaises(DataSrcError, self.ds.init, 1)
self.assertRaises(DataSrcError, self.ds.init, "{")
self.assertRaises(DataSrcError, self.ds.init, "{ \"database_file\": \"/ badfilename /\" }")
@@ -177,6 +174,9 @@
install_writable_database()
self.ds = DataSrc()
self.ds.init("{ \"database_file\": \""+ testdata_out_path + "/write_test.sqlite3\" }")
+
+ def tearDown(self):
+ remove_writable_database()
def test_transaction(self):
@@ -530,6 +530,9 @@
return os.system(testdata_install_prog + " " + testdata_path +
"/test.sqlite3 " + testdata_out_path +
"/write_test.sqlite3" );
+
+def remove_writable_database():
+ return os.remove(testdata_out_path + "/write_test.sqlite3" );
def rrsets_from_file(filename):
rrsets = []
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 Fri Oct 15 13:09:04 2010
@@ -979,7 +979,6 @@
rdp->next();
}
} while (!rdp->isLast());
- std::cout << "[XX] added rrset to zone " << zone_id << ": " << rrset->toText() << std::endl;
return result;
}
@@ -1153,34 +1152,6 @@
void* arg1, void* arg2)
{
if (transaction.getState() != DataSrcTransaction::RUNNING) {
- std::cout << "[XX] Transaction not running" << std::endl;
- return DataSrc::W_ERROR;
- }
-
- int zone_id = transaction.getData()->get("zone_id")->intValue();
-
- DataSrc::WriteResult result = delAll(zone_id);
- if (result != DataSrc::W_SUCCESS) {
- std::cout << "[XX] delAll failed" << std::endl;
- return result;
- }
-
- RRsetPtr next_rrset;
- while (next_rrset = nextRRset(arg1, arg2)) {
- std::cout << "[XX] adding rrset: " << next_rrset->toText() << std::endl;
- result = addRRset(transaction, next_rrset);
- if (result != DataSrc::W_SUCCESS) {
- std::cout << "[XX] addrrset failed" << std::endl;
- return result;
- }
- }
- return DataSrc::W_SUCCESS;
-}
-
-DataSrc::WriteResult
-Sqlite3DataSrc::delZone(DataSrcTransaction& transaction)
-{
- if (transaction.getState() != DataSrcTransaction::RUNNING) {
return DataSrc::W_ERROR;
}
@@ -1191,6 +1162,30 @@
return result;
}
+ RRsetPtr next_rrset;
+ while (next_rrset = nextRRset(arg1, arg2)) {
+ result = addRRset(transaction, next_rrset);
+ if (result != DataSrc::W_SUCCESS) {
+ return result;
+ }
+ }
+ return DataSrc::W_SUCCESS;
+}
+
+DataSrc::WriteResult
+Sqlite3DataSrc::delZone(DataSrcTransaction& transaction)
+{
+ if (transaction.getState() != DataSrcTransaction::RUNNING) {
+ return DataSrc::W_ERROR;
+ }
+
+ int zone_id = transaction.getData()->get("zone_id")->intValue();
+
+ DataSrc::WriteResult result = delAll(zone_id);
+ if (result != DataSrc::W_SUCCESS) {
+ return result;
+ }
+
sqlite3_stmt* query = dbparameters->w_del_zone_;
sqlite3_reset(query);
@@ -1203,7 +1198,6 @@
" to SQL statement (query)");
}
- std::cout << "[XX] del zone " << zone_id << " query prepared, executing" << std::endl;
int q_result = sqlite3_step(query);
sqlite3_reset(query);
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 Fri Oct 15 13:09:04 2010
@@ -1202,28 +1202,6 @@
}
-RRsetPtr
-getRRsetCallback_vector(void *arg1,
- void *arg2)
-{
- //std::vector<RRsetPtr> v = static_cast<std::vector<RRsetPtr> >(arg1);
- std::vector<RRsetPtr>* v = reinterpret_cast<std::vector<RRsetPtr>* >(arg1);
- size_t* i = reinterpret_cast<size_t*>(arg2);
- std::cout << "[XX] getRRsetCallback_vector() called" << std::endl;
- std::cout << "[XX] i: " << *i << std::endl;
- std::cout << "[XX] s: " << v->size() << std::endl;
-
- if (*i < v->size()) {
- //return ((*v)[(*i)++]);
- RRsetPtr result = ((*v)[(*i)++]);
- std::cout << "Returning: " << result->toText() << std::endl;
- return result;
- } else {
- std::cout << "Nothing in vector, returning empty Ptr" << std::endl;
- return (RRsetPtr());
- }
-}
-
TEST_F(Sqlite3DataSourceTest, replaceZone_callback_vector) {
std::vector<RRsetPtr> rrsets;
@@ -1250,7 +1228,7 @@
// Replace them, roll back
DataSrcTransaction transaction1(&data_source, zone_name, RRClass::IN());
ASSERT_EQ(DataSrc::W_SUCCESS, data_source.startTransaction(transaction1));
- ASSERT_EQ(DataSrc::W_SUCCESS, data_source.replaceZone(transaction1, getRRsetCallback_vector, &rrsets, &i));
+ ASSERT_EQ(DataSrc::W_SUCCESS, data_source.replaceZone(transaction1, isc::datasrc::callbackHelperRRsetVector, &rrsets, &i));
ASSERT_EQ(DataSrc::W_SUCCESS, data_source.rollbackTransaction(transaction1));
// check whether it still exists
@@ -1264,7 +1242,7 @@
i = 0;
DataSrcTransaction transaction2(&data_source, zone_name, RRClass::IN());
ASSERT_EQ(DataSrc::W_SUCCESS, data_source.startTransaction(transaction2));
- ASSERT_EQ(DataSrc::W_SUCCESS, data_source.replaceZone(transaction2, getRRsetCallback_vector, &rrsets, &i));
+ ASSERT_EQ(DataSrc::W_SUCCESS, data_source.replaceZone(transaction2, isc::datasrc::callbackHelperRRsetVector, &rrsets, &i));
ASSERT_EQ(DataSrc::W_SUCCESS, data_source.commitTransaction(transaction2));
// check whether the original rrs are gone now
@@ -1517,8 +1495,6 @@
} else {
return -1;
}
- cout << "[XX] CREATED IXFR PACKET:" << endl;
- cout << m.toText() << endl;
return 0;
}
@@ -1570,10 +1546,6 @@
data_source.findRRset(name, rrclass, rrtype,
result_sets, find_flags, &zone_name));
- if (result_sets.size() > 0) {
- std::cout << "[XX] checkSingleRRset: " << (*result_sets.begin())->toText() << std::endl;
- }
-
//EXPECT_EQ(DataSrc::SUCCESS, find_flags);
if (expected == "") {
// noerror/nodata gives an rdatalen=0 rrset back?
@@ -1588,6 +1560,7 @@
}
}
+/*
TEST_F(Sqlite3DataSourceTest, ixfr_ok_message) {
// reset database
ASSERT_EQ(0, install_writable_database());
@@ -1641,6 +1614,71 @@
);
ASSERT_EQ(DataSrc::W_SUCCESS, data_source.rollbackTransaction(transaction3));
}
+*/
+
+TEST_F(Sqlite3DataSourceTest, ixfr_ok_message) {
+ // 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, RRClass::IN());
+ ASSERT_EQ(DataSrc::W_SUCCESS, data_source.startTransaction(transaction1));
+ RRsetIterator begin, end;
+ begin = ixfr_msg.beginSection(Section::ANSWER());
+ end = ixfr_msg.endSection(Section::ANSWER());
+ EXPECT_EQ(DataSrc::SUCCESS,
+ data_source.doIXFR(transaction1,
+ isc::datasrc::callbackHelperRRsetIterator,
+ &begin,
+ &end)
+ );
+ ASSERT_EQ(DataSrc::W_SUCCESS, 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, RRClass::IN());
+ ASSERT_EQ(DataSrc::W_SUCCESS, data_source.startTransaction(transaction2));
+ begin = ixfr_msg.beginSection(Section::ANSWER());
+ end = ixfr_msg.endSection(Section::ANSWER());
+ EXPECT_EQ(DataSrc::SUCCESS,
+ data_source.doIXFR(transaction2,
+ isc::datasrc::callbackHelperRRsetIterator,
+ &begin,
+ &end)
+ );
+ ASSERT_EQ(DataSrc::W_SUCCESS, 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, RRClass::IN());
+ ASSERT_EQ(DataSrc::W_SUCCESS, data_source.startTransaction(transaction3));
+ begin = ixfr_msg.beginSection(Section::ANSWER());
+ end = ixfr_msg.endSection(Section::ANSWER());
+ EXPECT_EQ(DataSrc::ERROR,
+ data_source.doIXFR(transaction3,
+ isc::datasrc::callbackHelperRRsetIterator,
+ &begin,
+ &end)
+ );
+ ASSERT_EQ(DataSrc::W_SUCCESS, data_source.rollbackTransaction(transaction3));
+}
TEST_F(Sqlite3DataSourceTest, ixfr_ok_function) {
// reset database
@@ -1663,7 +1701,7 @@
ASSERT_EQ(DataSrc::W_SUCCESS, data_source.startTransaction(transaction1));
ASSERT_EQ(DataSrc::SUCCESS,
data_source.doIXFR(transaction1,
- getRRsetCallback_vector, &rrsets, &i)
+ isc::datasrc::callbackHelperRRsetVector, &rrsets, &i)
);
ASSERT_EQ(DataSrc::W_SUCCESS, data_source.rollbackTransaction(transaction1));
@@ -1677,7 +1715,7 @@
ASSERT_EQ(DataSrc::W_SUCCESS, data_source.startTransaction(transaction2));
ASSERT_EQ(DataSrc::SUCCESS,
data_source.doIXFR(transaction2,
- getRRsetCallback_vector, &rrsets, &i)
+ isc::datasrc::callbackHelperRRsetVector, &rrsets, &i)
);
ASSERT_EQ(DataSrc::W_SUCCESS, data_source.commitTransaction(transaction2));
@@ -1691,7 +1729,7 @@
ASSERT_EQ(DataSrc::W_SUCCESS, data_source.startTransaction(transaction3));
ASSERT_EQ(DataSrc::ERROR,
data_source.doIXFR(transaction3,
- getRRsetCallback_vector, &rrsets, &i)
+ isc::datasrc::callbackHelperRRsetVector, &rrsets, &i)
);
ASSERT_EQ(DataSrc::W_SUCCESS, data_source.rollbackTransaction(transaction3));
}
@@ -1710,13 +1748,16 @@
"/ixfr_bad_remove_nonexisting.rrs"));
DataSrcTransaction transaction1(&data_source, zone_name, RRClass::IN());
ASSERT_EQ(DataSrc::W_SUCCESS, data_source.startTransaction(transaction1));
+ RRsetIterator begin, end;
+ begin = ixfr_msg.beginSection(Section::ANSWER());
+ end = ixfr_msg.endSection(Section::ANSWER());
EXPECT_EQ(DataSrc::ERROR,
data_source.doIXFR(transaction1,
- ixfr_msg.beginSection(Section::ANSWER()),
- ixfr_msg.endSection(Section::ANSWER()))
+ isc::datasrc::callbackHelperRRsetIterator,
+ &begin,
+ &end)
);
ASSERT_EQ(DataSrc::W_SUCCESS, data_source.rollbackTransaction(transaction1));
-
}
TEST_F(Sqlite3DataSourceTest, dynamic_update) {
More information about the bind10-changes
mailing list