Index: src/libchcore/Tests/TOverlappedReaderTests.cpp
===================================================================
diff -u -N -r3ccbdb8d3eac3427e6d3354854476e57fdc7ceb9 -rdcbfdc95eedacd24d8b1d78fa507029ce12a5a63
--- src/libchcore/Tests/TOverlappedReaderTests.cpp	(.../TOverlappedReaderTests.cpp)	(revision 3ccbdb8d3eac3427e6d3354854476e57fdc7ceb9)
+++ src/libchcore/Tests/TOverlappedReaderTests.cpp	(.../TOverlappedReaderTests.cpp)	(revision dcbfdc95eedacd24d8b1d78fa507029ce12a5a63)
@@ -1,13 +1,216 @@
 #include "stdafx.h"
 #include "gtest/gtest.h"
 #include "gmock/gmock.h"
+#include "../TOverlappedDataBuffer.h"
+#include "../TCoreException.h"
+#include "../../liblogger/TLogFileData.h"
+#include "../GTestMacros.h"
+#include "../TOverlappedMemoryPool.h"
 #include "../TOverlappedReader.h"
 
 using namespace chcore;
 
-TEST(TOverlappedReaderTests, DefaultTest)
+TEST(TOverlappedReaderTests, DefaultConstructor_SanityTest)
 {
 	logger::TLogFileDataPtr spLogData(std::make_shared<logger::TLogFileData>());
-	TBufferListPtr spQueue(std::make_shared<TBufferList>());
-	TOverlappedReader reader(spLogData, spQueue, 0, 4096);
+
+	TOverlappedMemoryPoolPtr spBuffers(std::make_shared<TOverlappedMemoryPool>());
+	TOverlappedReader tReader(spLogData, spBuffers->GetBufferList(), 0, 4096);
+
+	EXPECT_EQ(nullptr, tReader.GetEmptyBuffer());
+	EXPECT_EQ(nullptr, tReader.GetFailedReadBuffer());
+
+	EXPECT_NE(nullptr, tReader.GetEventReadPossibleHandle());
+	EXPECT_NE(nullptr, tReader.GetEventReadFinishedHandle());
+	EXPECT_NE(nullptr, tReader.GetEventReadFailedHandle());
+
+	EXPECT_TIMEOUT(tReader.GetEventReadPossibleHandle());
+	EXPECT_TIMEOUT(tReader.GetEventReadFinishedHandle());
+	EXPECT_TIMEOUT(tReader.GetEventReadFailedHandle());
+
+	EXPECT_FALSE(tReader.IsDataSourceFinished());
 }
+
+TEST(TOverlappedReaderTests, AllocatingConstructor_SanityTest)
+{
+	logger::TLogFileDataPtr spLogData(std::make_shared<logger::TLogFileData>());
+
+	TOverlappedMemoryPoolPtr spBuffers(std::make_shared<TOverlappedMemoryPool>(3, 32768));
+	TOverlappedReader tReader(spLogData, spBuffers->GetBufferList(), 0, 4096);
+
+	EXPECT_SIGNALED(tReader.GetEventReadPossibleHandle());
+	EXPECT_TIMEOUT(tReader.GetEventReadFailedHandle());
+	EXPECT_TIMEOUT(tReader.GetEventReadFinishedHandle());
+
+	EXPECT_NE(nullptr, tReader.GetEmptyBuffer());
+	EXPECT_NE(nullptr, tReader.GetEmptyBuffer());
+	EXPECT_NE(nullptr, tReader.GetEmptyBuffer());
+	EXPECT_EQ(nullptr, tReader.GetEmptyBuffer());
+
+	EXPECT_EQ(nullptr, tReader.GetFailedReadBuffer());
+	EXPECT_FALSE(tReader.IsDataSourceFinished());
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+TEST(TOverlappedReaderTests, GetEmptyBuffer)
+{
+	logger::TLogFileDataPtr spLogData(std::make_shared<logger::TLogFileData>());
+
+	TOverlappedMemoryPoolPtr spBuffers(std::make_shared<TOverlappedMemoryPool>(3, 32768));
+	TOverlappedReader tReader(spLogData, spBuffers->GetBufferList(), 0, 4096);
+
+	EXPECT_SIGNALED(tReader.GetEventReadPossibleHandle());
+
+	EXPECT_NE(nullptr, tReader.GetEmptyBuffer());
+	EXPECT_SIGNALED(tReader.GetEventReadPossibleHandle());
+
+	EXPECT_NE(nullptr, tReader.GetEmptyBuffer());
+	EXPECT_SIGNALED(tReader.GetEventReadPossibleHandle());
+
+	EXPECT_NE(nullptr, tReader.GetEmptyBuffer());
+	EXPECT_TIMEOUT(tReader.GetEventReadPossibleHandle());
+
+	EXPECT_EQ(nullptr, tReader.GetEmptyBuffer());
+}
+
+TEST(TOverlappedReaderTests, AddEmptyBuffer)
+{
+	logger::TLogFileDataPtr spLogData(std::make_shared<logger::TLogFileData>());
+
+	TOverlappedMemoryPoolPtr spBuffers(std::make_shared<TOverlappedMemoryPool>(3, 32768));
+	TOverlappedReader tReader(spLogData, spBuffers->GetBufferList(), 0, 4096);
+
+	TOverlappedDataBuffer* pBuffers[ 3 ] = { tReader.GetEmptyBuffer(), tReader.GetEmptyBuffer(), tReader.GetEmptyBuffer() };
+
+	EXPECT_TIMEOUT(tReader.GetEventReadPossibleHandle());
+
+	tReader.AddEmptyBuffer(pBuffers[ 0 ], false);
+	EXPECT_SIGNALED(tReader.GetEventReadPossibleHandle());
+
+	tReader.AddEmptyBuffer(pBuffers[ 1 ], false);
+	EXPECT_SIGNALED(tReader.GetEventReadPossibleHandle());
+
+	tReader.AddEmptyBuffer(pBuffers[ 2 ], false);
+	EXPECT_SIGNALED(tReader.GetEventReadPossibleHandle());
+}
+
+TEST(TOverlappedReaderTests, AddEmptyBuffer_Null)
+{
+	logger::TLogFileDataPtr spLogData(std::make_shared<logger::TLogFileData>());
+
+	TOverlappedMemoryPoolPtr spBuffers(std::make_shared<TOverlappedMemoryPool>(3, 32768));
+	TOverlappedReader tReader(spLogData, spBuffers->GetBufferList(), 0, 4096);
+
+	EXPECT_THROW(tReader.AddEmptyBuffer(nullptr, false), TCoreException);
+	EXPECT_THROW(tReader.AddEmptyBuffer(nullptr, true), TCoreException);
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+TEST(TOverlappedReaderTests, AddFullBuffer_GetFullBuffer)
+{
+	logger::TLogFileDataPtr spLogData(std::make_shared<logger::TLogFileData>());
+
+	TOverlappedMemoryPoolPtr spBuffers(std::make_shared<TOverlappedMemoryPool>(3, 32768));
+	TOverlappedReader tReader(spLogData, spBuffers->GetBufferList(), 0, 4096);
+	TOverlappedDataBuffer* pBuffer = tReader.GetEmptyBuffer();
+
+	tReader.AddFinishedReadBuffer(pBuffer);
+	EXPECT_SIGNALED(tReader.GetEventReadFinishedHandle());
+
+	EXPECT_NE(nullptr, tReader.GetFinishedReadBuffer());
+	EXPECT_TIMEOUT(tReader.GetEventReadFinishedHandle());
+}
+
+TEST(TOverlappedReaderTests, GetFullBuffer_WrongOrder)
+{
+	logger::TLogFileDataPtr spLogData(std::make_shared<logger::TLogFileData>());
+
+	TOverlappedMemoryPoolPtr spBuffers(std::make_shared<TOverlappedMemoryPool>(3, 32768));
+	TOverlappedReader tReader(spLogData, spBuffers->GetBufferList(), 0, 4096);
+	TOverlappedDataBuffer* pBuffers[ 3 ] = { tReader.GetEmptyBuffer(), tReader.GetEmptyBuffer(), tReader.GetEmptyBuffer() };
+
+	tReader.AddFinishedReadBuffer(pBuffers[ 1 ]);
+	EXPECT_EQ(nullptr, tReader.GetFinishedReadBuffer());
+
+	tReader.AddFinishedReadBuffer(pBuffers[ 2 ]);
+	EXPECT_EQ(nullptr, tReader.GetFinishedReadBuffer());
+
+	tReader.AddFinishedReadBuffer(pBuffers[ 0 ]);
+	EXPECT_NE(nullptr, tReader.GetFinishedReadBuffer());
+}
+
+TEST(TOverlappedReaderTests, AddFullBuffer_HandlingSrcEof)
+{
+	logger::TLogFileDataPtr spLogData(std::make_shared<logger::TLogFileData>());
+
+	TOverlappedMemoryPoolPtr spBuffers(std::make_shared<TOverlappedMemoryPool>(3, 32768));
+	TOverlappedReader tReader(spLogData, spBuffers->GetBufferList(), 0, 4096);
+	TOverlappedDataBuffer* pBuffers[ 3 ] = { tReader.GetEmptyBuffer(), tReader.GetEmptyBuffer(), tReader.GetEmptyBuffer() };
+
+	pBuffers[ 1 ]->SetLastPart(true);
+
+	tReader.AddFinishedReadBuffer(pBuffers[ 0 ]);
+	EXPECT_FALSE(tReader.IsDataSourceFinished());
+
+	tReader.AddFinishedReadBuffer(pBuffers[ 1 ]);
+	EXPECT_TRUE(tReader.IsDataSourceFinished());
+}
+
+TEST(TOverlappedReaderTests, AddFullBuffer_Null)
+{
+	logger::TLogFileDataPtr spLogData(std::make_shared<logger::TLogFileData>());
+
+	TOverlappedMemoryPoolPtr spBuffers(std::make_shared<TOverlappedMemoryPool>(3, 32768));
+	TOverlappedReader tReader(spLogData, spBuffers->GetBufferList(), 0, 4096);
+
+	EXPECT_THROW(tReader.AddFinishedReadBuffer(nullptr), TCoreException);
+}
+
+TEST(TOverlappedReaderTests, AddFullBuffer_SameBufferTwice)
+{
+	logger::TLogFileDataPtr spLogData(std::make_shared<logger::TLogFileData>());
+
+	TOverlappedMemoryPoolPtr spBuffers(std::make_shared<TOverlappedMemoryPool>(3, 32768));
+	TOverlappedReader tReader(spLogData, spBuffers->GetBufferList(), 0, 4096);
+	TOverlappedDataBuffer* pBuffer = tReader.GetEmptyBuffer();
+
+	pBuffer->InitForRead(0, 1280);
+	pBuffer->SetBytesTransferred(1230);
+	pBuffer->SetStatusCode(0);
+
+	tReader.AddFinishedReadBuffer(pBuffer);
+	EXPECT_THROW(tReader.AddFinishedReadBuffer(pBuffer), TCoreException);
+}
+
+TEST(TOverlappedReaderTests, GetFullBuffer_AddFullBuffer_OutOfOrder)
+{
+	logger::TLogFileDataPtr spLogData(std::make_shared<logger::TLogFileData>());
+
+	TOverlappedMemoryPoolPtr spBuffers(std::make_shared<TOverlappedMemoryPool>(3, 32768));
+	TOverlappedReader tReader(spLogData, spBuffers->GetBufferList(), 0, 4096);
+	TOverlappedDataBuffer* pBuffers[ 3 ] = { tReader.GetEmptyBuffer(), tReader.GetEmptyBuffer(), tReader.GetEmptyBuffer() };
+
+	pBuffers[ 0 ]->InitForRead(0, 1000);
+	pBuffers[ 0 ]->SetBytesTransferred(1000);
+	pBuffers[ 0 ]->SetStatusCode(0);
+
+	pBuffers[ 1 ]->InitForRead(1000, 1200);
+	pBuffers[ 1 ]->SetBytesTransferred(1200);
+	pBuffers[ 1 ]->SetStatusCode(0);
+
+	pBuffers[ 2 ]->InitForRead(2200, 1400);
+	pBuffers[ 2 ]->SetBytesTransferred(800);
+	pBuffers[ 2 ]->SetStatusCode(0);
+	pBuffers[ 2 ]->SetLastPart(true);
+
+	EXPECT_TIMEOUT(tReader.GetEventReadFinishedHandle());
+
+	tReader.AddFinishedReadBuffer(pBuffers[ 1 ]);
+	EXPECT_TIMEOUT(tReader.GetEventReadFinishedHandle());
+
+	tReader.AddFinishedReadBuffer(pBuffers[ 2 ]);
+	EXPECT_TIMEOUT(tReader.GetEventReadFinishedHandle());
+
+	tReader.AddFinishedReadBuffer(pBuffers[ 0 ]);
+	EXPECT_SIGNALED(tReader.GetEventReadFinishedHandle());
+}