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

Side by Side Diff: content/browser/loader/upload_data_stream_builder_unittest.cc

Issue 261993004: Allow BlobDataHandles to be copied, and have their UUIDs read, on any thread. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "content/browser/loader/upload_data_stream_builder.h" 5 #include "content/browser/loader/upload_data_stream_builder.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/files/file_path.h" 10 #include "base/files/file_path.h"
11 #include "base/message_loop/message_loop.h" 11 #include "base/message_loop/message_loop.h"
12 #include "base/message_loop/message_loop_proxy.h" 12 #include "base/message_loop/message_loop_proxy.h"
13 #include "base/run_loop.h"
13 #include "base/time/time.h" 14 #include "base/time/time.h"
14 #include "content/common/resource_request_body.h" 15 #include "content/common/resource_request_body.h"
15 #include "net/base/upload_bytes_element_reader.h" 16 #include "net/base/upload_bytes_element_reader.h"
16 #include "net/base/upload_data_stream.h" 17 #include "net/base/upload_data_stream.h"
17 #include "net/base/upload_file_element_reader.h" 18 #include "net/base/upload_file_element_reader.h"
18 #include "testing/gtest/include/gtest/gtest.h" 19 #include "testing/gtest/include/gtest/gtest.h"
19 #include "url/gurl.h" 20 #include "url/gurl.h"
20 #include "webkit/browser/blob/blob_storage_context.h" 21 #include "webkit/browser/blob/blob_storage_context.h"
21 22
22 using webkit_blob::BlobData; 23 using webkit_blob::BlobData;
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 upload->element_readers()[1]->AsFileReader(); 87 upload->element_readers()[1]->AsFileReader();
87 ASSERT_TRUE(r2); 88 ASSERT_TRUE(r2);
88 EXPECT_EQ(kFilePath, r2->path().value()); 89 EXPECT_EQ(kFilePath, r2->path().value());
89 EXPECT_EQ(kFileOffset, r2->range_offset()); 90 EXPECT_EQ(kFileOffset, r2->range_offset());
90 EXPECT_EQ(kFileLength, r2->range_length()); 91 EXPECT_EQ(kFileLength, r2->range_length());
91 EXPECT_EQ(kFileTime, r2->expected_modification_time()); 92 EXPECT_EQ(kFileTime, r2->expected_modification_time());
92 } 93 }
93 94
94 TEST(UploadDataStreamBuilderTest, ResolveBlobAndCreateUploadDataStream) { 95 TEST(UploadDataStreamBuilderTest, ResolveBlobAndCreateUploadDataStream) {
95 base::MessageLoop message_loop; 96 base::MessageLoop message_loop;
96 // Setup blob data for testing. 97 {
97 base::Time time1, time2; 98 // Setup blob data for testing.
98 base::Time::FromString("Tue, 15 Nov 1994, 12:45:26 GMT", &time1); 99 base::Time time1, time2;
99 base::Time::FromString("Mon, 14 Nov 1994, 11:30:49 GMT", &time2); 100 base::Time::FromString("Tue, 15 Nov 1994, 12:45:26 GMT", &time1);
100 101 base::Time::FromString("Mon, 14 Nov 1994, 11:30:49 GMT", &time2);
101 BlobStorageContext blob_storage_context; 102
102 103 BlobStorageContext blob_storage_context;
103 const std::string blob_id0("id-0"); 104
104 scoped_refptr<BlobData> blob_data(new BlobData(blob_id0)); 105 const std::string blob_id0("id-0");
105 scoped_ptr<BlobDataHandle> handle1 = 106 scoped_refptr<BlobData> blob_data(new BlobData(blob_id0));
106 blob_storage_context.AddFinishedBlob(blob_data); 107 scoped_ptr<BlobDataHandle> handle1 =
107 108 blob_storage_context.AddFinishedBlob(blob_data);
108 const std::string blob_id1("id-1"); 109
109 blob_data = new BlobData(blob_id1); 110 const std::string blob_id1("id-1");
110 blob_data->AppendData("BlobData"); 111 blob_data = new BlobData(blob_id1);
111 blob_data->AppendFile( 112 blob_data->AppendData("BlobData");
112 base::FilePath(FILE_PATH_LITERAL("BlobFile.txt")), 0, 20, time1); 113 blob_data->AppendFile(
113 scoped_ptr<BlobDataHandle> handle2 = 114 base::FilePath(FILE_PATH_LITERAL("BlobFile.txt")), 0, 20, time1);
114 blob_storage_context.AddFinishedBlob(blob_data); 115 scoped_ptr<BlobDataHandle> handle2 =
115 116 blob_storage_context.AddFinishedBlob(blob_data);
116 // Setup upload data elements for comparison. 117
117 ResourceRequestBody::Element blob_element1, blob_element2; 118 // Setup upload data elements for comparison.
118 blob_element1.SetToBytes( 119 ResourceRequestBody::Element blob_element1, blob_element2;
119 blob_data->items().at(0).bytes() + 120 blob_element1.SetToBytes(
120 static_cast<int>(blob_data->items().at(0).offset()), 121 blob_data->items().at(0).bytes() +
121 static_cast<int>(blob_data->items().at(0).length())); 122 static_cast<int>(blob_data->items().at(0).offset()),
122 blob_element2.SetToFilePathRange( 123 static_cast<int>(blob_data->items().at(0).length()));
123 blob_data->items().at(1).path(), 124 blob_element2.SetToFilePathRange(
124 blob_data->items().at(1).offset(), 125 blob_data->items().at(1).path(),
125 blob_data->items().at(1).length(), 126 blob_data->items().at(1).offset(),
126 blob_data->items().at(1).expected_modification_time()); 127 blob_data->items().at(1).length(),
127 128 blob_data->items().at(1).expected_modification_time());
128 ResourceRequestBody::Element upload_element1, upload_element2; 129
129 upload_element1.SetToBytes("Hello", 5); 130 ResourceRequestBody::Element upload_element1, upload_element2;
130 upload_element2.SetToFilePathRange( 131 upload_element1.SetToBytes("Hello", 5);
131 base::FilePath(FILE_PATH_LITERAL("foo1.txt")), 0, 20, time2); 132 upload_element2.SetToFilePathRange(
132 133 base::FilePath(FILE_PATH_LITERAL("foo1.txt")), 0, 20, time2);
133 // Test no blob reference. 134
134 scoped_refptr<ResourceRequestBody> request_body(new ResourceRequestBody()); 135 // Test no blob reference.
135 request_body->AppendBytes(upload_element1.bytes(), upload_element1.length()); 136 scoped_refptr<ResourceRequestBody> request_body(new ResourceRequestBody());
136 request_body->AppendFileRange(upload_element2.path(), 137 request_body->AppendBytes(
137 upload_element2.offset(), 138 upload_element1.bytes(),
138 upload_element2.length(), 139 upload_element1.length());
139 upload_element2.expected_modification_time()); 140 request_body->AppendFileRange(
140 141 upload_element2.path(),
141 scoped_ptr<net::UploadDataStream> upload( 142 upload_element2.offset(),
142 UploadDataStreamBuilder::Build(request_body.get(), 143 upload_element2.length(),
143 &blob_storage_context, 144 upload_element2.expected_modification_time());
144 NULL, 145
145 base::MessageLoopProxy::current().get())); 146 scoped_ptr<net::UploadDataStream> upload(
146 147 UploadDataStreamBuilder::Build(
147 ASSERT_EQ(2U, upload->element_readers().size()); 148 request_body.get(),
148 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[0], upload_element1)); 149 &blob_storage_context,
149 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[1], upload_element2)); 150 NULL,
150 151 base::MessageLoopProxy::current().get()));
151 // Test having only one blob reference that refers to empty blob data. 152
152 request_body = new ResourceRequestBody(); 153 ASSERT_EQ(2U, upload->element_readers().size());
153 request_body->AppendBlob(blob_id0); 154 EXPECT_TRUE(AreElementsEqual(
154 155 *upload->element_readers()[0], upload_element1));
155 upload = 156 EXPECT_TRUE(AreElementsEqual(
156 UploadDataStreamBuilder::Build(request_body.get(), 157 *upload->element_readers()[1], upload_element2));
157 &blob_storage_context, 158
158 NULL, 159 // Test having only one blob reference that refers to empty blob data.
159 base::MessageLoopProxy::current().get()); 160 request_body = new ResourceRequestBody();
160 ASSERT_EQ(0U, upload->element_readers().size()); 161 request_body->AppendBlob(blob_id0);
161 162
162 // Test having only one blob reference. 163 upload = UploadDataStreamBuilder::Build(
163 request_body = new ResourceRequestBody(); 164 request_body.get(),
164 request_body->AppendBlob(blob_id1); 165 &blob_storage_context,
165 166 NULL,
166 upload = 167 base::MessageLoopProxy::current().get());
167 UploadDataStreamBuilder::Build(request_body.get(), 168 ASSERT_EQ(0U, upload->element_readers().size());
168 &blob_storage_context, 169
169 NULL, 170 // Test having only one blob reference.
170 base::MessageLoopProxy::current().get()); 171 request_body = new ResourceRequestBody();
171 ASSERT_EQ(2U, upload->element_readers().size()); 172 request_body->AppendBlob(blob_id1);
172 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[0], blob_element1)); 173
173 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[1], blob_element2)); 174 upload = UploadDataStreamBuilder::Build(
174 175 request_body.get(),
175 // Test having one blob reference at the beginning. 176 &blob_storage_context,
176 request_body = new ResourceRequestBody(); 177 NULL,
177 request_body->AppendBlob(blob_id1); 178 base::MessageLoopProxy::current().get());
178 request_body->AppendBytes(upload_element1.bytes(), upload_element1.length()); 179 ASSERT_EQ(2U, upload->element_readers().size());
179 request_body->AppendFileRange(upload_element2.path(), 180 EXPECT_TRUE(AreElementsEqual(
180 upload_element2.offset(), 181 *upload->element_readers()[0], blob_element1));
181 upload_element2.length(), 182 EXPECT_TRUE(AreElementsEqual(
182 upload_element2.expected_modification_time()); 183 *upload->element_readers()[1], blob_element2));
183 184
184 upload = 185 // Test having one blob reference at the beginning.
185 UploadDataStreamBuilder::Build(request_body.get(), 186 request_body = new ResourceRequestBody();
186 &blob_storage_context, 187 request_body->AppendBlob(blob_id1);
187 NULL, 188 request_body->AppendBytes(
188 base::MessageLoopProxy::current().get()); 189 upload_element1.bytes(),
189 ASSERT_EQ(4U, upload->element_readers().size()); 190 upload_element1.length());
190 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[0], blob_element1)); 191 request_body->AppendFileRange(
191 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[1], blob_element2)); 192 upload_element2.path(),
192 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[2], upload_element1)); 193 upload_element2.offset(),
193 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[3], upload_element2)); 194 upload_element2.length(),
194 195 upload_element2.expected_modification_time());
195 // Test having one blob reference at the end. 196
196 request_body = new ResourceRequestBody(); 197 upload = UploadDataStreamBuilder::Build(
197 request_body->AppendBytes(upload_element1.bytes(), upload_element1.length()); 198 request_body.get(),
198 request_body->AppendFileRange(upload_element2.path(), 199 &blob_storage_context,
199 upload_element2.offset(), 200 NULL,
200 upload_element2.length(), 201 base::MessageLoopProxy::current().get());
201 upload_element2.expected_modification_time()); 202 ASSERT_EQ(4U, upload->element_readers().size());
202 request_body->AppendBlob(blob_id1); 203 EXPECT_TRUE(AreElementsEqual(
203 204 *upload->element_readers()[0], blob_element1));
204 upload = 205 EXPECT_TRUE(AreElementsEqual(
205 UploadDataStreamBuilder::Build(request_body.get(), 206 *upload->element_readers()[1], blob_element2));
206 &blob_storage_context, 207 EXPECT_TRUE(AreElementsEqual(
207 NULL, 208 *upload->element_readers()[2], upload_element1));
208 base::MessageLoopProxy::current().get()); 209 EXPECT_TRUE(AreElementsEqual(
209 ASSERT_EQ(4U, upload->element_readers().size()); 210 *upload->element_readers()[3], upload_element2));
210 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[0], upload_element1)); 211
211 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[1], upload_element2)); 212 // Test having one blob reference at the end.
212 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[2], blob_element1)); 213 request_body = new ResourceRequestBody();
213 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[3], blob_element2)); 214 request_body->AppendBytes(
214 215 upload_element1.bytes(),
215 // Test having one blob reference in the middle. 216 upload_element1.length());
216 request_body = new ResourceRequestBody(); 217 request_body->AppendFileRange(
217 request_body->AppendBytes(upload_element1.bytes(), upload_element1.length()); 218 upload_element2.path(),
218 request_body->AppendBlob(blob_id1); 219 upload_element2.offset(),
219 request_body->AppendFileRange(upload_element2.path(), 220 upload_element2.length(),
220 upload_element2.offset(), 221 upload_element2.expected_modification_time());
221 upload_element2.length(), 222 request_body->AppendBlob(blob_id1);
222 upload_element2.expected_modification_time()); 223
223 224 upload =
224 upload = 225 UploadDataStreamBuilder::Build(request_body.get(),
225 UploadDataStreamBuilder::Build(request_body.get(), 226 &blob_storage_context,
226 &blob_storage_context, 227 NULL,
227 NULL, 228 base::MessageLoopProxy::current().get());
228 base::MessageLoopProxy::current().get()); 229 ASSERT_EQ(4U, upload->element_readers().size());
229 ASSERT_EQ(4U, upload->element_readers().size()); 230 EXPECT_TRUE(AreElementsEqual(
230 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[0], upload_element1)); 231 *upload->element_readers()[0], upload_element1));
231 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[1], blob_element1)); 232 EXPECT_TRUE(AreElementsEqual(
232 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[2], blob_element2)); 233 *upload->element_readers()[1], upload_element2));
233 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[3], upload_element2)); 234 EXPECT_TRUE(AreElementsEqual(
234 235 *upload->element_readers()[2], blob_element1));
235 // Test having multiple blob references. 236 EXPECT_TRUE(AreElementsEqual(
236 request_body = new ResourceRequestBody(); 237 *upload->element_readers()[3], blob_element2));
237 request_body->AppendBlob(blob_id1); 238
238 request_body->AppendBytes(upload_element1.bytes(), upload_element1.length()); 239 // Test having one blob reference in the middle.
239 request_body->AppendBlob(blob_id1); 240 request_body = new ResourceRequestBody();
240 request_body->AppendBlob(blob_id1); 241 request_body->AppendBytes(
241 request_body->AppendFileRange(upload_element2.path(), 242 upload_element1.bytes(),
242 upload_element2.offset(), 243 upload_element1.length());
243 upload_element2.length(), 244 request_body->AppendBlob(blob_id1);
244 upload_element2.expected_modification_time()); 245 request_body->AppendFileRange(
245 246 upload_element2.path(),
246 upload = 247 upload_element2.offset(),
247 UploadDataStreamBuilder::Build(request_body.get(), 248 upload_element2.length(),
248 &blob_storage_context, 249 upload_element2.expected_modification_time());
249 NULL, 250
250 base::MessageLoopProxy::current().get()); 251 upload = UploadDataStreamBuilder::Build(
251 ASSERT_EQ(8U, upload->element_readers().size()); 252 request_body.get(),
252 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[0], blob_element1)); 253 &blob_storage_context,
253 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[1], blob_element2)); 254 NULL,
254 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[2], upload_element1)); 255 base::MessageLoopProxy::current().get());
255 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[3], blob_element1)); 256 ASSERT_EQ(4U, upload->element_readers().size());
256 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[4], blob_element2)); 257 EXPECT_TRUE(AreElementsEqual(
257 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[5], blob_element1)); 258 *upload->element_readers()[0], upload_element1));
258 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[6], blob_element2)); 259 EXPECT_TRUE(AreElementsEqual(
259 EXPECT_TRUE(AreElementsEqual(*upload->element_readers()[7], upload_element2)); 260 *upload->element_readers()[1], blob_element1));
261 EXPECT_TRUE(AreElementsEqual(
262 *upload->element_readers()[2], blob_element2));
263 EXPECT_TRUE(AreElementsEqual(
264 *upload->element_readers()[3], upload_element2));
265
266 // Test having multiple blob references.
267 request_body = new ResourceRequestBody();
268 request_body->AppendBlob(blob_id1);
269 request_body->AppendBytes(
270 upload_element1.bytes(),
271 upload_element1.length());
272 request_body->AppendBlob(blob_id1);
273 request_body->AppendBlob(blob_id1);
274 request_body->AppendFileRange(
275 upload_element2.path(),
276 upload_element2.offset(),
277 upload_element2.length(),
278 upload_element2.expected_modification_time());
279
280 upload = UploadDataStreamBuilder::Build(
281 request_body.get(),
282 &blob_storage_context,
283 NULL,
284 base::MessageLoopProxy::current().get());
285 ASSERT_EQ(8U, upload->element_readers().size());
286 EXPECT_TRUE(AreElementsEqual(
287 *upload->element_readers()[0], blob_element1));
288 EXPECT_TRUE(AreElementsEqual(
289 *upload->element_readers()[1], blob_element2));
290 EXPECT_TRUE(AreElementsEqual(
291 *upload->element_readers()[2], upload_element1));
292 EXPECT_TRUE(AreElementsEqual(
293 *upload->element_readers()[3], blob_element1));
294 EXPECT_TRUE(AreElementsEqual(
295 *upload->element_readers()[4], blob_element2));
296 EXPECT_TRUE(AreElementsEqual(
297 *upload->element_readers()[5], blob_element1));
298 EXPECT_TRUE(AreElementsEqual(
299 *upload->element_readers()[6], blob_element2));
300 EXPECT_TRUE(AreElementsEqual(
301 *upload->element_readers()[7], upload_element2));
302 }
303 // Clean up for ASAN.
304 base::RunLoop().RunUntilIdle();
260 } 305 }
261 306
262 } // namespace content 307 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/fileapi/blob_storage_context_unittest.cc ('k') | webkit/browser/blob/blob_data_handle.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698