Index: ext/sqlite3/sqlite3.vcproj =================================================================== diff -u -N -rcaa075123222d2b7ae40270c006f021218d96a72 -r3397fd021739bea537248415a7b4fc2712dd2320 --- ext/sqlite3/sqlite3.vcproj (.../sqlite3.vcproj) (revision caa075123222d2b7ae40270c006f021218d96a72) +++ ext/sqlite3/sqlite3.vcproj (.../sqlite3.vcproj) (revision 3397fd021739bea537248415a7b4fc2712dd2320) @@ -321,8 +321,8 @@ @@ -394,8 +394,8 @@ @@ -468,8 +468,8 @@ TSQLiteDatabasePtr; +} + +END_CHCORE_NAMESPACE + +#endif Index: src/libchcore/TSQLiteException.cpp =================================================================== diff -u -N --- src/libchcore/TSQLiteException.cpp (revision 0) +++ src/libchcore/TSQLiteException.cpp (revision 3397fd021739bea537248415a7b4fc2712dd2320) @@ -0,0 +1,39 @@ +// ============================================================================ +// Copyright (C) 2001-2013 by Jozef Starosczyk +// ixen@copyhandler.com +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU Library General Public License +// (version 2) as published by the Free Software Foundation; +// +// 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 Library General Public +// License along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// ============================================================================ +#include "stdafx.h" +#include "TSQLiteException.h" + +BEGIN_CHCORE_NAMESPACE + +namespace sqlite +{ + TSQLiteException::TSQLiteException(EGeneralErrors eErrorCode, int iSQLiteError, const wchar_t* pszMsg, const wchar_t* pszFile, size_t stLineNumber, const wchar_t* pszFunction) : + TBaseException(eErrorCode, pszMsg, pszFile, stLineNumber, pszFunction), + m_iSQLiteError(iSQLiteError) + { + } + + TSQLiteException::TSQLiteException(EGeneralErrors eErrorCode, int iSQLiteError, const char* pszMsg, const wchar_t* pszFile, size_t stLineNumber, const wchar_t* pszFunction) : + TBaseException(eErrorCode, pszMsg, pszFile, stLineNumber, pszFunction), + m_iSQLiteError(iSQLiteError) + { + } +} + +END_CHCORE_NAMESPACE Index: src/libchcore/TSQLiteException.h =================================================================== diff -u -N --- src/libchcore/TSQLiteException.h (revision 0) +++ src/libchcore/TSQLiteException.h (revision 3397fd021739bea537248415a7b4fc2712dd2320) @@ -0,0 +1,45 @@ +// ============================================================================ +// Copyright (C) 2001-2013 by Jozef Starosczyk +// ixen@copyhandler.com +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU Library General Public License +// (version 2) as published by the Free Software Foundation; +// +// 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 Library General Public +// License along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// ============================================================================ +#ifndef __TSQLITEEXCEPTION_H__ +#define __TSQLITEEXCEPTION_H__ + +#include "libchcore.h" +#include "TBaseException.h" + +#define THROW_SQLITE_EXCEPTION(error_code, sqlite_error_code, err_msg)\ + throw TSQLiteException(error_code, sqlite_error_code, err_msg, __FILEW__, __LINE__, __FUNCTIONW__) + +BEGIN_CHCORE_NAMESPACE + +namespace sqlite +{ + class TSQLiteException : public TBaseException + { + public: + TSQLiteException(EGeneralErrors eErrorCode, int iSQLiteError, const wchar_t* pszMsg, const wchar_t* pszFile, size_t stLineNumber, const wchar_t* pszFunction); + TSQLiteException(EGeneralErrors eErrorCode, int iSQLiteError, const char* pszMsg, const wchar_t* pszFile, size_t stLineNumber, const wchar_t* pszFunction); + + private: + int m_iSQLiteError; + }; +} + +END_CHCORE_NAMESPACE + +#endif Index: src/libchcore/TSQLiteStatement.cpp =================================================================== diff -u -N --- src/libchcore/TSQLiteStatement.cpp (revision 0) +++ src/libchcore/TSQLiteStatement.cpp (revision 3397fd021739bea537248415a7b4fc2712dd2320) @@ -0,0 +1,189 @@ +// ============================================================================ +// Copyright (C) 2001-2013 by Jozef Starosczyk +// ixen@copyhandler.com +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU Library General Public License +// (version 2) as published by the Free Software Foundation; +// +// 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 Library General Public +// License along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// ============================================================================ +#include "stdafx.h" +#include "TSQLiteStatement.h" +#include "sqlite3/sqlite3.h" +#include "ErrorCodes.h" +#include "TSQLiteException.h" + +BEGIN_CHCORE_NAMESPACE + +namespace sqlite +{ + TSQLiteStatement::TSQLiteStatement(const TSQLiteDatabasePtr& spDatabase) : + m_pStatement(NULL), + m_spDatabase(spDatabase), + m_bHasRow(false) + { + if(!m_spDatabase) + THROW_SQLITE_EXCEPTION(eErr_InvalidArgument, 0, _T("Invalid database provided")); + } + + TSQLiteStatement::~TSQLiteStatement() + { + int iResult = sqlite3_finalize(m_pStatement); + _ASSERTE(iResult == SQLITE_OK); + } + + void TSQLiteStatement::Close() + { + if(m_pStatement != NULL) + { + int iResult = sqlite3_finalize(m_pStatement); + if(iResult != SQLITE_OK) + THROW_SQLITE_EXCEPTION(eErr_SQLiteFinalizeError, iResult, _T("Cannot finalize statement")); + m_pStatement = NULL; + } + m_bHasRow = false; + } + + void TSQLiteStatement::Prepare(PCWSTR pszQuery) + { + Close(); + + int iResult = sqlite3_prepare16_v2((sqlite3*)m_spDatabase->GetHandle(), pszQuery, -1, &m_pStatement, NULL); + if(iResult != SQLITE_OK) + THROW_SQLITE_EXCEPTION(eErr_SQLitePrepareError, iResult, (PCTSTR)sqlite3_errmsg16((sqlite3*)m_spDatabase->GetHandle())); + } + + TSQLiteStatement::EStepResult TSQLiteStatement::Step() + { + m_bHasRow = false; + + if(!m_pStatement) + THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement")); + + int iResult = sqlite3_step(m_pStatement); + switch(iResult) + { + case SQLITE_ROW: + m_bHasRow = true; + return eStep_HasRow; + case SQLITE_OK: + case SQLITE_DONE: + Reset(); + return eStep_Finished; + default: + THROW_SQLITE_EXCEPTION(eErr_SQLiteStepError, iResult, _T("Cannot perform step on the statement")); + } + } + + void TSQLiteStatement::BindValue(int iColumn, double dValue) + { + if(!m_pStatement) + THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement")); + + int iResult = sqlite3_bind_double(m_pStatement, iColumn, dValue); + if(iResult != SQLITE_OK) + THROW_SQLITE_EXCEPTION(eErr_SQLiteBindError, iResult, _T("Cannot bind a parameter")); + } + + void TSQLiteStatement::BindValue(int iColumn, int iValue) + { + if(!m_pStatement) + THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement")); + + int iResult = sqlite3_bind_int(m_pStatement, iColumn, iValue); + if(iResult != SQLITE_OK) + THROW_SQLITE_EXCEPTION(eErr_SQLiteBindError, iResult, _T("Cannot bind a parameter")); + } + + void TSQLiteStatement::BindValue(int iColumn, long long llValue) + { + if(!m_pStatement) + THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement")); + + int iResult = sqlite3_bind_int64(m_pStatement, iColumn, llValue); + if(iResult != SQLITE_OK) + THROW_SQLITE_EXCEPTION(eErr_SQLiteBindError, iResult, _T("Cannot bind a parameter")); + } + + void TSQLiteStatement::BindValue(int iColumn, PCTSTR pszText) + { + if(!m_pStatement) + THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement")); + + int iResult = sqlite3_bind_text16(m_pStatement, iColumn, pszText, -1, SQLITE_TRANSIENT); + if(iResult != SQLITE_OK) + THROW_SQLITE_EXCEPTION(eErr_SQLiteBindError, iResult, _T("Cannot bind a parameter")); + } + + double TSQLiteStatement::GetDouble(int iCol) + { + if(!m_pStatement) + THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement")); + if(!m_bHasRow) + THROW_SQLITE_EXCEPTION(eErr_SQLiteNoRowAvailable, 0, _T("No row available")); + + return sqlite3_column_double(m_pStatement, iCol); + } + + int TSQLiteStatement::GetInt(int iCol) + { + if(!m_pStatement) + THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement")); + if(!m_bHasRow) + THROW_SQLITE_EXCEPTION(eErr_SQLiteNoRowAvailable, 0, _T("No row available")); + + return sqlite3_column_int(m_pStatement, iCol); + } + + long long TSQLiteStatement::GetInt64(int iCol) + { + if(!m_pStatement) + THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement")); + if(!m_bHasRow) + THROW_SQLITE_EXCEPTION(eErr_SQLiteNoRowAvailable, 0, _T("No row available")); + + return sqlite3_column_int64(m_pStatement, iCol); + } + + TString TSQLiteStatement::GetText(int iCol) + { + if(!m_pStatement) + THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement")); + if(!m_bHasRow) + THROW_SQLITE_EXCEPTION(eErr_SQLiteNoRowAvailable, 0, _T("No row available")); + + return TString((const wchar_t*)sqlite3_column_text16(m_pStatement, iCol)); + } + + void TSQLiteStatement::ClearBindings() + { + if(!m_pStatement) + THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement")); + + int iResult = sqlite3_clear_bindings(m_pStatement); + if(iResult != SQLITE_OK) + THROW_SQLITE_EXCEPTION(eErr_SQLiteBindError, iResult, _T("Cannot clear bindings")); + } + + void TSQLiteStatement::Reset() + { + if(!m_pStatement) + THROW_SQLITE_EXCEPTION(eErr_SQLiteStatementNotPrepared, 0, _T("Tried to step on unprepared statement")); + + int iResult = sqlite3_reset(m_pStatement); + if(iResult != SQLITE_OK) + THROW_SQLITE_EXCEPTION(eErr_SQLiteBindError, iResult, _T("Cannot reset statement")); + } + +} + +END_CHCORE_NAMESPACE Index: src/libchcore/TSQLiteStatement.h =================================================================== diff -u -N --- src/libchcore/TSQLiteStatement.h (revision 0) +++ src/libchcore/TSQLiteStatement.h (revision 3397fd021739bea537248415a7b4fc2712dd2320) @@ -0,0 +1,77 @@ +// ============================================================================ +// Copyright (C) 2001-2013 by Jozef Starosczyk +// ixen@copyhandler.com +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU Library General Public License +// (version 2) as published by the Free Software Foundation; +// +// 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 Library General Public +// License along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// ============================================================================ +#ifndef __TSQLITESTATEMENT_H__ +#define __TSQLITESTATEMENT_H__ + +#include "libchcore.h" +#include "TSQLiteDatabase.h" +#include "TString.h" + +struct sqlite3_stmt; + +BEGIN_CHCORE_NAMESPACE + +namespace sqlite +{ + typedef boost::shared_ptr SQLiteStatementHandle; + + class TSQLiteStatement + { + public: + enum EStepResult + { + eStep_Finished, + eStep_HasRow + }; + + public: + TSQLiteStatement(const TSQLiteDatabasePtr& spDatabase); + ~TSQLiteStatement(); + + void Close(); + + void Prepare(PCTSTR pszQuery); + + void BindValue(int iColumn, double dValue); + void BindValue(int iColumn, int iValue); + void BindValue(int iColumn, long long llValue); + void BindValue(int iColumn, PCTSTR pszText); + + void ClearBindings(); + + EStepResult Step(); + void Reset(); + + double GetDouble(int iCol); + int GetInt(int iCol); + long long GetInt64(int iCol); + TString GetText(int iCol); + + private: + sqlite3_stmt* m_pStatement; + TSQLiteDatabasePtr m_spDatabase; + bool m_bHasRow; + }; + + typedef boost::shared_ptr TSQLiteStatementPtr; +} + +END_CHCORE_NAMESPACE + +#endif Index: src/libchcore/TSQLiteTransaction.cpp =================================================================== diff -u -N --- src/libchcore/TSQLiteTransaction.cpp (revision 0) +++ src/libchcore/TSQLiteTransaction.cpp (revision 3397fd021739bea537248415a7b4fc2712dd2320) @@ -0,0 +1,100 @@ +// ============================================================================ +// Copyright (C) 2001-2013 by Jozef Starosczyk +// ixen@copyhandler.com +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU Library General Public License +// (version 2) as published by the Free Software Foundation; +// +// 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 Library General Public +// License along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// ============================================================================ +#include "stdafx.h" +#include "TSQLiteTransaction.h" +#include "TSQLiteException.h" +#include "ErrorCodes.h" +#include "sqlite3/sqlite3.h" + +BEGIN_CHCORE_NAMESPACE + +namespace sqlite +{ + TSQLiteTransaction::TSQLiteTransaction(const TSQLiteDatabasePtr& spDatabase) : + m_spDatabase(spDatabase), + m_bTransactionStarted(false) + { + if(!m_spDatabase) + THROW_SQLITE_EXCEPTION(eErr_InvalidArgument, 0, _T("Invalid database provided")); + Begin(); + } + + TSQLiteTransaction::~TSQLiteTransaction() + { + // try to rollback the transaction; this is the last resort + if(m_bTransactionStarted && m_spDatabase->GetInTransaction()) + { + int iResult = sqlite3_exec((sqlite3*)m_spDatabase->GetHandle(), "ROLLBACK TRANSACTION;", NULL, NULL, NULL); + _ASSERTE(iResult == SQLITE_OK); + m_spDatabase->SetInTransaction(false); + } + } + + void TSQLiteTransaction::Begin() + { + if(m_spDatabase->GetInTransaction()) + return; + + if(m_bTransactionStarted) + THROW_SQLITE_EXCEPTION(eErr_SQLiteCannotBeginTransaction, 0, _T("Transaction already started")); + + int iResult = sqlite3_exec((sqlite3*)m_spDatabase->GetHandle(), "BEGIN TRANSACTION", NULL, NULL, NULL); + if(iResult != SQLITE_OK) + THROW_SQLITE_EXCEPTION(eErr_SQLiteCannotBeginTransaction, iResult, _T("Cannot begin transaction")); + + m_spDatabase->SetInTransaction(true); + m_bTransactionStarted = true; + } + + void TSQLiteTransaction::Rollback() + { + // no transactions whatsoever (even on database) + if(!m_bTransactionStarted && !m_spDatabase->GetInTransaction()) + THROW_SQLITE_EXCEPTION(eErr_SQLiteCannotRollbackTransaction, 0, _T("Transaction not started")); + + // database has transaction started, but not by this object + if(!m_bTransactionStarted) + return; + + int iResult = sqlite3_exec((sqlite3*)m_spDatabase->GetHandle(), "ROLLBACK TRANSACTION;", NULL, NULL, NULL); + if(iResult != SQLITE_OK) + THROW_SQLITE_EXCEPTION(eErr_SQLiteCannotRollbackTransaction, iResult, _T("Cannot rollback transaction")); + m_spDatabase->SetInTransaction(false); + m_bTransactionStarted = false; + } + + void TSQLiteTransaction::Commit() + { + // no transactions whatsoever (even on database) + if(!m_bTransactionStarted && !m_spDatabase->GetInTransaction()) + THROW_SQLITE_EXCEPTION(eErr_SQLiteCannotRollbackTransaction, 0, _T("Transaction not started")); + + // database has transaction started, but not by this object + if(!m_bTransactionStarted) + return; + + int iResult = sqlite3_exec((sqlite3*)m_spDatabase->GetHandle(), "COMMIT TRANSACTION;", NULL, NULL, NULL); + if(iResult != SQLITE_OK) + THROW_SQLITE_EXCEPTION(eErr_SQLiteCannotCommitTransaction, iResult, _T("Cannot commit transaction")); + m_spDatabase->SetInTransaction(false); + m_bTransactionStarted = false; + } +} + +END_CHCORE_NAMESPACE Index: src/libchcore/TSQLiteTransaction.h =================================================================== diff -u -N --- src/libchcore/TSQLiteTransaction.h (revision 0) +++ src/libchcore/TSQLiteTransaction.h (revision 3397fd021739bea537248415a7b4fc2712dd2320) @@ -0,0 +1,47 @@ +// ============================================================================ +// Copyright (C) 2001-2013 by Jozef Starosczyk +// ixen@copyhandler.com +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU Library General Public License +// (version 2) as published by the Free Software Foundation; +// +// 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 Library General Public +// License along with this program; if not, write to the +// Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// ============================================================================ +#ifndef __TSQLITETRANSACTION_H__ +#define __TSQLITETRANSACTION_H__ + +#include "libchcore.h" +#include "TSQLiteDatabase.h" + +BEGIN_CHCORE_NAMESPACE + +namespace sqlite +{ + class TSQLiteTransaction + { + public: + TSQLiteTransaction(const TSQLiteDatabasePtr& spDatabase); + ~TSQLiteTransaction(); + + void Begin(); + void Rollback(); + void Commit(); + + private: + TSQLiteDatabasePtr m_spDatabase; + bool m_bTransactionStarted; // states if transaction was started by this object + }; +} + +END_CHCORE_NAMESPACE + +#endif Index: src/libchcore/Tests/TestsTDataBufferManager.cpp =================================================================== diff -u -N --- src/libchcore/Tests/TestsTDataBufferManager.cpp (revision 0) +++ src/libchcore/Tests/TestsTDataBufferManager.cpp (revision 3397fd021739bea537248415a7b4fc2712dd2320) @@ -0,0 +1,312 @@ +#include "stdafx.h" +#include "gtest/gtest.h" +#include "gmock/gmock.h" +#include "../TDataBuffer.h" +#include "../TCoreException.h" + +// fixtures +class BasicBufferFixture : public ::testing::Test +{ +protected: + virtual void SetUp() + { + size_t stMaxMemory = 1048034; + + chcore::TDataBufferManager::CheckBufferConfig(stMaxMemory); + tBufferManager.Initialize(stMaxMemory); + } + + chcore::TDataBufferManager tBufferManager; +}; + +class DetailedBufferFixture : public ::testing::Test +{ +protected: + virtual void SetUp() + { + size_t stMaxMemory = 1048034; + size_t stPageSize = 262144; + size_t stBufferSize = 65536; + + chcore::TDataBufferManager::CheckBufferConfig(stMaxMemory, stPageSize, stBufferSize); + + tBufferManager.Initialize(stMaxMemory, stPageSize, stBufferSize); + } + + chcore::TDataBufferManager tBufferManager; +}; + +/////////////////////////////////////////////////////////////////////////////// +// TSimpleDataBuffer + +TEST(TSimpleDataBuffer, GetBufferPtr) +{ + chcore::TSimpleDataBuffer tDataBuffer; + EXPECT_EQ(tDataBuffer.GetBufferPtr(), (LPVOID)NULL); +} + +TEST(TSimpleDataBuffer, ReleaseBuffer) +{ + chcore::TSimpleDataBuffer tDataBuffer; + EXPECT_NO_FATAL_FAILURE(tDataBuffer.ReleaseBuffer()); +} + + +TEST(TSimpleDataBuffer, GetSetDataSize) +{ + chcore::TSimpleDataBuffer tDataBuffer; + EXPECT_EQ(tDataBuffer.GetDataSize(), 0); + EXPECT_THROW(tDataBuffer.SetDataSize(4273), chcore::TCoreException); + EXPECT_EQ(tDataBuffer.GetDataSize(), 0); +} + + +TEST(TSimpleDataBuffer, CutDataFromBuffer) +{ + chcore::TSimpleDataBuffer tDataBuffer; + + EXPECT_NO_FATAL_FAILURE(tDataBuffer.CutDataFromBuffer(7344)); + EXPECT_NO_FATAL_FAILURE(tDataBuffer.CutDataFromBuffer(0)); +} + +/////////////////////////////////////////////////////////////////////////////// +// TDataBufferManager + +TEST(TDataBufferManager, CheckBufferConfigBase) +{ + // only max mem - default values + size_t stMaxMem(0); + EXPECT_EQ(chcore::TDataBufferManager::CheckBufferConfig(stMaxMem), false); + EXPECT_EQ(stMaxMem, chcore::TDataBufferManager::DefaultMaxMemory); + + const size_t stTestSize = 103145; + stMaxMem = stTestSize; + EXPECT_EQ(chcore::TDataBufferManager::CheckBufferConfig(stMaxMem), false); + EXPECT_LE(stTestSize, stMaxMem); +} + +TEST(TDataBufferManager, CheckBufferConfigExt) +{ + // detailed config - default values + size_t stMaxMem(0); + size_t stPageSize(0); + size_t stChunkSize(0); + EXPECT_EQ(chcore::TDataBufferManager::CheckBufferConfig(stMaxMem, stPageSize, stChunkSize), false); + EXPECT_EQ(stMaxMem, chcore::TDataBufferManager::DefaultMaxMemory); + EXPECT_EQ(stPageSize, chcore::TDataBufferManager::DefaultPageSize); + EXPECT_EQ(stChunkSize, chcore::TDataBufferManager::DefaultBufferSize); + + const size_t stTestMaxSize = 1237645; + const size_t stTestPageSize = 34563; + const size_t stTestBufferSize = 120; + stMaxMem = stTestMaxSize; + stPageSize = stTestPageSize; + stChunkSize = stTestBufferSize; + EXPECT_EQ(chcore::TDataBufferManager::CheckBufferConfig(stMaxMem, stPageSize, stChunkSize), false); + EXPECT_LE(stTestMaxSize, stMaxMem); + EXPECT_LE(stTestPageSize, stPageSize); + EXPECT_LE(stTestBufferSize, stChunkSize); +} + +TEST(TDataBufferManager, FailedInitializations) +{ + chcore::TDataBufferManager tBufferManager; + + // failed initializations + EXPECT_THROW(tBufferManager.Initialize(chcore::TDataBufferManager::DefaultMaxMemory - 1), chcore::TCoreException); + EXPECT_EQ(tBufferManager.IsInitialized(), false); + + EXPECT_THROW(tBufferManager.Initialize(chcore::TDataBufferManager::DefaultMaxMemory, chcore::TDataBufferManager::DefaultPageSize - 1, + chcore::TDataBufferManager::DefaultBufferSize), chcore::TCoreException); + EXPECT_EQ(tBufferManager.IsInitialized(), false); + + // succeeded initialization + EXPECT_NO_FATAL_FAILURE(tBufferManager.Initialize(chcore::TDataBufferManager::DefaultPageSize)); + EXPECT_EQ(tBufferManager.IsInitialized(), true); + EXPECT_EQ(tBufferManager.GetMaxMemorySize(), chcore::TDataBufferManager::DefaultPageSize); +} + +TEST_F(BasicBufferFixture, FailedResize) +{ + EXPECT_TRUE(tBufferManager.IsInitialized()); + + size_t stCurrentMaxSize = tBufferManager.GetMaxMemorySize(); + size_t stCurrentPageSize = tBufferManager.GetPageSize(); + size_t stCurrentBufferSize = tBufferManager.GetSimpleBufferSize(); + + // try to change to something useless, check if nothing breaks inside + EXPECT_THROW(tBufferManager.ChangeMaxMemorySize(0), chcore::TCoreException); + EXPECT_EQ(stCurrentMaxSize ,tBufferManager.GetMaxMemorySize()); + EXPECT_EQ(stCurrentPageSize, tBufferManager.GetPageSize()); + EXPECT_EQ(stCurrentBufferSize, tBufferManager.GetSimpleBufferSize()); +} + +TEST_F(BasicBufferFixture, ResizeToSameSizeWithSimpleBufferChecks) +{ + EXPECT_TRUE(tBufferManager.IsInitialized()); + EXPECT_EQ((tBufferManager.GetMaxMemorySize() / tBufferManager.GetSimpleBufferSize()), tBufferManager.GetCountOfFreeBuffers()); + + size_t stCurrentMaxSize = tBufferManager.GetMaxMemorySize(); + + // try to change to something useless, check if nothing breaks inside + size_t stNewBufferSize = stCurrentMaxSize / 2; + tBufferManager.CheckResizeSize(stNewBufferSize); // can't assume that it will return true here, since we don't really know what's the buffer size now... + + EXPECT_NO_FATAL_FAILURE(tBufferManager.ChangeMaxMemorySize(stNewBufferSize)); + EXPECT_EQ(tBufferManager.GetMaxMemorySize(), stNewBufferSize); + + EXPECT_TRUE(tBufferManager.HasFreeBuffer()); + EXPECT_EQ((tBufferManager.GetMaxMemorySize() / tBufferManager.GetSimpleBufferSize()), tBufferManager.GetCountOfFreeBuffers()); +} + +TEST_F(DetailedBufferFixture, SmallBufferOperations) +{ + // get a single buffer, check internals + chcore::TSimpleDataBuffer tBuffer; + EXPECT_TRUE(tBufferManager.GetFreeBuffer(tBuffer)); + EXPECT_EQ(tBuffer.GetDataSize(), 0); + EXPECT_EQ(tBuffer.GetBufferSize(), 65536); + + // check whether there are still free buffers inside manager + EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 3); + EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 15); +} + +TEST_F(DetailedBufferFixture, WithoutAdditionalAllocTest) +{ + // do this in separate scope to allow auto-release of buffers at the end + { + std::vector vBuffers; + // get first 4 buffers and check state + for(size_t stIndex = 0; stIndex < 4; ++stIndex) + { + chcore::TSimpleDataBufferPtr spBuf(new chcore::TSimpleDataBuffer); + + EXPECT_TRUE(tBufferManager.GetFreeBuffer(*spBuf.get())); + vBuffers.push_back(spBuf); + } + + EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 0); + EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 12); + EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 262144); // only one page should be allocated at the moment + EXPECT_FALSE(tBufferManager.HasFreeBufferNA()); + EXPECT_TRUE(tBufferManager.HasFreeBuffer()); + } + + // check that everything was freed + EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 4); + EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 16); + EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 262144); // only one page should be allocated at the moment + EXPECT_TRUE(tBufferManager.HasFreeBuffer()); + EXPECT_TRUE(tBufferManager.HasFreeBufferNA()); +} + +TEST_F(DetailedBufferFixture, FullBufferTest) +{ + // do this in separate scope to allow auto-release of buffers at the end + { + // retrieve all the buffers that are inside + std::vector vBuffers; + for(size_t stIndex = 0; stIndex < 16; ++stIndex) + { + chcore::TSimpleDataBufferPtr spBuf(new chcore::TSimpleDataBuffer); + + EXPECT_TRUE(tBufferManager.GetFreeBuffer(*spBuf.get())); + vBuffers.push_back(spBuf); + } + + // ensure everything was taken + EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 0); + EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 0); + EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 1024*1024); // only one page should be allocated at the moment + EXPECT_FALSE(tBufferManager.HasFreeBufferNA()); + EXPECT_FALSE(tBufferManager.HasFreeBuffer()); + + // try to get one more buffer + chcore::TSimpleDataBuffer tFailBuffer; + EXPECT_FALSE(tBufferManager.GetFreeBuffer(tFailBuffer)); + } + + // ensure everything was freed as expected + EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 16); + EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 16); + EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 1024*1024); // only one page should be allocated at the moment + EXPECT_TRUE(tBufferManager.HasFreeBufferNA()); + EXPECT_TRUE(tBufferManager.HasFreeBuffer()); +} + +TEST_F(DetailedBufferFixture, FullBufferWithResizeTest) +{ + // do this in separate scope to allow auto-release of buffers at the end + { + // get all buffers + std::vector vBuffers; + for(size_t stIndex = 0; stIndex < 16; ++stIndex) + { + chcore::TSimpleDataBufferPtr spBuf(new chcore::TSimpleDataBuffer); + + EXPECT_TRUE(tBufferManager.GetFreeBuffer(*spBuf.get())); + vBuffers.push_back(spBuf); + } + + // now resize to quarter the size + size_t stNewSize = 262144; + tBufferManager.CheckResizeSize(stNewSize); + EXPECT_NO_FATAL_FAILURE(tBufferManager.ChangeMaxMemorySize(stNewSize)); + + // since all of the memory was already taken, there was no real freeing + EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 0); + EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 0); + EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 1024*1024); // only one page should be allocated at the moment + EXPECT_FALSE(tBufferManager.HasFreeBufferNA()); + EXPECT_FALSE(tBufferManager.HasFreeBuffer()); + EXPECT_EQ(tBufferManager.GetMaxMemorySize(), 256*1024); // only a single page is available + + // get rid of the small buffers (except for one) + for(size_t stIndex = 0; stIndex < 15; ++stIndex) + { + vBuffers.erase(vBuffers.end() - 1); + } + + // now only one page should be left + EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 3); + EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 3); + EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 256*1024); // only one page should be allocated at the moment + EXPECT_TRUE(tBufferManager.HasFreeBufferNA()); + EXPECT_TRUE(tBufferManager.HasFreeBuffer()); + EXPECT_EQ(tBufferManager.GetMaxMemorySize(), 256*1024); + } + + EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 4); + EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 4); + EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 256*1024); // only one page should be allocated at the moment + EXPECT_TRUE(tBufferManager.HasFreeBufferNA()); + EXPECT_TRUE(tBufferManager.HasFreeBuffer()); +} + +/* +static bool CheckBufferConfig(size_t& stMaxMemory, size_t& stPageSize, size_t& stBufferSize); +static bool CheckBufferConfig(size_t& stMaxMemory); + +// initialization +void Initialize(size_t stMaxMemory); +void Initialize(size_t stMaxMemory, size_t stPageSize, size_t stBufferSize); +bool IsInitialized() const; + +bool CheckResizeSize(size_t& stNewMaxSize); +void ChangeMaxMemorySize(size_t stNewMaxSize); + +// current settings +size_t GetMaxMemorySize() const { return m_stMaxMemory; } +size_t GetPageSize() const { return m_stPageSize; } +size_t GetSimpleBufferSize() const { return m_stBufferSize; } + +size_t GetRealAllocatedMemorySize() const; + +// buffer retrieval +bool HasFreeBuffer() const; // checks if a buffer is available without allocating any new memory +size_t GetCountOfFreeBuffers() const; // how many free buffers are there that can be used without allocating additional memory + +bool GetFreeBuffer(TSimpleDataBuffer& rSimpleBuffer); +void ReleaseBuffer(TSimpleDataBuffer& rSimpleBuffer); +*/ Index: src/libchcore/Tests/TDataBufferManagerTest.cpp =================================================================== diff -u -N --- src/libchcore/Tests/TDataBufferManagerTest.cpp (revision 548382442cbf7bed7f744b279ce3f66b54992724) +++ src/libchcore/Tests/TDataBufferManagerTest.cpp (revision 0) @@ -1,312 +0,0 @@ -#include "stdafx.h" -#include "gtest/gtest.h" -#include "gmock/gmock.h" -#include "../TDataBuffer.h" -#include "../TCoreException.h" - -// fixtures -class BasicBufferFixture : public ::testing::Test -{ -protected: - virtual void SetUp() - { - size_t stMaxMemory = 1048034; - - chcore::TDataBufferManager::CheckBufferConfig(stMaxMemory); - tBufferManager.Initialize(stMaxMemory); - } - - chcore::TDataBufferManager tBufferManager; -}; - -class DetailedBufferFixture : public ::testing::Test -{ -protected: - virtual void SetUp() - { - size_t stMaxMemory = 1048034; - size_t stPageSize = 262144; - size_t stBufferSize = 65536; - - chcore::TDataBufferManager::CheckBufferConfig(stMaxMemory, stPageSize, stBufferSize); - - tBufferManager.Initialize(stMaxMemory, stPageSize, stBufferSize); - } - - chcore::TDataBufferManager tBufferManager; -}; - -/////////////////////////////////////////////////////////////////////////////// -// TSimpleDataBuffer - -TEST(TSimpleDataBuffer, GetBufferPtr) -{ - chcore::TSimpleDataBuffer tDataBuffer; - EXPECT_EQ(tDataBuffer.GetBufferPtr(), (LPVOID)NULL); -} - -TEST(TSimpleDataBuffer, ReleaseBuffer) -{ - chcore::TSimpleDataBuffer tDataBuffer; - EXPECT_NO_FATAL_FAILURE(tDataBuffer.ReleaseBuffer()); -} - - -TEST(TSimpleDataBuffer, GetSetDataSize) -{ - chcore::TSimpleDataBuffer tDataBuffer; - EXPECT_EQ(tDataBuffer.GetDataSize(), 0); - EXPECT_THROW(tDataBuffer.SetDataSize(4273), chcore::TCoreException); - EXPECT_EQ(tDataBuffer.GetDataSize(), 0); -} - - -TEST(TSimpleDataBuffer, CutDataFromBuffer) -{ - chcore::TSimpleDataBuffer tDataBuffer; - - EXPECT_NO_FATAL_FAILURE(tDataBuffer.CutDataFromBuffer(7344)); - EXPECT_NO_FATAL_FAILURE(tDataBuffer.CutDataFromBuffer(0)); -} - -/////////////////////////////////////////////////////////////////////////////// -// TDataBufferManager - -TEST(TDataBufferManager, CheckBufferConfigBase) -{ - // only max mem - default values - size_t stMaxMem(0); - EXPECT_EQ(chcore::TDataBufferManager::CheckBufferConfig(stMaxMem), false); - EXPECT_EQ(stMaxMem, chcore::TDataBufferManager::DefaultMaxMemory); - - const size_t stTestSize = 103145; - stMaxMem = stTestSize; - EXPECT_EQ(chcore::TDataBufferManager::CheckBufferConfig(stMaxMem), false); - EXPECT_LE(stTestSize, stMaxMem); -} - -TEST(TDataBufferManager, CheckBufferConfigExt) -{ - // detailed config - default values - size_t stMaxMem(0); - size_t stPageSize(0); - size_t stChunkSize(0); - EXPECT_EQ(chcore::TDataBufferManager::CheckBufferConfig(stMaxMem, stPageSize, stChunkSize), false); - EXPECT_EQ(stMaxMem, chcore::TDataBufferManager::DefaultMaxMemory); - EXPECT_EQ(stPageSize, chcore::TDataBufferManager::DefaultPageSize); - EXPECT_EQ(stChunkSize, chcore::TDataBufferManager::DefaultBufferSize); - - const size_t stTestMaxSize = 1237645; - const size_t stTestPageSize = 34563; - const size_t stTestBufferSize = 120; - stMaxMem = stTestMaxSize; - stPageSize = stTestPageSize; - stChunkSize = stTestBufferSize; - EXPECT_EQ(chcore::TDataBufferManager::CheckBufferConfig(stMaxMem, stPageSize, stChunkSize), false); - EXPECT_LE(stTestMaxSize, stMaxMem); - EXPECT_LE(stTestPageSize, stPageSize); - EXPECT_LE(stTestBufferSize, stChunkSize); -} - -TEST(TDataBufferManager, FailedInitializations) -{ - chcore::TDataBufferManager tBufferManager; - - // failed initializations - EXPECT_THROW(tBufferManager.Initialize(chcore::TDataBufferManager::DefaultMaxMemory - 1), chcore::TCoreException); - EXPECT_EQ(tBufferManager.IsInitialized(), false); - - EXPECT_THROW(tBufferManager.Initialize(chcore::TDataBufferManager::DefaultMaxMemory, chcore::TDataBufferManager::DefaultPageSize - 1, - chcore::TDataBufferManager::DefaultBufferSize), chcore::TCoreException); - EXPECT_EQ(tBufferManager.IsInitialized(), false); - - // succeeded initialization - EXPECT_NO_FATAL_FAILURE(tBufferManager.Initialize(chcore::TDataBufferManager::DefaultPageSize)); - EXPECT_EQ(tBufferManager.IsInitialized(), true); - EXPECT_EQ(tBufferManager.GetMaxMemorySize(), chcore::TDataBufferManager::DefaultPageSize); -} - -TEST_F(BasicBufferFixture, FailedResize) -{ - EXPECT_TRUE(tBufferManager.IsInitialized()); - - size_t stCurrentMaxSize = tBufferManager.GetMaxMemorySize(); - size_t stCurrentPageSize = tBufferManager.GetPageSize(); - size_t stCurrentBufferSize = tBufferManager.GetSimpleBufferSize(); - - // try to change to something useless, check if nothing breaks inside - EXPECT_THROW(tBufferManager.ChangeMaxMemorySize(0), chcore::TCoreException); - EXPECT_EQ(stCurrentMaxSize ,tBufferManager.GetMaxMemorySize()); - EXPECT_EQ(stCurrentPageSize, tBufferManager.GetPageSize()); - EXPECT_EQ(stCurrentBufferSize, tBufferManager.GetSimpleBufferSize()); -} - -TEST_F(BasicBufferFixture, ResizeToSameSizeWithSimpleBufferChecks) -{ - EXPECT_TRUE(tBufferManager.IsInitialized()); - EXPECT_EQ((tBufferManager.GetMaxMemorySize() / tBufferManager.GetSimpleBufferSize()), tBufferManager.GetCountOfFreeBuffers()); - - size_t stCurrentMaxSize = tBufferManager.GetMaxMemorySize(); - - // try to change to something useless, check if nothing breaks inside - size_t stNewBufferSize = stCurrentMaxSize / 2; - tBufferManager.CheckResizeSize(stNewBufferSize); // can't assume that it will return true here, since we don't really know what's the buffer size now... - - EXPECT_NO_FATAL_FAILURE(tBufferManager.ChangeMaxMemorySize(stNewBufferSize)); - EXPECT_EQ(tBufferManager.GetMaxMemorySize(), stNewBufferSize); - - EXPECT_TRUE(tBufferManager.HasFreeBuffer()); - EXPECT_EQ((tBufferManager.GetMaxMemorySize() / tBufferManager.GetSimpleBufferSize()), tBufferManager.GetCountOfFreeBuffers()); -} - -TEST_F(DetailedBufferFixture, SmallBufferOperations) -{ - // get a single buffer, check internals - chcore::TSimpleDataBuffer tBuffer; - EXPECT_TRUE(tBufferManager.GetFreeBuffer(tBuffer)); - EXPECT_EQ(tBuffer.GetDataSize(), 0); - EXPECT_EQ(tBuffer.GetBufferSize(), 65536); - - // check whether there are still free buffers inside manager - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 3); - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 15); -} - -TEST_F(DetailedBufferFixture, WithoutAdditionalAllocTest) -{ - // do this in separate scope to allow auto-release of buffers at the end - { - std::vector vBuffers; - // get first 4 buffers and check state - for(size_t stIndex = 0; stIndex < 4; ++stIndex) - { - chcore::TSimpleDataBufferPtr spBuf(new chcore::TSimpleDataBuffer); - - EXPECT_TRUE(tBufferManager.GetFreeBuffer(*spBuf.get())); - vBuffers.push_back(spBuf); - } - - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 0); - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 12); - EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 262144); // only one page should be allocated at the moment - EXPECT_FALSE(tBufferManager.HasFreeBufferNA()); - EXPECT_TRUE(tBufferManager.HasFreeBuffer()); - } - - // check that everything was freed - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 4); - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 16); - EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 262144); // only one page should be allocated at the moment - EXPECT_TRUE(tBufferManager.HasFreeBuffer()); - EXPECT_TRUE(tBufferManager.HasFreeBufferNA()); -} - -TEST_F(DetailedBufferFixture, FullBufferTest) -{ - // do this in separate scope to allow auto-release of buffers at the end - { - // retrieve all the buffers that are inside - std::vector vBuffers; - for(size_t stIndex = 0; stIndex < 16; ++stIndex) - { - chcore::TSimpleDataBufferPtr spBuf(new chcore::TSimpleDataBuffer); - - EXPECT_TRUE(tBufferManager.GetFreeBuffer(*spBuf.get())); - vBuffers.push_back(spBuf); - } - - // ensure everything was taken - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 0); - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 0); - EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 1024*1024); // only one page should be allocated at the moment - EXPECT_FALSE(tBufferManager.HasFreeBufferNA()); - EXPECT_FALSE(tBufferManager.HasFreeBuffer()); - - // try to get one more buffer - chcore::TSimpleDataBuffer tFailBuffer; - EXPECT_FALSE(tBufferManager.GetFreeBuffer(tFailBuffer)); - } - - // ensure everything was freed as expected - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 16); - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 16); - EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 1024*1024); // only one page should be allocated at the moment - EXPECT_TRUE(tBufferManager.HasFreeBufferNA()); - EXPECT_TRUE(tBufferManager.HasFreeBuffer()); -} - -TEST_F(DetailedBufferFixture, FullBufferWithResizeTest) -{ - // do this in separate scope to allow auto-release of buffers at the end - { - // get all buffers - std::vector vBuffers; - for(size_t stIndex = 0; stIndex < 16; ++stIndex) - { - chcore::TSimpleDataBufferPtr spBuf(new chcore::TSimpleDataBuffer); - - EXPECT_TRUE(tBufferManager.GetFreeBuffer(*spBuf.get())); - vBuffers.push_back(spBuf); - } - - // now resize to quarter the size - size_t stNewSize = 262144; - tBufferManager.CheckResizeSize(stNewSize); - EXPECT_NO_FATAL_FAILURE(tBufferManager.ChangeMaxMemorySize(stNewSize)); - - // since all of the memory was already taken, there was no real freeing - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 0); - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 0); - EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 1024*1024); // only one page should be allocated at the moment - EXPECT_FALSE(tBufferManager.HasFreeBufferNA()); - EXPECT_FALSE(tBufferManager.HasFreeBuffer()); - EXPECT_EQ(tBufferManager.GetMaxMemorySize(), 256*1024); // only a single page is available - - // get rid of the small buffers (except for one) - for(size_t stIndex = 0; stIndex < 15; ++stIndex) - { - vBuffers.erase(vBuffers.end() - 1); - } - - // now only one page should be left - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 3); - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 3); - EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 256*1024); // only one page should be allocated at the moment - EXPECT_TRUE(tBufferManager.HasFreeBufferNA()); - EXPECT_TRUE(tBufferManager.HasFreeBuffer()); - EXPECT_EQ(tBufferManager.GetMaxMemorySize(), 256*1024); - } - - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffers(), 4); - EXPECT_EQ(tBufferManager.GetCountOfFreeBuffersNA(), 4); - EXPECT_EQ(tBufferManager.GetRealAllocatedMemorySize(), 256*1024); // only one page should be allocated at the moment - EXPECT_TRUE(tBufferManager.HasFreeBufferNA()); - EXPECT_TRUE(tBufferManager.HasFreeBuffer()); -} - -/* -static bool CheckBufferConfig(size_t& stMaxMemory, size_t& stPageSize, size_t& stBufferSize); -static bool CheckBufferConfig(size_t& stMaxMemory); - -// initialization -void Initialize(size_t stMaxMemory); -void Initialize(size_t stMaxMemory, size_t stPageSize, size_t stBufferSize); -bool IsInitialized() const; - -bool CheckResizeSize(size_t& stNewMaxSize); -void ChangeMaxMemorySize(size_t stNewMaxSize); - -// current settings -size_t GetMaxMemorySize() const { return m_stMaxMemory; } -size_t GetPageSize() const { return m_stPageSize; } -size_t GetSimpleBufferSize() const { return m_stBufferSize; } - -size_t GetRealAllocatedMemorySize() const; - -// buffer retrieval -bool HasFreeBuffer() const; // checks if a buffer is available without allocating any new memory -size_t GetCountOfFreeBuffers() const; // how many free buffers are there that can be used without allocating additional memory - -bool GetFreeBuffer(TSimpleDataBuffer& rSimpleBuffer); -void ReleaseBuffer(TSimpleDataBuffer& rSimpleBuffer); -*/ Index: src/libchcore/Tests/TestsTSQLiteDatabase.cpp =================================================================== diff -u -N --- src/libchcore/Tests/TestsTSQLiteDatabase.cpp (revision 0) +++ src/libchcore/Tests/TestsTSQLiteDatabase.cpp (revision 3397fd021739bea537248415a7b4fc2712dd2320) @@ -0,0 +1,13 @@ +#include "stdafx.h" +#include "gtest/gtest.h" +#include "gmock/gmock.h" +#include "../TSQLiteDatabase.h" + +using namespace chcore::sqlite; + +TEST(SQLiteDatabase, CreationWithVerification) +{ + TSQLiteDatabase db(_T(":memory:")); + EXPECT_TRUE(db.GetHandle() != NULL); + EXPECT_FALSE(db.GetInTransaction()); +} Index: src/libchcore/Tests/TestsTSQLiteStatement.cpp =================================================================== diff -u -N --- src/libchcore/Tests/TestsTSQLiteStatement.cpp (revision 0) +++ src/libchcore/Tests/TestsTSQLiteStatement.cpp (revision 3397fd021739bea537248415a7b4fc2712dd2320) @@ -0,0 +1,108 @@ +#include "stdafx.h" +#include "gtest/gtest.h" +#include "gmock/gmock.h" +#include "../TSQLiteDatabase.h" +#include "../TSQLiteStatement.h" +#include "../TSQLiteException.h" + +using namespace chcore::sqlite; + +TEST(SQLiteStatement, CorrectPrepare) +{ + TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:"))); + TSQLiteStatement tStatement(spDB); + + tStatement.Prepare(_T("CREATE TABLE test(col1 INTEGER, col2 VARCHAR(40))")); + EXPECT_EQ(TSQLiteStatement::eStep_Finished, tStatement.Step()); +} + +TEST(SQLiteStatement, IncorrectPrepare) +{ + TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:"))); + TSQLiteStatement tStatement(spDB); + + EXPECT_THROW(tStatement.Prepare(_T("CREATE incorrect TABLE test(col1 INTEGER, col2 VARCHAR(40))")), TSQLiteException); +} + +TEST(SQLiteStatement, PreparedStep) +{ + TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:"))); + TSQLiteStatement tStatement(spDB); + + tStatement.Prepare(_T("CREATE TABLE test(col1 INTEGER, col2 VARCHAR(40))")); + EXPECT_EQ(tStatement.Step(), TSQLiteStatement::eStep_Finished); +} + +TEST(SQLiteStatement, UnpreparedStep) +{ + TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:"))); + TSQLiteStatement tStatement(spDB); + + EXPECT_THROW(tStatement.Step(), TSQLiteException); +} + +TEST(SQLiteStatement, UnpreparedBind) +{ + TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:"))); + TSQLiteStatement tStatement(spDB); + + // insert data + EXPECT_THROW(tStatement.BindValue(1, 54), TSQLiteException); +} + +TEST(SQLiteStatement, InsertAndRetrieveData) +{ + TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:"))); + TSQLiteStatement tStatement(spDB); + + // create schema + tStatement.Prepare(_T("CREATE TABLE test(col1 INTEGER, col2 VARCHAR(40))")); + EXPECT_EQ(TSQLiteStatement::eStep_Finished, tStatement.Step()); + + // insert data + tStatement.Prepare(_T("INSERT INTO test(col1, col2) VALUES(?1, ?2)")); + tStatement.BindValue(1, 54); + tStatement.BindValue(2, _T("Some Value")); + EXPECT_EQ(TSQLiteStatement::eStep_Finished, tStatement.Step()); + + // retrieve data + tStatement.Prepare(_T("SELECT col2, col1 FROM test")); + EXPECT_EQ(TSQLiteStatement::eStep_HasRow, tStatement.Step()); + EXPECT_EQ(54, tStatement.GetInt(1)); + EXPECT_STREQ(_T("Some Value"), tStatement.GetText(0)); +} + +TEST(SQLiteStatement, ClearBindings) +{ + TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:"))); + TSQLiteStatement tStatement(spDB); + + // create schema + tStatement.Prepare(_T("CREATE TABLE test(col1 INTEGER, col2 VARCHAR(40))")); + EXPECT_EQ(TSQLiteStatement::eStep_Finished, tStatement.Step()); + + // insert data + tStatement.Prepare(_T("INSERT INTO test(col1, col2) VALUES(?1, ?2)")); + + tStatement.BindValue(1, 54); + tStatement.BindValue(2, _T("Some Value")); + EXPECT_EQ(TSQLiteStatement::eStep_Finished, tStatement.Step()); + + tStatement.BindValue(1, 32); + tStatement.BindValue(2, _T("???")); + EXPECT_EQ(TSQLiteStatement::eStep_Finished, tStatement.Step()); + + // retrieve data + tStatement.Prepare(_T("SELECT col2, col1 FROM test ORDER BY col1")); + EXPECT_EQ(TSQLiteStatement::eStep_HasRow, tStatement.Step()); + + EXPECT_EQ(32, tStatement.GetInt(1)); + EXPECT_STREQ(_T("???"), tStatement.GetText(0)); + + EXPECT_EQ(TSQLiteStatement::eStep_HasRow, tStatement.Step()); + + EXPECT_EQ(54, tStatement.GetInt(1)); + EXPECT_STREQ(_T("Some Value"), tStatement.GetText(0)); + + EXPECT_EQ(TSQLiteStatement::eStep_Finished, tStatement.Step()); +} Index: src/libchcore/Tests/TestsTSQLiteTransaction.cpp =================================================================== diff -u -N --- src/libchcore/Tests/TestsTSQLiteTransaction.cpp (revision 0) +++ src/libchcore/Tests/TestsTSQLiteTransaction.cpp (revision 3397fd021739bea537248415a7b4fc2712dd2320) @@ -0,0 +1,81 @@ +#include "stdafx.h" +#include "gtest/gtest.h" +#include "gmock/gmock.h" +#include "../TSQLiteTransaction.h" +#include "../TSQLiteDatabase.h" +#include "../TSQLiteStatement.h" +#include "../TSQLiteException.h" + +using namespace chcore::sqlite; + +TEST(SQLiteTransaction, BeginTransactionWithDefaultRollback_Empty) +{ + TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:"))); + + // separate scope for the transaction + { + TSQLiteTransaction tran(spDB); + EXPECT_TRUE(spDB->GetInTransaction()); + } + EXPECT_FALSE(spDB->GetInTransaction()); +} + +TEST(SQLiteTransaction, BeginTransactionWithDefaultRollback_WithData) +{ + TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:"))); + TSQLiteStatement tStatement(spDB); + + // separate scope for the transaction + { + TSQLiteTransaction tran(spDB); + + tStatement.Prepare(_T("CREATE TABLE test(col1 INTEGER, col2 VARCHAR(40))")); + tStatement.Step(); + + tStatement.Prepare(_T("INSERT INTO test(col1, col2) VALUES(?1, ?2)")); + tStatement.BindValue(1, 54); + tStatement.BindValue(2, _T("Some Value")); + tStatement.Step(); + } + + // rollback seem to revert the schema changes, so this statement can't be processed due to missing table + EXPECT_THROW(tStatement.Prepare(_T("SELECT count(*) FROM test")), TSQLiteException); +} + +TEST(SQLiteTransaction, BeginTransactionWithCommit) +{ + TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:"))); + + // separate scope for the transaction + TSQLiteTransaction tran(spDB); + + tran.Commit(); + EXPECT_FALSE(spDB->GetInTransaction()); +} + +TEST(SQLiteTransaction, BeginTransactionWithCommit_WithData) +{ + TSQLiteDatabasePtr spDB(new TSQLiteDatabase(_T(":memory:"))); + TSQLiteStatement tStatement(spDB); + + // separate scope for the transaction + { + TSQLiteTransaction tran(spDB); + + tStatement.Prepare(_T("CREATE TABLE test(col1 INTEGER, col2 VARCHAR(40))")); + tStatement.Step(); + + tStatement.Prepare(_T("INSERT INTO test(col1, col2) VALUES(?1, ?2)")); + tStatement.BindValue(1, 54); + tStatement.BindValue(2, _T("Some Value")); + tStatement.Step(); + + tran.Commit(); + } + + // rollback seem to revert the schema changes, so this statement can't be processed due to missing table + tStatement.Prepare(_T("SELECT count(*) FROM test")); + tStatement.Step(); + + EXPECT_EQ(1, tStatement.GetInt(0)); +} Index: src/libchcore/libchcore.vc90.vcproj =================================================================== diff -u -N -ra5f396da5ed5ffb3fcd9fdf22afb5a7fd07e1ab8 -r3397fd021739bea537248415a7b4fc2712dd2320 --- src/libchcore/libchcore.vc90.vcproj (.../libchcore.vc90.vcproj) (revision a5f396da5ed5ffb3fcd9fdf22afb5a7fd07e1ab8) +++ src/libchcore/libchcore.vc90.vcproj (.../libchcore.vc90.vcproj) (revision 3397fd021739bea537248415a7b4fc2712dd2320) @@ -1,7 +1,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +