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

Side by Side Diff: chrome/browser/extensions/api/file_system/saved_files_service_unittest.cc

Issue 14607023: Add support for persistent file access in apps. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 7 years, 7 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 (c) 2013 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 <algorithm>
6 #include "base/basictypes.h"
7 #include "base/files/file_path.h"
8 #include "base/string_number_conversions.h"
9 #include "base/test/values_test_util.h"
10 #include "base/values.h"
11 #include "chrome/browser/extensions/api/file_system/saved_files_service.h"
12 #include "chrome/browser/extensions/extension_prefs.h"
13 #include "chrome/browser/extensions/extension_service.h"
14 #include "chrome/browser/extensions/extension_system.h"
15 #include "chrome/browser/extensions/test_extension_environment.h"
16 #include "chrome/common/extensions/extension.h"
17 #include "chrome/test/base/testing_profile.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19
20 #if defined(OS_CHROMEOS)
21 #include "chrome/browser/chromeos/settings/cros_settings.h"
22 #include "chrome/browser/chromeos/settings/device_settings_service.h"
23 #endif
24
25 #define TRACE_CALL(expression) \
26 do { \
27 SCOPED_TRACE(#expression); \
28 expression; \
29 } while (0)
30
31 using extensions::SavedFileEntry;
32 using extensions::SavedFilesService;
33
34 namespace {
35
36 std::string GenerateId(int i) {
37 return base::IntToString(i) + ":filename.ext";
38 }
39
40 } // namespace
41
42 class SavedFilesServiceUnitTest : public testing::Test {
43 protected:
44 virtual void SetUp() OVERRIDE {
45 testing::Test::SetUp();
46 extension_ = env_.MakeExtension(*base::test::ParseJson(
47 "{\"app\": {\"background\": {\"scripts\": [\"background.js\"]}},"
48 "\"permissions\": [{\"fileSystem\": [\"retainFiles\"]}]}"));
49 service_ = SavedFilesService::Get(env_.profile());
50 path_ = base::FilePath(FILE_PATH_LITERAL("filename.ext"));
51 }
52
53 virtual void TearDown() OVERRIDE {
54 extensions::ClearMaxSequenceNumberForTest();
55 extensions::ClearLruSizeForTest();
56 testing::Test::TearDown();
57 }
58
59 void CheckSavedFileEntry(const std::string& id, int sequence_number) {
60 SCOPED_TRACE(id);
61 SavedFileEntry entry;
62 EXPECT_TRUE(service_->IsSaved(extension_->id(), id));
63 ASSERT_TRUE(service_->GetFileEntry(extension_->id(), id, &entry));
64 EXPECT_EQ(id, entry.id);
65 EXPECT_EQ(path_, entry.path);
66 EXPECT_TRUE(entry.writable);
67 EXPECT_EQ(sequence_number, entry.sequence_number);
68 }
69
70 void CheckSavedFileEntries(int start, int end) {
71 SavedFileEntry entry;
72 for (int i = start; i < end; i++) {
73 CheckSavedFileEntry(GenerateId(i), i + 1);
74 }
75 }
76
77 #if defined(OS_CHROMEOS)
78 chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
79 chromeos::ScopedTestCrosSettings test_cros_settings_;
80 #endif
81 extensions::TestExtensionEnvironment env_;
82 const extensions::Extension* extension_;
83 SavedFilesService* service_;
84 base::FilePath path_;
85 };
86
87 TEST_F(SavedFilesServiceUnitTest, RetainTwoFilesTest) {
88 service_->AddFileEntry(extension_->id(), GenerateId(1), path_, true);
89 service_->AddFileEntry(extension_->id(), GenerateId(2), path_, true);
90 service_->AddFileEntry(extension_->id(), GenerateId(3), path_, true);
91 TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 0));
92 TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 0));
93 TRACE_CALL(CheckSavedFileEntry(GenerateId(3), 0));
94 service_->RecordFileAccess(extension_->id(), GenerateId(1));
95 TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 1));
96 TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 0));
97 service_->RecordFileAccess(extension_->id(), GenerateId(1));
98 TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 1));
99 TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 0));
100 service_->RecordFileAccess(extension_->id(), GenerateId(2));
101 TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 1));
102 TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 2));
103 service_->RecordFileAccess(extension_->id(), GenerateId(2));
104 TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 1));
105 TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 2));
106 service_->RecordFileAccess(extension_->id(), GenerateId(1));
107 TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 3));
108 TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 2));
109 TRACE_CALL(CheckSavedFileEntry(GenerateId(3), 0));
110 EXPECT_FALSE(service_->IsSaved(extension_->id(), "another id"));
111 SavedFileEntry entry;
112 EXPECT_FALSE(service_->GetFileEntry(extension_->id(), "another id", &entry));
113 std::vector<SavedFileEntry> entries;
114 service_->ClearExtensionForTest(extension_->id());
115 TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 3));
116 TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 2));
117 EXPECT_FALSE(service_->IsSaved(extension_->id(), GenerateId(3)));
118 }
119
120 TEST_F(SavedFilesServiceUnitTest, NoRetainFilesPermissionTest) {
121 extension_ = env_.MakeExtension(*base::test::ParseJson(
122 "{\"app\": {\"background\": {\"scripts\": [\"background.js\"]}},"
123 "\"permissions\": [\"fileSystem\"]}"));
124 service_->AddFileEntry(extension_->id(), GenerateId(1), path_, true);
125 TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 0));
126 SavedFileEntry entry;
127 service_->RecordFileAccess(extension_->id(), GenerateId(1));
128 TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 1));
129 EXPECT_FALSE(service_->IsSaved(extension_->id(), "another id"));
130 EXPECT_FALSE(service_->GetFileEntry(extension_->id(), "another id", &entry));
131 std::vector<SavedFileEntry> entries;
132 service_->ClearExtensionForTest(extension_->id());
133 service_->GetFileEntries(extension_->id(), &entries);
134 EXPECT_TRUE(entries.empty());
135 }
136
137 TEST_F(SavedFilesServiceUnitTest, EvictionTest) {
138 extensions::SetLruSizeForTest(10);
139 for (int i = 0; i < 10; i++) {
140 service_->AddFileEntry(extension_->id(), GenerateId(i), path_, true);
141 service_->RecordFileAccess(extension_->id(), GenerateId(i));
142 }
143 service_->AddFileEntry(extension_->id(), GenerateId(10), path_, true);
144 TRACE_CALL(CheckSavedFileEntries(0, 10));
145 TRACE_CALL(CheckSavedFileEntry(GenerateId(10), 0));
146 service_->RecordFileAccess(extension_->id(), GenerateId(10));
147
148 TRACE_CALL(CheckSavedFileEntry(GenerateId(0), 0));
149 TRACE_CALL(CheckSavedFileEntries(1, 11));
150 service_->ClearExtensionForTest(extension_->id());
151 SavedFileEntry entry;
152 EXPECT_FALSE(service_->GetFileEntry(extension_->id(), GenerateId(0), &entry));
153 TRACE_CALL(CheckSavedFileEntries(1, 11));
154
155 service_->RecordFileAccess(extension_->id(), GenerateId(1));
156 TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 12));
157 TRACE_CALL(CheckSavedFileEntries(2, 11));
158 service_->ClearExtensionForTest(extension_->id());
159 TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 12));
160 TRACE_CALL(CheckSavedFileEntries(2, 11));
161 }
162
163 TEST_F(SavedFilesServiceUnitTest, SequenceNumberCompactionTest) {
164 extensions::SetMaxSequenceNumberForTest(8);
165 for (int i = 0; i < 4; i++) {
166 service_->AddFileEntry(extension_->id(), GenerateId(i), path_, true);
167 service_->RecordFileAccess(extension_->id(), GenerateId(i));
168 }
169 service_->RecordFileAccess(extension_->id(), GenerateId(2));
170 service_->RecordFileAccess(extension_->id(), GenerateId(3));
171 service_->RecordFileAccess(extension_->id(), GenerateId(2));
172 TRACE_CALL(CheckSavedFileEntry(GenerateId(0), 1));
173 TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 2));
174 TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 7));
175 TRACE_CALL(CheckSavedFileEntry(GenerateId(3), 6));
176 service_->ClearExtensionForTest(extension_->id());
177 TRACE_CALL(CheckSavedFileEntry(GenerateId(0), 1));
178 TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 2));
179 TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 7));
180 TRACE_CALL(CheckSavedFileEntry(GenerateId(3), 6));
181
182 service_->RecordFileAccess(extension_->id(), GenerateId(3));
183 TRACE_CALL(CheckSavedFileEntries(0, 4));
184 service_->ClearExtensionForTest(extension_->id());
185 TRACE_CALL(CheckSavedFileEntries(0, 4));
186 }
187
188 TEST_F(SavedFilesServiceUnitTest, SequenceNumberCompactionFirstAboveOneTest) {
189 extensions::SetMaxSequenceNumberForTest(10);
190 for (int i = 0; i < 4; i++) {
191 service_->AddFileEntry(extension_->id(), GenerateId(i), path_, true);
192 service_->RecordFileAccess(extension_->id(), GenerateId(i));
193 }
194 for (int i = 0; i < 4; i++) {
195 service_->RecordFileAccess(extension_->id(), GenerateId(i));
196 }
197 service_->RecordFileAccess(extension_->id(), GenerateId(2));
198 TRACE_CALL(CheckSavedFileEntry(GenerateId(0), 5));
199 TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 6));
200 TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 9));
201 TRACE_CALL(CheckSavedFileEntry(GenerateId(3), 8));
202 service_->ClearExtensionForTest(extension_->id());
203 TRACE_CALL(CheckSavedFileEntry(GenerateId(0), 5));
204 TRACE_CALL(CheckSavedFileEntry(GenerateId(1), 6));
205 TRACE_CALL(CheckSavedFileEntry(GenerateId(2), 9));
206 TRACE_CALL(CheckSavedFileEntry(GenerateId(3), 8));
207
208 service_->RecordFileAccess(extension_->id(), GenerateId(3));
209 TRACE_CALL(CheckSavedFileEntries(0, 4));
210 service_->ClearExtensionForTest(extension_->id());
211 TRACE_CALL(CheckSavedFileEntries(0, 4));
212 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698