Index: base/files/memory_mapped_file_unittest.cc |
diff --git a/base/files/memory_mapped_file_unittest.cc b/base/files/memory_mapped_file_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..21b0df4034e1ae05e32d346b9590fb10805fbe64 |
--- /dev/null |
+++ b/base/files/memory_mapped_file_unittest.cc |
@@ -0,0 +1,166 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/files/memory_mapped_file.h" |
+ |
+#include "base/file_util.h" |
+#include "base/files/file_path.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "testing/platform_test.h" |
+ |
+namespace base { |
+ |
+namespace { |
+ |
+// Create a temporary buffer and fill it with a watermark sequence. |
+scoped_ptr<uint8[]> CreateTestBuffer(size_t size, size_t offset) { |
+ scoped_ptr<uint8[]> buf(new uint8[size]); |
+ for (size_t i = 0; i < size; ++i) |
+ buf.get()[i] = static_cast<uint8>((offset + i) % 253); |
+ return buf.Pass(); |
+} |
+ |
+// Check that the watermark sequence is consistent with the |offset| provided. |
+bool CheckBufferContents(const uint8* data, size_t size, size_t offset) { |
+ scoped_ptr<uint8[]> test_data(CreateTestBuffer(size, offset)); |
+ return memcmp(test_data.get(), data, size) == 0; |
+} |
+ |
+class MemoryMappedFileTest : public PlatformTest { |
+ protected: |
+ virtual void SetUp() OVERRIDE { |
+ PlatformTest::SetUp(); |
+ CreateTemporaryFile(&temp_file_path_); |
+ } |
+ |
+ virtual void TearDown() { EXPECT_TRUE(DeleteFile(temp_file_path_, false)); } |
+ |
+ void CreateTemporaryTestFile(size_t size) { |
+ File file(temp_file_path_, |
+ File::FLAG_CREATE_ALWAYS | File::FLAG_READ | File::FLAG_WRITE); |
+ EXPECT_TRUE(file.IsValid()); |
+ |
+ scoped_ptr<uint8[]> test_data(CreateTestBuffer(size, 0)); |
+ size_t bytes_written = |
+ file.Write(0, reinterpret_cast<char*>(test_data.get()), size); |
+ EXPECT_EQ(size, bytes_written); |
+ file.Close(); |
+ } |
+ |
+ const FilePath temp_file_path() const { return temp_file_path_; } |
+ |
+ private: |
+ FilePath temp_file_path_; |
+}; |
+ |
+TEST_F(MemoryMappedFileTest, MapWholeFileByPath) { |
+ const size_t kFileSize = 68 * 1024; |
+ CreateTemporaryTestFile(kFileSize); |
+ MemoryMappedFile map; |
+ map.Initialize(temp_file_path()); |
+ ASSERT_EQ(kFileSize, map.length()); |
+ ASSERT_TRUE(map.data() != NULL); |
+ EXPECT_TRUE(map.IsValid()); |
+ ASSERT_TRUE(CheckBufferContents(map.data(), kFileSize, 0)); |
+} |
+ |
+TEST_F(MemoryMappedFileTest, MapWholeFileByFD) { |
+ const size_t kFileSize = 68 * 1024; |
+ CreateTemporaryTestFile(kFileSize); |
+ MemoryMappedFile map; |
+ map.Initialize(File(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ)); |
+ ASSERT_EQ(kFileSize, map.length()); |
+ ASSERT_TRUE(map.data() != NULL); |
+ EXPECT_TRUE(map.IsValid()); |
+ ASSERT_TRUE(CheckBufferContents(map.data(), kFileSize, 0)); |
+} |
+ |
+TEST_F(MemoryMappedFileTest, MapSmallFile) { |
+ const size_t kFileSize = 127; |
+ CreateTemporaryTestFile(kFileSize); |
+ MemoryMappedFile map; |
+ map.Initialize(temp_file_path()); |
+ ASSERT_EQ(kFileSize, map.length()); |
+ ASSERT_TRUE(map.data() != NULL); |
+ EXPECT_TRUE(map.IsValid()); |
+ ASSERT_TRUE(CheckBufferContents(map.data(), kFileSize, 0)); |
+} |
+ |
+TEST_F(MemoryMappedFileTest, MapWholeFileUsingRegion) { |
+ const size_t kFileSize = 157 * 1024; |
+ CreateTemporaryTestFile(kFileSize); |
+ MemoryMappedFile map; |
+ |
+ File file(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ); |
+ map.Initialize(file.Pass(), MemoryMappedFile::Region::kWholeFile); |
+ ASSERT_EQ(kFileSize, map.length()); |
+ ASSERT_TRUE(map.data() != NULL); |
+ EXPECT_TRUE(map.IsValid()); |
+ ASSERT_TRUE(CheckBufferContents(map.data(), kFileSize, 0)); |
+} |
+ |
+TEST_F(MemoryMappedFileTest, MapPartialRegionAtBeginning) { |
+ const size_t kFileSize = 157 * 1024; |
+ const size_t kPartialSize = 4 * 1024 + 32; |
+ CreateTemporaryTestFile(kFileSize); |
+ MemoryMappedFile map; |
+ |
+ File file(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ); |
+ map.Initialize(file.Pass(), MemoryMappedFile::Region(0, kPartialSize)); |
+ ASSERT_EQ(kPartialSize, map.length()); |
+ ASSERT_TRUE(map.data() != NULL); |
+ EXPECT_TRUE(map.IsValid()); |
+ ASSERT_TRUE(CheckBufferContents(map.data(), kPartialSize, 0)); |
+} |
+ |
+TEST_F(MemoryMappedFileTest, MapPartialRegionAtEnd) { |
+ const size_t kFileSize = 157 * 1024; |
+ const size_t kPartialSize = 5 * 1024 - 32; |
+ const size_t kOffset = kFileSize - kPartialSize; |
+ CreateTemporaryTestFile(kFileSize); |
+ MemoryMappedFile map; |
+ |
+ File file(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ); |
+ map.Initialize(file.Pass(), MemoryMappedFile::Region(kOffset, kPartialSize)); |
+ ASSERT_EQ(kPartialSize, map.length()); |
+ ASSERT_TRUE(map.data() != NULL); |
+ EXPECT_TRUE(map.IsValid()); |
+ ASSERT_TRUE(CheckBufferContents(map.data(), kPartialSize, kOffset)); |
+} |
+ |
+TEST_F(MemoryMappedFileTest, MapSmallPartialRegionInTheMiddle) { |
+ const size_t kFileSize = 157 * 1024; |
+ const size_t kOffset = 1024 * 5 + 32; |
+ const size_t kPartialSize = 8; |
+ |
+ CreateTemporaryTestFile(kFileSize); |
+ MemoryMappedFile map; |
+ |
+ File file(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ); |
+ map.Initialize(file.Pass(), MemoryMappedFile::Region(kOffset, kPartialSize)); |
+ ASSERT_EQ(kPartialSize, map.length()); |
+ ASSERT_TRUE(map.data() != NULL); |
+ EXPECT_TRUE(map.IsValid()); |
+ ASSERT_TRUE(CheckBufferContents(map.data(), kPartialSize, kOffset)); |
+} |
+ |
+TEST_F(MemoryMappedFileTest, MapLargePartialRegionInTheMiddle) { |
+ const size_t kFileSize = 157 * 1024; |
+ const size_t kOffset = 1024 * 5 + 32; |
+ const size_t kPartialSize = 16 * 1024 - 32; |
+ |
+ CreateTemporaryTestFile(kFileSize); |
+ MemoryMappedFile map; |
+ |
+ File file(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ); |
+ map.Initialize(file.Pass(), MemoryMappedFile::Region(kOffset, kPartialSize)); |
+ ASSERT_EQ(kPartialSize, map.length()); |
+ ASSERT_TRUE(map.data() != NULL); |
+ EXPECT_TRUE(map.IsValid()); |
+ ASSERT_TRUE(CheckBufferContents(map.data(), kPartialSize, kOffset)); |
+} |
+ |
+} // namespace |
+ |
+} // namespace base |