OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2015 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 "content/browser/service_worker/service_worker_cache_writer.h" | |
6 | |
7 #include <cstring> | |
falken
2015/08/28 05:45:24
Is this include needed? can it just be <string>?
Elly Fong-Jones
2015/08/31 15:03:45
Done.
| |
8 #include <list> | |
9 #include <queue> | |
10 | |
11 #include "base/stl_util.h" | |
12 #include "content/browser/service_worker/service_worker_disk_cache.h" | |
13 #include "testing/gtest/include/gtest/gtest.h" | |
14 | |
15 namespace content { | |
16 namespace { | |
17 | |
18 class MockServiceWorkerResponseReader : public ServiceWorkerResponseReader { | |
19 public: | |
20 MockServiceWorkerResponseReader() : ServiceWorkerResponseReader(0, nullptr) {} | |
21 ~MockServiceWorkerResponseReader() override {} | |
22 | |
23 // ServiceWorkerResponseReader overrides | |
24 void ReadInfo(HttpResponseInfoIOBuffer* info_buf, | |
25 const net::CompletionCallback& callback) override; | |
26 void ReadData(net::IOBuffer* buf, | |
27 int buf_len, | |
28 const net::CompletionCallback& callback) override; | |
29 | |
30 // Test helpers | |
31 void ExpectReadInfo(size_t len, bool async, int result); | |
32 void ExpectReadInfoOk(size_t len, bool async); | |
33 void ExpectReadData(const char* data, size_t len, bool async, int result); | |
34 void ExpectReadDataOk(const std::string& data, bool async); | |
35 | |
36 void CompletePendingRead(); | |
37 bool AllExpectedReadsDone() { return expected_reads_.size() == 0; } | |
38 | |
39 private: | |
40 struct ExpectedRead { | |
41 ExpectedRead(size_t len, bool async, int result) | |
42 : data(nullptr), len(len), info(true), async(async), result(result) {} | |
43 ExpectedRead(const char* data, size_t len, bool async, int result) | |
44 : data(data), len(len), info(false), async(async), result(result) {} | |
45 const char* data; | |
46 size_t len; | |
47 bool info; | |
48 bool async; | |
49 int result; | |
50 }; | |
51 | |
52 std::queue<ExpectedRead> expected_reads_; | |
53 scoped_refptr<net::IOBuffer> pending_buffer_; | |
54 size_t pending_buffer_len_; | |
55 scoped_refptr<HttpResponseInfoIOBuffer> pending_info_; | |
56 net::CompletionCallback pending_callback_; | |
57 }; | |
58 | |
59 void MockServiceWorkerResponseReader::ReadInfo( | |
60 HttpResponseInfoIOBuffer* info_buf, | |
61 const net::CompletionCallback& callback) { | |
62 DCHECK(!expected_reads_.empty()); | |
63 ExpectedRead expected = expected_reads_.front(); | |
64 EXPECT_TRUE(expected.info); | |
65 if (expected.async) { | |
66 pending_info_ = info_buf; | |
67 pending_callback_ = callback; | |
68 } else { | |
69 expected_reads_.pop(); | |
70 info_buf->response_data_size = expected.len; | |
71 callback.Run(expected.result); | |
72 } | |
73 } | |
74 | |
75 void MockServiceWorkerResponseReader::ReadData( | |
76 net::IOBuffer* buf, | |
77 int buf_len, | |
78 const net::CompletionCallback& callback) { | |
79 DCHECK(!expected_reads_.empty()); | |
80 ExpectedRead expected = expected_reads_.front(); | |
81 EXPECT_FALSE(expected.info); | |
82 if (expected.async) { | |
83 pending_callback_ = callback; | |
84 pending_buffer_ = buf; | |
85 pending_buffer_len_ = static_cast<size_t>(buf_len); | |
86 } else { | |
87 expected_reads_.pop(); | |
88 if (expected.len > 0) { | |
89 size_t to_read = std::min(static_cast<size_t>(buf_len), expected.len); | |
90 memcpy(buf->data(), expected.data, to_read); | |
91 } | |
92 callback.Run(expected.result); | |
93 } | |
94 } | |
95 | |
96 void MockServiceWorkerResponseReader::ExpectReadInfo(size_t len, | |
97 bool async, | |
98 int result) { | |
99 expected_reads_.push(ExpectedRead(len, async, result)); | |
100 } | |
101 | |
102 void MockServiceWorkerResponseReader::ExpectReadInfoOk(size_t len, bool async) { | |
103 expected_reads_.push(ExpectedRead(len, async, len)); | |
104 } | |
105 | |
106 void MockServiceWorkerResponseReader::ExpectReadData(const char* data, | |
107 size_t len, | |
108 bool async, | |
109 int result) { | |
110 expected_reads_.push(ExpectedRead(data, len, async, result)); | |
111 } | |
112 | |
113 void MockServiceWorkerResponseReader::ExpectReadDataOk(const std::string& data, | |
114 bool async) { | |
115 expected_reads_.push( | |
116 ExpectedRead(data.data(), data.size(), async, data.size())); | |
117 } | |
118 | |
119 void MockServiceWorkerResponseReader::CompletePendingRead() { | |
120 DCHECK(!expected_reads_.empty()); | |
121 ExpectedRead expected = expected_reads_.front(); | |
122 expected_reads_.pop(); | |
123 EXPECT_TRUE(expected.async); | |
124 if (expected.info) { | |
125 pending_info_->response_data_size = expected.len; | |
126 } else { | |
127 size_t to_read = std::min(pending_buffer_len_, expected.len); | |
128 if (to_read > 0) | |
129 memcpy(pending_buffer_->data(), expected.data, to_read); | |
falken
2015/08/28 05:45:24
Some lightweight high-level comments for these cla
Elly Fong-Jones
2015/08/31 15:03:45
Done.
| |
130 } | |
131 pending_info_ = nullptr; | |
132 pending_buffer_ = nullptr; | |
133 net::CompletionCallback callback = pending_callback_; | |
134 pending_callback_.Reset(); | |
135 callback.Run(expected.result); | |
136 } | |
137 | |
138 class MockServiceWorkerResponseWriter : public ServiceWorkerResponseWriter { | |
139 public: | |
140 MockServiceWorkerResponseWriter() | |
141 : ServiceWorkerResponseWriter(0, nullptr), | |
142 info_written_(0), | |
143 data_written_(0) {} | |
144 ~MockServiceWorkerResponseWriter() override {} | |
145 | |
146 // ServiceWorkerResponseWriter overrides | |
147 void WriteInfo(HttpResponseInfoIOBuffer* info_buf, | |
148 const net::CompletionCallback& callback) override; | |
149 void WriteData(net::IOBuffer* buf, | |
150 int buf_len, | |
151 const net::CompletionCallback& callback) override; | |
152 | |
153 // Test helpers | |
154 void ExpectWriteInfoOk(size_t len, bool async); | |
155 void ExpectWriteDataOk(size_t len, bool async); | |
156 | |
157 void CompletePendingWrite(); | |
158 bool AllExpectedWritesDone() { return expected_writes_.size() == 0; } | |
159 | |
160 private: | |
161 struct ExpectedWrite { | |
162 ExpectedWrite(bool is_info, size_t length, bool async, int result) | |
163 : is_info(is_info), length(length), async(async), result(result) {} | |
164 bool is_info; | |
165 size_t length; | |
166 bool async; | |
167 int result; | |
168 }; | |
169 | |
170 std::queue<ExpectedWrite> expected_writes_; | |
171 | |
172 size_t info_written_; | |
173 size_t data_written_; | |
174 | |
175 net::CompletionCallback pending_callback_; | |
176 }; | |
177 | |
178 void MockServiceWorkerResponseWriter::WriteInfo( | |
179 HttpResponseInfoIOBuffer* info_buf, | |
180 const net::CompletionCallback& callback) { | |
181 DCHECK(!expected_writes_.empty()); | |
182 ExpectedWrite write = expected_writes_.front(); | |
183 EXPECT_TRUE(write.is_info); | |
184 EXPECT_EQ(write.length, static_cast<size_t>(info_buf->response_data_size)); | |
185 info_written_ += info_buf->response_data_size; | |
186 if (!write.async) { | |
187 expected_writes_.pop(); | |
188 callback.Run(write.result); | |
189 } else { | |
190 pending_callback_ = callback; | |
191 } | |
192 } | |
193 | |
194 void MockServiceWorkerResponseWriter::WriteData( | |
195 net::IOBuffer* buf, | |
196 int buf_len, | |
197 const net::CompletionCallback& callback) { | |
198 DCHECK(!expected_writes_.empty()); | |
199 ExpectedWrite write = expected_writes_.front(); | |
200 EXPECT_FALSE(write.is_info); | |
201 EXPECT_EQ(write.length, static_cast<size_t>(buf_len)); | |
202 data_written_ += buf_len; | |
203 if (!write.async) { | |
204 expected_writes_.pop(); | |
205 callback.Run(write.result); | |
206 } else { | |
207 pending_callback_ = callback; | |
208 } | |
209 } | |
210 | |
211 void MockServiceWorkerResponseWriter::ExpectWriteInfoOk(size_t length, | |
212 bool async) { | |
213 ExpectedWrite expected(true, length, async, length); | |
214 expected_writes_.push(expected); | |
215 } | |
216 | |
217 void MockServiceWorkerResponseWriter::ExpectWriteDataOk(size_t length, | |
218 bool async) { | |
219 ExpectedWrite expected(false, length, async, length); | |
220 expected_writes_.push(expected); | |
221 } | |
222 | |
223 void MockServiceWorkerResponseWriter::CompletePendingWrite() { | |
224 DCHECK(!expected_writes_.empty()); | |
225 ExpectedWrite write = expected_writes_.front(); | |
226 DCHECK(write.async); | |
227 expected_writes_.pop(); | |
228 pending_callback_.Run(write.result); | |
229 } | |
230 | |
231 class ServiceWorkerCacheWriterTest : public ::testing::Test { | |
232 public: | |
233 ServiceWorkerCacheWriterTest() | |
234 : readers_deleter_(&readers_), writers_deleter_(&writers_) {} | |
235 | |
236 void SetUp() override { | |
237 ::testing::Test::SetUp(); | |
238 cache_writer_.reset(new ServiceWorkerCacheWriter( | |
239 base::Bind(&ServiceWorkerCacheWriterTest::CreateReader, | |
240 base::Unretained(this)), | |
241 base::Bind(&ServiceWorkerCacheWriterTest::CreateWriter, | |
242 base::Unretained(this)))); | |
243 write_complete_ = false; | |
244 } | |
245 | |
246 MockServiceWorkerResponseReader* ExpectReader() { | |
247 scoped_ptr<MockServiceWorkerResponseReader> reader( | |
248 new MockServiceWorkerResponseReader); | |
249 MockServiceWorkerResponseReader* borrowed_reader = reader.get(); | |
250 readers_.push_back(reader.release()); // give ownership to |readers_| | |
251 return borrowed_reader; | |
252 } | |
253 | |
254 MockServiceWorkerResponseWriter* ExpectWriter() { | |
255 scoped_ptr<MockServiceWorkerResponseWriter> writer( | |
256 new MockServiceWorkerResponseWriter); | |
257 MockServiceWorkerResponseWriter* borrowed_writer = writer.get(); | |
258 writers_.push_back(writer.release()); // give ownership to |writers_| | |
259 return borrowed_writer; | |
260 } | |
261 | |
262 protected: | |
263 // TODO(ellyjones): when unique_ptr<> is allowed, make these instead: | |
264 // std::list<unique_ptr<...>> | |
265 // Right now, these cannot use scoped_ptr. | |
266 // Their elements are deleted by the STLElementDeleters below when this object | |
267 // goes out of scope. | |
268 std::list<MockServiceWorkerResponseReader*> readers_; | |
269 std::list<MockServiceWorkerResponseWriter*> writers_; | |
270 STLElementDeleter<std::list<MockServiceWorkerResponseReader*>> | |
271 readers_deleter_; | |
272 STLElementDeleter<std::list<MockServiceWorkerResponseWriter*>> | |
273 writers_deleter_; | |
274 scoped_ptr<ServiceWorkerCacheWriter> cache_writer_; | |
275 bool write_complete_; | |
276 net::Error last_error_; | |
277 | |
278 scoped_ptr<ServiceWorkerResponseReader> CreateReader() { | |
279 if (readers_.empty()) | |
280 return make_scoped_ptr<ServiceWorkerResponseReader>(nullptr); | |
281 scoped_ptr<ServiceWorkerResponseReader> reader(readers_.front()); | |
282 readers_.pop_front(); | |
283 return reader.Pass(); | |
284 } | |
285 scoped_ptr<ServiceWorkerResponseWriter> CreateWriter() { | |
286 if (writers_.empty()) | |
287 return make_scoped_ptr<ServiceWorkerResponseWriter>(nullptr); | |
288 scoped_ptr<ServiceWorkerResponseWriter> writer(writers_.front()); | |
289 writers_.pop_front(); | |
290 return writer.Pass(); | |
291 } | |
292 | |
293 ServiceWorkerCacheWriter::OnWriteCompleteCallback CreateWriteCallback() { | |
294 return base::Bind(&ServiceWorkerCacheWriterTest::OnWriteComplete, | |
295 base::Unretained(this)); | |
296 } | |
297 | |
298 void OnWriteComplete(net::Error error) { | |
299 write_complete_ = true; | |
300 last_error_ = error; | |
301 } | |
302 | |
303 net::Error WriteHeaders(size_t len) { | |
304 scoped_refptr<HttpResponseInfoIOBuffer> buf(new HttpResponseInfoIOBuffer); | |
305 buf->response_data_size = len; | |
306 return cache_writer_->WriteHeaders(buf.get(), CreateWriteCallback()); | |
307 } | |
308 | |
309 net::Error WriteData(const std::string& data) { | |
310 scoped_refptr<net::IOBuffer> buf = new net::StringIOBuffer(data); | |
311 return cache_writer_->WriteData(buf.get(), data.size(), | |
312 CreateWriteCallback()); | |
313 } | |
314 }; | |
315 | |
316 TEST_F(ServiceWorkerCacheWriterTest, PassthroughHeadersSync) { | |
317 const size_t kHeaderSize = 16; | |
318 MockServiceWorkerResponseWriter* writer = ExpectWriter(); | |
319 writer->ExpectWriteInfoOk(kHeaderSize, false); | |
320 | |
321 net::Error error = WriteHeaders(kHeaderSize); | |
322 EXPECT_EQ(net::OK, error); | |
323 EXPECT_FALSE(write_complete_); | |
324 EXPECT_TRUE(writer->AllExpectedWritesDone()); | |
325 EXPECT_EQ(0U, cache_writer_->BytesWritten()); | |
326 } | |
327 | |
328 TEST_F(ServiceWorkerCacheWriterTest, PassthroughHeadersAsync) { | |
329 size_t kHeaderSize = 16; | |
330 MockServiceWorkerResponseWriter* writer = ExpectWriter(); | |
331 writer->ExpectWriteInfoOk(kHeaderSize, true); | |
332 | |
333 net::Error error = WriteHeaders(kHeaderSize); | |
334 EXPECT_EQ(net::ERR_IO_PENDING, error); | |
335 EXPECT_FALSE(write_complete_); | |
336 writer->CompletePendingWrite(); | |
337 EXPECT_TRUE(write_complete_); | |
338 EXPECT_TRUE(writer->AllExpectedWritesDone()); | |
339 EXPECT_EQ(0U, cache_writer_->BytesWritten()); | |
340 } | |
341 | |
342 TEST_F(ServiceWorkerCacheWriterTest, PassthroughDataSync) { | |
343 const std::string data1 = "abcdef"; | |
344 const std::string data2 = "ghijklmno"; | |
345 size_t response_size = data1.size() + data2.size(); | |
346 | |
347 MockServiceWorkerResponseWriter* writer = ExpectWriter(); | |
348 writer->ExpectWriteInfoOk(response_size, false); | |
349 writer->ExpectWriteDataOk(data1.size(), false); | |
350 writer->ExpectWriteDataOk(data2.size(), false); | |
351 | |
352 net::Error error = WriteHeaders(response_size); | |
353 EXPECT_EQ(net::OK, error); | |
354 | |
355 error = WriteData(data1); | |
356 EXPECT_EQ(net::OK, error); | |
357 | |
358 error = WriteData(data2); | |
359 EXPECT_EQ(net::OK, error); | |
360 EXPECT_TRUE(writer->AllExpectedWritesDone()); | |
361 } | |
362 | |
363 TEST_F(ServiceWorkerCacheWriterTest, PassthroughDataAsync) { | |
364 const std::string data1 = "abcdef"; | |
365 const std::string data2 = "ghijklmno"; | |
366 size_t response_size = data1.size() + data2.size(); | |
367 | |
368 MockServiceWorkerResponseWriter* writer = ExpectWriter(); | |
369 writer->ExpectWriteInfoOk(response_size, false); | |
370 writer->ExpectWriteDataOk(data1.size(), true); | |
371 writer->ExpectWriteDataOk(data2.size(), true); | |
372 | |
373 net::Error error = WriteHeaders(response_size); | |
374 EXPECT_EQ(net::OK, error); | |
375 | |
376 error = WriteData(data1); | |
377 EXPECT_EQ(net::ERR_IO_PENDING, error); | |
378 writer->CompletePendingWrite(); | |
379 EXPECT_TRUE(write_complete_); | |
380 | |
381 write_complete_ = false; | |
382 error = WriteData(data2); | |
383 EXPECT_EQ(net::ERR_IO_PENDING, error); | |
384 writer->CompletePendingWrite(); | |
385 EXPECT_TRUE(write_complete_); | |
386 EXPECT_TRUE(writer->AllExpectedWritesDone()); | |
387 } | |
388 | |
389 TEST_F(ServiceWorkerCacheWriterTest, CompareHeadersSync) { | |
falken
2015/08/28 05:45:24
It's a little magical to me how we seemed to switc
Elly Fong-Jones
2015/08/31 15:03:46
Done.
| |
390 size_t response_size = 3; | |
391 MockServiceWorkerResponseWriter* writer = ExpectWriter(); | |
392 MockServiceWorkerResponseReader* reader = ExpectReader(); | |
393 | |
394 reader->ExpectReadInfoOk(response_size, false); | |
395 | |
396 net::Error error = WriteHeaders(response_size); | |
397 EXPECT_EQ(net::OK, error); | |
398 EXPECT_TRUE(writer->AllExpectedWritesDone()); | |
399 EXPECT_TRUE(reader->AllExpectedReadsDone()); | |
400 } | |
401 | |
402 TEST_F(ServiceWorkerCacheWriterTest, CompareDataOkSync) { | |
403 const std::string data1 = "abcdef"; | |
404 size_t response_size = data1.size(); | |
405 | |
406 MockServiceWorkerResponseWriter* writer = ExpectWriter(); | |
407 MockServiceWorkerResponseReader* reader = ExpectReader(); | |
408 | |
409 reader->ExpectReadInfoOk(response_size, false); | |
410 reader->ExpectReadDataOk(data1, false); | |
411 | |
412 net::Error error = WriteHeaders(response_size); | |
413 EXPECT_EQ(net::OK, error); | |
414 | |
415 error = WriteData(data1); | |
416 EXPECT_EQ(net::OK, error); | |
417 | |
418 EXPECT_TRUE(writer->AllExpectedWritesDone()); | |
419 EXPECT_TRUE(reader->AllExpectedReadsDone()); | |
420 EXPECT_EQ(0U, cache_writer_->BytesWritten()); | |
421 } | |
422 | |
423 TEST_F(ServiceWorkerCacheWriterTest, CompareShortCacheReads) { | |
424 const size_t kHeaderSize = 16; | |
425 const std::string& data1 = "abcdef"; | |
426 const std::string& cache_data2 = "ghi"; | |
427 const std::string& cache_data3 = "j"; | |
428 const std::string& cache_data4 = "kl"; | |
429 const std::string& net_data2 = "ghijkl"; | |
falken
2015/08/28 05:45:24
Should there be cache_data1 or net_data1?
Elly Fong-Jones
2015/08/31 15:03:45
No; they both use data1 as a shared prefix.
| |
430 const std::string& data5 = "mnopqrst"; | |
431 | |
432 MockServiceWorkerResponseReader* reader = ExpectReader(); | |
433 reader->ExpectReadInfo(kHeaderSize, false, kHeaderSize); | |
434 reader->ExpectReadDataOk(data1, false); | |
435 reader->ExpectReadDataOk(cache_data2, false); | |
436 reader->ExpectReadDataOk(cache_data3, false); | |
437 reader->ExpectReadDataOk(cache_data4, false); | |
438 reader->ExpectReadDataOk(data5, false); | |
439 | |
440 net::Error error = WriteHeaders(kHeaderSize); | |
441 EXPECT_EQ(net::OK, error); | |
442 error = WriteData(data1); | |
443 EXPECT_EQ(net::OK, error); | |
444 error = WriteData(net_data2); | |
445 EXPECT_EQ(net::OK, error); | |
446 error = WriteData(data5); | |
447 EXPECT_EQ(net::OK, error); | |
448 } | |
449 | |
450 TEST_F(ServiceWorkerCacheWriterTest, CompareDataOkAsync) { | |
451 const std::string data1 = "abcdef"; | |
452 size_t response_size = data1.size(); | |
453 | |
454 MockServiceWorkerResponseWriter* writer = ExpectWriter(); | |
455 MockServiceWorkerResponseReader* reader = ExpectReader(); | |
456 | |
457 reader->ExpectReadInfoOk(response_size, true); | |
458 reader->ExpectReadDataOk(data1, true); | |
459 | |
460 net::Error error = WriteHeaders(response_size); | |
461 EXPECT_EQ(net::ERR_IO_PENDING, error); | |
462 reader->CompletePendingRead(); | |
463 | |
464 error = WriteData(data1); | |
465 EXPECT_EQ(net::ERR_IO_PENDING, error); | |
466 reader->CompletePendingRead(); | |
467 | |
468 EXPECT_TRUE(writer->AllExpectedWritesDone()); | |
469 EXPECT_TRUE(reader->AllExpectedReadsDone()); | |
470 } | |
471 | |
472 TEST_F(ServiceWorkerCacheWriterTest, CompareDataManyOkAsync) { | |
473 const std::string expected_data[] = { | |
474 "abcdef", "ghijkl", "mnopqr", "stuvwxyz", | |
475 }; | |
476 size_t response_size = 0; | |
477 for (size_t i = 0; i < arraysize(expected_data); ++i) | |
478 response_size += expected_data[i].size(); | |
479 | |
480 MockServiceWorkerResponseWriter* writer = ExpectWriter(); | |
481 MockServiceWorkerResponseReader* reader = ExpectReader(); | |
482 | |
483 reader->ExpectReadInfoOk(response_size, true); | |
484 for (size_t i = 0; i < arraysize(expected_data); ++i) { | |
485 reader->ExpectReadDataOk(expected_data[i], true); | |
486 } | |
487 | |
488 net::Error error = WriteHeaders(response_size); | |
489 EXPECT_EQ(net::ERR_IO_PENDING, error); | |
490 reader->CompletePendingRead(); | |
491 | |
492 for (size_t i = 0; i < arraysize(expected_data); ++i) { | |
493 error = WriteData(expected_data[i]); | |
494 EXPECT_EQ(net::ERR_IO_PENDING, error); | |
495 reader->CompletePendingRead(); | |
496 EXPECT_EQ(net::OK, last_error_); | |
497 } | |
498 | |
499 EXPECT_TRUE(writer->AllExpectedWritesDone()); | |
500 EXPECT_TRUE(reader->AllExpectedReadsDone()); | |
501 } | |
502 | |
503 // This test writes headers and three data blocks data1, data2, data3; data2 | |
504 // differs in the cached version. The writer should be asked to rewrite the | |
505 // headers and body with the new value, and the copy reader should be asked to | |
506 // read the header and data1. | |
507 TEST_F(ServiceWorkerCacheWriterTest, CompareFailedCopySync) { | |
508 std::string data1 = "abcdef"; | |
509 std::string cache_data2 = "ghijkl"; | |
510 std::string net_data2 = "mnopqr"; | |
511 std::string data3 = "stuvwxyz"; | |
512 size_t cache_response_size = data1.size() + cache_data2.size() + data3.size(); | |
513 size_t net_response_size = data1.size() + net_data2.size() + data3.size(); | |
514 | |
515 MockServiceWorkerResponseWriter* writer = ExpectWriter(); | |
516 MockServiceWorkerResponseReader* compare_reader = ExpectReader(); | |
517 MockServiceWorkerResponseReader* copy_reader = ExpectReader(); | |
518 | |
519 compare_reader->ExpectReadInfoOk(cache_response_size, false); | |
520 compare_reader->ExpectReadDataOk(data1, false); | |
521 compare_reader->ExpectReadDataOk(cache_data2, false); | |
522 | |
523 copy_reader->ExpectReadInfoOk(cache_response_size, false); | |
524 copy_reader->ExpectReadDataOk(data1, false); | |
525 | |
526 writer->ExpectWriteInfoOk(net_response_size, false); | |
527 writer->ExpectWriteDataOk(data1.size(), false); | |
528 writer->ExpectWriteDataOk(net_data2.size(), false); | |
529 writer->ExpectWriteDataOk(data3.size(), false); | |
530 | |
531 net::Error error = WriteHeaders(net_response_size); | |
532 EXPECT_EQ(net::OK, error); | |
533 error = WriteData(data1); | |
534 EXPECT_EQ(net::OK, error); | |
535 error = WriteData(net_data2); | |
536 EXPECT_EQ(net::OK, error); | |
537 error = WriteData(data3); | |
538 EXPECT_EQ(net::OK, error); | |
539 } | |
540 | |
541 // Tests behavior when the cached data is shorter than the network data. | |
542 TEST_F(ServiceWorkerCacheWriterTest, CompareFailedCopyShort) { | |
543 std::string data1 = "abcdef"; | |
544 std::string cache_data2 = "mnop"; | |
545 std::string net_data2 = "mnopqr"; | |
546 std::string data3 = "stuvwxyz"; | |
547 size_t cache_response_size = data1.size() + cache_data2.size() + data3.size(); | |
548 size_t net_response_size = data1.size() + net_data2.size() + data3.size(); | |
549 | |
550 MockServiceWorkerResponseWriter* writer = ExpectWriter(); | |
551 MockServiceWorkerResponseReader* compare_reader = ExpectReader(); | |
552 MockServiceWorkerResponseReader* copy_reader = ExpectReader(); | |
553 | |
554 compare_reader->ExpectReadInfoOk(cache_response_size, false); | |
555 compare_reader->ExpectReadDataOk(data1, false); | |
556 compare_reader->ExpectReadDataOk(cache_data2, false); | |
557 compare_reader->ExpectReadDataOk("", false); // EOF read | |
558 | |
559 copy_reader->ExpectReadInfoOk(cache_response_size, false); | |
560 copy_reader->ExpectReadDataOk(data1, false); | |
561 | |
562 writer->ExpectWriteInfoOk(net_response_size, false); | |
563 writer->ExpectWriteDataOk(data1.size(), false); | |
564 writer->ExpectWriteDataOk(net_data2.size(), false); | |
565 writer->ExpectWriteDataOk(data3.size(), false); | |
566 | |
567 net::Error error = WriteHeaders(net_response_size); | |
568 EXPECT_EQ(net::OK, error); | |
569 error = WriteData(data1); | |
570 EXPECT_EQ(net::OK, error); | |
571 error = WriteData(net_data2); | |
572 EXPECT_EQ(net::OK, error); | |
573 error = WriteData(data3); | |
574 EXPECT_EQ(net::OK, error); | |
575 } | |
576 | |
577 // Tests behavior when the cached data is longer than the network data. | |
578 TEST_F(ServiceWorkerCacheWriterTest, CompareFailedCopyLong) { | |
579 std::string data1 = "abcdef"; | |
580 std::string cache_data2 = "mnop"; | |
581 std::string net_data2 = "mnop"; | |
582 std::string cache_data3 = "qr"; | |
583 size_t cached_size = data1.size() + cache_data2.size() + cache_data3.size(); | |
584 size_t net_size = data1.size() + net_data2.size(); | |
585 | |
586 MockServiceWorkerResponseWriter* writer = ExpectWriter(); | |
587 MockServiceWorkerResponseReader* compare_reader = ExpectReader(); | |
588 MockServiceWorkerResponseReader* copy_reader = ExpectReader(); | |
589 | |
590 compare_reader->ExpectReadInfoOk(cached_size, false); | |
591 compare_reader->ExpectReadDataOk(data1, false); | |
592 compare_reader->ExpectReadDataOk(cache_data2, false); | |
593 | |
594 copy_reader->ExpectReadInfoOk(cached_size, false); | |
595 copy_reader->ExpectReadDataOk(data1, false); | |
596 copy_reader->ExpectReadDataOk(cache_data2, false); | |
597 | |
598 writer->ExpectWriteInfoOk(net_size, false); | |
599 writer->ExpectWriteDataOk(data1.size(), false); | |
600 writer->ExpectWriteDataOk(net_data2.size(), false); | |
601 | |
602 net::Error error = WriteHeaders(net_size); | |
603 EXPECT_EQ(net::OK, error); | |
604 error = WriteData(data1); | |
605 EXPECT_EQ(net::OK, error); | |
606 error = WriteData(net_data2); | |
607 EXPECT_EQ(net::OK, error); | |
608 } | |
609 | |
610 } // namespace | |
611 } // namespace content | |
OLD | NEW |