ClientTest: enabling the test with virtual syncsource

Virtual syncsource should be viewed as a single source by the synccontext while
as a list of sub datasources for the LocalTest.
This commit is contained in:
Chen Congwu 2009-12-16 14:43:08 +08:00
parent 36b76a6edd
commit 426526e496
5 changed files with 91 additions and 22 deletions

View File

@ -335,8 +335,9 @@ public:
virtual void updateConfig(ClientTestConfig &config) const
{
config.type = "evolution-calendar";
config.type = "virtual:text/x-vcalendar";
}
} superTest;
static class MemoTest : public RegisterSyncSourceTest {

View File

@ -185,10 +185,25 @@ public:
BOOST_FOREACH(const RegisterSyncSourceTest *test, m_configs) {
if (sources.find(test->m_configName) != sources.end()) {
m_source2Config.push_back(test->m_configName);
m_syncSource2Config.push_back(test->m_configName);
}
}
/* Local Test SyncSource : remove all virtual datastores, inserting the
* sub datastores*/
ClientTest::Config conf;
BOOST_FOREACH (string source, sources) {
getSourceConfig (source, conf);
if (conf.subConfigs) {
vector<string> subs;
boost::split (subs, conf.subConfigs, boost::is_any_of(","));
BOOST_FOREACH (string sub, subs) {
m_localSource2Config.push_back (sub);
}
} else {
m_localSource2Config.push_back (source);
}
}
// get configuration and set obligatory fields
LoggerBase::instance().setLevel(Logger::DEBUG);
std::string root = std::string("evolution/") + server + "_" + id;
@ -241,12 +256,34 @@ public:
return new EvolutionLocalTests(name, *this, sourceParam, co);
}
virtual int getNumSources() {
return m_source2Config.size();
virtual int getNumLocalSources() {
return m_localSource2Config.size();
}
virtual void getSourceConfig(int source, Config &config) {
getSourceConfig(m_configs[m_source2Config[source]], config);
virtual int getNumSyncSources() {
return m_syncSource2Config.size();
}
virtual void getLocalSourceConfig(int source, Config &config) {
getSourceConfig(m_configs[m_localSource2Config[source]], config);
}
virtual void getSyncSourceConfig(int source, Config &config) {
getSourceConfig(m_configs[m_syncSource2Config[source]], config);
}
virtual int getLocalSourcePosition(const string &configName) {
for (size_t i=0; i< m_localSource2Config.size(); i++) {
if(m_localSource2Config[i] == configName) {
return i;
break;
}
}
return -1;
}
virtual void getSourceConfig (const string &configName, Config &config) {
return getSourceConfig (m_configs[configName], config);
}
static void getSourceConfig(const RegisterSyncSourceTest *test, Config &config) {
@ -335,7 +372,7 @@ public:
filter[SyncSourceConfig::m_sourcePropSync.getName()] =
PrettyPrintSyncMode(options.m_syncMode);
for(int i = 0; sources[i] >= 0; i++) {
client.setConfigFilter(false, m_source2Config[sources[i]], filter);
client.setConfigFilter(false, m_syncSource2Config[sources[i]], filter);
}
SyncReport report;
@ -357,7 +394,8 @@ private:
* This is the mapping to the corresponding config name, created when
* constructing this instance.
*/
vector<string> m_source2Config;
vector<string> m_localSource2Config;
vector<string> m_syncSource2Config;
/** returns the name of the Evolution database */
string getDatabaseName(const string &configName) {
@ -366,7 +404,7 @@ private:
static TestingSyncSource *createSource(ClientTest &client, int source, bool isSourceA) {
TestEvolution &evClient((TestEvolution &)client);
string name = evClient.m_source2Config[source];
string name = evClient.m_localSource2Config[source];
string database = evClient.getDatabaseName(name);
SyncConfig config("client-test-changes");

View File

@ -370,6 +370,11 @@ struct ClientTestConfig{
*/
const char *type;
/**
* a list of sub configs separated via , if this is a super datastore
*/
const char *subConfigs;
/**
* TRUE if the source supports recovery from an interrupted
* synchronization. Enables the Client::Sync::*::Retry group

View File

@ -1390,18 +1390,26 @@ SyncTests::SyncTests(const std::string &name, ClientTest &cl, std::vector<int> s
it != sourceIndices.end();
++it) {
ClientTest::Config config;
client.getSourceConfig(*it, config);
client.getSyncSourceConfig(*it, config);
if (config.sourceName) {
sourceArray[sources.size()+offset] = *it;
if (strcmp (config.sourceName, "super")) {
sources.push_back(std::pair<int,LocalTests *>(*it, cl.createLocalTests(config.sourceName, *it, config)));
} else {
if (config.subConfigs) {
vector<string> subs;
boost::split (subs, config.subConfigs, boost::is_any_of(","));
offset++;
ClientTest::Config subConfig;
BOOST_FOREACH (string sub, subs) {
client.getSourceConfig (sub, subConfig);
sources.push_back(std::pair<int,LocalTests *>(*it, cl.createLocalTests(sub, client.getLocalSourcePosition(sub), subConfig)));
offset--;
}
} else {
sources.push_back(std::pair<int,LocalTests *>(*it, cl.createLocalTests(config.sourceName, client.getLocalSourcePosition(config.sourceName), config)));
}
}
}
sourceArray[sources.size()+offset] = -1;
sourceArray[sources.size()+ offset] = -1;
// check whether we have a second client
ClientTest *clientB = cl.getClientB();
@ -3126,9 +3134,9 @@ public:
// create local source tests
tests = new CppUnit::TestSuite(alltests->getName() + "::Source");
for (source=0; source < client.getNumSources(); source++) {
for (source=0; source < client.getNumLocalSources(); source++) {
ClientTest::Config config;
client.getSourceConfig(source, config);
client.getLocalSourceConfig(source, config);
if (config.sourceName) {
LocalTests *sourcetests =
client.createLocalTests(tests->getName() + "::" + config.sourceName, source, config);
@ -3141,9 +3149,9 @@ public:
// create sync tests with just one source
tests = new CppUnit::TestSuite(alltests->getName() + "::Sync");
for (source=0; source < client.getNumSources(); source++) {
for (source=0; source < client.getNumSyncSources(); source++) {
ClientTest::Config config;
client.getSourceConfig(source, config);
client.getSyncSourceConfig(source, config);
if (config.sourceName) {
std::vector<int> sources;
sources.push_back(source);
@ -3158,9 +3166,9 @@ public:
// that would be identical to the test above
std::vector<int> sources;
std::string name, name_reversed;
for (source=0; source < client.getNumSources(); source++) {
for (source=0; source < client.getNumSyncSources(); source++) {
ClientTest::Config config;
client.getSourceConfig(source, config);
client.getSyncSourceConfig(source, config);
if (config.sourceName) {
sources.push_back(source);
if (name.size() > 0) {
@ -3902,6 +3910,8 @@ void ClientTest::getTestData(const char *type, Config &config)
config.uniqueProperties = "SUMMARY:DESCRIPTION";
config.sizeProperty = "DESCRIPTION";
config.testcases = "testcases/imemo20.ics";
}else if (!strcmp (type, "super")) {
config.subConfigs = "ical20,itodo20";
}
}

View File

@ -291,15 +291,30 @@ class ClientTest {
* Data sources are enumbered from 0 to n-1 for the purpose of
* testing. This call returns n.
*/
virtual int getNumSources() = 0;
virtual int getNumLocalSources() = 0;
virtual int getNumSyncSources() = 0;
/**
* Called to fill the given test source config with information
* about a sync source identified by its index. It's okay to only
* fill in the available pieces of information and set everything
* else to zero.
* Two kinds of source config indexs are maintained, used for localSources
* and SyncSources, this is because virtual datasoures should be visible as
* a whole to the synccontext while should be viewed as a list of sub
* datasoures for Localtests.
*/
virtual void getSourceConfig(int source, Config &config) = 0;
virtual void getLocalSourceConfig(int source, Config &config) = 0;
virtual void getSyncSourceConfig(int source, Config &config) = 0;
/**
* Find the correspoding test source config via config name.
*/
virtual void getSourceConfig(const string &configName, Config &config) =0;
/*
* Give me a test source config name, return the index in localSyncSources.
* */
virtual int getLocalSourcePosition (const string &configName) =0;
/**
* The instance to use as second client. Returning NULL disables