mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-06-07 06:02:41 -04:00
Updated GXS tests, lots of mem leak fixes from valgrind run.
- mem leak caused by not deleting stored msgs and groups, rsdatastore now a group/msg sink - mem leak caused in rsgxsnetservice by not deleting meta information after retrieval - fixed mem leak in rstlvkeyset::getTlv due to tlvbindata making own data copy git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.5-gxs-b1@5616 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
0fc3a2704b
commit
bdd6c6041b
9 changed files with 101 additions and 47 deletions
|
@ -508,7 +508,19 @@ int RsDataService::storeMessage(std::map<RsNxsMsg *, RsGxsMsgMetaData *> &msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// finish transaction
|
// finish transaction
|
||||||
return mDb->execSQL("COMMIT;");
|
bool ret = mDb->execSQL("COMMIT;");
|
||||||
|
|
||||||
|
for(mit = msg.begin(); mit != msg.end(); mit++)
|
||||||
|
{
|
||||||
|
//TODO: API encourages aliasing, remove this abomination
|
||||||
|
if(mit->second != mit->first->metaData)
|
||||||
|
delete mit->second;
|
||||||
|
|
||||||
|
delete mit->first;
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -519,7 +531,8 @@ int RsDataService::storeGroup(std::map<RsNxsGrp *, RsGxsGrpMetaData *> &grp)
|
||||||
// begin transaction
|
// begin transaction
|
||||||
mDb->execSQL("BEGIN;");
|
mDb->execSQL("BEGIN;");
|
||||||
|
|
||||||
for(; sit != grp.end(); sit++){
|
for(; sit != grp.end(); sit++)
|
||||||
|
{
|
||||||
|
|
||||||
RsNxsGrp* grpPtr = sit->first;
|
RsNxsGrp* grpPtr = sit->first;
|
||||||
RsGxsGrpMetaData* grpMetaPtr = sit->second;
|
RsGxsGrpMetaData* grpMetaPtr = sit->second;
|
||||||
|
@ -589,7 +602,18 @@ int RsDataService::storeGroup(std::map<RsNxsGrp *, RsGxsGrpMetaData *> &grp)
|
||||||
mDb->sqlInsert(GRP_TABLE_NAME, "", cv);
|
mDb->sqlInsert(GRP_TABLE_NAME, "", cv);
|
||||||
}
|
}
|
||||||
// finish transaction
|
// finish transaction
|
||||||
return mDb->execSQL("COMMIT;");
|
bool ret = mDb->execSQL("COMMIT;");
|
||||||
|
|
||||||
|
for(sit = grp.begin(); sit != grp.end(); sit++)
|
||||||
|
{
|
||||||
|
//TODO: API encourages aliasing, remove this abomination
|
||||||
|
if(sit->second != sit->first->metaData)
|
||||||
|
delete sit->second;
|
||||||
|
delete sit->first;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int RsDataService::retrieveNxsGrps(std::map<std::string, RsNxsGrp *> &grp, bool withMeta, bool cache){
|
int RsDataService::retrieveNxsGrps(std::map<std::string, RsNxsGrp *> &grp, bool withMeta, bool cache){
|
||||||
|
|
|
@ -564,8 +564,9 @@ void RsGenExchange::publishMsgs()
|
||||||
msg->metaData->serialise(metaDataBuff, &size);
|
msg->metaData->serialise(metaDataBuff, &size);
|
||||||
msg->meta.setBinData(metaDataBuff, size);
|
msg->meta.setBinData(metaDataBuff, size);
|
||||||
|
|
||||||
ok = createMessage(msg);
|
ok = createMessage(msg);
|
||||||
|
RsGxsMessageId msgId;
|
||||||
|
RsGxsGroupId grpId;
|
||||||
if(ok)
|
if(ok)
|
||||||
{
|
{
|
||||||
msg->metaData->mPublishTs = time(NULL);
|
msg->metaData->mPublishTs = time(NULL);
|
||||||
|
@ -581,12 +582,13 @@ void RsGenExchange::publishMsgs()
|
||||||
{
|
{
|
||||||
msg->metaData->mOrigMsgId = msg->metaData->mMsgId;
|
msg->metaData->mOrigMsgId = msg->metaData->mMsgId;
|
||||||
}
|
}
|
||||||
|
msgId = msg->msgId;
|
||||||
|
grpId = msg->grpId;
|
||||||
ok = mDataAccess->addMsgData(msg);
|
ok = mDataAccess->addMsgData(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
// add to published to allow acknowledgement
|
// add to published to allow acknowledgement
|
||||||
mMsgNotify.insert(std::make_pair(mit->first, std::make_pair(msg->grpId, msg->msgId)));
|
mMsgNotify.insert(std::make_pair(mit->first, std::make_pair(grpId, msgId)));
|
||||||
mDataAccess->updatePublicRequestStatus(mit->first, RsTokenServiceV2::GXS_REQUEST_V2_STATUS_COMPLETE);
|
mDataAccess->updatePublicRequestStatus(mit->first, RsTokenServiceV2::GXS_REQUEST_V2_STATUS_COMPLETE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -597,7 +599,7 @@ void RsGenExchange::publishMsgs()
|
||||||
std::cerr << "RsGenExchange::publishMsgs() failed to publish msg " << std::endl;
|
std::cerr << "RsGenExchange::publishMsgs() failed to publish msg " << std::endl;
|
||||||
#endif
|
#endif
|
||||||
mMsgNotify.insert(std::make_pair(mit->first, std::make_pair(RsGxsGroupId(""), RsGxsMessageId(""))));
|
mMsgNotify.insert(std::make_pair(mit->first, std::make_pair(RsGxsGroupId(""), RsGxsMessageId(""))));
|
||||||
delete msg;
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -640,11 +642,11 @@ void RsGenExchange::publishGrps()
|
||||||
grp->metaData->mGroupId = grp->grpId;
|
grp->metaData->mGroupId = grp->grpId;
|
||||||
ok = grp->metaData->serialise(mData, size);
|
ok = grp->metaData->serialise(mData, size);
|
||||||
grp->meta.setBinData(mData, size);
|
grp->meta.setBinData(mData, size);
|
||||||
|
RsGxsGroupId grpId = grp->grpId;
|
||||||
ok = mDataAccess->addGroupData(grp);
|
mDataAccess->addGroupData(grp);
|
||||||
|
|
||||||
// add to published to allow acknowledgement
|
// add to published to allow acknowledgement
|
||||||
mGrpNotify.insert(std::make_pair(mit->first, grp->grpId));
|
mGrpNotify.insert(std::make_pair(mit->first, grpId));
|
||||||
mDataAccess->updatePublicRequestStatus(mit->first, RsTokenServiceV2::GXS_REQUEST_V2_STATUS_COMPLETE);
|
mDataAccess->updatePublicRequestStatus(mit->first, RsTokenServiceV2::GXS_REQUEST_V2_STATUS_COMPLETE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -695,7 +697,7 @@ void RsGenExchange::createDummyGroup(RsGxsGrpItem *grpItem)
|
||||||
ok = grp->metaData->serialise(mData, size);
|
ok = grp->metaData->serialise(mData, size);
|
||||||
grp->meta.setBinData(mData, size);
|
grp->meta.setBinData(mData, size);
|
||||||
|
|
||||||
ok = mDataAccess->addGroupData(grp);
|
mDataAccess->addGroupData(grp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!ok)
|
if(!ok)
|
||||||
|
|
|
@ -100,6 +100,8 @@ void RsGxsNetService::syncWithPeers()
|
||||||
|
|
||||||
if(meta->mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_SUBSCRIBED)
|
if(meta->mSubscribeFlags & GXS_SERV::GROUP_SUBSCRIBE_SUBSCRIBED)
|
||||||
grpIds.push_back(mit->first);
|
grpIds.push_back(mit->first);
|
||||||
|
|
||||||
|
delete meta;
|
||||||
}
|
}
|
||||||
|
|
||||||
sit = peers.begin();
|
sit = peers.begin();
|
||||||
|
@ -1131,6 +1133,7 @@ void RsGxsNetService::handleRecvSyncGroup(RsNxsSyncGrp* item)
|
||||||
gItem->PeerId(peer);
|
gItem->PeerId(peer);
|
||||||
gItem->transactionNumber = transN;
|
gItem->transactionNumber = transN;
|
||||||
itemL.push_back(gItem);
|
itemL.push_back(gItem);
|
||||||
|
delete mit->second; // release resource
|
||||||
}
|
}
|
||||||
|
|
||||||
tr->mFlag = NxsTransaction::FLAG_STATE_WAITING_CONFIRM;
|
tr->mFlag = NxsTransaction::FLAG_STATE_WAITING_CONFIRM;
|
||||||
|
|
|
@ -322,7 +322,7 @@ bool RsTlvSecurityKeySet::GetTlv(void *data, uint32_t size, uint32_t *offset) /
|
||||||
if (ok)
|
if (ok)
|
||||||
{
|
{
|
||||||
keys[key.keyId] = key;
|
keys[key.keyId] = key;
|
||||||
key.ShallowClear(); /* so that the Map can get control - should be ref counted*/
|
key.TlvClear(); /* so that the Map can get control - should be ref counted*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include "genexchangetester.h"
|
#include "genexchangetester.h"
|
||||||
#include "support.h"
|
#include "support.h"
|
||||||
#include "gxs/rsdataservice.h"
|
#include "gxs/rsdataservice.h"
|
||||||
|
#include "gxs/rsgxsflags.h"
|
||||||
|
|
||||||
|
|
||||||
GenExchangeTester::GenExchangeTester()
|
GenExchangeTester::GenExchangeTester()
|
||||||
|
@ -1404,7 +1405,7 @@ void GenExchangeTester::init(RsGroupMetaData &grpMeta) const
|
||||||
grpMeta.mPop = randNum();
|
grpMeta.mPop = randNum();
|
||||||
grpMeta.mSignFlags = randNum();
|
grpMeta.mSignFlags = randNum();
|
||||||
grpMeta.mPublishTs = randNum();
|
grpMeta.mPublishTs = randNum();
|
||||||
grpMeta.mSubscribeFlags = randNum();
|
grpMeta.mSubscribeFlags = GXS_SERV::GROUP_SUBSCRIBE_ADMIN;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1510,7 +1511,7 @@ void GenExchangeTester::pollForToken(uint32_t token, const RsTokReqOptionsV2 &op
|
||||||
Sleep((int) (timeDelta * 1000));
|
Sleep((int) (timeDelta * 1000));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(RsTokenServiceV2::GXS_REQUEST_STATUS_COMPLETE ==
|
if(RsTokenServiceV2::GXS_REQUEST_V2_STATUS_COMPLETE ==
|
||||||
mTokenService->requestStatus(token))
|
mTokenService->requestStatus(token))
|
||||||
{
|
{
|
||||||
switch(opts.mReqType)
|
switch(opts.mReqType)
|
||||||
|
|
|
@ -10,7 +10,7 @@ QT += core network
|
||||||
|
|
||||||
QT -= gui
|
QT -= gui
|
||||||
|
|
||||||
CONFIG += gen_exchange_target #dstore_target
|
CONFIG += dstore_target #gen_exchange_target # #nxs_net_test
|
||||||
|
|
||||||
dstore_target {
|
dstore_target {
|
||||||
|
|
||||||
|
@ -24,6 +24,12 @@ TARGET = gen_exchange_test
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nxs_net_test {
|
||||||
|
|
||||||
|
TARGET = nxs_net_test
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
CONFIG += console
|
CONFIG += console
|
||||||
CONFIG -= app_bundle
|
CONFIG -= app_bundle
|
||||||
|
|
||||||
|
@ -187,4 +193,21 @@ gen_exchange_target {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nxs_net_test {
|
||||||
|
|
||||||
|
SOURCES += \
|
||||||
|
support.cc \
|
||||||
|
nxstesthub.cc \
|
||||||
|
rsgxsnetservice_test.cc \
|
||||||
|
nxstestscenario.cc \
|
||||||
|
data_support.cc
|
||||||
|
|
||||||
|
|
||||||
|
HEADERS += support.h \
|
||||||
|
nxstesthub.h \
|
||||||
|
rsgxsnetservice_test.h \
|
||||||
|
nxstestscenario.h \
|
||||||
|
data_support.h
|
||||||
|
}
|
||||||
|
|
||||||
INCLUDEPATH += ../../
|
INCLUDEPATH += ../../
|
||||||
|
|
|
@ -82,16 +82,6 @@ void NxsMessageTest::populateStore(RsGeneralDataService* dStore)
|
||||||
|
|
||||||
dStore->storeGroup(grps);
|
dStore->storeGroup(grps);
|
||||||
|
|
||||||
|
|
||||||
std::map<RsNxsGrp*, RsGxsGrpMetaData*>::iterator grp_it
|
|
||||||
= grps.begin();
|
|
||||||
for(; grp_it != grps.end(); grp_it++)
|
|
||||||
{
|
|
||||||
delete grp_it->first;
|
|
||||||
delete grp_it->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int nMsgs = rand()%23;
|
int nMsgs = rand()%23;
|
||||||
std::map<RsNxsMsg*, RsGxsMsgMetaData*> msgs;
|
std::map<RsNxsMsg*, RsGxsMsgMetaData*> msgs;
|
||||||
RsNxsMsg* msg = NULL;
|
RsNxsMsg* msg = NULL;
|
||||||
|
@ -119,16 +109,6 @@ void NxsMessageTest::populateStore(RsGeneralDataService* dStore)
|
||||||
|
|
||||||
dStore->storeMessage(msgs);
|
dStore->storeMessage(msgs);
|
||||||
|
|
||||||
// clean up
|
|
||||||
std::map<RsNxsMsg*, RsGxsMsgMetaData*>::iterator msg_it
|
|
||||||
= msgs.begin();
|
|
||||||
|
|
||||||
for(; msg_it != msgs.end(); msg_it++)
|
|
||||||
{
|
|
||||||
delete msg_it->first;
|
|
||||||
delete msg_it->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ void test_groupStoreAndRetrieve(){
|
||||||
setUp();
|
setUp();
|
||||||
|
|
||||||
int nGrp = rand()%32;
|
int nGrp = rand()%32;
|
||||||
std::map<RsNxsGrp*, RsGxsGrpMetaData*> grps;
|
std::map<RsNxsGrp*, RsGxsGrpMetaData*> grps, grps_copy;
|
||||||
RsNxsGrp* grp;
|
RsNxsGrp* grp;
|
||||||
RsGxsGrpMetaData* grpMeta;
|
RsGxsGrpMetaData* grpMeta;
|
||||||
for(int i = 0; i < nGrp; i++){
|
for(int i = 0; i < nGrp; i++){
|
||||||
|
@ -51,13 +51,21 @@ void test_groupStoreAndRetrieve(){
|
||||||
init_item(grpMeta);
|
init_item(grpMeta);
|
||||||
grpMeta->mGroupId = grp->grpId;
|
grpMeta->mGroupId = grp->grpId;
|
||||||
grps.insert(p);
|
grps.insert(p);
|
||||||
|
RsNxsGrp* grp_copy = new RsNxsGrp(RS_SERVICE_TYPE_PLUGIN_SIMPLE_FORUM);
|
||||||
|
*grp_copy = *grp;
|
||||||
|
RsGxsGrpMetaData* grpMeta_copy = new RsGxsGrpMetaData();
|
||||||
|
*grpMeta_copy = *grpMeta;
|
||||||
|
grps_copy.insert(std::make_pair(grp_copy, grpMeta_copy ));
|
||||||
grpMeta = NULL;
|
grpMeta = NULL;
|
||||||
grp = NULL;
|
grp = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
dStore->storeGroup(grps);
|
dStore->storeGroup(grps);
|
||||||
|
|
||||||
|
//use copy, a grps are deleted in store
|
||||||
|
grps.clear();
|
||||||
|
grps = grps_copy;
|
||||||
|
|
||||||
std::map<RsGxsGroupId, RsNxsGrp*> gR;
|
std::map<RsGxsGroupId, RsNxsGrp*> gR;
|
||||||
std::map<RsGxsGroupId, RsGxsGrpMetaData*> grpMetaR;
|
std::map<RsGxsGroupId, RsGxsGrpMetaData*> grpMetaR;
|
||||||
dStore->retrieveNxsGrps(gR, false, false);
|
dStore->retrieveNxsGrps(gR, false, false);
|
||||||
|
@ -141,6 +149,7 @@ void test_messageStoresAndRetrieve()
|
||||||
grpV.push_back(grpId1);
|
grpV.push_back(grpId1);
|
||||||
|
|
||||||
std::map<RsNxsMsg*, RsGxsMsgMetaData*> msgs;
|
std::map<RsNxsMsg*, RsGxsMsgMetaData*> msgs;
|
||||||
|
std::map<RsNxsMsg*, RsGxsMsgMetaData*> msgs_copy;
|
||||||
RsNxsMsg* msg = NULL;
|
RsNxsMsg* msg = NULL;
|
||||||
RsGxsMsgMetaData* msgMeta = NULL;
|
RsGxsMsgMetaData* msgMeta = NULL;
|
||||||
int nMsgs = rand()%120;
|
int nMsgs = rand()%120;
|
||||||
|
@ -170,9 +179,15 @@ void test_messageStoresAndRetrieve()
|
||||||
msgMeta->mMsgId = msg->msgId;
|
msgMeta->mMsgId = msg->msgId;
|
||||||
msgMeta->mGroupId = msg->grpId = grpId;
|
msgMeta->mGroupId = msg->grpId = grpId;
|
||||||
|
|
||||||
|
RsNxsMsg* msg_copy = new RsNxsMsg(RS_SERVICE_TYPE_PLUGIN_SIMPLE_FORUM);
|
||||||
|
RsGxsMsgMetaData* msgMeta_copy = new RsGxsMsgMetaData();
|
||||||
|
|
||||||
|
*msg_copy = *msg;
|
||||||
|
*msgMeta_copy = *msgMeta;
|
||||||
|
|
||||||
// store msgs in map to use for verification
|
// store msgs in map to use for verification
|
||||||
std::pair<std::string, RsNxsMsg*> vP(msg->msgId, msg);
|
std::pair<std::string, RsNxsMsg*> vP(msg->msgId, msg_copy);
|
||||||
std::pair<std::string, RsGxsMsgMetaData*> vPmeta(msg->msgId, msgMeta);
|
std::pair<std::string, RsGxsMsgMetaData*> vPmeta(msg->msgId, msgMeta_copy);
|
||||||
|
|
||||||
if(!chosen)
|
if(!chosen)
|
||||||
{
|
{
|
||||||
|
@ -184,15 +199,21 @@ void test_messageStoresAndRetrieve()
|
||||||
VergrpId1.insert(vP);
|
VergrpId1.insert(vP);
|
||||||
VerMetagrpId0.insert(vPmeta);
|
VerMetagrpId0.insert(vPmeta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
msg = NULL;
|
msg = NULL;
|
||||||
msgMeta = NULL;
|
msgMeta = NULL;
|
||||||
|
|
||||||
msgs.insert(p);
|
msgs.insert(p);
|
||||||
|
msgs_copy.insert(std::make_pair(msg_copy, msgMeta_copy));
|
||||||
}
|
}
|
||||||
|
|
||||||
req[grpV[0]] = std::vector<RsGxsMessageId>(); // assign empty list for other
|
req[grpV[0]] = std::vector<RsGxsMessageId>(); // assign empty list for other
|
||||||
|
|
||||||
dStore->storeMessage(msgs);
|
dStore->storeMessage(msgs);
|
||||||
|
msgs.clear();
|
||||||
|
msgs = msgs_copy;
|
||||||
|
|
||||||
// now retrieve msgs for comparison
|
// now retrieve msgs for comparison
|
||||||
// first selective retrieval
|
// first selective retrieval
|
||||||
|
|
|
@ -17,16 +17,16 @@ int main()
|
||||||
// CHECK(tester.testMsgSubmissionRetrieval()); REPORT("testMsgSubmissionRetrieval()");
|
// CHECK(tester.testMsgSubmissionRetrieval()); REPORT("testMsgSubmissionRetrieval()");
|
||||||
// CHECK(tester.testSpecificMsgMetaRetrieval()); REPORT("testSpecificMsgMetaRetrieval()");
|
// CHECK(tester.testSpecificMsgMetaRetrieval()); REPORT("testSpecificMsgMetaRetrieval()");
|
||||||
// CHECK(tester.testMsgIdRetrieval()); REPORT("tester.testMsgIdRetrieval()");
|
// CHECK(tester.testMsgIdRetrieval()); REPORT("tester.testMsgIdRetrieval()");
|
||||||
//CHECK(tester.testMsgIdRetrieval_OptParents()); REPORT("tester.testRelatedMsgIdRetrieval_Parents()");
|
// CHECK(tester.testMsgIdRetrieval_OptParents()); REPORT("tester.testRelatedMsgIdRetrieval_Parents()");
|
||||||
// CHECK(tester.testMsgIdRetrieval_OptOrigMsgId()); REPORT("tester.testRelatedMsgIdRetrieval_OrigMsgId()");
|
// CHECK(tester.testMsgIdRetrieval_OptOrigMsgId()); REPORT("tester.testRelatedMsgIdRetrieval_OrigMsgId()");
|
||||||
// CHECK(tester.testMsgIdRetrieval_OptLatest()); REPORT("tester.testRelatedMsgIdRetrieval_Latest()");
|
// CHECK(tester.testMsgIdRetrieval_OptLatest()); REPORT("tester.testRelatedMsgIdRetrieval_Latest()");
|
||||||
//CHECK(tester.testMsgMetaModRequest()); REPORT("tester.testMsgMetaModRequest()");
|
// CHECK(tester.testMsgMetaModRequest()); REPORT("tester.testMsgMetaModRequest()");
|
||||||
CHECK(tester.testMsgChildRetrieval()); REPORT("tester.testMsgMetaModRequest()");
|
// CHECK(tester.testMsgChildRetrieval()); REPORT("tester.testMsgMetaModRequest()");
|
||||||
|
|
||||||
// CHECK(tester.testGrpSubmissionRetrieval()); REPORT("tester.testGrpSubmissionRetrieval()");
|
CHECK(tester.testGrpSubmissionRetrieval()); REPORT("tester.testGrpSubmissionRetrieval()");
|
||||||
// CHECK(tester.testGrpMetaRetrieval()); REPORT("tester.testGrpMetaRetrieval()");
|
CHECK(tester.testGrpMetaRetrieval()); REPORT("tester.testGrpMetaRetrieval()");
|
||||||
// CHECK(tester.testGrpIdRetrieval()); REPORT("tester.testGrpIdRetrieval()");
|
CHECK(tester.testGrpIdRetrieval()); REPORT("tester.testGrpIdRetrieval()");
|
||||||
// CHECK(tester.testGrpMetaModRequest()); REPORT("tester.testGrpMetaModRequest()");
|
CHECK(tester.testGrpMetaModRequest()); REPORT("tester.testGrpMetaModRequest()");
|
||||||
|
|
||||||
FINALREPORT("RsGenExchangeTest");
|
FINALREPORT("RsGenExchangeTest");
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue