| // Copyright 2011 Google Inc. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| // Author: fangfei@google.com (Fangfei Zhou) |
| |
| #include <cstdlib> |
| #include "pagespeed/kernel/base/circular_buffer.h" |
| #include "pagespeed/kernel/base/mock_message_handler.h" |
| #include "pagespeed/kernel/base/null_mutex.h" |
| #include "pagespeed/kernel/base/gtest.h" |
| |
| namespace net_instaweb { |
| |
| class CircularBufferTest : public testing::Test { |
| protected: |
| CircularBufferTest() : handler_(new NullMutex) {} |
| MockMessageHandler handler_; |
| }; |
| |
| // Instantiate CircularBuffer with malloc. |
| TEST_F(CircularBufferTest, InstantiateWithMalloc) { |
| CircularBuffer* cb = CircularBuffer::Create(10); |
| cb->Write("012345"); |
| EXPECT_EQ("012345", cb->ToString(&handler_)); |
| free(cb); |
| } |
| |
| // Instantiate CircularBuffer with pre-allocated block of right size. |
| TEST_F(CircularBufferTest, InstantiateWithPreAllocatedBlock) { |
| const int capacity = 10; |
| const int segment_size = CircularBuffer::Sizeof(capacity); |
| void* segment = static_cast<void*>(malloc(segment_size)); |
| CircularBuffer* cb = CircularBuffer::Init(true, segment, |
| segment_size, capacity); |
| if (cb != NULL) { |
| cb->Write("0123456789"); |
| } |
| EXPECT_EQ("0123456789", cb->ToString(&handler_)); |
| free(segment); |
| } |
| |
| // Test circular buffer overwritten result. |
| TEST_F(CircularBufferTest, CircularWritten) { |
| const int capacity = 10; |
| CircularBuffer* cb = CircularBuffer::Create(capacity); |
| cb->Write("012345"); |
| EXPECT_EQ("012345", cb->ToString(&handler_)); |
| cb->Write("67"); |
| EXPECT_EQ("01234567", cb->ToString(&handler_)); |
| // Buffer size is 10, it should be filled exactly so far. |
| cb->Write("89"); |
| EXPECT_EQ("0123456789", cb->ToString(&handler_)); |
| // Lose the first char. |
| cb->Write("a"); |
| EXPECT_EQ("123456789a", cb->ToString(&handler_)); |
| // Message size is larger than buffer size. |
| cb->Write("bcdefghijkl"); |
| EXPECT_EQ("cdefghijkl", cb->ToString(&handler_)); |
| free(cb); |
| } |
| |
| // Test the content after clear(). |
| TEST_F(CircularBufferTest, OverWrittenAfterClear) { |
| const int capacity = 10; |
| CircularBuffer* cb = CircularBuffer::Create(capacity); |
| cb->Write("0123456789"); |
| EXPECT_EQ("0123456789", cb->ToString(&handler_)); |
| cb->Clear(); |
| cb->Write("abc"); |
| EXPECT_EQ("abc", cb->ToString(&handler_)); |
| free(cb); |
| } |
| |
| // Test corner case where buffer size is 1. |
| TEST_F(CircularBufferTest, SmallSize) { |
| // CircularBuffer instantiated with malloc. |
| const int capacity = 1; |
| CircularBuffer* cb = CircularBuffer::Create(capacity); |
| cb->Write("0"); |
| EXPECT_EQ("0", cb->ToString(&handler_)); |
| cb->Write("1"); |
| EXPECT_EQ("1", cb->ToString(&handler_)); |
| cb->Write("234"); |
| EXPECT_EQ("4", cb->ToString(&handler_)); |
| free(cb); |
| // CircularBuffer instantiated with pre-allocated buffer. |
| int segment_size = CircularBuffer::Sizeof(capacity); |
| void* segment = static_cast<void*>(malloc(segment_size)); |
| CircularBuffer* temp = CircularBuffer::Init(true, segment, |
| segment_size, capacity); |
| temp->Write("0"); |
| EXPECT_EQ("0", temp->ToString(&handler_)); |
| temp->Write("1"); |
| EXPECT_EQ("1", temp->ToString(&handler_)); |
| temp->Write("234"); |
| EXPECT_EQ("4", temp->ToString(&handler_)); |
| free(temp); |
| } |
| |
| } // namespace net_instaweb |