client-test: added interrupted sync tests with split items

The tests are expected to run with a maximum message size of 20000
used by both client *and* server - server must be configured
accordingly.

Then the Add and Update operations in the interrupted sync with
client B are done with an item that is larger than the message size
and thus depends on <MoreData> support. On resume, only the second
half is sent and the recipient must assemble the complete item.
This commit is contained in:
Patrick Ohly 2010-02-26 17:19:12 +01:00
parent ecc76a4fef
commit 446b5bfbd1
2 changed files with 57 additions and 7 deletions

View File

@ -1519,6 +1519,10 @@ void SyncTests::addTests() {
ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeServerAdd);
ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeServerRemove);
ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeServerUpdate);
ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeClientAddBig);
ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeClientUpdateBig);
ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeServerAddBig);
ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeServerUpdateBig);
ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeFull);
addTest(FilterTest(retryTests));
}
@ -2829,6 +2833,13 @@ void SyncTests::doInterruptResume(int changes,
bool equal = true;
bool resend = dynamic_cast <TransportResendInjector *> (wrapper.get()) != NULL;
// better be large enough for complete DevInf, 20000 is already a
// bit small when running with many stores
size_t maxMsgSize = 20000;
size_t changedItemSize = (changes & BIG) ?
3 * maxMsgSize / 2 :
0;
while (true) {
char buffer[80];
sprintf(buffer, "%d", interruptAtMessage);
@ -2866,7 +2877,7 @@ void SyncTests::doInterruptResume(int changes,
for (i = 0; i < sources.size(); i++) {
if (changes & SERVER_ADD) {
sources[i].second->insertManyItems(sources[i].second->createSourceA,
4, 1, 0);
4, 1, changedItemSize);
}
if (changes & SERVER_REMOVE) {
// remove second item
@ -2877,19 +2888,21 @@ void SyncTests::doInterruptResume(int changes,
// update third item
updateItem(sources[i].second->createSourceA,
*(++ ++clientAluids[i].begin()),
sources[i].second->createItem(3, "updated", 0).c_str());
sources[i].second->createItem(3, "updated", changedItemSize).c_str());
}
}
// send using the same mode as in the interrupted sync with client B
if (changes & (SERVER_ADD|SERVER_REMOVE|SERVER_UPDATE)) {
doSync("changesFromA", SyncOptions(SYNC_TWO_WAY));
doSync("changesFromA", SyncOptions(SYNC_TWO_WAY).setMaxMsgSize(maxMsgSize));
}
// make changes as requested on client B
for (i = 0; i < sources.size(); i++) {
if (changes & CLIENT_ADD) {
accessClientB->sources[i].second->insertManyItems(accessClientB->sources[i].second->createSourceA,
14, 1, 0);
14, 1, changedItemSize);
}
if (changes & CLIENT_REMOVE) {
// remove second item
@ -2900,7 +2913,7 @@ void SyncTests::doInterruptResume(int changes,
// update third item
updateItem(accessClientB->sources[i].second->createSourceA,
*(++ ++clientBluids[i].begin()),
accessClientB->sources[i].second->createItem(13, "updated", 0).c_str());
accessClientB->sources[i].second->createItem(13, "updated", changedItemSize).c_str());
}
}
@ -2913,7 +2926,8 @@ void SyncTests::doInterruptResume(int changes,
accessClientB->doSync("changesFromB",
SyncOptions(SYNC_TWO_WAY,
CheckSyncReport(-1, -1, -1, -1,
-1, -1, resend)).setTransportAgent(wrapper));
-1, -1, resend)).setTransportAgent(wrapper)
.setMaxMsgSize(maxMsgSize));
wasInterrupted = interruptAtMessage != -1 &&
wrapper->getMessageCount() <= interruptAtMessage;
wrapper->rewind();
@ -3019,6 +3033,26 @@ void SyncTests::testInterruptResumeServerUpdate()
doInterruptResume(SERVER_UPDATE, boost::shared_ptr<TransportWrapper> (new TransportFaultInjector()));
}
void SyncTests::testInterruptResumeClientAddBig()
{
doInterruptResume(CLIENT_ADD|BIG, boost::shared_ptr<TransportWrapper> (new TransportFaultInjector()));
}
void SyncTests::testInterruptResumeClientUpdateBig()
{
doInterruptResume(CLIENT_UPDATE|BIG, boost::shared_ptr<TransportWrapper> (new TransportFaultInjector()));
}
void SyncTests::testInterruptResumeServerAddBig()
{
doInterruptResume(SERVER_ADD|BIG, boost::shared_ptr<TransportWrapper> (new TransportFaultInjector()));
}
void SyncTests::testInterruptResumeServerUpdateBig()
{
doInterruptResume(SERVER_UPDATE|BIG, boost::shared_ptr<TransportWrapper> (new TransportFaultInjector()));
}
void SyncTests::testInterruptResumeFull()
{
doInterruptResume(CLIENT_ADD|CLIENT_REMOVE|CLIENT_UPDATE|

View File

@ -680,13 +680,25 @@ protected:
virtual void doInterruptResume(int changes,
boost::shared_ptr<TransportWrapper> wrapper);
/**
* CLIENT_ = change made on client B before interrupting
* SERVER_ = change made on client A and applied to server before interrupting
* while sending to B
* _ADD = new item added
* _REMOVE = existing item deleted
* _UPDATE = existing item replaced
* BIG = when adding or updating, make the new item so large that it does
* not fit into a single message
*/
enum {
CLIENT_ADD = (1<<0),
CLIENT_REMOVE = (1<<1),
CLIENT_UPDATE = (1<<2),
SERVER_ADD = (1<<3),
SERVER_REMOVE = (1<<4),
SERVER_UPDATE = (1<<5)
SERVER_UPDATE = (1<<5),
BIG = (1<<6)
};
virtual void testInterruptResumeClientAdd();
virtual void testInterruptResumeClientRemove();
@ -694,6 +706,10 @@ protected:
virtual void testInterruptResumeServerAdd();
virtual void testInterruptResumeServerRemove();
virtual void testInterruptResumeServerUpdate();
virtual void testInterruptResumeClientAddBig();
virtual void testInterruptResumeClientUpdateBig();
virtual void testInterruptResumeServerAddBig();
virtual void testInterruptResumeServerUpdateBig();
virtual void testInterruptResumeFull();
virtual void testUserSuspendClientAdd();