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..1ac8a8ca355cb75d62d5015a3d2576c4de2d5e01 |
--- /dev/null |
+++ b/base/files/memory_mapped_file_unittest.cc |
@@ -0,0 +1,139 @@ |
+// 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" |
+ |
+using base::File; |
willchan no longer on Chromium
2014/07/22 20:45:47
You don't need these using statements if everythin
Primiano Tucci (use gerrit)
2014/07/23 23:17:38
Done.
|
+using base::FilePath; |
+ |
+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(); |
+ base::CreateTemporaryFile(&temp_file_path_); |
+ } |
+ |
+ virtual void TearDown() { |
+ EXPECT_TRUE(base::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 base::FilePath temp_file_path() const { return temp_file_path_; } |
+ |
+ private: |
+ base::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(), File::Region::WholeFile()); |
+ 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 = 6 * 1024; |
+ CreateTemporaryTestFile(kFileSize); |
+ MemoryMappedFile map; |
+ |
+ File file(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ); |
+ map.Initialize(file.Pass(), File::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 = 6 * 1024; |
+ 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(), File::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 |