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

Side by Side Diff: content/browser/service_worker/service_worker_cache_writer_unittest.cc

Issue 1315443003: ServiceWorkerWriteToCacheJob: refactor (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: first draft Created 5 years, 4 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 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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698