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

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

Issue 2526983002: Refactor ResourceHandler API. (Closed)
Patch Set: Fix merge again (?) Created 4 years 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
1 // Copyright 2016 The Chromium Authors. All rights reserved. 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 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/mock_resource_loader.h" 5 #include "content/browser/loader/mock_resource_loader.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "base/memory/ptr_util.h" 9 #include "base/memory/ptr_util.h"
10 #include "base/memory/ref_counted.h" 10 #include "base/memory/ref_counted.h"
11 #include "content/browser/loader/resource_controller.h" 11 #include "content/browser/loader/resource_controller.h"
12 #include "content/browser/loader/resource_handler.h"
13 #include "net/base/io_buffer.h" 12 #include "net/base/io_buffer.h"
14 #include "net/url_request/url_request_status.h" 13 #include "net/url_request/url_request_status.h"
15 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
16 15
17 namespace content { 16 namespace content {
18 17
18 class MockResourceLoader::TestResourceController : public ResourceController {
19 public:
20 explicit TestResourceController(base::WeakPtr<MockResourceLoader> mock_loader)
21 : mock_loader_(mock_loader) {}
22 ~TestResourceController() override {}
23
24 void Resume() override { mock_loader_->OnResume(); }
25
26 void Cancel() override { CancelWithError(net::ERR_ABORTED); }
27
28 void CancelAndIgnore() override {
29 ADD_FAILURE() << "Unexpected CancelAndIgnore call.";
30 Cancel();
31 }
32
33 void CancelWithError(int error_code) override {
34 mock_loader_->OnCancel(error_code);
35 }
36
37 base::WeakPtr<MockResourceLoader> mock_loader_;
38 };
39
19 MockResourceLoader::MockResourceLoader(ResourceHandler* resource_handler) 40 MockResourceLoader::MockResourceLoader(ResourceHandler* resource_handler)
20 : resource_handler_(resource_handler) { 41 : resource_handler_(resource_handler), weak_factory_(this) {
21 resource_handler_->SetController(this); 42 resource_handler_->SetDelegate(this);
22 } 43 }
23 44
24 MockResourceLoader::~MockResourceLoader() {} 45 MockResourceLoader::~MockResourceLoader() {}
25 46
26 MockResourceLoader::Status MockResourceLoader::OnWillStart(const GURL& url) { 47 MockResourceLoader::Status MockResourceLoader::OnWillStart(const GURL& url) {
48 EXPECT_FALSE(weak_factory_.HasWeakPtrs());
27 EXPECT_EQ(Status::IDLE, status_); 49 EXPECT_EQ(Status::IDLE, status_);
50
28 status_ = Status::CALLING_HANDLER; 51 status_ = Status::CALLING_HANDLER;
29 52 resource_handler_->OnWillStart(url, base::MakeUnique<TestResourceController>(
30 bool defer = false; 53 weak_factory_.GetWeakPtr()));
31 bool result = resource_handler_->OnWillStart(url, &defer); 54 if (status_ == Status::CALLING_HANDLER)
32 // The second case isn't really allowed, but a number of classes do it
33 // anyways.
34 EXPECT_TRUE(status_ == Status::CALLING_HANDLER ||
35 (result == false && status_ == Status::CANCELED));
36 if (!result) {
37 status_ = Status::CANCELED;
38 } else if (defer) {
39 status_ = Status::CALLBACK_PENDING; 55 status_ = Status::CALLBACK_PENDING;
40 } else {
41 status_ = Status::IDLE;
42 }
43 return status_; 56 return status_;
44 } 57 }
45 58
46 MockResourceLoader::Status MockResourceLoader::OnRequestRedirected( 59 MockResourceLoader::Status MockResourceLoader::OnRequestRedirected(
47 const net::RedirectInfo& redirect_info, 60 const net::RedirectInfo& redirect_info,
48 ResourceResponse* response) { 61 ResourceResponse* response) {
62 EXPECT_FALSE(weak_factory_.HasWeakPtrs());
49 EXPECT_EQ(Status::IDLE, status_); 63 EXPECT_EQ(Status::IDLE, status_);
64
50 status_ = Status::CALLING_HANDLER; 65 status_ = Status::CALLING_HANDLER;
51 66 resource_handler_->OnRequestRedirected(
52 bool defer = false; 67 redirect_info, response,
53 bool result = 68 base::MakeUnique<TestResourceController>(weak_factory_.GetWeakPtr()));
54 resource_handler_->OnRequestRedirected(redirect_info, response, &defer); 69 if (status_ == Status::CALLING_HANDLER)
55 // The second case isn't really allowed, but a number of classes do it
56 // anyways.
57 EXPECT_TRUE(status_ == Status::CALLING_HANDLER ||
58 (result == false && status_ == Status::CANCELED));
59 if (!result) {
60 status_ = Status::CANCELED;
61 } else if (defer) {
62 status_ = Status::CALLBACK_PENDING; 70 status_ = Status::CALLBACK_PENDING;
63 } else {
64 status_ = Status::IDLE;
65 }
66 return status_; 71 return status_;
67 } 72 }
68 73
69 MockResourceLoader::Status MockResourceLoader::OnResponseStarted( 74 MockResourceLoader::Status MockResourceLoader::OnResponseStarted(
70 ResourceResponse* response) { 75 ResourceResponse* response) {
76 EXPECT_FALSE(weak_factory_.HasWeakPtrs());
71 EXPECT_EQ(Status::IDLE, status_); 77 EXPECT_EQ(Status::IDLE, status_);
78
72 status_ = Status::CALLING_HANDLER; 79 status_ = Status::CALLING_HANDLER;
73 80 resource_handler_->OnResponseStarted(
74 bool defer = false; 81 response,
75 bool result = resource_handler_->OnResponseStarted(response, &defer); 82 base::MakeUnique<TestResourceController>(weak_factory_.GetWeakPtr()));
76 // The second case isn't really allowed, but a number of classes do it 83 if (status_ == Status::CALLING_HANDLER)
77 // anyways.
78 EXPECT_TRUE(status_ == Status::CALLING_HANDLER ||
79 (result == false && status_ == Status::CANCELED));
80 if (!result) {
81 status_ = Status::CANCELED;
82 } else if (defer) {
83 status_ = Status::CALLBACK_PENDING; 84 status_ = Status::CALLBACK_PENDING;
84 } else {
85 status_ = Status::IDLE;
86 }
87 return status_; 85 return status_;
88 } 86 }
89 87
90 MockResourceLoader::Status MockResourceLoader::OnWillRead(int min_size) { 88 MockResourceLoader::Status MockResourceLoader::OnWillRead(int min_size) {
89 EXPECT_FALSE(weak_factory_.HasWeakPtrs());
91 EXPECT_EQ(Status::IDLE, status_); 90 EXPECT_EQ(Status::IDLE, status_);
91
92 status_ = Status::CALLING_HANDLER; 92 status_ = Status::CALLING_HANDLER;
93
94 scoped_refptr<net::IOBuffer> buf; 93 scoped_refptr<net::IOBuffer> buf;
95 int buf_size; 94 int buf_size;
96 bool result = resource_handler_->OnWillRead(&buf, &buf_size, min_size); 95 bool result = resource_handler_->OnWillRead(&buf, &buf_size, min_size);
97 // The second case isn't really allowed, but a number of classes do it 96 // The second case isn't really allowed, but a number of classes do it
98 // anyways. 97 // anyways.
99 EXPECT_TRUE(status_ == Status::CALLING_HANDLER || 98 EXPECT_TRUE(status_ == Status::CALLING_HANDLER ||
100 (result == false && status_ == Status::CANCELED)); 99 (result == false && status_ == Status::CANCELED));
101 if (!result) { 100 if (!result) {
102 status_ = Status::CANCELED; 101 status_ = Status::CANCELED;
103 } else { 102 } else {
104 EXPECT_LE(min_size, buf_size); 103 EXPECT_LE(min_size, buf_size);
105 status_ = Status::IDLE; 104 status_ = Status::IDLE;
106 } 105 }
107 return status_; 106 return status_;
108 }; 107 };
109 108
110 MockResourceLoader::Status MockResourceLoader::OnReadCompleted(int bytes_read) { 109 MockResourceLoader::Status MockResourceLoader::OnReadCompleted(int bytes_read) {
110 EXPECT_FALSE(weak_factory_.HasWeakPtrs());
111 EXPECT_EQ(Status::IDLE, status_); 111 EXPECT_EQ(Status::IDLE, status_);
112
112 status_ = Status::CALLING_HANDLER; 113 status_ = Status::CALLING_HANDLER;
113 114 resource_handler_->OnReadCompleted(
114 bool defer = false; 115 bytes_read,
115 bool result = resource_handler_->OnReadCompleted(bytes_read, &defer); 116 base::MakeUnique<TestResourceController>(weak_factory_.GetWeakPtr()));
116 // The second case isn't really allowed, but a number of classes do it 117 if (status_ == Status::CALLING_HANDLER)
117 // anyways.
118 EXPECT_TRUE(status_ == Status::CALLING_HANDLER ||
119 (result == false && status_ == Status::CANCELED));
120 if (!result) {
121 status_ = Status::CANCELED;
122 } else if (defer) {
123 status_ = Status::CALLBACK_PENDING; 118 status_ = Status::CALLBACK_PENDING;
124 } else {
125 status_ = Status::IDLE;
126 }
127 return status_; 119 return status_;
128 } 120 }
129 121
130 MockResourceLoader::Status MockResourceLoader::OnResponseCompleted( 122 MockResourceLoader::Status MockResourceLoader::OnResponseCompleted(
131 const net::URLRequestStatus& status) { 123 const net::URLRequestStatus& status) {
124 EXPECT_FALSE(weak_factory_.HasWeakPtrs());
132 // This should only happen while the ResourceLoader is idle or the request was 125 // This should only happen while the ResourceLoader is idle or the request was
133 // canceled. 126 // canceled.
134 EXPECT_TRUE(status_ == Status::IDLE || 127 EXPECT_TRUE(status_ == Status::IDLE ||
135 (!status.is_success() && status_ == Status::CANCELED && 128 (!status.is_success() && status_ == Status::CANCELED &&
136 error_code_ == status.error())); 129 error_code_ == status.error()));
137 130
138 status_ = Status::CALLING_HANDLER; 131 status_ = Status::CALLING_HANDLER;
139 132 resource_handler_->OnResponseCompleted(
140 bool defer = false; 133 status,
141 resource_handler_->OnResponseCompleted(status, &defer); 134 base::MakeUnique<TestResourceController>(weak_factory_.GetWeakPtr()));
142 EXPECT_EQ(Status::CALLING_HANDLER, status_); 135 if (status_ == Status::CALLING_HANDLER)
143 if (defer) {
144 status_ = Status::CALLBACK_PENDING; 136 status_ = Status::CALLBACK_PENDING;
145 } else { 137 EXPECT_NE(Status::CANCELED, status_);
146 status_ = Status::IDLE;
147 }
148 return status_; 138 return status_;
149 } 139 }
150 140
151 void MockResourceLoader::Cancel() { 141 void MockResourceLoader::OutOfBandCancel(int error_code, bool tell_renderer) {
152 CancelWithError(net::ERR_ABORTED); 142 // Shouldn't be called in-band.
143 EXPECT_NE(Status::CALLING_HANDLER, status_);
144
145 status_ = Status::CANCELED;
146 canceled_out_of_band_ = true;
147
148 // To mimic real behavior, keep old error, in the case of double-cancel.
149 if (error_code_ == net::OK)
150 error_code_ = error_code;
153 } 151 }
154 152
155 void MockResourceLoader::CancelAndIgnore() { 153 void MockResourceLoader::OnCancel(int error_code) {
156 NOTREACHED(); 154 // It's currently allowed to be canceled in-band after being cancelled
157 } 155 // out-of-band, so do nothing, unless the status is no longer CANCELED, which
158 156 // which case, OnResponseCompleted has already been called, and cancels aren't
159 void MockResourceLoader::CancelWithError(int error_code) { 157 // expected then.
160 EXPECT_LT(error_code, 0); 158 // TODO(mmenke): Make CancelOutOfBand synchronously destroy the
161 // Ignore double cancels. Classes shouldn't be doing this, as 159 // ResourceLoader.
162 // ResourceLoader doesn't really support it, but they do anywways. :( 160 if (canceled_out_of_band_ && status_ == Status::CANCELED)
163 // TODO(mmenke): Remove this check.
164 if (error_code_ != net::OK)
165 return; 161 return;
166 162
167 // ResourceLoader really expects canceled not to be called synchronously, but 163 EXPECT_LT(error_code, 0);
168 // a lot of code does it, so allow it.
169 // TODO(mmenke): Remove CALLING_HANDLER.
170 EXPECT_TRUE(status_ == Status::CALLBACK_PENDING || 164 EXPECT_TRUE(status_ == Status::CALLBACK_PENDING ||
171 status_ == Status::CALLING_HANDLER || status_ == Status::IDLE); 165 status_ == Status::CALLING_HANDLER);
166
172 status_ = Status::CANCELED; 167 status_ = Status::CANCELED;
173 error_code_ = error_code; 168 error_code_ = error_code;
174 } 169 }
175 170
176 void MockResourceLoader::Resume() { 171 void MockResourceLoader::OnResume() {
177 EXPECT_EQ(Status::CALLBACK_PENDING, status_); 172 EXPECT_TRUE(status_ == Status::CALLBACK_PENDING ||
173 status_ == Status::CALLING_HANDLER);
174
178 status_ = Status::IDLE; 175 status_ = Status::IDLE;
179 } 176 }
180 177
181 } // namespace content 178 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698