You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-08-17 09:41:06 +03:00
777 lines
26 KiB
C++
777 lines
26 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. */
|
|
|
|
#include <stdio.h>
|
|
#include <string>
|
|
#include <stdexcept>
|
|
using namespace std;
|
|
|
|
#include <boost/scoped_ptr.hpp>
|
|
using namespace boost;
|
|
|
|
#include <cppunit/extensions/HelperMacros.h>
|
|
|
|
#include "we_dctnry.h"
|
|
#include "we_dctnrystore.h"
|
|
|
|
using namespace WriteEngine;
|
|
|
|
class DctnryTest : public CppUnit::TestFixture {
|
|
|
|
|
|
CPPUNIT_TEST_SUITE( DctnryTest );
|
|
|
|
// Dctnry basic testing
|
|
//CPPUNIT_TEST( testDctnryInsertLarge );
|
|
//CPPUNIT_TEST( testDctnryInsertDelete );
|
|
///CPPUNIT_TEST( testDctnryInsertStress);
|
|
//CPPUNIT_TEST( testGetBlockHdr);
|
|
//CPPUNIT_TEST( testGetFreeSpace);
|
|
CPPUNIT_TEST( testDctnryInsertDeleteStore);
|
|
CPPUNIT_TEST_SUITE_END();
|
|
|
|
private:
|
|
Dctnry m_Dctnry;
|
|
DctnryStore m_DctnryStore;
|
|
int m_oId;
|
|
public:
|
|
void setUp() {
|
|
}
|
|
|
|
void tearDown() {
|
|
}
|
|
DctnryTest()
|
|
{
|
|
m_oId =0;
|
|
}
|
|
void testDctnryInsertLarge() {
|
|
int oId=2000;
|
|
// int blockCount =10;
|
|
|
|
FILE* dFile =NULL;
|
|
|
|
int rc =0;
|
|
DataBlock curBlock;
|
|
// int largeSize=6144;
|
|
int largeSize=2724;
|
|
int smallSize=2032;
|
|
|
|
uint16_t freeSpace;
|
|
uint64_t nextPtr;
|
|
uint16_t offSet0;
|
|
uint16_t endHeader;
|
|
unsigned char dctnryHeader[14];
|
|
m_Dctnry.setUseSmallSize(false);
|
|
m_Dctnry.setDebugLevel( DEBUG_3 );
|
|
m_oId = oId;
|
|
|
|
memset(curBlock.data,0, sizeof (curBlock.data));
|
|
memset(dctnryHeader,0, sizeof(dctnryHeader));
|
|
printf("\nRunning testDctnryInsertLarge \n");
|
|
|
|
rc = m_Dctnry.deleteFile(oId);
|
|
rc = m_Dctnry.createDctnry(oId,3);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
|
|
rc = m_Dctnry.openDctnry(oId);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
dFile = m_Dctnry.getDctnryFile();
|
|
CPPUNIT_ASSERT( dFile != NULL );
|
|
|
|
|
|
rc = m_Dctnry.initDctnryHdr( dFile);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
m_Dctnry.closeDctnry();
|
|
printf("After initDctnryHdr \n");
|
|
testGetBlockHdr();
|
|
|
|
//dFile= m_Dctnry.openFile( oId);
|
|
rc = m_Dctnry.openDctnry();
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
dFile = m_Dctnry.getDctnryFile();
|
|
CPPUNIT_ASSERT( dFile != NULL );
|
|
//12 for 6 bytes and 14 for 8 bytes
|
|
rc =m_Dctnry.readSubBlockEntry( dFile, &curBlock, 0, 0, 0, 14, &dctnryHeader);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
memcpy(&freeSpace,dctnryHeader,2);
|
|
memcpy(&nextPtr,dctnryHeader+2,8); // 8 bytes
|
|
memcpy(&offSet0,dctnryHeader+10,2);
|
|
memcpy(&endHeader,dctnryHeader+12,2);
|
|
|
|
unsigned char sgnature_value[largeSize];
|
|
memset(sgnature_value,0, sizeof(sgnature_value));
|
|
int j=0;
|
|
for (int i=0; i<largeSize; i++)
|
|
{
|
|
// if (j>255)
|
|
// j=0;
|
|
sgnature_value[i]=119;
|
|
// j++;
|
|
}
|
|
//insert a signature value
|
|
Token token;
|
|
|
|
rc = m_Dctnry.insertDctnry(dFile, largeSize,
|
|
sgnature_value, token);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
testGetBlockHdr();
|
|
|
|
|
|
rc = m_Dctnry.insertDctnry(dFile, largeSize,
|
|
sgnature_value, token);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
testGetBlockHdr();
|
|
|
|
|
|
rc = m_Dctnry.insertDctnry(dFile, largeSize,
|
|
sgnature_value, token);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
testGetBlockHdr();
|
|
|
|
token.fbo = 0;
|
|
token.op = 3;
|
|
rc =m_Dctnry.deleteDctnryValue( dFile, token);
|
|
testGetBlockHdr();
|
|
|
|
rc = m_Dctnry.insertDctnry(dFile, largeSize,
|
|
sgnature_value, token);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
testGetBlockHdr();
|
|
|
|
|
|
return;
|
|
|
|
//add the same dictionary again. it should not be added
|
|
rc = m_Dctnry.insertDctnry(dFile, largeSize,
|
|
sgnature_value, token);
|
|
testGetBlockHdr();
|
|
//add the same dictionary again. it should not be added to the next block
|
|
|
|
rc = m_Dctnry.insertDctnry(dFile, largeSize,
|
|
sgnature_value, token);
|
|
testGetBlockHdr();
|
|
|
|
printf("token fbo = %i",token.fbo);
|
|
printf("token op = %i",token.op);
|
|
token.fbo = 0;
|
|
token.op = 2;
|
|
// token.op++;
|
|
rc =m_Dctnry.deleteDctnryValue( dFile, token);
|
|
testGetBlockHdr();
|
|
|
|
return;
|
|
|
|
//add a 2nd dictionary to fillup the whole file block
|
|
|
|
unsigned char sgnature_value_s[smallSize];
|
|
memset(sgnature_value_s,0, sizeof(sgnature_value_s));
|
|
|
|
for (int i=0; i<smallSize; i++)
|
|
{
|
|
// if (j>255)
|
|
// j=0;
|
|
sgnature_value_s[i]=118;
|
|
// j++;
|
|
}
|
|
//insert a signature value
|
|
rc = m_Dctnry.insertDctnry(dFile, smallSize,
|
|
sgnature_value_s, token);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
testGetBlockHdr();
|
|
|
|
|
|
return;
|
|
//insert a signature value
|
|
Token token3;
|
|
rc = m_Dctnry.insertDctnry(dFile, largeSize,
|
|
sgnature_value, token3);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
m_Dctnry.closeDctnry(dFile);
|
|
printf("After insert dictionary \n");
|
|
testGetBlockHdr();
|
|
rc = m_Dctnry.openDctnry(oId);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
dFile = m_Dctnry.getDctnryFile();
|
|
rc =m_Dctnry.deleteDctnryValue( dFile, token);
|
|
m_Dctnry.closeDctnry(dFile);
|
|
printf("After delete dictionary \n");
|
|
testGetBlockHdr();
|
|
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
j=255;
|
|
for (int i=0; i<smallSize; i++)
|
|
{
|
|
if (j==0)
|
|
j=255;
|
|
sgnature_value[i]=j;
|
|
j--;
|
|
}
|
|
//insert another signature value
|
|
rc = m_Dctnry.openDctnry(oId);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
dFile = m_Dctnry.getDctnryFile();
|
|
CPPUNIT_ASSERT( dFile != NULL );
|
|
Token token2;
|
|
rc = m_Dctnry.insertDctnry(dFile, smallSize,
|
|
sgnature_value, token2);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
m_Dctnry.closeDctnry(dFile);
|
|
printf("After insert dictionary \n");
|
|
testGetBlockHdr();
|
|
m_Dctnry.dropDctnry(oId);
|
|
return;
|
|
}//testDctnryInsert
|
|
|
|
void testDctnryInsertDelete() {
|
|
int oId=2001;
|
|
// int blockCount =10;
|
|
|
|
FILE* dFile =NULL;
|
|
|
|
int rc =0;
|
|
DataBlock curBlock;
|
|
int largeSize=9000;
|
|
int smallSize=1000;
|
|
|
|
unsigned char dctnryHeader[14];
|
|
uint16_t freeSpace;
|
|
uint64_t nextPtr;
|
|
uint16_t offSet0;
|
|
uint16_t endHeader;
|
|
|
|
m_Dctnry.setDebugLevel( DEBUG_3 );
|
|
m_Dctnry.setUseSmallSize(true);
|
|
m_oId =oId;
|
|
memset(curBlock.data,0, sizeof (curBlock.data));
|
|
memset(dctnryHeader,0, sizeof(dctnryHeader));
|
|
printf("\nRunning testDctnryInsertDelete \n");
|
|
|
|
rc = m_Dctnry.deleteFile(oId);
|
|
|
|
rc = m_Dctnry.createDctnry((FID)-1);
|
|
CPPUNIT_ASSERT( rc == ERR_OPEN_FILE );
|
|
rc = m_Dctnry.createDctnry(oId,10);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
|
|
rc = m_Dctnry.openDctnry();
|
|
dFile = m_Dctnry.getDctnryFile();
|
|
CPPUNIT_ASSERT( dFile != NULL );
|
|
|
|
rc = m_Dctnry.initDctnryHdr( dFile);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
//CPPUNIT_ASSERT(rc==NO_ERROR);
|
|
//m_Dctnry.closeFile(dFile);
|
|
m_Dctnry.closeDctnry();
|
|
printf("After initDctnryHdr");
|
|
testGetBlockHdr();
|
|
//testGetFreeSpace();
|
|
rc = m_Dctnry.openDctnry();
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
dFile = m_Dctnry.getDctnryFile();
|
|
CPPUNIT_ASSERT( dFile != NULL );
|
|
//12 for 6 bytes and 14 for 8 bytes
|
|
rc =m_Dctnry.readSubBlockEntry( dFile, &curBlock, 0, 0, 0, 14, &dctnryHeader);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
memcpy(&freeSpace,dctnryHeader,2);
|
|
memcpy(&nextPtr,dctnryHeader+2,8); // 8 bytes
|
|
memcpy(&offSet0,dctnryHeader+10,2);
|
|
memcpy(&endHeader,dctnryHeader+12,2);
|
|
|
|
unsigned char sgnature_value[largeSize];
|
|
memset(sgnature_value,0, sizeof(sgnature_value));
|
|
int j=0;
|
|
for (int i=0; i<largeSize; i++)
|
|
{
|
|
if (j>255)
|
|
j=0;
|
|
|
|
sgnature_value[i]=j;
|
|
j++;
|
|
}
|
|
//insert a signature value
|
|
Token token;
|
|
|
|
rc = m_Dctnry.insertDctnry(dFile, largeSize,
|
|
sgnature_value, token);
|
|
CPPUNIT_ASSERT( rc ==ERR_DICT_SIZE_GT_8000);
|
|
largeSize = 6000;
|
|
Token token3;
|
|
for (int i=0; i<largeSize; i++)
|
|
{
|
|
if (j>255)
|
|
j=0;
|
|
sgnature_value[i]=j;
|
|
j++;
|
|
}
|
|
rc = m_Dctnry.insertDctnry(dFile, largeSize,
|
|
sgnature_value, token3);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
CPPUNIT_ASSERT( token3.fbo == 0 );
|
|
CPPUNIT_ASSERT( token3.op == 1 );
|
|
m_Dctnry.closeDctnry(dFile);
|
|
printf("After insert token 3 into dictionary \n");
|
|
testGetBlockHdr();
|
|
rc = m_Dctnry.openDctnry();
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
dFile = m_Dctnry.getDctnryFile();
|
|
CPPUNIT_ASSERT( dFile != NULL );
|
|
j=255;
|
|
for (int i=0; i<smallSize; i++)
|
|
{
|
|
if (j==0)
|
|
j=255;
|
|
sgnature_value[i]=j;
|
|
j--;
|
|
}
|
|
//insert another signature value
|
|
Token token2;
|
|
rc = m_Dctnry.insertDctnry(dFile, smallSize,
|
|
sgnature_value, token2);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
CPPUNIT_ASSERT( token2.fbo == 0 );
|
|
CPPUNIT_ASSERT( token2.op == 2 );
|
|
m_Dctnry.closeDctnry(dFile);
|
|
printf("After insert token 2 into dictionary \n");
|
|
testGetBlockHdr();
|
|
//delete
|
|
memset(&token,0, sizeof(token));
|
|
rc = m_Dctnry.openDctnry();
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
dFile = m_Dctnry.getDctnryFile();
|
|
CPPUNIT_ASSERT( dFile != NULL );
|
|
//token dose not exist in dictionary
|
|
rc =m_Dctnry.deleteDctnryValue( dFile, token);
|
|
CPPUNIT_ASSERT( rc == ERR_DICT_NO_OP_DELETE );
|
|
|
|
//rc =m_Dctnry.deleteDctnryValue( dFile, token3);
|
|
rc =m_Dctnry.deleteDctnryValue( dFile, token2);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
m_Dctnry.closeDctnry();
|
|
printf("After delete dictionary token2 \n");
|
|
testGetBlockHdr();
|
|
//delete right after
|
|
rc = m_Dctnry.openDctnry();
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
dFile = m_Dctnry.getDctnryFile();
|
|
CPPUNIT_ASSERT( dFile != NULL );
|
|
//rc =m_Dctnry.deleteDctnryValue( dFile, token2);
|
|
rc =m_Dctnry.deleteDctnryValue( dFile, token3);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
|
|
//m_Dctnry.closeFile( dFile );
|
|
m_Dctnry.closeDctnry();
|
|
printf("After delete dictionary token3\n");
|
|
testGetBlockHdr();
|
|
rc = m_Dctnry.openDctnry();
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
dFile = m_Dctnry.getDctnryFile();
|
|
CPPUNIT_ASSERT( dFile != NULL );
|
|
//rc =m_Dctnry.deleteDctnryValue( dFile, token2);
|
|
rc =m_Dctnry.deleteDctnryValue( dFile, token3);
|
|
CPPUNIT_ASSERT( rc == ERR_DICT_NO_OP_DELETE );
|
|
rc =m_Dctnry.deleteDctnryValue( dFile, token2);
|
|
CPPUNIT_ASSERT( rc == ERR_DICT_NO_OP_DELETE );
|
|
//CPPUNIT_ASSERT( rc == ERR_DICT_ZERO_LEN );
|
|
m_Dctnry.closeDctnry();
|
|
return;
|
|
}//testDctnryInsertDelete
|
|
|
|
void testDctnryInsertStress() {
|
|
|
|
int oId=2002;
|
|
int blockCount =2;
|
|
FILE* dFile =NULL;
|
|
int rc =0;
|
|
DataBlock curBlock;
|
|
int smallSize=1000;
|
|
uint16_t freeSpace;
|
|
Offset hdrOffsets[4039];
|
|
int opCount = 0;
|
|
|
|
m_Dctnry.setDebugLevel( DEBUG_3);
|
|
m_Dctnry.setUseSmallSize(true);
|
|
m_oId = oId;
|
|
memset(curBlock.data,0, sizeof (curBlock.data));
|
|
memset(hdrOffsets,0, sizeof(hdrOffsets));
|
|
printf("\nRunning testDctnryInsertStress \n");
|
|
|
|
rc = m_Dctnry.deleteFile(oId);
|
|
rc = m_Dctnry.createFile(oId,blockCount);
|
|
|
|
dFile= m_Dctnry.openFile( oId );
|
|
CPPUNIT_ASSERT( dFile != NULL );
|
|
|
|
rc = m_Dctnry.initDctnryHdr( dFile);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
//m_Dctnry.closeFile(dFile);
|
|
m_Dctnry.closeDctnry();
|
|
printf("After initDctnryHdr");
|
|
testGetBlockHdr();
|
|
dFile= m_Dctnry.openFile( oId);
|
|
unsigned char sgnature_value[smallSize];
|
|
Token token[100];
|
|
int i,j,k;
|
|
j=255;
|
|
for (k=0; k<18; k++)
|
|
{
|
|
for (int i=0; i<smallSize; i++)
|
|
{
|
|
if (j==0)
|
|
j=255;
|
|
sgnature_value[i]=k;
|
|
j--;
|
|
|
|
}// endfor i
|
|
rc = m_Dctnry.insertDctnry(dFile, smallSize,
|
|
sgnature_value, token[k]);
|
|
if (rc != NO_ERROR)
|
|
{
|
|
|
|
printf ("k: %i Error Code is: %i \n",k, rc);
|
|
//return;
|
|
}
|
|
if (k >15)
|
|
{
|
|
CPPUNIT_ASSERT( rc != NO_ERROR );
|
|
printf("294. Error code is: %i \n", rc);
|
|
}
|
|
else
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
|
|
}//endfor k
|
|
Offset prevOffset, curOffset;
|
|
j=0;
|
|
unsigned char* value = NULL;
|
|
//This is to get the value out
|
|
for (i=0; i<blockCount; i++)
|
|
{
|
|
rc =m_Dctnry.readSubBlockEntry( dFile, &curBlock, i, 0, 0, 2, &freeSpace);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
j=0;
|
|
|
|
prevOffset.hdrLoc =2+8; // 8 bytes
|
|
memcpy(&(prevOffset.offset),&(curBlock.data[prevOffset.hdrLoc]),2);
|
|
curOffset.hdrLoc = prevOffset.hdrLoc+2;
|
|
memcpy(&(curOffset.offset),&(curBlock.data[curOffset.hdrLoc]),2);
|
|
|
|
int op=1;
|
|
int size = prevOffset.offset - curOffset.offset;
|
|
|
|
value = (unsigned char*)malloc(sizeof(unsigned char)*size);
|
|
memcpy(value, &curBlock.data[curOffset.offset], size );
|
|
|
|
while (curOffset.offset!= 0xFFFF)
|
|
{
|
|
//printf("fbo: %i op: %i starting offset: %i ending offset %i size: %i \n",
|
|
// i, op, curOffset.offset, prevOffset.offset, size);
|
|
|
|
//printf("value : ");
|
|
for (k=0; k<size; k++)
|
|
{
|
|
//printf("%u",value[k]);
|
|
}
|
|
// printf("\n");
|
|
//start again
|
|
free(value);
|
|
value = NULL;
|
|
prevOffset.hdrLoc = curOffset.hdrLoc;
|
|
prevOffset.offset = curOffset.offset;
|
|
curOffset.hdrLoc+=2;
|
|
memcpy(&(curOffset.offset), &curBlock.data[curOffset.hdrLoc],2);
|
|
size = prevOffset.offset - curOffset.offset;
|
|
if (curOffset.offset!= 0xFFFF)
|
|
{
|
|
value = (unsigned char*)malloc(sizeof(unsigned char)*size);
|
|
memcpy(value, &curBlock.data[curOffset.offset], size );
|
|
}
|
|
op++;
|
|
|
|
}//end while
|
|
|
|
//Get Offset info
|
|
m_Dctnry.closeDctnry();
|
|
printf("After insertDctnry");
|
|
testGetBlockHdr();
|
|
dFile= m_Dctnry.openFile( oId );
|
|
CPPUNIT_ASSERT( dFile != NULL );
|
|
m_Dctnry.getBlockHdr(dFile, i, opCount, hdrOffsets);
|
|
int opCount2 =0;
|
|
for (k=0; k< opCount; k++)
|
|
{
|
|
Token token;
|
|
token.fbo = i;
|
|
token.op = k+1;
|
|
rc = m_Dctnry.findTokenValue(dFile, token,sgnature_value, size);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR);
|
|
CPPUNIT_ASSERT( size == smallSize);
|
|
rc =m_Dctnry.deleteDctnryValue( dFile, token);
|
|
printf("After deleteDctnryValue fbo %i op %i\n", (int)i, k+1);
|
|
m_Dctnry.getBlockHdr(dFile, i, opCount2, hdrOffsets);
|
|
Offset startOffset, endOffset;
|
|
printf("Header Info for fbo: %i \n %i %llu ", i, (int)m_Dctnry.getFree(),
|
|
m_Dctnry.getNextPtr());
|
|
|
|
endOffset.hdrLoc = 10;
|
|
endOffset.offset = 8192;
|
|
printf("%i ",endOffset.offset);
|
|
for (int k1=0; k1< opCount2; k1++)
|
|
{
|
|
startOffset.hdrLoc = hdrOffsets[k1].hdrLoc;
|
|
startOffset.offset = hdrOffsets[k1].offset;
|
|
printf("%i ",startOffset.offset);
|
|
}//end for k1
|
|
|
|
rc =m_Dctnry.deleteDctnryValue( dFile, token);
|
|
|
|
printf("%x \n", 0xFFFF);
|
|
printf("k-> %i i-> %i error code -> %i \n ", k, i, rc);
|
|
if (k<opCount-1)
|
|
CPPUNIT_ASSERT( rc == ERR_DICT_ZERO_LEN);
|
|
else
|
|
CPPUNIT_ASSERT( rc == ERR_DICT_NO_OP_DELETE);
|
|
}//end for k
|
|
} //end for i
|
|
//m_Dctnry.closeFile( dFile );
|
|
char sigString[] = "Hello, I am a string; what are you? I am testing dictionary as a signature value, I don't know how long I am but we will find out in a minute";
|
|
int sigStringSize = strlen(sigString);
|
|
char resultString[sigStringSize+1];
|
|
Token stringToken;
|
|
rc = m_Dctnry.insertDctnry(dFile, sigStringSize,
|
|
(unsigned char*)sigString, stringToken);
|
|
rc = m_Dctnry.findTokenValue(dFile,stringToken, (unsigned char*)resultString,sigStringSize);
|
|
resultString[sigStringSize] ='\0';
|
|
printf("result String is %s --->size is %i\n",resultString, strlen(resultString) );
|
|
m_Dctnry.closeDctnry();
|
|
printf("After insert the result string, the header look like the following:\n");
|
|
testGetBlockHdr();
|
|
return;
|
|
}//testDctnryInsertStress
|
|
|
|
void testGetBlockHdr() {
|
|
|
|
int blockCount=2;
|
|
int oId =2002;
|
|
int i =0, k=0;
|
|
FILE* dFile;
|
|
int opCount;
|
|
Offset hdrOffsets[4040];
|
|
memset(hdrOffsets,0, sizeof(hdrOffsets));
|
|
m_Dctnry.setDebugLevel( DEBUG_3 );
|
|
|
|
|
|
printf("\nRunning testGetBlockHdr \n");
|
|
|
|
dFile= m_Dctnry.openFile( m_oId );
|
|
if (dFile==NULL)
|
|
dFile= m_Dctnry.openFile( oId );
|
|
CPPUNIT_ASSERT( dFile != NULL );
|
|
blockCount = m_Dctnry.getFileSize( dFile )/BYTE_PER_BLOCK ;
|
|
for (i=0; i<blockCount; i++)
|
|
{
|
|
m_Dctnry.getBlockHdr(dFile, i, opCount, hdrOffsets);
|
|
Offset startOffset, endOffset;
|
|
int sigSize;
|
|
printf("Header Info for fbo: %i \n %i %llu ", i, (int)m_Dctnry.getFree(),
|
|
m_Dctnry.getNextPtr());
|
|
//printf(" fbo %i total offset number %i \n", i, opCount);
|
|
endOffset.hdrLoc = 10;
|
|
endOffset.offset = 8192;
|
|
printf("%i ",endOffset.offset);
|
|
for (k=0; k< opCount; k++)
|
|
{
|
|
startOffset.hdrLoc = hdrOffsets[k].hdrLoc;
|
|
startOffset.offset = hdrOffsets[k].offset;
|
|
sigSize = endOffset.offset - startOffset.offset;
|
|
|
|
//printf(" OP %i signature size : %i \n from %i to %i \n", k+1,
|
|
// sigSize, startOffset.offset,endOffset.offset );
|
|
endOffset.hdrLoc = startOffset.hdrLoc ;
|
|
endOffset.offset = startOffset.offset;
|
|
printf("%i ",endOffset.offset);
|
|
}//end for k
|
|
printf("%x \n", 0xFFFF);
|
|
}//endfor i
|
|
m_Dctnry.closeDctnry();
|
|
|
|
}
|
|
void testGetFreeSpace() {
|
|
int oId =2002;
|
|
FILE* dFile;
|
|
|
|
m_Dctnry.setDebugLevel( DEBUG_1 );
|
|
|
|
|
|
printf("\nRunning testGetFreeSpace \n");
|
|
dFile= m_Dctnry.openFile( m_oId );
|
|
if (dFile==NULL)
|
|
dFile= m_Dctnry.openFile( oId );
|
|
CPPUNIT_ASSERT( dFile != NULL );
|
|
m_Dctnry.getFreeSpaceArray(dFile);
|
|
for (int i=0; i<m_Dctnry.getNumBlocks(); i++)
|
|
{
|
|
printf("fbo %i -->free space:%i \n", i, m_Dctnry.m_freeSpaceArray[i]);
|
|
}
|
|
m_Dctnry.closeDctnry();
|
|
}
|
|
void testDctnryInsertDeleteStore() {
|
|
int rc =0;
|
|
int smallSize=1000;
|
|
FID dctnryOID =2002;
|
|
FID treeOID = 101;
|
|
FID listOID = 102;
|
|
m_DctnryStore.setDebugLevel( DEBUG_3 );
|
|
printf("\nRunning testDctnryInsertDeleteStore \n");
|
|
rc = m_DctnryStore.dropDctnryStore( treeOID, dctnryOID, listOID);
|
|
//CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
rc = m_DctnryStore.createDctnryStore( dctnryOID, treeOID, listOID);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
rc = m_DctnryStore.dropDctnryStore( dctnryOID, treeOID, listOID);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
rc = m_DctnryStore.createDctnryStore( dctnryOID, treeOID, listOID);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
rc = m_DctnryStore.dropDctnryStore( treeOID, dctnryOID, listOID);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
|
|
rc = m_DctnryStore.createDctnryStore( dctnryOID, treeOID, listOID);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
rc = m_DctnryStore.dropDctnryStore();
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
|
|
rc = m_DctnryStore.createDctnryStore( dctnryOID, treeOID, listOID);
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
|
|
rc = m_DctnryStore.openDctnryStore(dctnryOID, treeOID, listOID );
|
|
CPPUNIT_ASSERT( rc ==NO_ERROR );
|
|
|
|
m_DctnryStore.closeDctnryStore();
|
|
CPPUNIT_ASSERT( rc ==NO_ERROR );
|
|
|
|
rc = m_DctnryStore.openDctnryStore();
|
|
CPPUNIT_ASSERT( rc ==NO_ERROR );
|
|
|
|
unsigned char sgnature_value[smallSize];
|
|
Token token[100];
|
|
memset(token, 0, sizeof(token));
|
|
int i,j,k;
|
|
for (int i=0; i<smallSize; i++)
|
|
{
|
|
// if (j>255)
|
|
// j=0;
|
|
sgnature_value[i]=119;
|
|
// j++;
|
|
}
|
|
//insert a signature value
|
|
for (k=1;k<12;k++) {
|
|
|
|
rc = m_DctnryStore.updateDctnryStore(sgnature_value, smallSize,token[k]);
|
|
printf("token fbo = %i",token[k].fbo);
|
|
printf("token op = %i",token[k].op);
|
|
}
|
|
testGetBlockHdr();
|
|
return;
|
|
|
|
rc = m_DctnryStore.updateDctnryStore(sgnature_value, smallSize,token[1]);
|
|
testGetBlockHdr();
|
|
|
|
|
|
//Recheck if the tokens are all inserted
|
|
for (k=1; k<99; k++)
|
|
{
|
|
for (i=0; i<smallSize; i++)
|
|
{
|
|
if (j==0)
|
|
j=255;
|
|
if (k>10)
|
|
sgnature_value[i]=k;
|
|
else
|
|
{
|
|
if (i<8)
|
|
sgnature_value[i] =1;
|
|
else
|
|
sgnature_value[i]=k;
|
|
}
|
|
j--;
|
|
}//endfor i ; second time
|
|
rc = m_DctnryStore.updateDctnryStore(sgnature_value,
|
|
smallSize,token[k]);
|
|
if (rc!= NO_ERROR)
|
|
{
|
|
printf("443. Attentione!!! ERROR CODE : %i \n", rc);
|
|
}
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
} //endof for k; second time
|
|
|
|
int tempSize = 7;
|
|
rc = m_DctnryStore.updateDctnryStore(sgnature_value,
|
|
tempSize,token[k]);
|
|
if (rc!= NO_ERROR)
|
|
{
|
|
printf("452. Predicted Error Code should be 1363: The result ERROR CODE : %i \n", rc);
|
|
}
|
|
CPPUNIT_ASSERT( rc ==1363 );
|
|
|
|
tempSize = 8;
|
|
rc = m_DctnryStore.updateDctnryStore(sgnature_value,
|
|
tempSize,token[k]);
|
|
if (rc!= NO_ERROR)
|
|
{
|
|
printf("461. Attention!!! ERROR CODE : %i \n", rc);
|
|
}
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
for (i=1; i<99; i++)
|
|
{
|
|
if( m_DctnryStore.isDebug( DEBUG_3 ))
|
|
{
|
|
printf("i : %i token.fbo %i token.op %i \n", i, (int)token[i].fbo, (int)token[i].op);
|
|
}
|
|
}
|
|
|
|
for (i=1; i<99; i++)
|
|
{
|
|
rc = m_DctnryStore.deleteDctnryToken(token[i]);
|
|
|
|
if (rc!= NO_ERROR)
|
|
{
|
|
printf("475 . Attention!!! ERROR CODE : %i \n", rc);
|
|
}
|
|
CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
}
|
|
|
|
m_DctnryStore.closeDctnryStore();
|
|
//rc = m_DctnryStore.dropDctnryStore();
|
|
//CPPUNIT_ASSERT( rc == NO_ERROR );
|
|
return;
|
|
}//testDctnryInsertDeleteStore
|
|
};
|
|
|
|
CPPUNIT_TEST_SUITE_REGISTRATION( DctnryTest );
|
|
|
|
#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);
|
|
}
|
|
|
|
|