ClientTest: refactored code for inserting and deleting items in source test

Introduced ClientSourceTests::allSourcesInsert/DeleteAll(), which
replaces several instances of that code in the various tests.
This commit is contained in:
Patrick Ohly 2012-02-13 10:40:26 +01:00
parent 4e1e84c15e
commit 49ea9ea49e
2 changed files with 40 additions and 64 deletions

View File

@ -2634,7 +2634,6 @@ bool SyncTests::compareDatabases(const char *refFileBase, bool raiseAssert) {
/** deletes all items locally and on server */
void SyncTests::deleteAll(DeleteAllMode mode) {
source_it it;
SyncPrefix prefix("deleteall", *this);
const char *value = getenv ("CLIENT_TEST_DELETE_REFRESH");
@ -2645,14 +2644,10 @@ void SyncTests::deleteAll(DeleteAllMode mode) {
switch(mode) {
case DELETE_ALL_SYNC:
// a refresh from server would slightly reduce the amount of data exchanged, but not all servers support it
for (it = sources.begin(); it != sources.end(); ++it) {
CT_ASSERT_NO_THROW(it->second->deleteAll(it->second->createSourceA));
}
CT_ASSERT_NO_THROW(allSourcesDeleteAll());
doSync(__FILE__, __LINE__, "init", SyncOptions(SYNC_SLOW));
// now that client and server are in sync, delete locally and sync again
for (it = sources.begin(); it != sources.end(); ++it) {
CT_ASSERT_NO_THROW(it->second->deleteAll(it->second->createSourceA));
}
CT_ASSERT_NO_THROW(allSourcesDeleteAll());
doSync(__FILE__, __LINE__,
"twoway",
SyncOptions(SYNC_TWO_WAY,
@ -2660,9 +2655,7 @@ void SyncTests::deleteAll(DeleteAllMode mode) {
break;
case DELETE_ALL_REFRESH:
// delete locally and then tell the server to "copy" the empty databases
for (it = sources.begin(); it != sources.end(); ++it) {
CT_ASSERT_NO_THROW(it->second->deleteAll(it->second->createSourceA));
}
CT_ASSERT_NO_THROW(allSourcesDeleteAll());
doSync(__FILE__, __LINE__,
"refreshserver",
SyncOptions(RefreshFromLocalMode(),
@ -2682,10 +2675,7 @@ void SyncTests::doCopy() {
accessClientB->deleteAll();
// insert into first database, copy to server
source_it it;
for (it = sources.begin(); it != sources.end(); ++it) {
CT_ASSERT_NO_THROW(it->second->testSimpleInsert());
}
CT_ASSERT_NO_THROW(allSourcesInsert());
doSync(__FILE__, __LINE__,
"send",
SyncOptions(SYNC_TWO_WAY,
@ -2706,11 +2696,7 @@ void SyncTests::doCopy() {
* servers do no support SYNC_REFRESH_FROM_SERVER
*/
void SyncTests::refreshClient(SyncOptions options) {
source_it it;
for (it = sources.begin(); it != sources.end(); ++it) {
CT_ASSERT_NO_THROW(it->second->deleteAll(it->second->createSourceA));
}
CT_ASSERT_NO_THROW(allSourcesDeleteAll());
doSync(__FILE__, __LINE__,
"refresh",
options
@ -2724,15 +2710,11 @@ void SyncTests::testDeleteAllRefresh() {
source_it it;
// start with clean local data
for (it = sources.begin(); it != sources.end(); ++it) {
CT_ASSERT_NO_THROW(it->second->deleteAll(it->second->createSourceA));
}
CT_ASSERT_NO_THROW(allSourcesDeleteAll());
// copy something to server first; doesn't matter whether it has the
// item already or not, as long as it exists there afterwards
for (it = sources.begin(); it != sources.end(); ++it) {
CT_ASSERT_NO_THROW(it->second->testSimpleInsert());
}
CT_ASSERT_NO_THROW(allSourcesInsert());
doSync(__FILE__, __LINE__, "insert", SyncOptions(SYNC_SLOW));
// now ensure we can delete it
@ -2808,9 +2790,7 @@ void SyncTests::testRefreshFromServerSemantic() {
CT_ASSERT_NO_THROW(deleteAll());
// insert item, then refresh from empty server
for (it = sources.begin(); it != sources.end(); ++it) {
CT_ASSERT_NO_THROW(it->second->testSimpleInsert());
}
CT_ASSERT_NO_THROW(allSourcesInsert());
doSync(__FILE__, __LINE__,
"refresh",
SyncOptions(RefreshFromPeerMode(),
@ -2838,18 +2818,14 @@ void SyncTests::testRefreshFromClientSemantic() {
CT_ASSERT_NO_THROW(deleteAll());
// insert item, send to server
for (it = sources.begin(); it != sources.end(); ++it) {
CT_ASSERT_NO_THROW(it->second->testSimpleInsert());
}
CT_ASSERT_NO_THROW(allSourcesInsert());
doSync(__FILE__, __LINE__,
"send",
SyncOptions(SYNC_TWO_WAY,
CheckSyncReport(0,0,0, 1,0,0, true, SYNC_TWO_WAY)));
// delete locally
for (it = sources.begin(); it != sources.end(); ++it) {
CT_ASSERT_NO_THROW(it->second->deleteAll(it->second->createSourceA));
}
CT_ASSERT_NO_THROW(allSourcesDeleteAll());
// refresh from client
doSync(__FILE__, __LINE__,
@ -2873,15 +2849,9 @@ void SyncTests::testRefreshFromClientSemantic() {
void SyncTests::testRefreshStatus() {
source_it it;
for (it = sources.begin(); it != sources.end(); ++it) {
CT_ASSERT_NO_THROW(it->second->testSimpleInsert());
}
for (it = sources.begin(); it != sources.end(); ++it) {
CT_ASSERT_NO_THROW(it->second->deleteAll(it->second->createSourceA));
}
for (it = sources.begin(); it != sources.end(); ++it) {
CT_ASSERT_NO_THROW(it->second->testSimpleInsert());
}
CT_ASSERT_NO_THROW(allSourcesInsert());
CT_ASSERT_NO_THROW(allSourcesDeleteAll());
CT_ASSERT_NO_THROW(allSourcesInsert());
doSync(__FILE__, __LINE__,
"refresh-from-client",
SyncOptions(RefreshFromLocalMode(),
@ -2964,10 +2934,7 @@ void SyncTests::testDelete() {
CT_ASSERT_NO_THROW(doCopy());
// delete it on A
source_it it;
for (it = sources.begin(); it != sources.end(); ++it) {
CT_ASSERT_NO_THROW(it->second->deleteAll(it->second->createSourceA));
}
CT_ASSERT_NO_THROW(allSourcesDeleteAll());
// transfer change from A to server to B
doSync(__FILE__, __LINE__,
@ -2980,7 +2947,7 @@ void SyncTests::testDelete() {
CheckSyncReport(0,0,1, 0,0,0, true, SYNC_TWO_WAY)));
// check client B: shouldn't have any items now
for (it = sources.begin(); it != sources.end(); ++it) {
for (source_it it = sources.begin(); it != sources.end(); ++it) {
TestingSyncSourcePtr copy;
SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(it->second->createSourceA()));
SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get()));
@ -3728,9 +3695,7 @@ void SyncTests::testManyDeletes() {
CT_ASSERT_NO_THROW(compareDatabases());
// delete everything locally
BOOST_FOREACH(source_array_t::value_type &source_pair, sources) {
source_pair.second->deleteAll(source_pair.second->createSourceA);
}
CT_ASSERT_NO_THROW(allSourcesDeleteAll());
doSync(__FILE__, __LINE__,
"delete-server",
SyncOptions(SYNC_TWO_WAY,
@ -3774,9 +3739,7 @@ void SyncTests::testSlowSyncSemantic()
"refresh",
SyncOptions(SYNC_TWO_WAY,
CheckSyncReport(0,-1,0, 0,0,0, true, SYNC_TWO_WAY)));
BOOST_FOREACH(source_array_t::value_type &source_pair, accessClientB->sources) {
source_pair.second->deleteAll(source_pair.second->createSourceA);
}
CT_ASSERT_NO_THROW(accessClientB->allSourcesDeleteAll());
accessClientB->doSync(__FILE__, __LINE__,
"delete",
SyncOptions(SYNC_TWO_WAY,
@ -3823,9 +3786,7 @@ void SyncTests::testComplexRefreshFromServerSemantic()
}
// delete that item via A, check again
BOOST_FOREACH(source_array_t::value_type &source_pair, sources) {
source_pair.second->deleteAll(source_pair.second->createSourceA);
}
CT_ASSERT_NO_THROW(allSourcesDeleteAll());
doSync(__FILE__, __LINE__,
"delete-item",
SyncOptions(SYNC_TWO_WAY,
@ -3854,18 +3815,14 @@ void SyncTests::testDeleteBothSides()
{
CT_ASSERT_NO_THROW(testCopy());
source_it it;
for (it = sources.begin(); it != sources.end(); ++it) {
CT_ASSERT_NO_THROW(it->second->deleteAll(it->second->createSourceA));
}
for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) {
CT_ASSERT_NO_THROW(it->second->deleteAll(it->second->createSourceA));
}
CT_ASSERT_NO_THROW(allSourcesDeleteAll());
CT_ASSERT_NO_THROW(accessClientB->allSourcesDeleteAll());
doSync(__FILE__, __LINE__,
"delete-item-A",
SyncOptions(SYNC_TWO_WAY,
CheckSyncReport(0,0,0, 0,0,1, true, SYNC_TWO_WAY)));
source_it it;
for (it = sources.begin(); it != sources.end(); ++it) {
if (it->second->config.m_createSourceB) {
TestingSyncSourcePtr source;
@ -5168,6 +5125,21 @@ void SyncTests::postSync(int res, const std::string &logname)
client.postSync(res, logname);
}
void SyncTests::allSourcesInsert()
{
BOOST_FOREACH(source_array_t::value_type &source_pair, sources) {
CT_ASSERT_NO_THROW(source_pair.second->testSimpleInsert());
}
}
void SyncTests::allSourcesDeleteAll()
{
BOOST_FOREACH(source_array_t::value_type &source_pair, sources) {
CT_ASSERT_NO_THROW(source_pair.second->deleteAll(source_pair.second->createSourceA));
}
}
/** generates tests on demand based on what the client supports */
class ClientTestFactory : public CppUnit::TestFactory {
public:

View File

@ -849,6 +849,10 @@ protected:
CT_WRAP_ASSERT(file, line, doSync(options));
}
virtual void postSync(int res, const std::string &logname);
private:
void allSourcesInsert();
void allSourcesDeleteAll();
};
/*