Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(500)

Side by Side Diff: base/files/memory_mapped_file_unittest.cc

Issue 394313002: Add support for loading pak files from arbitrary file regions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Ah, remove <algorithm> Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/files/memory_mapped_file.h"
6
7 #include "base/file_util.h"
8 #include "base/files/file_path.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "testing/platform_test.h"
11
12 namespace base {
13
14 namespace {
15
16 // Create a temporary buffer and fill it with a watermark sequence.
17 scoped_ptr<uint8[]> CreateTestBuffer(size_t size, size_t offset) {
18 scoped_ptr<uint8[]> buf(new uint8[size]);
19 for (size_t i = 0; i < size; ++i)
20 buf.get()[i] = static_cast<uint8>((offset + i) % 253);
21 return buf.Pass();
22 }
23
24 // Check that the watermark sequence is consistent with the |offset| provided.
25 bool CheckBufferContents(const uint8* data, size_t size, size_t offset) {
26 scoped_ptr<uint8[]> test_data(CreateTestBuffer(size, offset));
27 return memcmp(test_data.get(), data, size) == 0;
28 }
29
30 class MemoryMappedFileTest : public PlatformTest {
31 protected:
32 virtual void SetUp() OVERRIDE {
33 PlatformTest::SetUp();
34 CreateTemporaryFile(&temp_file_path_);
35 }
36
37 virtual void TearDown() {
38 EXPECT_TRUE(DeleteFile(temp_file_path_, false));
39 }
40
41 void CreateTemporaryTestFile(size_t size) {
42 File file(temp_file_path_,
43 File::FLAG_CREATE_ALWAYS | File::FLAG_READ | File::FLAG_WRITE);
44 EXPECT_TRUE(file.IsValid());
45
46 scoped_ptr<uint8[]> test_data(CreateTestBuffer(size, 0));
47 size_t bytes_written =
48 file.Write(0, reinterpret_cast<char*>(test_data.get()), size);
49 EXPECT_EQ(size, bytes_written);
50 file.Close();
51 }
52
53 const FilePath temp_file_path() const { return temp_file_path_; }
54
55 private:
56 FilePath temp_file_path_;
57 };
58
59 TEST_F(MemoryMappedFileTest, MapWholeFileByPath) {
60 const size_t kFileSize = 68 * 1024;
61 CreateTemporaryTestFile(kFileSize);
62 MemoryMappedFile map;
63 map.Initialize(temp_file_path());
64 ASSERT_EQ(kFileSize, map.length());
65 ASSERT_TRUE(map.data() != NULL);
66 EXPECT_TRUE(map.IsValid());
67 ASSERT_TRUE(CheckBufferContents(map.data(), kFileSize, 0));
68 }
69
70 TEST_F(MemoryMappedFileTest, MapWholeFileByFD) {
71 const size_t kFileSize = 68 * 1024;
72 CreateTemporaryTestFile(kFileSize);
73 MemoryMappedFile map;
74 map.Initialize(File(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ));
75 ASSERT_EQ(kFileSize, map.length());
76 ASSERT_TRUE(map.data() != NULL);
77 EXPECT_TRUE(map.IsValid());
78 ASSERT_TRUE(CheckBufferContents(map.data(), kFileSize, 0));
79 }
80
81 TEST_F(MemoryMappedFileTest, MapSmallFile) {
82 const size_t kFileSize = 127;
83 CreateTemporaryTestFile(kFileSize);
84 MemoryMappedFile map;
85 map.Initialize(temp_file_path());
86 ASSERT_EQ(kFileSize, map.length());
87 ASSERT_TRUE(map.data() != NULL);
88 EXPECT_TRUE(map.IsValid());
89 ASSERT_TRUE(CheckBufferContents(map.data(), kFileSize, 0));
90 }
91
92 TEST_F(MemoryMappedFileTest, MapWholeFileUsingRegion) {
93 const size_t kFileSize = 157 * 1024;
94 CreateTemporaryTestFile(kFileSize);
95 MemoryMappedFile map;
96
97 File file(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ);
98 map.Initialize(file.Pass(), File::Region::kWholeFile);
99 ASSERT_EQ(kFileSize, map.length());
100 ASSERT_TRUE(map.data() != NULL);
101 EXPECT_TRUE(map.IsValid());
102 ASSERT_TRUE(CheckBufferContents(map.data(), kFileSize, 0));
103 }
104
105 TEST_F(MemoryMappedFileTest, MapPartialRegionAtBeginning) {
106 const size_t kFileSize = 157 * 1024;
107 const size_t kPartialSize = 6 * 1024;
108 CreateTemporaryTestFile(kFileSize);
109 MemoryMappedFile map;
110
111 File file(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ);
112 map.Initialize(file.Pass(), File::Region(0, kPartialSize));
113 ASSERT_EQ(kPartialSize, map.length());
114 ASSERT_TRUE(map.data() != NULL);
115 EXPECT_TRUE(map.IsValid());
116 ASSERT_TRUE(CheckBufferContents(map.data(), kPartialSize, 0));
117 }
118
119 TEST_F(MemoryMappedFileTest, MapPartialRegionAtEnd) {
willchan no longer on Chromium 2014/07/25 21:21:24 Can you add another test with the partial region i
Primiano Tucci (use gerrit) 2014/07/28 12:52:11 Sure. Actually, none of these boundaries should be
120 const size_t kFileSize = 157 * 1024;
121 const size_t kPartialSize = 6 * 1024;
122 const size_t kOffset = kFileSize - kPartialSize;
123 CreateTemporaryTestFile(kFileSize);
124 MemoryMappedFile map;
125
126 File file(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ);
127 map.Initialize(file.Pass(), File::Region(kOffset, kPartialSize));
128 ASSERT_EQ(kPartialSize, map.length());
129 ASSERT_TRUE(map.data() != NULL);
130 EXPECT_TRUE(map.IsValid());
131 ASSERT_TRUE(CheckBufferContents(map.data(), kPartialSize, kOffset));
132 }
133
134 } // namespace
135
136 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698