1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-06-01 22:41:43 +03:00
2016-01-06 14:08:59 -06:00

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 &registry = CppUnit::TestFactoryRegistry::getRegistry();
runner.addTest( registry.makeTest() );
bool wasSuccessful = runner.run( "", false );
return (wasSuccessful ? 0 : 1);
}