diff --git a/flaim/util/basic_test.cpp b/flaim/util/basic_test.cpp index 0e44d87..f7a9db1 100644 --- a/flaim/util/basic_test.cpp +++ b/flaim/util/basic_test.cpp @@ -41,6 +41,125 @@ FSTATIC const char * gv_pszSampleDictionary = " 2 field 3\n" " 3 required\n"; +#define PERSON_TAG 1 +#define LAST_NAME_TAG 2 +#define FIRST_NAME_TAG 3 +#define AGE_TAG 4 +#define LAST_NAME_FIRST_NAME_IX 5 + +#ifdef FLM_NLM + #define DB_NAME_STR "SYS:\\SAMPLE.DB" + #define DB_COPY_NAME_STR "SYS:\\SAMPLECOPY.DB" + #define DB_RENAME_NAME_STR "SYS:\\SAMPLERENAME.DB" + #define DB_RESTORE_NAME_STR "SYS:\\SAMPLERESTORE.DB" + #define BACKUP_PATH "SYS:\\SAMPLEBACKUP" +#else + #define DB_NAME_STR "sample.db" + #define DB_COPY_NAME_STR "samplecopy.db" + #define DB_RENAME_NAME_STR "samplerename.db" + #define DB_RESTORE_NAME_STR "samplerestore.db" + #define BACKUP_PATH "samplebackup" +#endif + +/*************************************************************************** +Desc: +****************************************************************************/ +class IFlmTestImpl : public TestBase +{ +public: + + IFlmTestImpl() + { + m_hDb = HFDB_NULL; + } + + virtual ~IFlmTestImpl() + { + if (m_hDb != HFDB_NULL) + { + (void)FlmDbClose( &m_hDb); + } + } + + inline const char * getName( void) + { + return( "Basic Test"); + } + + RCODE createDbTest( void); + + RCODE addRecordTest( + FLMUINT * puiDrn); + + RCODE modifyRecordTest( + FLMUINT uiDrn); + + RCODE deleteRecordTest( + FLMUINT uiDrn); + + RCODE queryRecordTest( void); + + RCODE keyRetrieveTest( + FLMUINT uiIndex, + FLMBOOL bLastNameFirstNameIx); + + RCODE addIndexTest( + FLMUINT * puiIndex); + + RCODE deleteIndexTest( + FLMUINT uiIndex); + + RCODE suspendIndexTest( + FLMUINT uiIndex); + + RCODE resumeIndexTest( + FLMUINT uiIndex); + + RCODE backupRestoreDbTest( void); + + RCODE compareRecords( + const char * pszDb1, + const char * pszDb2, + const char * pszWhat, + FlmRecord * pRecord1, + FlmRecord * pRecord2); + + RCODE compareIndexes( + const char * pszDb1, + const char * pszDb2, + HFDB hDb1, + HFDB hDb2, + FLMUINT uiIndexNum); + + RCODE compareContainers( + const char * pszDb1, + const char * pszDb2, + HFDB hDb1, + HFDB hDb2, + FLMUINT uiContainerNum); + + RCODE compareDbTest( + const char * pszDb1, + const char * pszDb2); + + RCODE copyDbTest( + const char * pszDestDbName, + const char * pszSrcDbName); + + RCODE renameDbTest( + const char * pszDestDbName, + const char * pszSrcDbName); + + RCODE removeDbTest( + const char * pszDbName); + + RCODE execute( void); + +private: + + HFDB m_hDb; +}; + const char * gv_pszFamilyNames[] = { "Walton", @@ -246,72 +365,6 @@ const char * gv_pszGivenNames[] = NULL }; -#define PERSON_TAG 1 -#define LAST_NAME_TAG 2 -#define FIRST_NAME_TAG 3 -#define AGE_TAG 4 -#define LAST_NAME_FIRST_NAME_IX 5 - -#ifdef FLM_NLM - #define DB_NAME_STR "SYS:\\SAMPLE.DB" -#else - #define DB_NAME_STR "sample.db" -#endif - -/*************************************************************************** -Desc: -****************************************************************************/ -class IFlmTestImpl : public TestBase -{ -public: - - IFlmTestImpl() - { - m_hDb = HFDB_NULL; - } - - virtual ~IFlmTestImpl() - { - if (m_hDb != HFDB_NULL) - { - (void)FlmDbClose( &m_hDb); - } - } - - inline const char * getName( void) - { - return( "Basic Test"); - } - - RCODE createDbTest( void); - - RCODE addRecordTest( - FLMUINT * puiDrn); - - RCODE modifyRecordTest( - FLMUINT uiDrn); - - RCODE deleteRecordTest( - FLMUINT uiDrn); - - RCODE queryRecordTest( void); - - RCODE keyRetrieveTest( - FLMUINT uiIndex, - FLMBOOL bLastNameFirstNameIx); - - RCODE addIndexTest( - FLMUINT * puiIndex); - - RCODE removeDbTest( void); - - RCODE execute( void); - -private: - - HFDB m_hDb; -}; - /**************************************************************************** Desc: ****************************************************************************/ @@ -1090,16 +1143,777 @@ Exit: /*************************************************************************** Desc: ****************************************************************************/ -RCODE IFlmTestImpl::removeDbTest( void) +RCODE IFlmTestImpl::deleteIndexTest( + FLMUINT uiIndex + ) { RCODE rc = FERR_OK; FLMBOOL bPassed = FALSE; + beginTest( "Delete Index Test"); + + // Delete the record from the dictionary. + + if( RC_BAD( rc = FlmRecordDelete( m_hDb, FLM_DICT_CONTAINER, uiIndex, + FLM_AUTO_TRANS | 15))) + { + MAKE_ERROR_STRING( "calling FlmRecordDelete", rc, m_szFailInfo); + goto Exit; + } + + bPassed = TRUE; + +Exit: + + endTest( bPassed); + return( rc); +} + +/*************************************************************************** +Desc: +****************************************************************************/ +RCODE IFlmTestImpl::suspendIndexTest( + FLMUINT uiIndex + ) +{ + RCODE rc = FERR_OK; + FLMBOOL bPassed = FALSE; + FINDEX_STATUS indexStatus; + + beginTest( "Suspend Index Test"); + + // Delete the record from the dictionary. + + if( RC_BAD( rc = FlmIndexSuspend( m_hDb, uiIndex))) + { + MAKE_ERROR_STRING( "calling FlmIndexSuspend", rc, m_szFailInfo); + goto Exit; + } + + // See if the index is actually suspended. + + if( RC_BAD( rc = FlmIndexStatus( m_hDb, uiIndex, &indexStatus))) + { + MAKE_ERROR_STRING( "calling FlmIndexStatus", rc, m_szFailInfo); + goto Exit; + } + + if (!indexStatus.bSuspended) + { + rc = RC_SET( FERR_FAILURE); + f_sprintf( m_szFailInfo, "FlmIndexSuspend failed to suspend index %u", + (unsigned)uiIndex); + goto Exit; + } + + bPassed = TRUE; + +Exit: + + endTest( bPassed); + return( rc); +} + +/*************************************************************************** +Desc: +****************************************************************************/ +RCODE IFlmTestImpl::resumeIndexTest( + FLMUINT uiIndex) +{ + RCODE rc = FERR_OK; + FLMBOOL bPassed = FALSE; + FINDEX_STATUS indexStatus; + + beginTest( "Resume Index Test"); + + // Delete the record from the dictionary. + + if (RC_BAD( rc = FlmIndexResume( m_hDb, uiIndex))) + { + MAKE_ERROR_STRING( "calling FlmIndexResume", rc, m_szFailInfo); + goto Exit; + } + + // Wait for the index to come on-line + + for (;;) + { + + // See if the index is actually resumed. + + if( RC_BAD( rc = FlmIndexStatus( m_hDb, uiIndex, &indexStatus))) + { + MAKE_ERROR_STRING( "calling FlmIndexStatus", rc, m_szFailInfo); + goto Exit; + } + + if (indexStatus.bSuspended) + { + rc = RC_SET( FERR_FAILURE); + f_sprintf( m_szFailInfo, "FlmIndexResume failed to resume index %u", + (unsigned)uiIndex); + goto Exit; + } + + if (indexStatus.uiLastRecordIdIndexed == RECID_UNDEFINED) + { + break; + } + } + + bPassed = TRUE; + +Exit: + + endTest( bPassed); + return( rc); +} + +/*************************************************************************** +Desc: +****************************************************************************/ +RCODE IFlmTestImpl::backupRestoreDbTest( void) +{ + RCODE rc = FERR_OK; + FLMBOOL bPassed = FALSE; + HFBACKUP hBackup = HFBACKUP_NULL; + char szTest [200]; + + // Do the backup + + beginTest( "Backup Test"); + if (RC_BAD( rc = FlmDbBackupBegin( m_hDb, FLM_FULL_BACKUP, TRUE, &hBackup))) + { + MAKE_ERROR_STRING( "calling FlmDbBackupBegin", rc, m_szFailInfo); + goto Exit; + } + if (RC_BAD( rc = FlmDbBackup( hBackup, BACKUP_PATH, NULL, NULL, NULL, NULL, + NULL))) + { + MAKE_ERROR_STRING( "calling FlmDbBackup", rc, m_szFailInfo); + goto Exit; + } + if (RC_BAD( rc = FlmDbBackupEnd( &hBackup))) + { + MAKE_ERROR_STRING( "calling FlmDbBackupEnd", rc, m_szFailInfo); + goto Exit; + } + endTest( TRUE); + + // Do the restore + + f_sprintf( szTest, "Restore Backup To %s Test", DB_RESTORE_NAME_STR); + beginTest( szTest); + if (RC_BAD( rc = FlmDbRestore( DB_RESTORE_NAME_STR, NULL, BACKUP_PATH, + NULL, NULL, NULL))) + { + MAKE_ERROR_STRING( "calling FlmDbBackupEnd", rc, m_szFailInfo); + goto Exit; + } + bPassed = TRUE; + +Exit: + + if (hBackup != HFBACKUP_NULL) + { + (void)FlmDbBackupEnd( &hBackup); + } + + endTest( bPassed); + return( rc); +} + +/*************************************************************************** +Desc: +****************************************************************************/ +RCODE IFlmTestImpl::compareRecords( + const char * pszDb1, + const char * pszDb2, + const char * pszWhat, + FlmRecord * pRecord1, + FlmRecord * pRecord2) +{ + RCODE rc = FERR_OK; + void * pvField1 = pRecord1->root(); + void * pvField2 = pRecord2->root(); + FLMUINT uiFieldNum1; + FLMUINT uiFieldNum2; + FLMUINT uiLevel1; + FLMUINT uiLevel2; + FLMUINT uiDataType1; + FLMUINT uiDataType2; + FLMUINT uiDataLength1; + FLMUINT uiDataLength2; + FLMUINT uiEncLength1; + FLMUINT uiEncLength2; + FLMUINT uiEncId1; + FLMUINT uiEncId2; + + for (;;) + { + if (!pvField1) + { + if (pvField2) + { + rc = RC_SET( FERR_FAILURE); + f_sprintf( m_szFailInfo, "%s in %s has more fields than in %s", + pszWhat, pszDb2, pszDb1); + goto Exit; + } + else + { + break; + } + } + else if (!pvField2) + { + rc = RC_SET( FERR_FAILURE); + f_sprintf( m_szFailInfo, "%s in %s has more fields than in %s", + pszWhat, pszDb1, pszDb2); + goto Exit; + } + + // Compare the field number, data type, etc. + + if (RC_BAD( rc = pRecord1->getFieldInfo( pvField1, &uiFieldNum1, + &uiLevel1, &uiDataType1, &uiDataLength1, + &uiEncLength1, &uiEncId1))) + { + MAKE_ERROR_STRING( "calling FlmRecord->getFieldInfo", rc, m_szFailInfo); + goto Exit; + } + if (RC_BAD( rc = pRecord2->getFieldInfo( pvField2, &uiFieldNum2, + &uiLevel2, &uiDataType2, &uiDataLength2, + &uiEncLength2, &uiEncId2))) + { + MAKE_ERROR_STRING( "calling FlmRecord->getFieldInfo", rc, m_szFailInfo); + goto Exit; + } + + if (uiFieldNum1 != uiFieldNum2) + { + rc = RC_SET( FERR_FAILURE); + f_sprintf( m_szFailInfo, "Field Num mismatch in %s, %s: %u, %s: %u", + pszWhat, + pszDb1, (unsigned)uiFieldNum1, + pszDb2, (unsigned)uiFieldNum2); + goto Exit; + } + if (uiLevel1 != uiLevel2) + { + rc = RC_SET( FERR_FAILURE); + f_sprintf( m_szFailInfo, "Field Level mismatch in %s, Fld: %u, %s: %u, %s: %u", + pszWhat, (unsigned)uiFieldNum1, + pszDb1, (unsigned)uiLevel1, + pszDb2, (unsigned)uiLevel2); + goto Exit; + } + if (uiDataType1 != uiDataType2) + { + rc = RC_SET( FERR_FAILURE); + f_sprintf( m_szFailInfo, "Field Type mismatch in %s, Fld: %u, %s: %u, %s: %u", + pszWhat, (unsigned)uiFieldNum1, + pszDb1, (unsigned)uiDataType1, + pszDb2, (unsigned)uiDataType2); + goto Exit; + } + if (uiDataLength1 != uiDataLength2) + { + rc = RC_SET( FERR_FAILURE); + f_sprintf( m_szFailInfo, "Field Length mismatch in %s, Fld: %u, %s: %u, %s: %u", + pszWhat, (unsigned)uiFieldNum1, + pszDb1, (unsigned)uiDataLength1, + pszDb2, (unsigned)uiDataLength2); + goto Exit; + } + if (uiEncLength1 != uiEncLength2) + { + rc = RC_SET( FERR_FAILURE); + f_sprintf( m_szFailInfo, "Field Enc. Length mismatch in %s, Fld: %u, %s: %u, %s: %u", + pszWhat, (unsigned)uiFieldNum1, + pszDb1, (unsigned)uiEncLength1, + pszDb2, (unsigned)uiEncLength2); + goto Exit; + } + if (uiEncId1 != uiEncId2) + { + rc = RC_SET( FERR_FAILURE); + f_sprintf( m_szFailInfo, "Field Enc. Id mismatch in %s, Fld: %u, %s: %u, %s: %u", + pszWhat, (unsigned)uiFieldNum1, + pszDb1, (unsigned)uiEncId1, + pszDb2, (unsigned)uiEncId2); + goto Exit; + } + + // Compare the data + + if (uiDataLength1) + { + const FLMBYTE * pucData1 = pRecord1->getDataPtr( pvField1); + const FLMBYTE * pucData2 = pRecord2->getDataPtr( pvField2); + + if (f_memcmp( pucData1, pucData2, uiDataLength1) != 0) + { + rc = RC_SET( FERR_FAILURE); + f_sprintf( m_szFailInfo, "Field Value mismatch in %s, Fld: %u", + pszWhat, (unsigned)uiFieldNum1); + goto Exit; + } + } + + // Go to the next field in each key. + + pvField1 = pRecord1->next( pvField1); + pvField2 = pRecord2->next( pvField2); + } + +Exit: + + return( rc); +} + +/*************************************************************************** +Desc: +****************************************************************************/ +RCODE IFlmTestImpl::compareIndexes( + const char * pszDb1, + const char * pszDb2, + HFDB hDb1, + HFDB hDb2, + FLMUINT uiIndexNum) +{ + RCODE rc = FERR_OK; + RCODE rc1; + RCODE rc2; + FLMUINT uiFlags1; + FLMUINT uiFlags2; + FlmRecord * pSearchKey1 = NULL; + FLMUINT uiSearchDrn1 = 0; + FlmRecord * pSearchKey2 = NULL; + FLMUINT uiSearchDrn2 = 0; + FlmRecord * pFoundKey1 = NULL; + FLMUINT uiFoundDrn1 = 0; + FlmRecord * pFoundKey2 = NULL; + FLMUINT uiFoundDrn2 = 0; + char szWhat [40]; + FLMUINT uiCount = 0; + + // Read through all keys and references in the index. Make sure they + // are identical. + + uiFlags1 = FO_FIRST; + uiFlags2 = FO_FIRST; + for (;;) + { + rc1 = FlmKeyRetrieve( hDb1, uiIndexNum, + 0, pSearchKey1, uiSearchDrn1, uiFlags1, + &pFoundKey1, &uiFoundDrn1); + rc2 = FlmKeyRetrieve( hDb2, uiIndexNum, + 0, pSearchKey2, uiSearchDrn2, uiFlags2, + &pFoundKey2, &uiFoundDrn2); + if (RC_BAD( rc1)) + { + if (rc1 == FERR_EOF_HIT) + { + if (RC_OK( rc2)) + { + rc = RC_SET( FERR_FAILURE); + f_sprintf( m_szFailInfo, "%s has more keys/refs in index %u than %2", + pszDb2, (unsigned)uiIndexNum, pszDb1); + goto Exit; + } + else if (rc2 == FERR_EOF_HIT) + { + break; + } + else + { + rc = rc2; + MAKE_ERROR_STRING( "calling FlmKeyRetrieve", rc2, m_szFailInfo); + goto Exit; + } + } + else + { + rc = rc1; + MAKE_ERROR_STRING( "calling FlmKeyRetrieve", rc1, m_szFailInfo); + goto Exit; + } + } + else + { + if (rc2 == FERR_EOF_HIT) + { + rc = RC_SET( FERR_FAILURE); + f_sprintf( m_szFailInfo, "%s has more keys/refs in index %u than %2", + pszDb1, (unsigned)uiIndexNum, pszDb2); + goto Exit; + } + else if (RC_BAD( rc2)) + { + rc = rc2; + MAKE_ERROR_STRING( "calling FlmKeyRetrieve", rc2, m_szFailInfo); + goto Exit; + } + } + + // Compare the two keys. + + uiCount++; + f_sprintf( szWhat, "Ix #%u, Key #%u", (unsigned)uiIndexNum, (unsigned)uiCount); + if (RC_BAD( rc = compareRecords( pszDb1, pszDb2, szWhat, + pFoundKey1, pFoundKey2))) + { + goto Exit; + } + + // Compare the references. + + if (uiFoundDrn1 != uiFoundDrn2) + { + rc = RC_SET( FERR_FAILURE); + f_sprintf( m_szFailInfo, "Ref DRN mismatch in %s, %s: %u, %s: %u", + szWhat, (unsigned)uiIndexNum, + pszDb1, (unsigned)uiFoundDrn1, pszDb2, (unsigned)uiFoundDrn2); + goto Exit; + } + + // Setup to get the next key. + + uiFlags1 = FO_EXCL; + uiSearchDrn1 = uiFoundDrn1; + if (pSearchKey1) + { + pSearchKey1->Release(); + } + pSearchKey1 = pFoundKey1; + pFoundKey1 = NULL; + uiFoundDrn1 = 0; + + uiFlags2 = FO_EXCL; + uiSearchDrn2 = uiFoundDrn2; + if (pSearchKey2) + { + pSearchKey2->Release(); + } + pSearchKey2 = pFoundKey2; + pFoundKey2 = NULL; + uiFoundDrn2 = 0; + } + +Exit: + + if (pSearchKey1) + { + pSearchKey1->Release(); + } + if (pSearchKey2) + { + pSearchKey2->Release(); + } + if (pFoundKey1) + { + pFoundKey1->Release(); + } + if (pFoundKey2) + { + pFoundKey2->Release(); + } + + return( rc); +} + +/*************************************************************************** +Desc: +****************************************************************************/ +RCODE IFlmTestImpl::compareContainers( + const char * pszDb1, + const char * pszDb2, + HFDB hDb1, + HFDB hDb2, + FLMUINT uiContainerNum) +{ + RCODE rc = FERR_OK; + RCODE rc1; + RCODE rc2; + FlmRecord * pRecord1 = NULL; + FLMUINT uiDrn1; + FlmRecord * pRecord2 = NULL; + FLMUINT uiDrn2; + char szWhat [40]; + + // Read through all records in the container. Make sure they + // are identical. + + uiDrn1 = 1; + uiDrn2 = 1; + for (;;) + { + rc1 = FlmRecordRetrieve( hDb1, uiContainerNum, uiDrn1, + FO_INCL, &pRecord1, &uiDrn1); + rc2 = FlmRecordRetrieve( hDb2, uiContainerNum, uiDrn2, + FO_INCL, &pRecord2, &uiDrn2); + if (RC_BAD( rc1)) + { + if (rc1 == FERR_EOF_HIT) + { + if (RC_OK( rc2)) + { + rc = RC_SET( FERR_FAILURE); + f_sprintf( m_szFailInfo, "%s has more records in container %u than %s", + pszDb2, (unsigned)uiContainerNum, pszDb1); + goto Exit; + } + else if (rc2 == FERR_EOF_HIT) + { + break; + } + else + { + rc = rc2; + MAKE_ERROR_STRING( "calling FlmRecordRetrieve", rc2, m_szFailInfo); + goto Exit; + } + } + else + { + rc = rc1; + MAKE_ERROR_STRING( "calling FlmRecordRetrieve", rc1, m_szFailInfo); + goto Exit; + } + } + else + { + if (rc2 == FERR_EOF_HIT) + { + rc = RC_SET( FERR_FAILURE); + f_sprintf( m_szFailInfo, "%s has more records in container %u than %s", + pszDb1, (unsigned)uiContainerNum, pszDb2); + goto Exit; + } + else if (RC_BAD( rc2)) + { + rc = rc2; + MAKE_ERROR_STRING( "calling FlmRecordRetrieve", rc2, m_szFailInfo); + goto Exit; + } + } + + // Make sure these records have the same DRN + + if (uiDrn1 != uiDrn2) + { + rc = RC_SET( FERR_FAILURE); + f_sprintf( m_szFailInfo, "DRN mismatch in container %u, %s: %u, %s: %u", + (unsigned)uiContainerNum, + pszDb1, (unsigned)uiDrn1, pszDb2, (unsigned)uiDrn2); + goto Exit; + } + + // Compare the two records. + + f_sprintf( szWhat, "Cont #%u, Rec #%u", (unsigned)uiContainerNum, + (unsigned)uiDrn1); + if (RC_BAD( rc = compareRecords( pszDb1, pszDb2, szWhat, + pRecord1, pRecord2))) + { + goto Exit; + } + + // If we are doing the dictionary container, we will jump out + // to check any containers or indexes that it defines. + + if (uiContainerNum == FLM_DICT_CONTAINER) + { + if (pRecord1->getFieldID( pRecord1->root()) == FLM_CONTAINER_TAG) + { + if (RC_BAD( rc = compareContainers( pszDb1, pszDb2, hDb1, hDb2, uiDrn1))) + { + goto Exit; + } + } + else if (pRecord1->getFieldID( pRecord1->root()) == FLM_INDEX_TAG) + { + if (RC_BAD( rc = compareIndexes( pszDb1, pszDb2, hDb1, hDb2, uiDrn1))) + { + goto Exit; + } + } + } + + uiDrn1++; + uiDrn2++; + } + +Exit: + + if (pRecord1) + { + pRecord1->Release(); + } + if (pRecord2) + { + pRecord2->Release(); + } + return( rc); +} + +/*************************************************************************** +Desc: +****************************************************************************/ +RCODE IFlmTestImpl::compareDbTest( + const char * pszDb1, + const char * pszDb2) +{ + RCODE rc = FERR_OK; + FLMBOOL bPassed = FALSE; + char szTest [200]; + HFDB hDb1 = HFDB_NULL; + HFDB hDb2 = HFDB_NULL; + + f_sprintf( szTest, "Compare Database Test (%s,%s)", + pszDb1, pszDb2); + beginTest( szTest); + + // Open each database. + + if( RC_BAD( rc = FlmDbOpen( pszDb1, NULL, NULL, + FO_DONT_RESUME_BACKGROUND_THREADS, NULL, &hDb1))) + { + MAKE_ERROR_STRING( "calling FlmDbOpen", rc, m_szFailInfo); + goto Exit; + } + if( RC_BAD( rc = FlmDbOpen( pszDb2, NULL, NULL, + FO_DONT_RESUME_BACKGROUND_THREADS, NULL, &hDb2))) + { + MAKE_ERROR_STRING( "calling FlmDbOpen", rc, m_szFailInfo); + goto Exit; + } + + // Need to compare all of the records in the default data + // container and the tracker container + + if (RC_BAD( rc = compareContainers( pszDb1, pszDb2, hDb1, hDb2, FLM_DATA_CONTAINER))) + { + goto Exit; + } + if (RC_BAD( rc = compareContainers( pszDb1, pszDb2, hDb1, hDb2, FLM_TRACKER_CONTAINER))) + { + goto Exit; + } + + // Compare all of the keys in the dictionary index + + if (RC_BAD( rc = compareIndexes( pszDb1, pszDb2, hDb1, hDb2, FLM_DICT_INDEX))) + { + goto Exit; + } + + // Compare the records in the dictionary container. + // This will cause recursive calls to compareContainers for any + // containers defined in the dictionary, as well as calls to + // compareIndexes for an indexes defined in the dictionary. + + if (RC_BAD( rc = compareContainers( pszDb1, pszDb2, hDb1, hDb2, FLM_DICT_CONTAINER))) + { + goto Exit; + } + + bPassed = TRUE; + +Exit: + + if (hDb1 != HFDB_NULL) + { + (void)FlmDbClose( &hDb1); + } + if (hDb2 != HFDB_NULL) + { + (void)FlmDbClose( &hDb2); + } + + endTest( bPassed); + return( rc); +} + +/*************************************************************************** +Desc: +****************************************************************************/ +RCODE IFlmTestImpl::copyDbTest( + const char * pszDestDbName, + const char * pszSrcDbName) +{ + RCODE rc = FERR_OK; + FLMBOOL bPassed = FALSE; + char szTest [200]; + + // FlmDbCopy will copy a database and all of its files + + f_sprintf( szTest, "Copy Database Test (%s --> %s)", + pszSrcDbName, pszDestDbName); + beginTest( szTest); + + if( RC_BAD( rc = FlmDbCopy( pszSrcDbName, NULL, NULL, + pszDestDbName, NULL, NULL, NULL, NULL))) + { + MAKE_ERROR_STRING( "calling FlmDbCopy", rc, m_szFailInfo); + goto Exit; + } + bPassed = TRUE; + +Exit: + + endTest( bPassed); + return( rc); +} + +/*************************************************************************** +Desc: +****************************************************************************/ +RCODE IFlmTestImpl::renameDbTest( + const char * pszDestDbName, + const char * pszSrcDbName) +{ + RCODE rc = FERR_OK; + FLMBOOL bPassed = FALSE; + char szTest [200]; + + // FlmDbRename will rename a database and all of its files + + f_sprintf( szTest, "Rename Database Test (%s --> %s)", + pszSrcDbName, pszDestDbName); + beginTest( szTest); + + if( RC_BAD( rc = FlmDbRename( pszSrcDbName, NULL, NULL, + pszDestDbName, TRUE, NULL, NULL))) + { + MAKE_ERROR_STRING( "calling FlmDbRename", rc, m_szFailInfo); + goto Exit; + } + bPassed = TRUE; + +Exit: + + endTest( bPassed); + return( rc); +} + +/*************************************************************************** +Desc: +****************************************************************************/ +RCODE IFlmTestImpl::removeDbTest( + const char * pszDbName) +{ + RCODE rc = FERR_OK; + FLMBOOL bPassed = FALSE; + char szTest [200]; + // FlmDbRemove will delete the database and all of its files - beginTest( "Remove Database Test"); + f_sprintf( szTest, "Remove Database Test (%s)", pszDbName); + beginTest( szTest); - if( RC_BAD( rc = FlmDbRemove( DB_NAME_STR, NULL, NULL, TRUE))) + if( RC_BAD( rc = FlmDbRemove( pszDbName, NULL, NULL, TRUE))) { MAKE_ERROR_STRING( "calling FlmDbRemove", rc, m_szFailInfo); goto Exit; @@ -1186,14 +2000,81 @@ RCODE IFlmTestImpl::execute( void) goto Exit; } + // Suspend index test + + if (RC_BAD( rc = suspendIndexTest( uiIndex))) + { + goto Exit; + } + + // Resume index test + + if (RC_BAD( rc = resumeIndexTest( uiIndex))) + { + goto Exit; + } + + // Delete index test + + if (RC_BAD( rc = deleteIndexTest( uiIndex))) + { + goto Exit; + } + + // Hot Backup/Restore test + + if (RC_BAD( rc = backupRestoreDbTest())) + { + goto Exit; + } + + // Compare the restored database to the current database + + if (RC_BAD( rc = compareDbTest( DB_NAME_STR, DB_RESTORE_NAME_STR))) + { + goto Exit; + } + // Close the database FlmDbClose( &m_hDb); - if (RC_BAD( rc = removeDbTest())) + // Copy database test + + if (RC_BAD( rc = copyDbTest( DB_COPY_NAME_STR, DB_NAME_STR))) { goto Exit; } + + // Compare the restored database to the copied database + + if (RC_BAD( rc = compareDbTest( DB_COPY_NAME_STR, DB_RESTORE_NAME_STR))) + { + goto Exit; + } + + // Rename database test + + if (RC_BAD( rc = renameDbTest( DB_RENAME_NAME_STR, DB_COPY_NAME_STR))) + { + goto Exit; + } + + // Remove database test + + if (RC_BAD( rc = removeDbTest( DB_RENAME_NAME_STR))) + { + goto Exit; + } + if (RC_BAD( rc = removeDbTest( DB_NAME_STR))) + { + goto Exit; + } + if (RC_BAD( rc = removeDbTest( DB_RESTORE_NAME_STR))) + { + goto Exit; + } + Exit: