Index: src/libchcore/Tests/TFailedBufferQueueTests.cpp =================================================================== diff -u -N -r3ccbdb8d3eac3427e6d3354854476e57fdc7ceb9 -rbef894e38e5c1486824787cf8c47a87a0828b228 --- src/libchcore/Tests/TFailedBufferQueueTests.cpp (.../TFailedBufferQueueTests.cpp) (revision 3ccbdb8d3eac3427e6d3354854476e57fdc7ceb9) +++ src/libchcore/Tests/TFailedBufferQueueTests.cpp (.../TFailedBufferQueueTests.cpp) (revision bef894e38e5c1486824787cf8c47a87a0828b228) @@ -2,10 +2,193 @@ #include "gtest/gtest.h" #include "gmock/gmock.h" #include "../TFailedBufferQueue.h" +#include "../GTestMacros.h" +#include "../TOverlappedDataBuffer.h" +#include using namespace chcore; -TEST(TFailedBufferQueueTests, DefaultTest) +class FallbackCollection : public std::vector { +public: + void Push(TOverlappedDataBuffer* pBuffer, bool /*bKeepPos*/) + { + push_back(pBuffer); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// Construction tests + +TEST(TFailedBufferQueueTests, ConstructionSanityTest) +{ TFailedBufferQueue queue; + + EXPECT_EQ(0, queue.GetCount()); + EXPECT_TIMEOUT(queue.GetHasBuffersEvent()); + EXPECT_EQ(true, queue.IsEmpty()); } + +/////////////////////////////////////////////////////////////////////////////// +// PushBuffer tests + +TEST(TFailedBufferQueueTests, PushBuffer_FirstFailure) +{ + TFailedBufferQueue queue; + TOverlappedDataBuffer buffer(4096, nullptr); + buffer.SetErrorCode(123); + + FallbackCollection collection; + + queue.PushWithFallback(&buffer, collection); + EXPECT_EQ(false, queue.IsEmpty()); + EXPECT_EQ(1, queue.GetCount()); + EXPECT_SIGNALED(queue.GetHasBuffersEvent()); + EXPECT_EQ(true, collection.empty()); +} + +TEST(TFailedBufferQueueTests, PushBuffer_TwoSubsequentFailures) +{ + TFailedBufferQueue queue; + TOverlappedDataBuffer buffer1(4096, nullptr); + TOverlappedDataBuffer buffer2(4096, nullptr); + buffer1.SetFilePosition(0); + buffer1.SetErrorCode(123); + buffer2.SetFilePosition(1000); + buffer2.SetErrorCode(234); + + FallbackCollection collection; + + queue.PushWithFallback(&buffer1, collection); + queue.PushWithFallback(&buffer2, collection); + + EXPECT_EQ(false, queue.IsEmpty()); + EXPECT_EQ(1, queue.GetCount()); + EXPECT_SIGNALED(queue.GetHasBuffersEvent()); + EXPECT_EQ(1, collection.size()); + EXPECT_EQ(&buffer2, collection.front()); + EXPECT_EQ(1000, collection.front()->GetFilePosition()); + EXPECT_EQ(234, collection.front()->GetErrorCode()); +} + +TEST(TFailedBufferQueueTests, PushBuffer_TwoFailuresOutOfOrder) +{ + TFailedBufferQueue queue; + TOverlappedDataBuffer buffer1(4096, nullptr); + TOverlappedDataBuffer buffer2(4096, nullptr); + buffer1.SetFilePosition(0); + buffer1.SetErrorCode(123); + buffer2.SetFilePosition(1000); + buffer2.SetErrorCode(234); + + FallbackCollection collection; + + queue.PushWithFallback(&buffer2, collection); + queue.PushWithFallback(&buffer1, collection); + + EXPECT_EQ(false, queue.IsEmpty()); + EXPECT_EQ(1, queue.GetCount()); + EXPECT_SIGNALED(queue.GetHasBuffersEvent()); + EXPECT_EQ(1, collection.size()); + EXPECT_EQ(&buffer2, collection.front()); + EXPECT_EQ(1000, collection.front()->GetFilePosition()); + EXPECT_EQ(234, collection.front()->GetErrorCode()); +} + +TEST(TFailedBufferQueueTests, PushBuffer_ThrowOnNonErrorBuffer) +{ + TFailedBufferQueue queue; + TOverlappedDataBuffer buffer1(4096, nullptr); + buffer1.SetFilePosition(0); + buffer1.SetErrorCode(ERROR_SUCCESS); + + FallbackCollection collection; + + EXPECT_THROW(queue.PushWithFallback(&buffer1, collection), TCoreException); +} + +TEST(TFailedBufferQueueTests, PushBuffer_WithSamePosition) +{ + TFailedBufferQueue queue; + TOverlappedDataBuffer buffer1(4096, nullptr); + TOverlappedDataBuffer buffer2(4096, nullptr); + buffer1.SetFilePosition(1000); + buffer1.SetErrorCode(123); + buffer2.SetFilePosition(1000); + buffer2.SetErrorCode(234); + + FallbackCollection collection; + + queue.PushWithFallback(&buffer1, collection); + EXPECT_THROW(queue.PushWithFallback(&buffer2, collection), TCoreException); +} + +///////////////////////////////////////////////////////////////////////////////////////// +// Pop tests + +TEST(TFailedBufferQueueTests, PopBuffer_EmptyContainer) +{ + TFailedBufferQueue queue; + EXPECT_EQ(nullptr, queue.Pop()); +} + +TEST(TFailedBufferQueueTests, PopBuffer_WithSamePosition) +{ + TFailedBufferQueue queue; + TOverlappedDataBuffer buffer1(4096, nullptr); + TOverlappedDataBuffer buffer2(4096, nullptr); + TOverlappedDataBuffer buffer3(4096, nullptr); + buffer1.SetFilePosition(0); + buffer1.SetErrorCode(123); + buffer2.SetFilePosition(1000); + buffer2.SetErrorCode(234); + + FallbackCollection collection; + + queue.PushWithFallback(&buffer1, collection); + queue.Pop(); + + EXPECT_EQ(0, collection.size()); + EXPECT_TIMEOUT(queue.GetHasBuffersEvent()); + + queue.PushWithFallback(&buffer2, collection); + EXPECT_EQ(1, queue.GetCount()); +} + +/////////////////////////////////////////////////////////////////////////////////////////// +// Clear tests + +TEST(TFailedBufferQueueTests, Clear) +{ + TFailedBufferQueue queue; + TOverlappedDataBuffer buffer1(4096, nullptr); + buffer1.SetFilePosition(0); + buffer1.SetErrorCode(123); + + FallbackCollection collection; + + queue.PushWithFallback(&buffer1, collection); + queue.Clear(); + + EXPECT_EQ(0, queue.GetCount()); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// ReleaseBuffers + +TEST(TFailedBufferQueueTests, ReleaseBuffers) +{ + TFailedBufferQueue queue; + TOverlappedDataBuffer buffer1(4096, nullptr); + buffer1.SetFilePosition(0); + buffer1.SetErrorCode(123); + + FallbackCollection collection; + + queue.PushWithFallback(&buffer1, collection); + + TBufferListPtr spReturnedBuffers(std::make_shared()); + queue.ReleaseBuffers(spReturnedBuffers); + + EXPECT_EQ(1, spReturnedBuffers->GetCount()); +}