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

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

Issue 2055053003: [BlobAsync] Disk support for blob storage (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed layout tests, cleaned up test visibility Created 4 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 2016 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 "storage/browser/blob/blob_flattener.h"
6
7 #include <memory>
8
9 #include "base/files/file_path.h"
10 #include "base/message_loop/message_loop.h"
11 #include "base/run_loop.h"
12 #include "base/time/time.h"
13 #include "storage/browser/blob/blob_data_builder.h"
14 #include "storage/browser/blob/blob_data_handle.h"
15 #include "storage/browser/blob/blob_data_item.h"
16 #include "storage/browser/blob/blob_storage_context.h"
17 #include "storage/browser/blob/blob_storage_registry.h"
18 #include "storage/browser/blob/internal_blob_data.h"
19 #include "storage/browser/blob/shareable_blob_data_item.h"
20 #include "storage/common/data_element.h"
21 #include "testing/gtest/include/gtest/gtest.h"
22
23 namespace storage {
24 namespace {
25 const char kType[] = "type";
26 const char kDisposition[] = "";
27
28 scoped_refptr<BlobDataItem> CreateDataDescriptionItem(size_t size) {
29 std::unique_ptr<DataElement> element(new DataElement());
30 element->SetToBytesDescription(size);
31 return scoped_refptr<BlobDataItem>(new BlobDataItem(std::move(element)));
32 };
33
34 scoped_refptr<BlobDataItem> CreateDataItem(const char* memory, size_t size) {
35 std::unique_ptr<DataElement> element(new DataElement());
36 element->SetToBytes(memory, size);
37 return scoped_refptr<BlobDataItem>(new BlobDataItem(std::move(element)));
38 };
39
40 scoped_refptr<BlobDataItem> CreateFileItem(size_t offset, size_t size) {
41 std::unique_ptr<DataElement> element(new DataElement());
42 element->SetToFilePathRange(base::FilePath("kFakePath"), offset, size,
43 base::Time::Max());
44 return scoped_refptr<BlobDataItem>(new BlobDataItem(std::move(element)));
45 };
46
47 scoped_refptr<BlobDataItem> CreateFutureFileItem(size_t offset, size_t size) {
48 std::unique_ptr<DataElement> element(new DataElement());
49 element->SetToFilePathRange(
50 base::FilePath(BlobDataBuilder::kAppendFutureFileTemporaryFileName),
51 offset, size, base::Time::Max());
52 return scoped_refptr<BlobDataItem>(new BlobDataItem(std::move(element)));
53 };
54
55 } // namespace
56
57 class BlobFlattenerTest : public testing::Test {
58 protected:
59 BlobFlattenerTest() {}
60 ~BlobFlattenerTest() override {}
61
62 void TearDown() override { base::RunLoop().RunUntilIdle(); }
63
64 std::unique_ptr<BlobDataHandle> SetupBasicBlob(const std::string& id) {
65 BlobDataBuilder builder(id);
66 builder.AppendData("1", 1);
67 builder.set_content_type("text/plain");
68 return context_.AddFinishedBlob(builder);
69 }
70
71 BlobStorageRegistry* registry() { return context_.mutable_registry(); }
72
73 const ShareableBlobDataItem& GetItemInBlob(const std::string& uuid,
74 size_t index) {
75 InternalBlobData* entry = registry()->GetEntry(uuid);
76 EXPECT_TRUE(entry);
77 return *entry->items()[index];
78 }
79
80 base::MessageLoop fake_io_message_loop;
81 BlobStorageContext context_;
82 };
83
84 TEST_F(BlobFlattenerTest, NoBlobItems) {
85 const std::string kBlobUUID = "kId";
86
87 BlobDataBuilder builder(kBlobUUID);
88 builder.AppendData("hi", 2u);
89 builder.AppendFile(base::FilePath("kFakePath"), 0u, 10u, base::Time::Max());
90 InternalBlobData output(kType, kDisposition);
91 BlobFlattener flattener(builder, &output, registry());
92
93 EXPECT_EQ(BlobStatus::DONE, flattener.status);
94 EXPECT_EQ(0u, flattener.dependent_blobs.size());
95 EXPECT_EQ(0u, flattener.copies.size());
96 EXPECT_EQ(12u, flattener.total_size.ValueOrDie());
97 EXPECT_EQ(2u, flattener.memory_needed.ValueOrDie());
98
99 ASSERT_EQ(2u, output.items().size());
100 EXPECT_EQ(*CreateDataItem("hi", 2u), *output.items()[0]->item());
101 EXPECT_EQ(*CreateFileItem(0, 10u), *output.items()[1]->item());
102 }
103
104 TEST_F(BlobFlattenerTest, ErrorCases) {
105 const std::string kBlobUUID = "kId";
106 const std::string kBlob2UUID = "kId2";
107
108 // Invalid blob reference.
109 {
110 BlobDataBuilder builder(kBlobUUID);
111 builder.AppendBlob("doesnotexist");
112 InternalBlobData output(kType, kDisposition);
113 BlobFlattener flattener(builder, &output, registry());
114 EXPECT_EQ(BlobStatus::ERR_INVALID_CONSTRUCTION_ARGUMENTS, flattener.status);
115 }
116
117 // Circular reference.
118 {
119 BlobDataBuilder builder(kBlobUUID);
120 builder.AppendBlob(kBlobUUID);
121 InternalBlobData output(kType, kDisposition);
122 BlobFlattener flattener(builder, &output, registry());
123 EXPECT_EQ(BlobStatus::ERR_INVALID_CONSTRUCTION_ARGUMENTS, flattener.status);
124 }
125
126 // Bad slice.
127 {
128 std::unique_ptr<BlobDataHandle> handle = SetupBasicBlob(kBlob2UUID);
129 BlobDataBuilder builder(kBlobUUID);
130 builder.AppendBlob(kBlob2UUID, 1, 2);
131 InternalBlobData output(kType, kDisposition);
132 BlobFlattener flattener(builder, &output, registry());
133 EXPECT_EQ(BlobStatus::ERR_INVALID_CONSTRUCTION_ARGUMENTS, flattener.status);
134 }
135 }
136
137 TEST_F(BlobFlattenerTest, BlobWithSlices) {
138 const std::string kBlobUUID = "kId";
139 const std::string kDataBlob = "kId2";
140 const std::string kFileBlob = "kId3";
141 const std::string kPendingFileBlob = "kId4";
142
143 // We have the following:
144 // * data,
145 // * sliced data blob,
146 // * file
147 // * full data blob,
148 // * pending data,
149 // * sliced pending file.
150
151 std::unique_ptr<BlobDataHandle> data_blob;
152 {
153 BlobDataBuilder builder(kDataBlob);
154 builder.AppendData("12345", 5);
155 builder.set_content_type("text/plain");
156 data_blob = context_.AddFinishedBlob(builder);
157 }
158
159 std::unique_ptr<BlobDataHandle> file_blob;
160 {
161 BlobDataBuilder builder(kFileBlob);
162 builder.AppendFile(base::FilePath("kFakePath"), 1u, 10u, base::Time::Max());
163 file_blob = context_.AddFinishedBlob(builder);
164 }
165
166 std::unique_ptr<BlobDataHandle> future_file_blob;
167 {
168 BlobDataBuilder builder(kPendingFileBlob);
169 builder.AppendFile(
170 base::FilePath(BlobDataBuilder::kAppendFutureFileTemporaryFileName), 2u,
171 5u, base::Time::Max());
172 future_file_blob = context_.AddFinishedBlob(builder);
173 }
174
175 BlobDataBuilder builder(kBlobUUID);
176 builder.AppendData("hi", 2u);
177 builder.AppendBlob(kDataBlob, 1u, 2u);
178 builder.AppendFile(base::FilePath("kFakePath"), 3u, 5u, base::Time::Max());
179 builder.AppendBlob(kDataBlob);
180 builder.AppendBlob(kFileBlob, 1u, 3u);
181 builder.AppendFutureData(12u);
182 builder.AppendBlob(kPendingFileBlob, 1u, 2u);
183
184 InternalBlobData output(kType, kDisposition);
185 BlobFlattener flattener(builder, &output, registry());
186 EXPECT_EQ(BlobStatus::PENDING_DATA_POPULATION, flattener.status);
187
188 EXPECT_EQ(3u, flattener.dependent_blobs.size());
189 EXPECT_EQ(31u, flattener.total_size.ValueOrDie());
190 EXPECT_EQ(16u, flattener.memory_needed.ValueOrDie());
191
192 ASSERT_EQ(7u, output.items().size());
193 EXPECT_EQ(*CreateDataItem("hi", 2u), *output.items()[0]->item());
194 EXPECT_EQ(*CreateDataDescriptionItem(2u), *output.items()[1]->item());
195 EXPECT_EQ(*CreateFileItem(3u, 5u), *output.items()[2]->item());
196 EXPECT_EQ(GetItemInBlob(kDataBlob, 0), *output.items()[3]);
197 EXPECT_EQ(*CreateFileItem(2u, 3u), *output.items()[4]->item());
198 EXPECT_EQ(*CreateDataDescriptionItem(12u), *output.items()[5]->item());
199 EXPECT_EQ(*CreateFutureFileItem(3u, 2u), *output.items()[6]->item());
200
201 // We're copying item at index 1 and 6.
202 ASSERT_EQ(2u, flattener.copies.size());
203 EXPECT_EQ(*flattener.copies[0].dest_item, *output.items()[1]);
204 EXPECT_EQ(GetItemInBlob(kDataBlob, 0), *flattener.copies[0].source_item);
205 EXPECT_EQ(1u, flattener.copies[0].source_item_offset);
206
207 EXPECT_EQ(*flattener.copies[1].dest_item, *output.items()[6]);
208 EXPECT_EQ(GetItemInBlob(kPendingFileBlob, 0),
209 *flattener.copies[1].source_item);
210 EXPECT_EQ(1u, flattener.copies[0].source_item_offset);
211 }
212
213 } // namespace storage
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698