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

Side by Side Diff: content/browser/blob_storage/blob_flattener_unittest.cc

Issue 2516713002: [BlobStorage] Implementing disk. (Closed)
Patch Set: comments, and hopefully browsertest cleanup Created 4 years 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
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "storage/browser/blob/blob_storage_context.h" 5 #include "storage/browser/blob/blob_storage_context.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "base/files/file_path.h" 9 #include "base/files/file_path.h"
10 #include "base/files/file_util.h" 10 #include "base/files/file_util.h"
11 #include "base/files/scoped_temp_dir.h" 11 #include "base/files/scoped_temp_dir.h"
12 #include "base/memory/ptr_util.h"
12 #include "base/message_loop/message_loop.h" 13 #include "base/message_loop/message_loop.h"
13 #include "base/run_loop.h" 14 #include "base/run_loop.h"
14 #include "base/test/test_simple_task_runner.h" 15 #include "base/test/test_simple_task_runner.h"
15 #include "base/time/time.h" 16 #include "base/time/time.h"
16 #include "storage/browser/blob/blob_data_builder.h" 17 #include "storage/browser/blob/blob_data_builder.h"
17 #include "storage/browser/blob/blob_data_handle.h" 18 #include "storage/browser/blob/blob_data_handle.h"
18 #include "storage/browser/blob/blob_data_item.h" 19 #include "storage/browser/blob/blob_data_item.h"
19 #include "storage/browser/blob/blob_entry.h" 20 #include "storage/browser/blob/blob_entry.h"
20 #include "storage/browser/blob/blob_storage_registry.h" 21 #include "storage/browser/blob/blob_storage_registry.h"
21 #include "storage/browser/blob/shareable_blob_data_item.h" 22 #include "storage/browser/blob/shareable_blob_data_item.h"
(...skipping 10 matching lines...) Expand all
32 } // namespace 33 } // namespace
33 34
34 class BlobFlattenerTest : public testing::Test { 35 class BlobFlattenerTest : public testing::Test {
35 protected: 36 protected:
36 using BlobFlattener = BlobStorageContext::BlobFlattener; 37 using BlobFlattener = BlobStorageContext::BlobFlattener;
37 38
38 BlobFlattenerTest() 39 BlobFlattenerTest()
39 : fake_file_path_(base::FilePath(FILE_PATH_LITERAL("kFakePath"))) {} 40 : fake_file_path_(base::FilePath(FILE_PATH_LITERAL("kFakePath"))) {}
40 ~BlobFlattenerTest() override {} 41 ~BlobFlattenerTest() override {}
41 42
42 void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); } 43 void SetUp() override {
44 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
45 context_ = base::MakeUnique<BlobStorageContext>();
46 }
43 47
44 void TearDown() override { 48 void TearDown() override {
45 base::RunLoop().RunUntilIdle(); 49 base::RunLoop().RunUntilIdle();
46 file_runner_->RunPendingTasks(); 50 file_runner_->RunPendingTasks();
47 ASSERT_TRUE(temp_dir_.Delete()); 51 ASSERT_TRUE(temp_dir_.Delete());
48 } 52 }
49 53
50 scoped_refptr<BlobDataItem> CreateDataDescriptionItem(size_t size) { 54 scoped_refptr<BlobDataItem> CreateDataDescriptionItem(size_t size) {
51 std::unique_ptr<DataElement> element(new DataElement()); 55 std::unique_ptr<DataElement> element(new DataElement());
52 element->SetToBytesDescription(size); 56 element->SetToBytesDescription(size);
53 return scoped_refptr<BlobDataItem>(new BlobDataItem(std::move(element))); 57 return scoped_refptr<BlobDataItem>(new BlobDataItem(std::move(element)));
54 }; 58 };
55 59
56 scoped_refptr<BlobDataItem> CreateDataItem(const char* memory, size_t size) { 60 scoped_refptr<BlobDataItem> CreateDataItem(const char* memory, size_t size) {
57 std::unique_ptr<DataElement> element(new DataElement()); 61 std::unique_ptr<DataElement> element(new DataElement());
58 element->SetToBytes(memory, size); 62 element->SetToBytes(memory, size);
59 return scoped_refptr<BlobDataItem>(new BlobDataItem(std::move(element))); 63 return scoped_refptr<BlobDataItem>(new BlobDataItem(std::move(element)));
60 }; 64 };
61 65
62 scoped_refptr<BlobDataItem> CreateFileItem(size_t offset, size_t size) { 66 scoped_refptr<BlobDataItem> CreateFileItem(size_t offset, size_t size) {
63 std::unique_ptr<DataElement> element(new DataElement()); 67 std::unique_ptr<DataElement> element(new DataElement());
64 element->SetToFilePathRange(fake_file_path_, offset, size, 68 element->SetToFilePathRange(fake_file_path_, offset, size,
65 base::Time::Max()); 69 base::Time::Max());
66 return scoped_refptr<BlobDataItem>(new BlobDataItem(std::move(element))); 70 return scoped_refptr<BlobDataItem>(new BlobDataItem(std::move(element)));
67 }; 71 };
68 72
73 scoped_refptr<BlobDataItem> CreateFutureFileItem(size_t offset, size_t size) {
74 std::unique_ptr<DataElement> element(new DataElement());
75 element->SetToFilePathRange(BlobDataBuilder::GetFutureFileItemPath(0),
76 offset, size, base::Time());
77 return scoped_refptr<BlobDataItem>(new BlobDataItem(std::move(element)));
78 };
79
69 std::unique_ptr<BlobDataHandle> SetupBasicBlob(const std::string& id) { 80 std::unique_ptr<BlobDataHandle> SetupBasicBlob(const std::string& id) {
70 BlobDataBuilder builder(id); 81 BlobDataBuilder builder(id);
71 builder.AppendData("1", 1); 82 builder.AppendData("1", 1);
72 builder.set_content_type("text/plain"); 83 builder.set_content_type("text/plain");
73 return context_.AddFinishedBlob(builder); 84 return context_->AddFinishedBlob(builder);
74 } 85 }
75 86
76 BlobStorageRegistry* registry() { return context_.mutable_registry(); } 87 BlobStorageRegistry* registry() { return context_->mutable_registry(); }
77 88
78 const ShareableBlobDataItem& GetItemInBlob(const std::string& uuid, 89 const ShareableBlobDataItem& GetItemInBlob(const std::string& uuid,
79 size_t index) { 90 size_t index) {
80 BlobEntry* entry = registry()->GetEntry(uuid); 91 BlobEntry* entry = registry()->GetEntry(uuid);
81 EXPECT_TRUE(entry); 92 EXPECT_TRUE(entry);
82 return *entry->items()[index]; 93 return *entry->items()[index];
83 } 94 }
84 95
85 base::FilePath fake_file_path_; 96 base::FilePath fake_file_path_;
86 base::ScopedTempDir temp_dir_; 97 base::ScopedTempDir temp_dir_;
87 scoped_refptr<TestSimpleTaskRunner> file_runner_ = new TestSimpleTaskRunner(); 98 scoped_refptr<TestSimpleTaskRunner> file_runner_ = new TestSimpleTaskRunner();
88 99
89 base::MessageLoop fake_io_message_loop; 100 base::MessageLoop fake_io_message_loop;
90 BlobStorageContext context_; 101 std::unique_ptr<BlobStorageContext> context_;
91 }; 102 };
92 103
93 TEST_F(BlobFlattenerTest, NoBlobItems) { 104 TEST_F(BlobFlattenerTest, NoBlobItems) {
94 const std::string kBlobUUID = "kId"; 105 const std::string kBlobUUID = "kId";
95 106
96 BlobDataBuilder builder(kBlobUUID); 107 BlobDataBuilder builder(kBlobUUID);
97 builder.AppendData("hi", 2u); 108 builder.AppendData("hi", 2u);
98 builder.AppendFile(fake_file_path_, 0u, 10u, base::Time::Max()); 109 builder.AppendFile(fake_file_path_, 0u, 10u, base::Time::Max());
99 BlobEntry output(kType, kDisposition); 110 BlobEntry output(kType, kDisposition);
100 BlobFlattener flattener(builder, &output, registry()); 111 BlobFlattener flattener(builder, &output, registry());
101 112
102 EXPECT_EQ(BlobStatus::PENDING_QUOTA, flattener.status); 113 EXPECT_EQ(BlobStatus::PENDING_QUOTA, flattener.status);
103 EXPECT_EQ(0u, flattener.dependent_blobs.size()); 114 EXPECT_EQ(0u, flattener.dependent_blobs.size());
104 EXPECT_EQ(0u, flattener.copies.size()); 115 EXPECT_EQ(0u, flattener.copies.size());
105 EXPECT_EQ(12u, flattener.total_size); 116 EXPECT_EQ(12u, flattener.total_size);
106 EXPECT_EQ(2u, flattener.memory_quota_needed); 117 EXPECT_EQ(2u, flattener.transport_quota_needed);
107 118
108 ASSERT_EQ(2u, output.items().size()); 119 ASSERT_EQ(2u, output.items().size());
109 EXPECT_EQ(*CreateDataItem("hi", 2u), *output.items()[0]->item()); 120 EXPECT_EQ(*CreateDataItem("hi", 2u), *output.items()[0]->item());
110 EXPECT_EQ(*CreateFileItem(0, 10u), *output.items()[1]->item()); 121 EXPECT_EQ(*CreateFileItem(0, 10u), *output.items()[1]->item());
111 } 122 }
112 123
113 TEST_F(BlobFlattenerTest, ErrorCases) { 124 TEST_F(BlobFlattenerTest, ErrorCases) {
114 const std::string kBlobUUID = "kId"; 125 const std::string kBlobUUID = "kId";
115 const std::string kBlob2UUID = "kId2"; 126 const std::string kBlob2UUID = "kId2";
116 127
(...skipping 23 matching lines...) Expand all
140 BlobEntry output(kType, kDisposition); 151 BlobEntry output(kType, kDisposition);
141 BlobFlattener flattener(builder, &output, registry()); 152 BlobFlattener flattener(builder, &output, registry());
142 EXPECT_EQ(BlobStatus::ERR_INVALID_CONSTRUCTION_ARGUMENTS, flattener.status); 153 EXPECT_EQ(BlobStatus::ERR_INVALID_CONSTRUCTION_ARGUMENTS, flattener.status);
143 } 154 }
144 } 155 }
145 156
146 TEST_F(BlobFlattenerTest, BlobWithSlices) { 157 TEST_F(BlobFlattenerTest, BlobWithSlices) {
147 const std::string kBlobUUID = "kId"; 158 const std::string kBlobUUID = "kId";
148 const std::string kDataBlob = "kId2"; 159 const std::string kDataBlob = "kId2";
149 const std::string kFileBlob = "kId3"; 160 const std::string kFileBlob = "kId3";
161 const std::string kPendingFileBlob = "kId4";
150 162
151 // We have the following: 163 // We have the following:
152 // * data, 164 // * data,
153 // * sliced data blob, 165 // * sliced data blob,
154 // * file 166 // * file
155 // * full data blob, 167 // * full data blob,
156 // * pending data, 168 // * pending data,
157 169
170 context_ =
171 base::MakeUnique<BlobStorageContext>(temp_dir_.GetPath(), file_runner_);
172
158 std::unique_ptr<BlobDataHandle> data_blob; 173 std::unique_ptr<BlobDataHandle> data_blob;
159 { 174 {
160 BlobDataBuilder builder(kDataBlob); 175 BlobDataBuilder builder(kDataBlob);
161 builder.AppendData("12345", 5); 176 builder.AppendData("12345", 5);
162 builder.set_content_type("text/plain"); 177 builder.set_content_type("text/plain");
163 data_blob = context_.AddFinishedBlob(builder); 178 data_blob = context_->AddFinishedBlob(builder);
164 } 179 }
165 180
166 std::unique_ptr<BlobDataHandle> file_blob; 181 std::unique_ptr<BlobDataHandle> file_blob;
167 { 182 {
168 BlobDataBuilder builder(kFileBlob); 183 BlobDataBuilder builder(kFileBlob);
169 builder.AppendFile(fake_file_path_, 1u, 10u, base::Time::Max()); 184 builder.AppendFile(fake_file_path_, 1u, 10u, base::Time::Max());
170 file_blob = context_.AddFinishedBlob(builder); 185 file_blob = context_->AddFinishedBlob(builder);
186 }
187
188 std::unique_ptr<BlobDataHandle> future_file_blob;
189 {
190 BlobDataBuilder builder(kPendingFileBlob);
191 builder.AppendFutureFile(2u, 5u, 0);
192 future_file_blob = context_->AddFinishedBlob(builder);
171 } 193 }
172 194
173 BlobDataBuilder builder(kBlobUUID); 195 BlobDataBuilder builder(kBlobUUID);
174 builder.AppendData("hi", 2u); 196 builder.AppendData("hi", 2u);
175 builder.AppendBlob(kDataBlob, 1u, 2u); 197 builder.AppendBlob(kDataBlob, 1u, 2u);
176 builder.AppendFile(fake_file_path_, 3u, 5u, base::Time::Max()); 198 builder.AppendFile(fake_file_path_, 3u, 5u, base::Time::Max());
177 builder.AppendBlob(kDataBlob); 199 builder.AppendBlob(kDataBlob);
178 builder.AppendBlob(kFileBlob, 1u, 3u); 200 builder.AppendBlob(kFileBlob, 1u, 3u);
179 builder.AppendFutureData(12u); 201 builder.AppendFutureData(12u);
202 builder.AppendBlob(kPendingFileBlob, 1u, 2u);
180 203
181 BlobEntry output(kType, kDisposition); 204 BlobEntry output(kType, kDisposition);
182 BlobFlattener flattener(builder, &output, registry()); 205 BlobFlattener flattener(builder, &output, registry());
183 EXPECT_EQ(BlobStatus::PENDING_QUOTA, flattener.status); 206 EXPECT_EQ(BlobStatus::PENDING_QUOTA, flattener.status);
184 207
185 EXPECT_EQ(2u, flattener.dependent_blobs.size()); 208 EXPECT_EQ(3u, flattener.dependent_blobs.size());
186 EXPECT_EQ(29u, flattener.total_size); 209 EXPECT_EQ(31u, flattener.total_size);
187 EXPECT_EQ(16u, flattener.memory_quota_needed); 210 EXPECT_EQ(14u, flattener.transport_quota_needed);
211 EXPECT_EQ(2u, flattener.copy_quota_needed);
188 212
189 ASSERT_EQ(6u, output.items().size()); 213 ASSERT_EQ(7u, output.items().size());
190 EXPECT_EQ(*CreateDataItem("hi", 2u), *output.items()[0]->item()); 214 EXPECT_EQ(*CreateDataItem("hi", 2u), *output.items()[0]->item());
191 EXPECT_EQ(*CreateDataDescriptionItem(2u), *output.items()[1]->item()); 215 EXPECT_EQ(*CreateDataDescriptionItem(2u), *output.items()[1]->item());
192 EXPECT_EQ(*CreateFileItem(3u, 5u), *output.items()[2]->item()); 216 EXPECT_EQ(*CreateFileItem(3u, 5u), *output.items()[2]->item());
193 EXPECT_EQ(GetItemInBlob(kDataBlob, 0), *output.items()[3]); 217 EXPECT_EQ(GetItemInBlob(kDataBlob, 0), *output.items()[3]);
194 EXPECT_EQ(*CreateFileItem(2u, 3u), *output.items()[4]->item()); 218 EXPECT_EQ(*CreateFileItem(2u, 3u), *output.items()[4]->item());
195 EXPECT_EQ(*CreateDataDescriptionItem(12u), *output.items()[5]->item()); 219 EXPECT_EQ(*CreateDataDescriptionItem(12u), *output.items()[5]->item());
220 EXPECT_EQ(*CreateFutureFileItem(3u, 2u), *output.items()[6]->item());
196 221
197 // We're copying item at index 1 222 // We're copying item at index 1 and 6.
198 ASSERT_EQ(1u, flattener.copies.size()); 223 ASSERT_EQ(2u, flattener.copies.size());
199 EXPECT_EQ(*flattener.copies[0].dest_item, *output.items()[1]); 224 EXPECT_EQ(*flattener.copies[0].dest_item, *output.items()[1]);
200 EXPECT_EQ(GetItemInBlob(kDataBlob, 0), *flattener.copies[0].source_item); 225 EXPECT_EQ(GetItemInBlob(kDataBlob, 0), *flattener.copies[0].source_item);
201 EXPECT_EQ(1u, flattener.copies[0].source_item_offset); 226 EXPECT_EQ(1u, flattener.copies[0].source_item_offset);
227 EXPECT_EQ(*flattener.copies[1].dest_item, *output.items()[6]);
228 EXPECT_EQ(GetItemInBlob(kPendingFileBlob, 0),
229 *flattener.copies[1].source_item);
230 EXPECT_EQ(1u, flattener.copies[1].source_item_offset);
202 } 231 }
203 232
204 } // namespace storage 233 } // namespace storage
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698