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

Side by Side Diff: net/http/http_cache_writers_unittest.cc

Issue 2886483002: Adds a new class HttpCache::Writers for multiple cache transactions reading from the network. (Closed)
Patch Set: Feedback addressed Created 3 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
« no previous file with comments | « net/http/http_cache_writers.cc ('k') | net/http/http_transaction_test_util.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2017 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 "net/http/http_cache_writers.h"
6
7 #include <memory>
8 #include <string>
9 #include <vector>
10
11 #include "base/run_loop.h"
12 #include "net/http/http_cache.h"
13 #include "net/http/http_cache_transaction.h"
14 #include "net/http/http_transaction.h"
15 #include "net/http/http_transaction_test_util.h"
16 #include "net/http/mock_http_cache.h"
17 #include "net/test/gtest_util.h"
18 #include "testing/gmock/include/gmock/gmock.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20
21 using net::test::IsError;
22 using net::test::IsOk;
23
24 namespace net {
25
26 class MockHttpCacheTransaction : public HttpCache::Transaction {
27 typedef WebSocketHandshakeStreamBase::CreateHelper CreateHelper;
28
29 public:
30 MockHttpCacheTransaction(RequestPriority priority, HttpCache* cache)
31 : HttpCache::Transaction(priority, cache){};
32 ~MockHttpCacheTransaction() override{};
33
34 // HttpCache::Transaction:
35
36 int Start(const HttpRequestInfo* request,
37 const CompletionCallback& callback,
38 const NetLogWithSource& net_log) override {
39 return OK;
40 }
41
42 int RestartIgnoringLastError(const CompletionCallback& callback) override {
43 return OK;
44 }
45
46 int RestartWithCertificate(scoped_refptr<X509Certificate> client_cert,
47 scoped_refptr<SSLPrivateKey> client_private_key,
48 const CompletionCallback& callback) override {
49 return OK;
50 }
51
52 int RestartWithAuth(const AuthCredentials& credentials,
53 const CompletionCallback& callback) override {
54 return OK;
55 }
56
57 bool IsReadyToRestartForAuth() override { return true; }
58
59 int Read(IOBuffer* buf,
60 int buf_len,
61 const CompletionCallback& callback) override {
62 return OK;
63 }
64
65 void PopulateNetErrorDetails(NetErrorDetails* details) const override {}
66
67 void StopCaching() override {}
68
69 bool GetFullRequestHeaders(HttpRequestHeaders* headers) const override {
70 return true;
71 }
72
73 int64_t GetTotalReceivedBytes() const override { return OK; }
74
75 int64_t GetTotalSentBytes() const override { return OK; }
76
77 void DoneReading() override {}
78
79 const HttpResponseInfo* GetResponseInfo() const override { return nullptr; }
80
81 LoadState GetLoadState() const override { return LOAD_STATE_IDLE; }
82
83 void SetQuicServerInfo(QuicServerInfo* quic_server_info) override {}
84
85 bool GetLoadTimingInfo(LoadTimingInfo* load_timing_info) const override {
86 return true;
87 }
88
89 bool GetRemoteEndpoint(IPEndPoint* endpoint) const override { return true; }
90
91 void SetWebSocketHandshakeStreamCreateHelper(
92 CreateHelper* create_helper) override {}
93
94 void SetBeforeNetworkStartCallback(
95 const BeforeNetworkStartCallback& callback) override {}
96
97 void SetBeforeHeadersSentCallback(
98 const BeforeHeadersSentCallback& callback) override {}
99
100 int ResumeNetworkStart() override { return OK; }
101
102 void GetConnectionAttempts(ConnectionAttempts* out) const override {}
103
104 CreateHelper* websocket_handshake_stream_create_helper() { return nullptr; }
105 };
106
107 class WritersTest : public testing::Test {
108 public:
109 enum class DeleteTransactionType { NONE, ACTIVE, WAITING, IDLE };
110
111 WritersTest() : disk_entry_(nullptr), request_(kSimpleGET_Transaction) {}
112
113 ~WritersTest() override {
114 if (disk_entry_)
115 disk_entry_->Close();
116 }
117
118 void CreateWriters(const std::string& url) {
119 cache_.CreateBackendEntry(kSimpleGET_Transaction.url, &disk_entry_,
120 nullptr);
121 writers_ = base::MakeUnique<HttpCache::Writers>(disk_entry_);
122 }
123
124 std::unique_ptr<HttpTransaction> CreateNetworkTransaction() {
125 std::unique_ptr<HttpTransaction> transaction;
126 MockNetworkLayer* network_layer = cache_.network_layer();
127 network_layer->CreateTransaction(DEFAULT_PRIORITY, &transaction);
128 return transaction;
129 }
130
131 void CreateWritersAddTransaction(bool is_exclusive = false) {
132 TestCompletionCallback callback;
133
134 // Create and Start a mock network transaction.
135 std::unique_ptr<HttpTransaction> network_transaction;
136 network_transaction = CreateNetworkTransaction();
137 network_transaction->Start(&request_, callback.callback(),
138 NetLogWithSource());
139 base::RunLoop().RunUntilIdle();
140
141 // Create a mock cache transaction.
142 std::unique_ptr<MockHttpCacheTransaction> transaction =
143 base::MakeUnique<MockHttpCacheTransaction>(DEFAULT_PRIORITY,
144 cache_.http_cache());
145
146 CreateWriters(kSimpleGET_Transaction.url);
147 EXPECT_TRUE(writers_->IsEmpty());
148 writers_->AddTransaction(transaction.get(), std::move(network_transaction),
149 is_exclusive);
150 EXPECT_TRUE(writers_->HasTransaction(transaction.get()));
151 transactions_.push_back(std::move(transaction));
152 }
153
154 void CreateWritersAddTransactionPriority(net::RequestPriority priority,
155 bool is_exclusive = false) {
156 CreateWritersAddTransaction(is_exclusive);
157 MockHttpCacheTransaction* transaction = transactions_.begin()->get();
158 transaction->SetPriority(priority);
159 }
160
161 void AddTransactionToExistingWriters() {
162 EXPECT_TRUE(writers_);
163
164 // Create a mock cache transaction.
165 std::unique_ptr<MockHttpCacheTransaction> transaction =
166 base::MakeUnique<MockHttpCacheTransaction>(DEFAULT_PRIORITY,
167 cache_.http_cache());
168
169 writers_->AddTransaction(transaction.get(), nullptr, false);
170 transactions_.push_back(std::move(transaction));
171 }
172
173 int Read(std::string* result) {
174 EXPECT_TRUE(transactions_.size() >= (size_t)1);
175 MockHttpCacheTransaction* transaction = transactions_.begin()->get();
176 TestCompletionCallback callback;
177
178 std::string content;
179 int rv = 0;
180 do {
181 scoped_refptr<IOBuffer> buf(new IOBuffer(kDefaultBufferSize));
182 rv = writers_->Read(buf.get(), kDefaultBufferSize, callback.callback(),
183 transaction);
184 if (rv == ERR_IO_PENDING) {
185 rv = callback.WaitForResult();
186 base::RunLoop().RunUntilIdle();
187 }
188
189 if (rv > 0)
190 content.append(buf->data(), rv);
191 else if (rv < 0)
192 return rv;
193 } while (rv > 0);
194
195 result->swap(content);
196 return OK;
197 }
198
199 void ReadVerifyTwoDifferentBufferLengths(
200 const std::vector<int>& buffer_lengths) {
201 EXPECT_EQ(2u, buffer_lengths.size());
202 EXPECT_EQ(2u, transactions_.size());
203
204 std::vector<std::string> results(buffer_lengths.size());
205
206 // Check only the 1st Read and not the complete response because the smaller
207 // buffer transaction will need to read the remaining response from the
208 // cache which will be tested when integrated with MockHttpCacheTransaction
209 // layer.
210
211 int rv = 0;
212
213 std::vector<scoped_refptr<IOBuffer>> bufs;
214 for (auto buffer_length : buffer_lengths)
215 bufs.push_back(new IOBuffer(buffer_length));
216
217 std::vector<TestCompletionCallback> callbacks(buffer_lengths.size());
218
219 // Multiple transactions should be able to read with different sized
220 // buffers.
221 for (size_t i = 0; i < transactions_.size(); i++) {
222 rv = writers_->Read(bufs[i].get(), buffer_lengths[i],
223 callbacks[i].callback(), transactions_[i].get());
224 EXPECT_EQ(ERR_IO_PENDING, rv); // Since the default is asynchronous.
225 }
226
227 // If first buffer is smaller, then the second one will only read the
228 // smaller length as well.
229 std::vector<int> expected_lengths = {buffer_lengths[0],
230 buffer_lengths[0] < buffer_lengths[1]
231 ? buffer_lengths[0]
232 : buffer_lengths[1]};
233
234 for (size_t i = 0; i < callbacks.size(); i++) {
235 rv = callbacks[i].WaitForResult();
236 EXPECT_EQ(expected_lengths[i], rv);
237 results[i].append(bufs[i]->data(), expected_lengths[i]);
238 }
239
240 EXPECT_EQ(results[0].substr(0, expected_lengths[1]), results[1]);
241
242 std::string expected(kSimpleGET_Transaction.data);
243 EXPECT_EQ(expected.substr(0, expected_lengths[1]), results[1]);
244 }
245
246 // Verifies the impact of an active/waiting/idle transaction's deletion on
247 // other transactions given by deleteType. If deleteType is NONE, then no
248 // transaction is deleted and all transactions complete reading the data.
jkarlin 2017/07/14 18:30:48 This comment doesn't describe the main intent, whi
shivanisha 2017/07/14 20:50:27 done
249 void ReadAllDeleteTransaction(DeleteTransactionType deleteType) {
250 EXPECT_TRUE(transactions_.size() >= 3u);
251
252 unsigned int delete_index = std::numeric_limits<unsigned int>::max();
253 switch (deleteType) {
254 case DeleteTransactionType::NONE:
255 break;
256 case DeleteTransactionType::ACTIVE:
257 delete_index = 0;
258 break;
259 case DeleteTransactionType::WAITING:
260 delete_index = 1;
261 break;
262 case DeleteTransactionType::IDLE:
263 delete_index = 2;
264 break;
265 }
266
267 std::vector<std::string> results(transactions_.size());
268 int rv = 0;
269 bool first_iter = true;
270 do {
271 std::vector<scoped_refptr<IOBuffer>> bufs;
272 std::vector<TestCompletionCallback> callbacks(transactions_.size());
273
274 for (size_t i = 0; i < transactions_.size(); i++) {
275 bufs.push_back(new IOBuffer(kDefaultBufferSize));
276
277 // If we have deleted a transaction in the first iteration, then do not
278 // invoke Read on it, in subsequent iterations.
279 if (!first_iter && deleteType != DeleteTransactionType::NONE &&
280 i == delete_index)
281 continue;
282
283 // For it to be an idle transaction, do not invoke Read.
284 if (deleteType == DeleteTransactionType::IDLE && i == delete_index)
285 continue;
286
287 rv = writers_->Read(bufs[i].get(), kDefaultBufferSize,
288 callbacks[i].callback(), transactions_[i].get());
289 EXPECT_EQ(ERR_IO_PENDING, rv); // Since the default is asynchronous.
290 }
291
292 if (first_iter && deleteType != DeleteTransactionType::NONE) {
293 writers_->RemoveTransaction(transactions_.at(delete_index).get());
294 }
295
296 std::vector<int> rvs;
297 for (size_t i = 0; i < callbacks.size(); i++) {
298 if (i == delete_index && deleteType != DeleteTransactionType::NONE)
299 continue;
300 rv = callbacks[i].WaitForResult();
301 rvs.push_back(rv);
302 }
303
304 // Verify all transactions should read the same length buffer.
305 for (size_t i = 1; i < rvs.size(); i++) {
306 ASSERT_EQ(rvs[i - 1], rvs[i]);
307 }
308
309 if (rv > 0) {
310 for (size_t i = 0; i < results.size(); i++) {
311 if (i == delete_index && deleteType != DeleteTransactionType::NONE &&
312 deleteType != DeleteTransactionType::ACTIVE) {
313 continue;
314 }
315 results.at(i).append(bufs[i]->data(), rv);
316 }
317 }
318 first_iter = false;
319 } while (rv > 0);
320
321 for (size_t i = 0; i < results.size(); i++) {
322 if (i == delete_index && deleteType != DeleteTransactionType::NONE &&
323 deleteType != DeleteTransactionType::ACTIVE) {
324 continue;
325 }
326 EXPECT_EQ(kSimpleGET_Transaction.data, results[i]);
327 }
328
329 EXPECT_EQ(OK, rv);
330 }
331
332 void ReadAll() { ReadAllDeleteTransaction(DeleteTransactionType::NONE); }
333
334 int ReadCacheWriteFailure(std::vector<std::string>* results) {
335 int rv = 0;
336 int active_transaction_rv = 0;
337 bool first_iter = true;
338 do {
339 std::vector<scoped_refptr<IOBuffer>> bufs;
340 std::vector<TestCompletionCallback> callbacks(results->size());
341
342 // Fail the request.
343 cache_.disk_cache()->set_soft_failures(true);
344
345 // We have to open the entry again to propagate the failure flag.
346 disk_cache::Entry* en;
347 cache_.OpenBackendEntry(kSimpleGET_Transaction.url, &en);
348 en->Close();
349
350 for (size_t i = 0; i < transactions_.size(); i++) {
351 bufs.push_back(new IOBuffer(30));
352
353 if (!first_iter && i > 0)
354 break;
355 rv = writers_->Read(bufs[i].get(), 30, callbacks[i].callback(),
356 transactions_[i].get());
357 EXPECT_EQ(ERR_IO_PENDING, rv); // Since the default is asynchronous.
358 }
359
360 for (size_t i = 0; i < callbacks.size(); i++) {
361 // Only active transaction should succeed.
362 if (i == 0) {
363 active_transaction_rv = callbacks[i].WaitForResult();
364 EXPECT_TRUE(active_transaction_rv >= 0);
365 results->at(0).append(bufs[i]->data(), active_transaction_rv);
366 } else if (first_iter) {
367 rv = callbacks[i].WaitForResult();
368 EXPECT_EQ(ERR_CACHE_WRITE_FAILURE, rv);
369 }
370 }
371
372 first_iter = false;
373 } while (active_transaction_rv > 0);
374
375 return active_transaction_rv;
376 }
377
378 int ReadNetworkFailure(std::vector<std::string>* results, Error error) {
379 int rv = 0;
380 std::vector<scoped_refptr<IOBuffer>> bufs;
381 std::vector<TestCompletionCallback> callbacks(results->size());
382
383 for (size_t i = 0; i < transactions_.size(); i++) {
384 bufs.push_back(new IOBuffer(30));
385
386 rv = writers_->Read(bufs[i].get(), 30, callbacks[i].callback(),
387 transactions_[i].get());
388 EXPECT_EQ(ERR_IO_PENDING, rv); // Since the default is asynchronous.
389 }
390
391 for (auto& callback : callbacks) {
392 rv = callback.WaitForResult();
393 EXPECT_EQ(error, rv);
394 }
395
396 return error;
397 }
398
399 bool StopCaching() {
400 MockHttpCacheTransaction* transaction = transactions_.begin()->get();
401 EXPECT_TRUE(transaction);
402 return writers_->StopCaching(transaction);
403 }
404
405 void RemoveFirstTransaction() {
406 MockHttpCacheTransaction* transaction = transactions_.begin()->get();
407 EXPECT_TRUE(transaction);
408 writers_->RemoveTransaction(transaction);
409 }
410
411 void UpdateAndVerifyPriority(RequestPriority priority) {
412 writers_->UpdatePriority();
413 EXPECT_EQ(priority, writers_->priority_);
414 }
415
416 MockHttpCache cache_;
417 std::unique_ptr<HttpCache::Writers> writers_;
418 disk_cache::Entry* disk_entry_;
419
420 // Should be before transactions_ since it is accessed in the network
421 // transaction's destructor.
422 MockHttpRequest request_;
423
424 static const int kDefaultBufferSize = 256;
425
426 std::vector<std::unique_ptr<MockHttpCacheTransaction>> transactions_;
427 };
428
429 // Tests successful addition of a transaction.
430 TEST_F(WritersTest, AddTransaction) {
431 CreateWritersAddTransaction();
432 EXPECT_FALSE(writers_->IsEmpty());
433 }
434
435 // Tests successful addition of multiple transactions.
436 TEST_F(WritersTest, AddManyTransactions) {
437 CreateWritersAddTransaction();
438 EXPECT_FALSE(writers_->IsEmpty());
439
440 for (int i = 0; i < 5; i++)
441 AddTransactionToExistingWriters();
442
443 EXPECT_EQ(6, writers_->CountTransactionsForTesting());
444 }
445
446 // Tests that CanAddWriters should return false if it is writing exclusively.
447 TEST_F(WritersTest, AddTransactionsExclusive) {
448 CreateWritersAddTransaction(true /* is_exclusive */);
449 EXPECT_FALSE(writers_->IsEmpty());
450
451 EXPECT_FALSE(writers_->CanAddWriters());
452 }
453
454 // Tests StopCaching should not stop caching if there are multiple writers.
455 TEST_F(WritersTest, StopCachingMultipleWriters) {
456 CreateWritersAddTransaction();
457 EXPECT_FALSE(writers_->IsEmpty());
458
459 EXPECT_TRUE(writers_->CanAddWriters());
460 AddTransactionToExistingWriters();
461
462 EXPECT_FALSE(StopCaching());
463 EXPECT_TRUE(writers_->CanAddWriters());
464 }
465
466 // Tests StopCaching should stop caching if there is a single writer.
467 TEST_F(WritersTest, StopCaching) {
468 CreateWritersAddTransaction();
469 EXPECT_FALSE(writers_->IsEmpty());
470
471 EXPECT_TRUE(StopCaching());
472 EXPECT_FALSE(writers_->CanAddWriters());
473 }
474
475 // Tests removing of an idle transaction and change in priority.
476 TEST_F(WritersTest, RemoveIdleTransaction) {
477 CreateWritersAddTransactionPriority(HIGHEST);
478 UpdateAndVerifyPriority(HIGHEST);
479
480 AddTransactionToExistingWriters();
481 UpdateAndVerifyPriority(HIGHEST);
482
483 EXPECT_FALSE(writers_->IsEmpty());
484 EXPECT_EQ(2, writers_->CountTransactionsForTesting());
485
486 RemoveFirstTransaction();
487 EXPECT_EQ(1, writers_->CountTransactionsForTesting());
488
489 UpdateAndVerifyPriority(DEFAULT_PRIORITY);
490 }
491
492 // Tests that Read is successful.
493 TEST_F(WritersTest, Read) {
494 CreateWritersAddTransaction();
495 EXPECT_FALSE(writers_->IsEmpty());
496
497 std::string content;
498 int rv = Read(&content);
499
500 EXPECT_THAT(rv, IsOk());
501 std::string expected(kSimpleGET_Transaction.data);
502 EXPECT_EQ(expected, content);
503 }
504
505 // Tests that multiple transactions can read the same data simultaneously.
506 TEST_F(WritersTest, ReadMultiple) {
507 CreateWritersAddTransaction();
508 EXPECT_FALSE(writers_->IsEmpty());
509
510 EXPECT_TRUE(writers_->CanAddWriters());
511 AddTransactionToExistingWriters();
512 AddTransactionToExistingWriters();
513
514 ReadAll();
515 }
516
517 // Tests that multiple transactions can read the same data simultaneously.
518 TEST_F(WritersTest, ReadMultipleDifferentBufferSizes) {
519 CreateWritersAddTransaction();
520 EXPECT_FALSE(writers_->IsEmpty());
521
522 EXPECT_TRUE(writers_->CanAddWriters());
523 AddTransactionToExistingWriters();
524
525 std::vector<int> buffer_lengths{20, 10};
526 ReadVerifyTwoDifferentBufferLengths(buffer_lengths);
527 }
528
529 // Same as above but tests the first transaction having smaller buffer size
530 // than the next.
531 TEST_F(WritersTest, ReadMultipleDifferentBufferSizes1) {
532 CreateWritersAddTransaction();
533 EXPECT_FALSE(writers_->IsEmpty());
534
535 EXPECT_TRUE(writers_->CanAddWriters());
536 AddTransactionToExistingWriters();
537
538 std::vector<int> buffer_lengths{10, 20};
539 ReadVerifyTwoDifferentBufferLengths(buffer_lengths);
540 }
541
542 // Tests that ongoing Read completes even when active transaction is deleted
543 // mid-read. Any transactions waiting should be able to get the read buffer.
544 TEST_F(WritersTest, ReadMultipleDeleteActiveTransaction) {
545 CreateWritersAddTransaction();
546 EXPECT_FALSE(writers_->IsEmpty());
547
548 EXPECT_TRUE(writers_->CanAddWriters());
549 AddTransactionToExistingWriters();
550 AddTransactionToExistingWriters();
551
552 ReadAllDeleteTransaction(DeleteTransactionType::ACTIVE);
553 }
554
555 // Tests that removing a waiting for read transaction does not impact other
556 // transactions.
557 TEST_F(WritersTest, ReadMultipleDeleteWaitingTransaction) {
558 CreateWritersAddTransaction();
559 EXPECT_FALSE(writers_->IsEmpty());
560
561 EXPECT_TRUE(writers_->CanAddWriters());
562 AddTransactionToExistingWriters();
563 AddTransactionToExistingWriters();
564 AddTransactionToExistingWriters();
565
566 std::vector<std::string> contents(4);
567 ReadAllDeleteTransaction(DeleteTransactionType::WAITING);
568 }
569
570 // Tests that removing an idle transaction does not impact other transactions.
571 TEST_F(WritersTest, ReadMultipleDeleteIdleTransaction) {
572 CreateWritersAddTransaction();
573 EXPECT_FALSE(writers_->IsEmpty());
574
575 EXPECT_TRUE(writers_->CanAddWriters());
576 AddTransactionToExistingWriters();
577 AddTransactionToExistingWriters();
578
579 std::vector<std::string> contents(3);
580 ReadAllDeleteTransaction(DeleteTransactionType::IDLE);
581 }
582
583 // Tests cache write failure.
584 TEST_F(WritersTest, ReadMultipleCacheWriteFailed) {
585 CreateWritersAddTransaction();
586 EXPECT_FALSE(writers_->IsEmpty());
587
588 EXPECT_TRUE(writers_->CanAddWriters());
589 AddTransactionToExistingWriters();
590 AddTransactionToExistingWriters();
591
592 std::vector<std::string> contents(3);
593 int rv = ReadCacheWriteFailure(&contents);
594
595 EXPECT_THAT(rv, IsOk());
596 std::string expected(kSimpleGET_Transaction.data);
597
598 // Only active_transaction_ should succeed.
599 EXPECT_EQ(expected, contents.at(0));
600
601 // No new transactions should now be added.
602 EXPECT_FALSE(writers_->CanAddWriters());
603 }
604
605 // Tests that network read failure fails all transactions: active, waiting and
606 // idle.
607 TEST_F(WritersTest, ReadMultipleNetworkReadFailed) {
608 ScopedMockTransaction transaction(kSimpleGET_Transaction);
609 transaction.read_return_code = ERR_INTERNET_DISCONNECTED;
610 MockHttpRequest request(transaction);
611 request_ = request;
612
613 CreateWritersAddTransaction();
614 EXPECT_FALSE(writers_->IsEmpty());
615
616 EXPECT_TRUE(writers_->CanAddWriters());
617 AddTransactionToExistingWriters();
618 AddTransactionToExistingWriters();
619
620 std::vector<std::string> contents(3);
621 int rv = ReadNetworkFailure(&contents, ERR_INTERNET_DISCONNECTED);
622
623 EXPECT_EQ(ERR_INTERNET_DISCONNECTED, rv);
624 }
625
626 // Tests moving idle writers to readers.
627 TEST_F(WritersTest, MoveIdleWritersToReaders) {
628 CreateWritersAddTransaction();
629 EXPECT_FALSE(writers_->IsEmpty());
630
631 EXPECT_TRUE(writers_->CanAddWriters());
632 AddTransactionToExistingWriters();
633 AddTransactionToExistingWriters();
634
635 EXPECT_FALSE(writers_->IsEmpty());
636 writers_->RemoveAllIdleWriters();
637 EXPECT_TRUE(writers_->IsEmpty());
638 }
639
640 // Tests GetWriterLoadState.
641 TEST_F(WritersTest, GetWriterLoadState) {
642 CreateWritersAddTransaction();
643 EXPECT_FALSE(writers_->IsEmpty());
644
645 EXPECT_EQ(LOAD_STATE_IDLE, writers_->GetWriterLoadState());
646 }
647
648 // Tests truncating the entry via Writers.
649 TEST_F(WritersTest, TruncateEntry) {
650 CreateWritersAddTransaction();
651 EXPECT_FALSE(writers_->IsEmpty());
652
653 std::string content;
654 int rv = Read(&content);
655
656 EXPECT_THAT(rv, IsOk());
657 std::string expected(kSimpleGET_Transaction.data);
658 EXPECT_EQ(expected, content);
659
660 writers_->TruncateEntry();
661 base::RunLoop().RunUntilIdle();
662 EXPECT_TRUE(writers_->IsTruncatedForTesting());
663 }
664
665 } // namespace net
OLDNEW
« no previous file with comments | « net/http/http_cache_writers.cc ('k') | net/http/http_transaction_test_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698