You've already forked mariadb-columnstore-engine
							
							
				mirror of
				https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
				synced 2025-11-03 17:13:17 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			1374 lines
		
	
	
		
			45 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			1374 lines
		
	
	
		
			45 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* Copyright (C) 2014 InfiniDB, Inc.
 | 
						|
 | 
						|
   This program is free software; you can redistribute it and/or
 | 
						|
   modify it under the terms of the GNU General Public License
 | 
						|
   as published by the Free Software Foundation; version 2 of
 | 
						|
   the License.
 | 
						|
 | 
						|
   This program is distributed in the hope that it will be useful,
 | 
						|
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
   GNU General Public License for more details.
 | 
						|
 | 
						|
   You should have received a copy of the GNU General Public License
 | 
						|
   along with this program; if not, write to the Free Software
 | 
						|
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 | 
						|
   MA 02110-1301, USA. */
 | 
						|
 | 
						|
// Define __STDC_LIMIT_MACROS so that we can pick up UINT64_MAX from stdint.h
 | 
						|
#define  __STDC_LIMIT_MACROS 1
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string>
 | 
						|
#include <stdexcept>
 | 
						|
#include <stdint.h>
 | 
						|
using namespace std;
 | 
						|
 | 
						|
#include <boost/scoped_ptr.hpp>
 | 
						|
using namespace boost;
 | 
						|
 | 
						|
#include <cppunit/extensions/HelperMacros.h>
 | 
						|
 | 
						|
#include <we_dbfileop.h>
 | 
						|
#include <we_type.h>
 | 
						|
#include <we_semop.h>
 | 
						|
#include <we_log.h>
 | 
						|
#include <we_convertor.h>
 | 
						|
#include <we_brm.h>
 | 
						|
#include <we_cache.h>
 | 
						|
 | 
						|
using namespace WriteEngine;
 | 
						|
using namespace BRM;
 | 
						|
 | 
						|
int compare (const void * a, const void * b)
 | 
						|
{
 | 
						|
  return ( *(uint32_t*)a - *(uint32_t*)b );
 | 
						|
}
 | 
						|
 | 
						|
int compare1(const void * a, const void * b)
 | 
						|
{
 | 
						|
  return ( (*(SortTuple*)a).key - (*(SortTuple*)b).key );
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
class SharedTest : public CppUnit::TestFixture {
 | 
						|
 | 
						|
CPPUNIT_TEST_SUITE( SharedTest );
 | 
						|
 | 
						|
//CPPUNIT_TEST(setUp);
 | 
						|
//CPPUNIT_TEST( test1 );
 | 
						|
 | 
						|
// File operation testing
 | 
						|
CPPUNIT_TEST( testFileNameOp );
 | 
						|
CPPUNIT_TEST( testFileHandleOp );
 | 
						|
CPPUNIT_TEST( testDirBasic );
 | 
						|
 | 
						|
// Data block related testing
 | 
						|
CPPUNIT_TEST( testCalculateRowIdBitmap );
 | 
						|
CPPUNIT_TEST( testBlockBuffer );
 | 
						|
CPPUNIT_TEST( testBitBasic );
 | 
						|
CPPUNIT_TEST( testBufferBit );
 | 
						|
CPPUNIT_TEST( testBitShift );
 | 
						|
CPPUNIT_TEST( testEmptyRowValue );
 | 
						|
CPPUNIT_TEST( testCorrectRowWidth );
 | 
						|
// DB File Block related testing
 | 
						|
CPPUNIT_TEST( testDbBlock );
 | 
						|
 | 
						|
CPPUNIT_TEST( testCopyDbFile );
 | 
						|
 | 
						|
// Semaphore related testing
 | 
						|
CPPUNIT_TEST( testSem );
 | 
						|
 | 
						|
// Log related testing
 | 
						|
CPPUNIT_TEST( testLog );
 | 
						|
 | 
						|
// Version Buffer related testing
 | 
						|
CPPUNIT_TEST( testHWM ); 
 | 
						|
CPPUNIT_TEST( testVB );
 | 
						|
 | 
						|
// Disk manager related testing
 | 
						|
CPPUNIT_TEST( testDM );
 | 
						|
CPPUNIT_TEST( tearDown );
 | 
						|
 | 
						|
// Cache related testing
 | 
						|
CPPUNIT_TEST( testCacheBasic );
 | 
						|
CPPUNIT_TEST( testCacheReadWrite );
 | 
						|
 | 
						|
CPPUNIT_TEST( testCleanup );   // NEVER COMMENT OUT THIS LINE
 | 
						|
CPPUNIT_TEST_SUITE_END();
 | 
						|
 | 
						|
private:
 | 
						|
 | 
						|
public:
 | 
						|
	void setUp() {
 | 
						|
	   
 | 
						|
	}
 | 
						|
 | 
						|
	void tearDown() {
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
   void test1() {
 | 
						|
      //m_wrapper.test();
 | 
						|
//      int numOfBlock = 10240;
 | 
						|
      int numOfBlock = 1024;
 | 
						|
      FILE*          pFile;
 | 
						|
      unsigned char  writeBuf[BYTE_PER_BLOCK*10];
 | 
						|
      char           diskBuf[BYTE_PER_BLOCK*11];
 | 
						|
      char           fileName[40];
 | 
						|
 | 
						|
      for( int k = 0; k < 273; k++ ) {
 | 
						|
         snprintf( fileName, sizeof(fileName), "testwr%d.tst", k );
 | 
						|
         pFile = fopen( fileName, "w+b" );
 | 
						|
         if( pFile != NULL ) {
 | 
						|
            setvbuf ( pFile , diskBuf , _IOFBF , 81920 );
 | 
						|
            memset( writeBuf, 0, BYTE_PER_BLOCK * sizeof( unsigned char ));
 | 
						|
            for( int i = 0; i < numOfBlock; i++ )
 | 
						|
               fwrite( writeBuf, sizeof( writeBuf ), 1, pFile );
 | 
						|
   //            fwrite( writeBuf, sizeof( writeBuf ), numOfBlock, pFile );
 | 
						|
            fclose( pFile );
 | 
						|
         }
 | 
						|
      }
 | 
						|
   }
 | 
						|
 | 
						|
   void testFileNameOp() {
 | 
						|
      FileOp   fileOp;
 | 
						|
      bool     bStatus;
 | 
						|
      char     fileName[20];
 | 
						|
      int      rc;
 | 
						|
 | 
						|
      strcpy( fileName, "FILE_999.dat" );
 | 
						|
      BRMWrapper::setUseBrm(true);
 | 
						|
      // file opertaions
 | 
						|
      fileOp.deleteFile( fileName );
 | 
						|
      CPPUNIT_ASSERT( fileOp.exists( fileName ) == false );
 | 
						|
 | 
						|
      rc = fileOp.deleteFile( fileName );
 | 
						|
      CPPUNIT_ASSERT( rc == ERR_FILE_NOT_EXIST );
 | 
						|
 | 
						|
      rc = fileOp.createFile( fileName, 10 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      rc = fileOp.createFile( fileName, 10 );
 | 
						|
      CPPUNIT_ASSERT( rc == ERR_FILE_EXIST );
 | 
						|
      
 | 
						|
      bStatus = fileOp.exists( fileName );
 | 
						|
      CPPUNIT_ASSERT( bStatus == true );
 | 
						|
 | 
						|
      // init different value
 | 
						|
      fileOp.deleteFile( fileName );
 | 
						|
      CPPUNIT_ASSERT( fileOp.exists( fileName ) == false );
 | 
						|
 | 
						|
      rc = fileOp.createFile( fileName, 10, 0xFF, 1 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      fileOp.deleteFile( fileName );
 | 
						|
      CPPUNIT_ASSERT( fileOp.exists( fileName ) == false );
 | 
						|
      rc = fileOp.createFile( fileName, 10, 0x8001, 2 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      fileOp.deleteFile( fileName );
 | 
						|
      CPPUNIT_ASSERT( fileOp.exists( fileName ) == false );
 | 
						|
      rc = fileOp.createFile( fileName, 10, 0xFFAAAAAB, 4 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      fileOp.deleteFile( fileName );
 | 
						|
      CPPUNIT_ASSERT( fileOp.exists( fileName ) == false );
 | 
						|
      
 | 
						|
      //Not use block resolution manager
 | 
						|
      BRMWrapper::setUseBrm(false);
 | 
						|
      // file opertaions
 | 
						|
      fileOp.deleteFile( fileName );
 | 
						|
      CPPUNIT_ASSERT( fileOp.exists( fileName ) == false );
 | 
						|
 | 
						|
      rc = fileOp.deleteFile( fileName );
 | 
						|
      CPPUNIT_ASSERT( rc == ERR_FILE_NOT_EXIST );
 | 
						|
 | 
						|
      rc = fileOp.createFile( fileName, 10 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      rc = fileOp.createFile( fileName, 10 );
 | 
						|
      CPPUNIT_ASSERT( rc == ERR_FILE_EXIST );
 | 
						|
      
 | 
						|
      bStatus = fileOp.exists( fileName );
 | 
						|
      CPPUNIT_ASSERT( bStatus == true );
 | 
						|
 | 
						|
      // init different value
 | 
						|
      fileOp.deleteFile( fileName );
 | 
						|
      CPPUNIT_ASSERT( fileOp.exists( fileName ) == false );
 | 
						|
 | 
						|
      rc = fileOp.createFile( fileName, 10, 0xFF, 1 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      fileOp.deleteFile( fileName );
 | 
						|
      CPPUNIT_ASSERT( fileOp.exists( fileName ) == false );
 | 
						|
      rc = fileOp.createFile( fileName, 10, 0x8001, 2 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      fileOp.deleteFile( fileName );
 | 
						|
      CPPUNIT_ASSERT( fileOp.exists( fileName ) == false );
 | 
						|
      rc = fileOp.createFile( fileName, 10, 0xFFAAAAAB, 4 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      fileOp.deleteFile( fileName );
 | 
						|
      CPPUNIT_ASSERT( fileOp.exists( fileName ) == false );      
 | 
						|
   }
 | 
						|
 | 
						|
   void testFileHandleOp() {
 | 
						|
      FileOp   fileOp;
 | 
						|
      char     fileName[100], testStr[50];
 | 
						|
      unsigned char dataBuf[BYTE_PER_BLOCK];
 | 
						|
      long     fileSize;
 | 
						|
      FILE*    pFile;
 | 
						|
      int      rc;
 | 
						|
      int      allocSize =0;
 | 
						|
      
 | 
						|
      BRMWrapper::setUseBrm(true);
 | 
						|
//      strcpy( fileName, "FILE_999.dat" );
 | 
						|
      strcpy( testStr, "String write test data" );
 | 
						|
      
 | 
						|
      fileOp.deleteFile( 999 );
 | 
						|
      rc = fileOp.createFile( 999, 10, allocSize);
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      pFile = fileOp.openFile( 999 );
 | 
						|
      CPPUNIT_ASSERT( pFile != NULL );
 | 
						|
 | 
						|
      fileSize = fileOp.getFileSize( 999 );
 | 
						|
      CPPUNIT_ASSERT( fileSize == allocSize * BYTE_PER_BLOCK );
 | 
						|
 | 
						|
      rc = fileOp.setFileOffset( pFile, -1, SEEK_SET );
 | 
						|
      CPPUNIT_ASSERT( rc == ERR_FILE_SEEK );
 | 
						|
      
 | 
						|
      uint64_t lbid1;
 | 
						|
      rc = BRMWrapper::getInstance()->getBrmInfo( 1999, 1, lbid1 );
 | 
						|
      CPPUNIT_ASSERT( rc != NO_ERROR );
 | 
						|
      rc = BRMWrapper::getInstance()->getBrmInfo( 999, 1, lbid1 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      rc = fileOp.setFileOffset( pFile, lbid1*BYTE_PER_BLOCK, SEEK_SET );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      
 | 
						|
      uint64_t lbid9;
 | 
						|
      rc = BRMWrapper::getInstance()->getBrmInfo( 999, 9, lbid9 );
 | 
						|
      
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      rc = fileOp.setFileOffset( pFile, BYTE_PER_BLOCK * lbid9, SEEK_SET );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      // write something to block 1
 | 
						|
      memset( dataBuf, 0, sizeof( unsigned char ) * BYTE_PER_BLOCK );
 | 
						|
      memcpy( dataBuf + 8, testStr, strlen( testStr ) );
 | 
						|
      
 | 
						|
      CPPUNIT_ASSERT( fileOp.setFileOffset( pFile, lbid1*BYTE_PER_BLOCK, SEEK_SET ) == NO_ERROR );
 | 
						|
      rc = fileOp.writeFile( pFile, dataBuf, BYTE_PER_BLOCK );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      rc = fileOp.writeFile( NULL, dataBuf, BYTE_PER_BLOCK );
 | 
						|
      CPPUNIT_ASSERT( rc == ERR_FILE_NULL );
 | 
						|
 | 
						|
      // read something from block 1
 | 
						|
      memset( dataBuf, 0, sizeof( unsigned char ) * BYTE_PER_BLOCK );
 | 
						|
      
 | 
						|
      rc = BRMWrapper::getInstance()->getBrmInfo( 999, 1, lbid1 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      CPPUNIT_ASSERT( fileOp.setFileOffset( pFile, lbid1*BYTE_PER_BLOCK, SEEK_SET ) == NO_ERROR );
 | 
						|
      rc = fileOp.readFile( pFile, dataBuf, BYTE_PER_BLOCK );
 | 
						|
 | 
						|
      printf( "\ndataBuf=%s\n", dataBuf + 8 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      CPPUNIT_ASSERT( memcmp( dataBuf + 8, testStr, strlen(testStr)) == 0 );
 | 
						|
 | 
						|
CPPUNIT_ASSERT( fileOp.getFileSize( 999 ) == allocSize*8192 );
 | 
						|
      fileOp.closeFile( pFile );
 | 
						|
      fileOp.deleteFile(999);
 | 
						|
      
 | 
						|
      // No block resolution manager
 | 
						|
      BRMWrapper::setUseBrm(false);
 | 
						|
//      strcpy( fileName, "FILE_999.dat" );
 | 
						|
      rc = fileOp.getFileName( 999, fileName );
 | 
						|
      strcpy( testStr, "String write test data" );
 | 
						|
      fileOp.deleteFile( 999 );
 | 
						|
      CPPUNIT_ASSERT( fileOp.exists( 999 ) == false );
 | 
						|
      
 | 
						|
      rc = fileOp.createFile( 999, 10, allocSize);
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      pFile = fileOp.openFile( fileName );
 | 
						|
      CPPUNIT_ASSERT( pFile != NULL );
 | 
						|
 | 
						|
      fileSize = fileOp.getFileSize( 999 );
 | 
						|
      CPPUNIT_ASSERT( fileSize == 81920 );
 | 
						|
 | 
						|
      rc = fileOp.setFileOffset( pFile, -1, SEEK_SET );
 | 
						|
      CPPUNIT_ASSERT( rc == ERR_FILE_SEEK );
 | 
						|
      
 | 
						|
      rc = fileOp.setFileOffset( pFile, BYTE_PER_BLOCK, SEEK_SET );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      
 | 
						|
      rc = fileOp.setFileOffset( pFile, BYTE_PER_BLOCK * 9, SEEK_SET );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      // write something to block 1
 | 
						|
      memset( dataBuf, 0, sizeof( unsigned char ) * BYTE_PER_BLOCK );
 | 
						|
      memcpy( dataBuf + 8, testStr, strlen( testStr ) );
 | 
						|
      
 | 
						|
      CPPUNIT_ASSERT( fileOp.setFileOffset( pFile, BYTE_PER_BLOCK, SEEK_SET ) == NO_ERROR );
 | 
						|
      rc = fileOp.writeFile( pFile, dataBuf, BYTE_PER_BLOCK );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      rc = fileOp.writeFile( NULL, dataBuf, BYTE_PER_BLOCK );
 | 
						|
      CPPUNIT_ASSERT( rc == ERR_FILE_NULL );
 | 
						|
 | 
						|
      // read something from block 1
 | 
						|
      memset( dataBuf, 0, sizeof( unsigned char ) * BYTE_PER_BLOCK );
 | 
						|
      
 | 
						|
      CPPUNIT_ASSERT( fileOp.setFileOffset( pFile, BYTE_PER_BLOCK, SEEK_SET ) == NO_ERROR );
 | 
						|
      rc = fileOp.readFile( pFile, dataBuf, BYTE_PER_BLOCK );
 | 
						|
 | 
						|
      printf( "\ndataBuf=%s\n", dataBuf + 8 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      CPPUNIT_ASSERT( memcmp( dataBuf + 8, testStr, strlen(testStr)) == 0 );
 | 
						|
 | 
						|
CPPUNIT_ASSERT( fileOp.getFileSize( 999 ) == 81920 );
 | 
						|
      fileOp.closeFile( pFile );
 | 
						|
      fileOp.deleteFile(999);
 | 
						|
 | 
						|
   }
 | 
						|
 | 
						|
   void testDirBasic() {
 | 
						|
      FileOp   fileOp;
 | 
						|
      char     dirName[30];
 | 
						|
      int      rc;
 | 
						|
 | 
						|
      strcpy( dirName, "testdir" );
 | 
						|
      fileOp.removeDir( dirName );
 | 
						|
      CPPUNIT_ASSERT( fileOp.isDir( dirName ) == false );
 | 
						|
 | 
						|
      rc = fileOp.createDir( dirName );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      CPPUNIT_ASSERT( fileOp.isDir( dirName ) == true );
 | 
						|
 | 
						|
      fileOp.removeDir( dirName );
 | 
						|
   }
 | 
						|
 | 
						|
   void testCalculateRowIdBitmap() {
 | 
						|
      BlockOp blockOp;
 | 
						|
      RID rowId = numeric_limits<WriteEngine::RID>max();
 | 
						|
      int  fbo = 0, bio = 0, bbo = 0;
 | 
						|
 | 
						|
      // Assuming 1024 per data block, 8 byte width
 | 
						|
      CPPUNIT_ASSERT( blockOp.calculateRowId( rowId, 1024, 8, fbo, bio ) == false );
 | 
						|
 | 
						|
      rowId = 1026;
 | 
						|
      CPPUNIT_ASSERT( blockOp.calculateRowId( rowId, 1024, 8, fbo, bio ) == true );
 | 
						|
      CPPUNIT_ASSERT( fbo == 1 );
 | 
						|
      CPPUNIT_ASSERT( bio == 16 );
 | 
						|
 | 
						|
      // Assuming 2048 per data block, 4 byte width
 | 
						|
/*      rowId = 2049;
 | 
						|
      CPPUNIT_ASSERT( blockOp.calculateRowId( rowId, 2048, 4, fbo, bio ) == true );
 | 
						|
      CPPUNIT_ASSERT( fbo == 1 );
 | 
						|
      CPPUNIT_ASSERT( bio == 16 );
 | 
						|
 | 
						|
      // Assuming 4096 per data block, 2 byte width
 | 
						|
      rowId = 2049;
 | 
						|
      CPPUNIT_ASSERT( blockOp.calculateRowId( rowId, 4096, 2, fbo, bio ) == true );
 | 
						|
      CPPUNIT_ASSERT( fbo == 1 );
 | 
						|
      CPPUNIT_ASSERT( bio == 16 );
 | 
						|
 | 
						|
      // Assuming 8192 per data block, 1 byte width
 | 
						|
      rowId = 2049;
 | 
						|
      CPPUNIT_ASSERT( blockOp.calculateRowId( rowId, 8192, 1, fbo, bio ) == true );
 | 
						|
      CPPUNIT_ASSERT( fbo == 1 );
 | 
						|
      CPPUNIT_ASSERT( bio == 16 );
 | 
						|
*/
 | 
						|
      rowId = 65546;
 | 
						|
      CPPUNIT_ASSERT( blockOp.calculateRowBitmap( rowId, BYTE_PER_BLOCK*8, fbo, bio, bbo ) == true );
 | 
						|
      CPPUNIT_ASSERT( fbo == 1 );
 | 
						|
      CPPUNIT_ASSERT( bio == 1 );
 | 
						|
      CPPUNIT_ASSERT( bbo == 2 );
 | 
						|
 | 
						|
//      CPPUNIT_ASSERT( blockOp.getRowId( fbo, bio, bbo ) == 65546 );
 | 
						|
 | 
						|
      rowId = numeric_limits<WriteEngine::RID>max();
 | 
						|
      CPPUNIT_ASSERT( blockOp.calculateRowBitmap( rowId, BYTE_PER_BLOCK*8, fbo, bio, bbo ) == false );
 | 
						|
   }
 | 
						|
 | 
						|
 | 
						|
   void testBlockBuffer() {
 | 
						|
      BlockOp blockOp;
 | 
						|
      unsigned char buf[BYTE_PER_BLOCK];
 | 
						|
      int writeVal = 80, readVal;
 | 
						|
 | 
						|
      blockOp.resetBuf( buf, sizeof( buf ) );
 | 
						|
      CPPUNIT_ASSERT( buf[1] == '\0' );
 | 
						|
 | 
						|
      // copy to byte 8 area
 | 
						|
      blockOp.writeBufValue( buf + 8, &writeVal, 4, true );
 | 
						|
 | 
						|
//      blockOp.writeBufValue( buf + 8, &writeVal, 4 );
 | 
						|
      blockOp.readBufValue( buf + 8, &readVal, 4 );
 | 
						|
      CPPUNIT_ASSERT( readVal == 80 );
 | 
						|
   }
 | 
						|
 | 
						|
   void testBitBasic() {
 | 
						|
      BlockOp blockOp;
 | 
						|
      unsigned int val;
 | 
						|
 | 
						|
      val = 7;
 | 
						|
      CPPUNIT_ASSERT( blockOp.getByteTotalOnBit( val, 8 ) == 3 );
 | 
						|
      val = 33;
 | 
						|
      CPPUNIT_ASSERT( blockOp.getByteTotalOnBit( val, 8 ) == 2 );
 | 
						|
      val = 255;
 | 
						|
      CPPUNIT_ASSERT( blockOp.getByteTotalOnBit( val, 8 ) == 8 );
 | 
						|
      val = 0;
 | 
						|
      CPPUNIT_ASSERT( blockOp.getByteTotalOnBit( val, 8 ) == 0 );
 | 
						|
 | 
						|
      val = 3;
 | 
						|
      CPPUNIT_ASSERT( blockOp.getBitFlag( val, 0 ) == 1 );
 | 
						|
      CPPUNIT_ASSERT( blockOp.getBitFlag( val, 1 ) == 1 );
 | 
						|
      CPPUNIT_ASSERT( blockOp.getBitFlag( val, 2 ) == 0 );
 | 
						|
      CPPUNIT_ASSERT( blockOp.getBitFlag( val, 3 ) == 0 );
 | 
						|
 | 
						|
      blockOp.setBitFlag( &val, 2, true );
 | 
						|
      CPPUNIT_ASSERT( blockOp.getBitFlag( val, 2 ) == true );
 | 
						|
      CPPUNIT_ASSERT( val == 7 );
 | 
						|
 | 
						|
      blockOp.setBitFlag( &val, 1, false );
 | 
						|
      CPPUNIT_ASSERT( blockOp.getBitFlag( val, 1 ) == false );
 | 
						|
      CPPUNIT_ASSERT( val == 5 );
 | 
						|
   }
 | 
						|
 | 
						|
   void testBufferBit() {
 | 
						|
      BlockOp blockOp;
 | 
						|
      unsigned char buf[BYTE_PER_BLOCK];
 | 
						|
 | 
						|
      blockOp.resetBuf( buf, sizeof( buf ) );
 | 
						|
 | 
						|
      blockOp.setBitFlag( (unsigned int*)&buf[1], 0, true );
 | 
						|
      blockOp.setBitFlag( (unsigned int*)&buf[1], 3, true );
 | 
						|
 | 
						|
      blockOp.setBitFlag( (unsigned int*)&buf[6], 1, true );
 | 
						|
      blockOp.setBitFlag( (unsigned int*)&buf[6], 2, true );
 | 
						|
      blockOp.setBitFlag( (unsigned int*)&buf[6], 3, true );
 | 
						|
      blockOp.setBitFlag( (unsigned int*)&buf[6], 5, true );
 | 
						|
 | 
						|
      CPPUNIT_ASSERT( blockOp.getBufTotalOnBit( buf, sizeof( buf )) == 6 );
 | 
						|
 | 
						|
      CPPUNIT_ASSERT( blockOp.getBufByteBitFlag( buf, 6, 5 ) == true );
 | 
						|
      CPPUNIT_ASSERT( blockOp.getBufByteBitFlag( buf, 6, 3 ) == true );
 | 
						|
      CPPUNIT_ASSERT( blockOp.getBufByteBitFlag( buf, 1, 0 ) == true );
 | 
						|
      CPPUNIT_ASSERT( blockOp.getBufByteBitFlag( buf, 1, 3 ) == true );
 | 
						|
 | 
						|
      blockOp.setBufByteBitFlag( buf, 6, 2, false );
 | 
						|
      CPPUNIT_ASSERT( blockOp.getBufByteBitFlag( buf, 6, 2 ) == false );
 | 
						|
      CPPUNIT_ASSERT( blockOp.getBufTotalOnBit( buf, sizeof( buf )) == 5 );
 | 
						|
   }
 | 
						|
 | 
						|
   void testBitShift() {
 | 
						|
      BlockOp blockOp;
 | 
						|
      uint64_t curVal, result, mask;
 | 
						|
 | 
						|
      curVal = 0x6a;
 | 
						|
      mask = 0xe0; // first three bit
 | 
						|
      result = blockOp.getBitValue( curVal, 5, 0xF );
 | 
						|
      CPPUNIT_ASSERT( result == 3 );
 | 
						|
 | 
						|
      result = blockOp.setBitValue( curVal, 0x4, 5, mask );
 | 
						|
      CPPUNIT_ASSERT( result == 138 );
 | 
						|
   }
 | 
						|
 | 
						|
   void testEmptyRowValue( ) {
 | 
						|
      BlockOp  blockOp;
 | 
						|
      uint64_t      curVal;
 | 
						|
      RID      curRID;
 | 
						|
 | 
						|
      curRID = blockOp.getRowId( 0, 1, 3 );
 | 
						|
      CPPUNIT_ASSERT( curRID == 3 );
 | 
						|
 | 
						|
      curRID = blockOp.getRowId( 0, 2, 3 );
 | 
						|
      CPPUNIT_ASSERT( curRID == 3 );
 | 
						|
 | 
						|
      curRID = blockOp.getRowId( 2, 4, 3 );
 | 
						|
      CPPUNIT_ASSERT( curRID == 4099 );
 | 
						|
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::TINYINT, 1 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0x81 );
 | 
						|
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::SMALLINT, 2 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0x8001 );
 | 
						|
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::MEDINT, 4 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0x80000001 );
 | 
						|
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::INT, 4 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0x80000001 );
 | 
						|
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::BIGINT, 8 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0x8000000000000001LL );
 | 
						|
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::FLOAT, 4 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0xFFAAAAAB );
 | 
						|
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::DOUBLE, 8 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0xFFFAAAAAAAAAAAABLL );
 | 
						|
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::DECIMAL, 1 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0x8001 );
 | 
						|
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::DECIMAL, 2 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0x8001 );
 | 
						|
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::DECIMAL, 3 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0x80000001 );
 | 
						|
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::DECIMAL, 4 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0x80000001 );
 | 
						|
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::DECIMAL, 5 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0x8000000000000001LL );
 | 
						|
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::DECIMAL, 6 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0x8000000000000001LL );
 | 
						|
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::DECIMAL, 7 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0x8000000000000001LL );
 | 
						|
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::DECIMAL, 8 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0x8000000000000001LL );
 | 
						|
/*
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::DECIMAL, 9 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0x80000001 );
 | 
						|
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::DECIMAL, 10 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0x8000000000000001LL );
 | 
						|
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::DECIMAL, 12 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0x8000000000000001LL );
 | 
						|
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::DECIMAL, 19 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0xFFFFFFFFFFFFFFFFLL );
 | 
						|
*/
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::DATE, 4 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0xFFFFFFFF );
 | 
						|
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::DATETIME, 8 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0xFFFFFFFFFFFFFFFFLL );
 | 
						|
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::CHAR, 1 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0xFF );
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::CHAR, 2 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0xFFFF );
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::CHAR, 4 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0xFFFFFFFF );
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::CHAR, 5 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0xFFFFFFFFFFFFFFFFLL );
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::CHAR, 8 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0xFFFFFFFFFFFFFFFFLL );
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::CHAR, 10 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0xFFFFFFFFFFFFFFFFLL );
 | 
						|
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::VARCHAR, 1 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0xFFFF );
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::VARCHAR, 2 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0xFFFFFFFF );
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::VARCHAR, 3 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0xFFFFFFFF );
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::VARCHAR, 4 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0xFFFFFFFFFFFFFFFFLL );
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::VARCHAR, 5 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0xFFFFFFFFFFFFFFFFLL );
 | 
						|
      curVal = blockOp.getEmptyRowValue( WriteEngine::VARCHAR, 10 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 0xFFFFFFFFFFFFFFFFLL );
 | 
						|
   }
 | 
						|
   void testCorrectRowWidth() {
 | 
						|
      BlockOp  blockOp;
 | 
						|
      int      curVal;
 | 
						|
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::TINYINT, 1 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 1 );
 | 
						|
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::SMALLINT, 1 );  // intentionally put 1 rather than 2
 | 
						|
      CPPUNIT_ASSERT( curVal == 2 );
 | 
						|
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::MEDINT, 8 );   // intentionally put 8 rather than 4
 | 
						|
      CPPUNIT_ASSERT( curVal == 4 );
 | 
						|
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::INT, 4 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 4 );
 | 
						|
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::BIGINT, 4 );  // should be 8
 | 
						|
      CPPUNIT_ASSERT( curVal == 8 );
 | 
						|
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::FLOAT, 8 ); // should be 4
 | 
						|
      CPPUNIT_ASSERT( curVal == 4 );
 | 
						|
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::DOUBLE, 4 ); // should be 8
 | 
						|
      CPPUNIT_ASSERT( curVal == 8 );
 | 
						|
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::DECIMAL, 1 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 2 );
 | 
						|
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::DECIMAL, 2 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 2 );
 | 
						|
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::DECIMAL, 3 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 4 );
 | 
						|
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::DECIMAL, 4 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 4 );
 | 
						|
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::DECIMAL, 5 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 8 );
 | 
						|
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::DECIMAL, 6 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 8 );
 | 
						|
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::DECIMAL, 7 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 8 );
 | 
						|
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::DECIMAL, 8 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 8 );
 | 
						|
 | 
						|
/*      curVal = blockOp.getCorrectRowWidth( WriteEngine::DECIMAL, 9 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 4 );
 | 
						|
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::DECIMAL, 10 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 8 );
 | 
						|
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::DECIMAL, 12 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 8 );
 | 
						|
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::DECIMAL, 19 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 8 );
 | 
						|
*/
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::DATE, 8 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 4 );
 | 
						|
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::DATETIME, 4 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 8 );
 | 
						|
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::CHAR, 1 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 1 );
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::CHAR, 2 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 2 );
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::CHAR, 3 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 4 );
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::CHAR, 5 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 8 );
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::CHAR, 8 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 8 );
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::CHAR, 10 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 8 );
 | 
						|
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::VARCHAR, 1 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 2 );
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::VARCHAR, 2 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 4 );
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::VARCHAR, 3 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 4 );
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::VARCHAR, 4 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 8 );
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::VARCHAR, 5 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 8 );
 | 
						|
      curVal = blockOp.getCorrectRowWidth( WriteEngine::VARCHAR, 10 );
 | 
						|
      CPPUNIT_ASSERT( curVal == 8 );
 | 
						|
   }
 | 
						|
 | 
						|
 | 
						|
   void testDbBlock() {
 | 
						|
      DbFileOp    dbFileOp;
 | 
						|
      DataBlock   block;
 | 
						|
      uint64_t    outVal = 12345, inVal;
 | 
						|
      int         rc;
 | 
						|
      FILE*       pFile;
 | 
						|
      int         allocSize =0;
 | 
						|
      
 | 
						|
      Stats::setUseStats( true );
 | 
						|
      BRMWrapper::setUseBrm(true);
 | 
						|
      dbFileOp.deleteFile( 999 );
 | 
						|
      CPPUNIT_ASSERT( dbFileOp.exists( 999 ) == false );
 | 
						|
 | 
						|
      CPPUNIT_ASSERT( dbFileOp.createFile( 999, 10, allocSize ) == NO_ERROR );
 | 
						|
 | 
						|
      pFile = dbFileOp.openFile( 999 );
 | 
						|
      CPPUNIT_ASSERT( pFile != NULL );
 | 
						|
      
 | 
						|
      uint64_t lbid0;
 | 
						|
      BRMWrapper::getInstance()->getBrmInfo( 999, 0, lbid0 );
 | 
						|
      rc = dbFileOp.readDBFile( pFile, block.data, lbid0 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      
 | 
						|
      dbFileOp.setSubBlockEntry( block.data, 1, 2, 8, &outVal );
 | 
						|
      
 | 
						|
      rc = dbFileOp.writeDBFile( pFile, block.data, lbid0 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      rc = dbFileOp.readSubBlockEntry( pFile, &block, lbid0 , 1, 2, 8, &inVal );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      CPPUNIT_ASSERT( inVal == outVal );
 | 
						|
 | 
						|
      inVal = 0;
 | 
						|
      dbFileOp.getSubBlockEntry( block.data, 1, 2, 8, &inVal );
 | 
						|
      CPPUNIT_ASSERT( inVal == outVal );
 | 
						|
 | 
						|
      rc = dbFileOp.writeSubBlockEntry( pFile, &block, lbid0, 1, 2, 8, &inVal );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      rc = dbFileOp.readDBFile( pFile, &block, lbid0 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      rc = dbFileOp.writeDBFile( pFile, &block, lbid0 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      
 | 
						|
      // Not Use Block resolution manager
 | 
						|
      BRMWrapper::setUseBrm(false);
 | 
						|
      dbFileOp.deleteFile( 999 );
 | 
						|
      CPPUNIT_ASSERT( dbFileOp.exists( 999 ) == false );
 | 
						|
 | 
						|
      CPPUNIT_ASSERT( dbFileOp.createFile( 999, 10, allocSize ) == NO_ERROR );
 | 
						|
 | 
						|
      pFile = dbFileOp.openFile( 999 );
 | 
						|
      CPPUNIT_ASSERT( pFile != NULL );
 | 
						|
      
 | 
						|
      rc = dbFileOp.readDBFile( pFile, block.data, 0 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      
 | 
						|
      dbFileOp.setSubBlockEntry( block.data, 1, 2, 8, &outVal );
 | 
						|
      
 | 
						|
      rc = dbFileOp.writeDBFile( pFile, block.data, 0 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      rc = dbFileOp.readSubBlockEntry( pFile, &block, 0 , 1, 2, 8, &inVal );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      CPPUNIT_ASSERT( inVal == outVal );
 | 
						|
 | 
						|
      inVal = 0;
 | 
						|
      dbFileOp.getSubBlockEntry( block.data, 1, 2, 8, &inVal );
 | 
						|
      CPPUNIT_ASSERT( inVal == outVal );
 | 
						|
 | 
						|
      rc = dbFileOp.writeSubBlockEntry( pFile, &block, (uint64_t)0, 1, 2, 8, &inVal );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      rc = dbFileOp.readDBFile( pFile, &block, 0 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      rc = dbFileOp.writeDBFile( pFile, &block, 0 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      long readCounter, writeCounter;
 | 
						|
      readCounter = Stats::getIoBlockRead();
 | 
						|
      writeCounter = Stats::getIoBlockWrite();
 | 
						|
      printf( "\nTotal number of blocks read: %ld", readCounter );
 | 
						|
      printf( "\nTotal number of blocks write: %ld", writeCounter );
 | 
						|
      Stats::setUseStats( false );
 | 
						|
   }
 | 
						|
 | 
						|
   void testCopyDbFile() {
 | 
						|
      DbFileOp    dbFileOp;
 | 
						|
      int         rc, startFbo = 5, copyBlock=15, bufBlock = 30, extendBlock;
 | 
						|
      FILE*       pSourceFile = NULL;
 | 
						|
      FILE*       pTargetFile = NULL;
 | 
						|
      int         allocSize999 = 0, allocSize998 =0;
 | 
						|
      
 | 
						|
      BRMWrapper::setUseBrm(true);
 | 
						|
      
 | 
						|
      rc = dbFileOp.copyFileValidation( pSourceFile, pTargetFile, startFbo, 
 | 
						|
                                        copyBlock, bufBlock, extendBlock );
 | 
						|
      CPPUNIT_ASSERT( rc == ERR_FILE_NULL );
 | 
						|
 | 
						|
      dbFileOp.deleteFile( 999 );
 | 
						|
      dbFileOp.deleteFile( 998 );
 | 
						|
      CPPUNIT_ASSERT( dbFileOp.exists( 999 ) == false );
 | 
						|
      CPPUNIT_ASSERT( dbFileOp.exists( 998 ) == false );
 | 
						|
 | 
						|
      CPPUNIT_ASSERT( dbFileOp.createFile( 999, 10, allocSize999 ) == NO_ERROR );
 | 
						|
      CPPUNIT_ASSERT( dbFileOp.createFile( 998, 20, allocSize998, 0xFFFF, 2 ) == NO_ERROR );
 | 
						|
 | 
						|
      pTargetFile = dbFileOp.openFile( 999 );
 | 
						|
      CPPUNIT_ASSERT( pTargetFile != NULL );
 | 
						|
 | 
						|
      pSourceFile = dbFileOp.openFile( 998 );
 | 
						|
      CPPUNIT_ASSERT( pSourceFile != NULL );
 | 
						|
 | 
						|
//      rc = dbFileOp.copyFileValidation( pSourceFile, pTargetFile, startFbo, 
 | 
						|
//                                        copyBlock, bufBlock, extendBlock );
 | 
						|
//      CPPUNIT_ASSERT( rc == ERR_SIZE_NOT_MATCH );
 | 
						|
      //CPPUNIT_ASSERT( rc == ERR_SIZE_NOT_MATCH );
 | 
						|
 | 
						|
      //copyBlock = 20;
 | 
						|
      copyBlock = allocSize998;
 | 
						|
      bufBlock = allocSize999;
 | 
						|
      
 | 
						|
      rc = dbFileOp.copyFileValidation( pSourceFile, pTargetFile, startFbo , 
 | 
						|
                                        copyBlock, bufBlock, extendBlock );
 | 
						|
      CPPUNIT_ASSERT( rc == ERR_FILE_NEED_EXTEND );
 | 
						|
      //CPPUNIT_ASSERT( extendBlock == 10245 );
 | 
						|
      
 | 
						|
      int allocExtSize999 =0;
 | 
						|
      rc = dbFileOp.extendFile( pTargetFile, 999, extendBlock, allocExtSize999, 0, 8 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      rc = dbFileOp.copyFileValidation( pSourceFile, pTargetFile, startFbo, 
 | 
						|
                                      copyBlock, bufBlock, extendBlock );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      CPPUNIT_ASSERT( extendBlock == 0 );
 | 
						|
      
 | 
						|
      uint64_t lbidTarget; 
 | 
						|
      BRMWrapper::getInstance()->getBrmInfo( 999, startFbo, lbidTarget );
 | 
						|
      rc = dbFileOp.copyDBFile( pSourceFile, pTargetFile, lbidTarget );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      dbFileOp.closeFile( pSourceFile );
 | 
						|
      dbFileOp.closeFile( pTargetFile );
 | 
						|
      
 | 
						|
      //Not Use BRM
 | 
						|
      BRMWrapper::setUseBrm(false);
 | 
						|
      pSourceFile = NULL;
 | 
						|
      pTargetFile = NULL;
 | 
						|
      rc = dbFileOp.copyFileValidation( pSourceFile, pTargetFile, startFbo, 
 | 
						|
                                        copyBlock, bufBlock, extendBlock );
 | 
						|
      CPPUNIT_ASSERT( rc == ERR_FILE_NULL );
 | 
						|
 | 
						|
      dbFileOp.deleteFile( 999 );
 | 
						|
      dbFileOp.deleteFile( 998 );
 | 
						|
      CPPUNIT_ASSERT( dbFileOp.exists( 999 ) == false );
 | 
						|
      CPPUNIT_ASSERT( dbFileOp.exists( 998 ) == false );
 | 
						|
 | 
						|
      CPPUNIT_ASSERT( dbFileOp.createFile( 999, 10, allocSize999 ) == NO_ERROR );
 | 
						|
      CPPUNIT_ASSERT( dbFileOp.createFile( 998, 20, allocSize998, 0xFFFF, 2 ) == NO_ERROR );
 | 
						|
 | 
						|
      pTargetFile = dbFileOp.openFile( 999 );
 | 
						|
      CPPUNIT_ASSERT( pTargetFile != NULL );
 | 
						|
 | 
						|
      pSourceFile = dbFileOp.openFile( 998 );
 | 
						|
      CPPUNIT_ASSERT( pSourceFile != NULL );
 | 
						|
      
 | 
						|
//      rc = dbFileOp.copyFileValidation( pSourceFile, pTargetFile, startFbo, 
 | 
						|
//                                        copyBlock, bufBlock, extendBlock );
 | 
						|
//      CPPUNIT_ASSERT( rc == ERR_SIZE_NOT_MATCH );
 | 
						|
 | 
						|
      //CPPUNIT_ASSERT( rc == ERR_SIZE_NOT_MATCH );
 | 
						|
      //CPPUNIT_ASSERT( rc == NO_ERROR);
 | 
						|
 | 
						|
      copyBlock = 20;
 | 
						|
      bufBlock  = 30;
 | 
						|
      rc = dbFileOp.copyFileValidation( pSourceFile, pTargetFile,startFbo , 
 | 
						|
                                        copyBlock, bufBlock, extendBlock );
 | 
						|
      CPPUNIT_ASSERT( rc == ERR_FILE_NEED_EXTEND );
 | 
						|
      CPPUNIT_ASSERT( extendBlock == 45 );
 | 
						|
 | 
						|
      rc = dbFileOp.extendFile( pTargetFile, 999, extendBlock, 0, 8 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      rc = dbFileOp.copyFileValidation( pSourceFile, pTargetFile, startFbo, 
 | 
						|
                                      copyBlock, bufBlock, extendBlock );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      CPPUNIT_ASSERT( extendBlock == 0 );
 | 
						|
      
 | 
						|
      rc = dbFileOp.copyDBFile( pSourceFile, pTargetFile, startFbo );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      dbFileOp.closeFile( pSourceFile );
 | 
						|
      dbFileOp.closeFile( pTargetFile );
 | 
						|
 | 
						|
   }
 | 
						|
 | 
						|
   void testSem() {
 | 
						|
      SemOp    semOp;
 | 
						|
      FileOp   fileOp;
 | 
						|
      int      rc;
 | 
						|
      bool     bSuccess;
 | 
						|
      key_t    key;
 | 
						|
      int      sid, totalNum = 5;
 | 
						|
      char     fileName[100];
 | 
						|
      
 | 
						|
      semOp.setMaxSemVal( 3 );
 | 
						|
 | 
						|
      bSuccess = semOp.getKey( NULL, key );
 | 
						|
      CPPUNIT_ASSERT( bSuccess == false );
 | 
						|
 | 
						|
      rc = fileOp.getFileName( 9991, fileName );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      bSuccess = semOp.getKey( fileName, key );
 | 
						|
      CPPUNIT_ASSERT( bSuccess == false );
 | 
						|
 | 
						|
      rc = fileOp.getFileName( 999, fileName );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      bSuccess = semOp.getKey( fileName, key );
 | 
						|
      printf( "\nkey=%d", key );
 | 
						|
      CPPUNIT_ASSERT( bSuccess == true );
 | 
						|
      
 | 
						|
      if( semOp.existSem( sid, key ) )
 | 
						|
         semOp.deleteSem( sid );
 | 
						|
 | 
						|
      rc = semOp.createSem( sid, key, 1000 );
 | 
						|
      CPPUNIT_ASSERT( rc == ERR_MAX_SEM );
 | 
						|
 | 
						|
      rc = semOp.createSem( sid, key, totalNum );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      rc = semOp.createSem( sid, key, totalNum );
 | 
						|
      CPPUNIT_ASSERT( rc == ERR_SEM_EXIST );
 | 
						|
 | 
						|
      rc = semOp.openSem( sid, key );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      semOp.printAllVal( sid );
 | 
						|
 | 
						|
      // lock
 | 
						|
      printf( "\nlock one in 2" );
 | 
						|
      rc = semOp.lockSem( sid, 2 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      CPPUNIT_ASSERT( semOp.getVal( sid, 2 ) == 2 );
 | 
						|
      semOp.printAllVal( sid );
 | 
						|
 | 
						|
      printf( "\nlock one in 2" );
 | 
						|
      rc = semOp.lockSem( sid, 2 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      CPPUNIT_ASSERT( semOp.getVal( sid, 2 ) == 1 );
 | 
						|
      semOp.printAllVal( sid );
 | 
						|
 | 
						|
      printf( "\nlock one in 2" );
 | 
						|
      rc = semOp.lockSem( sid, 2 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      CPPUNIT_ASSERT( semOp.getVal( sid, 2 ) == 0 );
 | 
						|
      semOp.printAllVal( sid );
 | 
						|
 | 
						|
      rc = semOp.lockSem( sid, 2 );
 | 
						|
      CPPUNIT_ASSERT( rc == ERR_NO_SEM_RESOURCE );
 | 
						|
      CPPUNIT_ASSERT( semOp.getVal( sid, 2 ) == 0 );
 | 
						|
 | 
						|
      rc = semOp.lockSem( sid, -2 );
 | 
						|
      CPPUNIT_ASSERT( rc == ERR_VALUE_OUTOFRANGE );
 | 
						|
 | 
						|
      rc = semOp.lockSem( sid + 1, 1 );
 | 
						|
      CPPUNIT_ASSERT( rc == ERR_LOCK_FAIL );
 | 
						|
 | 
						|
      // unlock
 | 
						|
      rc = semOp.unlockSem( sid, -2 );
 | 
						|
      CPPUNIT_ASSERT( rc == ERR_VALUE_OUTOFRANGE );
 | 
						|
 | 
						|
      rc = semOp.unlockSem( sid, 1 );
 | 
						|
      CPPUNIT_ASSERT( rc == ERR_NO_SEM_LOCK );
 | 
						|
 | 
						|
      rc = semOp.unlockSem( sid + 1, 2 );
 | 
						|
      CPPUNIT_ASSERT( rc == ERR_UNLOCK_FAIL );
 | 
						|
 | 
						|
      printf( "\nunlock one in 2" );
 | 
						|
      rc = semOp.unlockSem( sid, 2 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      CPPUNIT_ASSERT( semOp.getVal( sid, 2 ) == 1 );
 | 
						|
      semOp.printAllVal( sid );
 | 
						|
 | 
						|
      semOp.deleteSem( sid );
 | 
						|
      CPPUNIT_ASSERT(  semOp.existSem( sid, key ) == false );
 | 
						|
 | 
						|
      CPPUNIT_ASSERT( semOp.getSemCount( sid + 1 ) == 0 );
 | 
						|
 | 
						|
 | 
						|
   }
 | 
						|
 | 
						|
      void testLog() {
 | 
						|
      Log   log;
 | 
						|
      string msg;
 | 
						|
      int    iVal = 3;
 | 
						|
      float  fVal = 2.0;
 | 
						|
 | 
						|
      log.setLogFileName( "test1.log", "test1err.log" );
 | 
						|
 | 
						|
      msg = Convertor::int2Str( iVal );
 | 
						|
      log.logMsg( msg + " this is a info message", INFO );
 | 
						|
      msg = Convertor::getTimeStr();
 | 
						|
      log.logMsg( Convertor::float2Str( fVal ) + " this is a warning message", WARNING );
 | 
						|
      log.logMsg( "this is an error message ", 1011, ERROR );
 | 
						|
      log.logMsg( "this is a critical message", 1211, CRITICAL );
 | 
						|
 | 
						|
      //...Test formatting an unsigned 64 bit integer.
 | 
						|
      uint64_t i64Value(UINT64_MAX);
 | 
						|
      msg = Convertor::i64ToStr( i64Value );
 | 
						|
      CPPUNIT_ASSERT( (msg == "18446744073709551615") );
 | 
						|
      log.logMsg( msg + " this is an info message with the max uint64_t integer value", INFO );
 | 
						|
   }
 | 
						|
 | 
						|
   void testHWM() 
 | 
						|
   {
 | 
						|
      int rc ;
 | 
						|
      int hwm = 0;
 | 
						|
      int allocSize = 0, allocSize1 = 0;
 | 
						|
      OID oid  = 999;
 | 
						|
      DbFileOp    dbFileOp;
 | 
						|
      VER_t       transId = 11;
 | 
						|
 | 
						|
      BRMWrapper::setUseBrm(true);
 | 
						|
      BRMWrapper::getInstance()->rollBack( transId );
 | 
						|
 | 
						|
      // create something to increase LBID number
 | 
						|
      dbFileOp.deleteFile( oid - 1 );
 | 
						|
      rc  = dbFileOp.createFile( oid - 1, 10, allocSize1 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      dbFileOp.deleteFile( oid );
 | 
						|
      CPPUNIT_ASSERT( dbFileOp.exists( oid ) == false );
 | 
						|
 | 
						|
      CPPUNIT_ASSERT( dbFileOp.createFile( oid, 10, allocSize1 ) == NO_ERROR );
 | 
						|
 | 
						|
      rc = BRMWrapper::getInstance()->getHWM( oid , hwm);
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );      
 | 
						|
      hwm = 10;
 | 
						|
      rc = BRMWrapper::getInstance()->setHWM( oid,  hwm );
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
      rc = BRMWrapper::getInstance()->getHWM( oid , hwm); 
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
      CPPUNIT_ASSERT(  hwm == 10 );  
 | 
						|
 | 
						|
      rc = BRMWrapper::getInstance()->allocateExtent( oid, -1, allocSize);
 | 
						|
      CPPUNIT_ASSERT(  rc != NO_ERROR );
 | 
						|
      rc = BRMWrapper::getInstance()->allocateExtent( oid, 20, allocSize);
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
      CPPUNIT_ASSERT(  allocSize > 0 );
 | 
						|
   }
 | 
						|
 | 
						|
   void testVB() 
 | 
						|
   {
 | 
						|
      FileOp                     fileOp;
 | 
						|
      FILE*                      pFile;
 | 
						|
      OID                        oid = 999;
 | 
						|
      LBIDRange                  range;
 | 
						|
      vector<struct LBIDRange>   rangeList;
 | 
						|
      vector<uint32_t>           fboList;
 | 
						|
      uint64_t                   curLbid;
 | 
						|
      int                        rc;
 | 
						|
      VER_t                      transId = 11;
 | 
						|
      
 | 
						|
      BRMWrapper::getInstance()->setDebugLevel( DEBUG_3 );
 | 
						|
 | 
						|
      // change fbo 3
 | 
						|
      rc = BRMWrapper::getInstance()->getBrmInfo( oid, 3, curLbid );
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
      CPPUNIT_ASSERT(  curLbid >= 0 );
 | 
						|
 | 
						|
      range.start = 0;
 | 
						|
      range.size = 1;
 | 
						|
 | 
						|
      rangeList.push_back( range );
 | 
						|
      printf( "\ncur lbid=%ld", (long)curLbid );
 | 
						|
 | 
						|
      pFile = fileOp.openFile( oid );
 | 
						|
      CPPUNIT_ASSERT(  pFile != NULL );
 | 
						|
 | 
						|
      fboList.push_back( 3 );
 | 
						|
      rc = BRMWrapper::getInstance()->writeVB( pFile, transId, oid, fboList, rangeList );
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
 | 
						|
      rc = BRMWrapper::getInstance()->writeVB( pFile, transId, oid, fboList, rangeList );
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
 | 
						|
      // commit
 | 
						|
      rc = BRMWrapper::getInstance()->commit( transId );
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
 | 
						|
 | 
						|
      // write to the same block
 | 
						|
      transId++;
 | 
						|
      rc = BRMWrapper::getInstance()->writeVB( pFile, transId, oid, fboList, rangeList );
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
 | 
						|
      // commit
 | 
						|
      rc = BRMWrapper::getInstance()->commit( transId );
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
 | 
						|
      // the same block should be locked by BRM
 | 
						|
      transId++;
 | 
						|
      rc = BRMWrapper::getInstance()->writeVB( pFile, transId, oid, fboList, rangeList );
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
 | 
						|
      transId++;
 | 
						|
      // rollback
 | 
						|
      fboList[0] += 1;
 | 
						|
      rangeList[0].start += 1;
 | 
						|
      rc = BRMWrapper::getInstance()->writeVB( pFile, transId, oid, fboList, rangeList );
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
 | 
						|
      rc = BRMWrapper::getInstance()->commit( transId );
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
 | 
						|
      transId++;
 | 
						|
      // write lbid
 | 
						|
      rc = BRMWrapper::getInstance()->writeVB( pFile, transId, oid, curLbid + 5);
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
 | 
						|
      rc = BRMWrapper::getInstance()->writeVB( pFile, transId, oid, curLbid + 6);
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
 | 
						|
      rc = BRMWrapper::getInstance()->commit( transId );
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
      
 | 
						|
      fileOp.closeFile( pFile );
 | 
						|
 | 
						|
      // test rollback whether can write back the original value after three insert
 | 
						|
      printf( "\n\nThis is the test for rollback after three insert for the same trans\n" );
 | 
						|
      DbFileOp    dbFileOp;
 | 
						|
      DataBlock   block, originBlock;
 | 
						|
      uint64_t         lbid0;
 | 
						|
      
 | 
						|
      pFile = dbFileOp.openFile( oid );
 | 
						|
      CPPUNIT_ASSERT( pFile != NULL );
 | 
						|
      
 | 
						|
      BRMWrapper::getInstance()->getBrmInfo( oid, 10, lbid0 );
 | 
						|
      memset( block.data, 'a', BYTE_PER_BLOCK );
 | 
						|
      rc = dbFileOp.writeDBFile( pFile, block.data, lbid0 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      rc = dbFileOp.readDBFile( pFile, originBlock.data, lbid0 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
 | 
						|
      transId++;
 | 
						|
      fboList.clear();
 | 
						|
      fboList.push_back( 10 );
 | 
						|
 | 
						|
      // first time
 | 
						|
      rc = BRMWrapper::getInstance()->writeVB( pFile, transId, oid, fboList );
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
 | 
						|
      memset( block.data, 'b', BYTE_PER_BLOCK );
 | 
						|
      rc = dbFileOp.writeDBFile( pFile, block.data, lbid0 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      // second time
 | 
						|
      rc = BRMWrapper::getInstance()->writeVB( pFile, transId, oid, fboList );
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
 | 
						|
      memset( block.data, 'c', BYTE_PER_BLOCK );
 | 
						|
      rc = dbFileOp.writeDBFile( pFile, block.data, lbid0 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      // third time
 | 
						|
      rc = BRMWrapper::getInstance()->writeVB( pFile, transId, oid, fboList );
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
 | 
						|
      memset( block.data, 'd', BYTE_PER_BLOCK );
 | 
						|
      rc = dbFileOp.writeDBFile( pFile, block.data, lbid0 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      fflush(pFile);
 | 
						|
      rc = BRMWrapper::getInstance()->rollBack( transId );
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
 | 
						|
      fflush(pFile);
 | 
						|
      rc = dbFileOp.readDBFile( pFile, block.data, lbid0 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      CPPUNIT_ASSERT( memcmp( block.data, originBlock.data, BYTE_PER_BLOCK ) == 0 );
 | 
						|
      
 | 
						|
      // test commit twice and rollback to see whether rollback commit values
 | 
						|
      printf( "\n\nThis is the test for commit twice and then rollback to see whether the previous two committed one got rollback\n" );
 | 
						|
 | 
						|
      // first commit
 | 
						|
      transId++;
 | 
						|
      rc = BRMWrapper::getInstance()->writeVB( pFile, transId, oid, fboList );
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
 | 
						|
      memset( block.data, 'e', BYTE_PER_BLOCK );
 | 
						|
      rc = dbFileOp.writeDBFile( pFile, block.data, lbid0 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      rc = BRMWrapper::getInstance()->commit( transId );
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
 | 
						|
      // second commit
 | 
						|
      transId++;
 | 
						|
      rc = BRMWrapper::getInstance()->writeVB( pFile, transId, oid, fboList );
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
 | 
						|
      memset( block.data, 'f', BYTE_PER_BLOCK );
 | 
						|
      rc = dbFileOp.writeDBFile( pFile, block.data, lbid0 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      fflush(pFile);
 | 
						|
 | 
						|
      rc = BRMWrapper::getInstance()->commit( transId );
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
 | 
						|
      memcpy( originBlock.data, block.data, BYTE_PER_BLOCK );
 | 
						|
 | 
						|
      // rollback
 | 
						|
      transId++;
 | 
						|
      rc = BRMWrapper::getInstance()->writeVB( pFile, transId, oid, fboList );
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
 | 
						|
      memset( block.data, 'g', BYTE_PER_BLOCK );
 | 
						|
      rc = dbFileOp.writeDBFile( pFile, block.data, lbid0 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      fflush(pFile);
 | 
						|
 | 
						|
      rc = BRMWrapper::getInstance()->rollBack( transId );
 | 
						|
      CPPUNIT_ASSERT(  rc == NO_ERROR );
 | 
						|
 | 
						|
      // check whether they are the same one
 | 
						|
      rc = dbFileOp.readDBFile( pFile, block.data, lbid0 );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      fflush(pFile);
 | 
						|
 | 
						|
      CPPUNIT_ASSERT( memcmp( block.data, originBlock.data, BYTE_PER_BLOCK ) == 0 );
 | 
						|
   }
 | 
						|
 | 
						|
   void testDM() 
 | 
						|
   {
 | 
						|
      FileOp   fileOp;
 | 
						|
      char     fileName[FILE_NAME_SIZE];
 | 
						|
      int      rc;
 | 
						|
 | 
						|
      rc = fileOp.oid2FileName( 100, fileName, true );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
      rc = fileOp.oid2FileName( 3071, fileName, true );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
 | 
						|
   }
 | 
						|
 | 
						|
   void testCacheBasic() 
 | 
						|
   {
 | 
						|
      DataBlock block;
 | 
						|
      OID       oid = 15;
 | 
						|
      uint64_t  lbid = 1234, fbo = 3;
 | 
						|
      int       rc;
 | 
						|
      CacheKey  key;
 | 
						|
      CommBlock cb;
 | 
						|
 | 
						|
      Cache::init();
 | 
						|
      cb.file.oid = oid;
 | 
						|
      memset( block.data, 'a', BYTE_PER_BLOCK );
 | 
						|
      rc = Cache::insertLRUList( cb, lbid, fbo, block );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      CPPUNIT_ASSERT( Cache::cacheKeyExist( oid, lbid ) == true );
 | 
						|
 | 
						|
      // add a second block
 | 
						|
      block.data[1] = '1';
 | 
						|
      lbid = 1235;
 | 
						|
      rc = Cache::insertLRUList( cb, lbid, fbo, block );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      CPPUNIT_ASSERT( Cache::cacheKeyExist( oid, lbid ) == true );
 | 
						|
 | 
						|
      // add one more block
 | 
						|
      block.data[1] = '2';
 | 
						|
      lbid = 1237;
 | 
						|
      rc = Cache::insertLRUList( cb, lbid, fbo, block );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      CPPUNIT_ASSERT( Cache::cacheKeyExist( oid, lbid ) == true );
 | 
						|
 | 
						|
      // load one from lruList
 | 
						|
      memset( block.data, 0, BYTE_PER_BLOCK );
 | 
						|
      lbid = 1235;
 | 
						|
      key = Cache::getCacheKey( oid, lbid );
 | 
						|
      rc = Cache::loadCacheBlock( key, block );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      CPPUNIT_ASSERT( block.data[1] == '1' );
 | 
						|
      CPPUNIT_ASSERT( block.data[2] == 'a' );
 | 
						|
 | 
						|
      // move one block from lrulist to write list
 | 
						|
      block.data[2] = 'm';
 | 
						|
      rc = Cache::modifyCacheBlock( key, block );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      memset( block.data, 0, BYTE_PER_BLOCK );  // clear
 | 
						|
      rc = Cache::loadCacheBlock( key, block );
 | 
						|
      CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
      CPPUNIT_ASSERT( block.data[2] == 'm' );
 | 
						|
 | 
						|
      Cache::printCacheList();
 | 
						|
 | 
						|
      // flush cache
 | 
						|
      Cache::flushCache();
 | 
						|
      Cache::printCacheList();
 | 
						|
 | 
						|
      // shutdown
 | 
						|
//      Cache::freeMemory();
 | 
						|
   }
 | 
						|
 | 
						|
   void testCacheReadWrite() 
 | 
						|
   {
 | 
						|
      DbFileOp  dbFileOp;
 | 
						|
      DataBlock block;
 | 
						|
      CommBlock cb;
 | 
						|
      OID       oid = 16;
 | 
						|
      uint64_t  lbid = 1234;
 | 
						|
      int       rc, totalBlock;
 | 
						|
      int       allocSize =0;
 | 
						|
 | 
						|
      BRMWrapper::setUseBrm(true);
 | 
						|
      dbFileOp.setTransId( 3 );
 | 
						|
      Cache::clear();
 | 
						|
     
 | 
						|
      cb.session.txnid = 10;
 | 
						|
      cb.file.oid = oid;
 | 
						|
 | 
						|
      dbFileOp.deleteFile( oid );
 | 
						|
      CPPUNIT_ASSERT( dbFileOp.exists( oid ) == false );
 | 
						|
 | 
						|
      CPPUNIT_ASSERT( dbFileOp.createFile( oid, 10, allocSize ) == NO_ERROR );
 | 
						|
 | 
						|
      cb.file.pFile = dbFileOp.openFile( oid );
 | 
						|
      CPPUNIT_ASSERT( cb.file.pFile != NULL );
 | 
						|
      
 | 
						|
      BRMWrapper::getInstance()->getBrmInfo( oid, 3, lbid );
 | 
						|
 | 
						|
      Cache::setUseCache( true );
 | 
						|
      Cache::clear();
 | 
						|
      int size;
 | 
						|
 | 
						|
      size = Cache::getListSize( FREE_LIST );
 | 
						|
      CPPUNIT_ASSERT( size == DEFAULT_CACHE_BLOCK );
 | 
						|
      size = Cache::getListSize( WRITE_LIST );
 | 
						|
      CPPUNIT_ASSERT( size == 0 );
 | 
						|
 | 
						|
 | 
						|
      totalBlock = Cache::getTotalBlock();
 | 
						|
      for( long i = 0; i < totalBlock; i++ ) {
 | 
						|
 | 
						|
         rc = dbFileOp.readDBFile( cb, block.data, lbid );
 | 
						|
         CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
         block.data[1] = 'k';
 | 
						|
         rc = dbFileOp.writeDBFile( cb, block.data, lbid );
 | 
						|
         CPPUNIT_ASSERT( rc == NO_ERROR );
 | 
						|
 | 
						|
         lbid++;
 | 
						|
         if( i == DEFAULT_CACHE_BLOCK - 20 ) 
 | 
						|
            BRMWrapper::getInstance()->getBrmInfo( oid, 3, lbid );
 | 
						|
 | 
						|
         if( i % 5000 == 0 && i != 0 ) {
 | 
						|
            printf( "\ni=%ld", i );
 | 
						|
            Cache::printCacheList();
 | 
						|
         }
 | 
						|
 | 
						|
         if( i == totalBlock - 2 ) {
 | 
						|
            dbFileOp.flushCache();
 | 
						|
            Cache::setUseCache( false );
 | 
						|
         }
 | 
						|
      }
 | 
						|
 | 
						|
   }
 | 
						|
 | 
						|
   void testCleanup() 
 | 
						|
   {
 | 
						|
      // shutdown
 | 
						|
      Cache::freeMemory();
 | 
						|
   }
 | 
						|
 | 
						|
};
 | 
						|
 | 
						|
CPPUNIT_TEST_SUITE_REGISTRATION( SharedTest );
 | 
						|
 | 
						|
#include <cppunit/extensions/TestFactoryRegistry.h>
 | 
						|
#include <cppunit/ui/text/TestRunner.h>
 | 
						|
 | 
						|
int main( int argc, char **argv)
 | 
						|
{
 | 
						|
  CppUnit::TextUi::TestRunner runner;
 | 
						|
  CppUnit::TestFactoryRegistry ®istry = CppUnit::TestFactoryRegistry::getRegistry();
 | 
						|
  runner.addTest( registry.makeTest() );
 | 
						|
  bool wasSuccessful = runner.run( "", false );
 | 
						|
  return (wasSuccessful ? 0 : 1);
 | 
						|
}
 | 
						|
 | 
						|
 |