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

Side by Side Diff: chrome/browser/policy/cloud/test_request_interceptor.cc

Issue 879233003: Initial RemoteCommandService (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@remote-commands
Patch Set: WIP Created 5 years, 10 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
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 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 "chrome/browser/policy/cloud/test_request_interceptor.h" 5 #include "chrome/browser/policy/cloud/test_request_interceptor.h"
6 6
7 #include <limits> 7 #include <limits>
8 #include <queue> 8 #include <queue>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/bind_helpers.h" 12 #include "base/bind_helpers.h"
13 #include "base/memory/scoped_ptr.h" 13 #include "base/memory/scoped_ptr.h"
14 #include "base/message_loop/message_loop_proxy.h" 14 #include "base/message_loop/message_loop_proxy.h"
15 #include "base/run_loop.h" 15 #include "base/run_loop.h"
16 #include "base/sequenced_task_runner.h" 16 #include "base/sequenced_task_runner.h"
17 #include "chrome/browser/policy/remote_commands/testing_remote_commands_server.h "
17 #include "content/public/browser/browser_thread.h" 18 #include "content/public/browser/browser_thread.h"
18 #include "net/base/net_errors.h" 19 #include "net/base/net_errors.h"
19 #include "net/base/upload_bytes_element_reader.h" 20 #include "net/base/upload_bytes_element_reader.h"
20 #include "net/base/upload_data_stream.h" 21 #include "net/base/upload_data_stream.h"
21 #include "net/base/upload_element_reader.h" 22 #include "net/base/upload_element_reader.h"
22 #include "net/test/url_request/url_request_mock_http_job.h" 23 #include "net/test/url_request/url_request_mock_http_job.h"
23 #include "net/url_request/url_request_error_job.h" 24 #include "net/url_request/url_request_error_job.h"
24 #include "net/url_request/url_request_filter.h" 25 #include "net/url_request/url_request_filter.h"
25 #include "net/url_request/url_request_interceptor.h" 26 #include "net/url_request/url_request_interceptor.h"
26 #include "net/url_request/url_request_test_job.h" 27 #include "net/url_request/url_request_test_job.h"
27 #include "url/gurl.h" 28 #include "url/gurl.h"
28 29
29 namespace em = enterprise_management; 30 namespace em = enterprise_management;
30 31
31 namespace policy { 32 namespace policy {
32 33
33 namespace { 34 namespace {
34 35
36 static const char kGoodHeaders[] =
37 "HTTP/1.1 200 OK\0"
38 "Content-type: application/protobuf\0"
39 "\0";
40 static const char kBadHeaders[] =
41 "HTTP/1.1 400 Bad request\0"
42 "Content-type: application/protobuf\0"
43 "\0";
44
35 // Helper callback for jobs that should fail with a network |error|. 45 // Helper callback for jobs that should fail with a network |error|.
36 net::URLRequestJob* ErrorJobCallback(int error, 46 net::URLRequestJob* ErrorJobCallback(int error,
37 net::URLRequest* request, 47 net::URLRequest* request,
38 net::NetworkDelegate* network_delegate) { 48 net::NetworkDelegate* network_delegate) {
39 return new net::URLRequestErrorJob(request, network_delegate, error); 49 return new net::URLRequestErrorJob(request, network_delegate, error);
40 } 50 }
41 51
42 // Helper callback for jobs that should fail with a 400 HTTP error. 52 // Helper callback for jobs that should fail with a 400 HTTP error.
43 net::URLRequestJob* BadRequestJobCallback( 53 net::URLRequestJob* BadRequestJobCallback(
44 net::URLRequest* request, 54 net::URLRequest* request,
45 net::NetworkDelegate* network_delegate) { 55 net::NetworkDelegate* network_delegate) {
46 static const char kBadHeaders[] =
47 "HTTP/1.1 400 Bad request\0"
48 "Content-type: application/protobuf\0"
49 "\0";
50 std::string headers(kBadHeaders, arraysize(kBadHeaders)); 56 std::string headers(kBadHeaders, arraysize(kBadHeaders));
51 return new net::URLRequestTestJob( 57 return new net::URLRequestTestJob(
52 request, network_delegate, headers, std::string(), true); 58 request, network_delegate, headers, std::string(), true);
53 } 59 }
54 60
55 net::URLRequestJob* FileJobCallback(const base::FilePath& file_path, 61 net::URLRequestJob* FileJobCallback(const base::FilePath& file_path,
56 net::URLRequest* request, 62 net::URLRequest* request,
57 net::NetworkDelegate* network_delegate) { 63 net::NetworkDelegate* network_delegate) {
58 return new net::URLRequestMockHTTPJob( 64 return new net::URLRequestMockHTTPJob(
59 request, 65 request,
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 net::NetworkDelegate* network_delegate) { 114 net::NetworkDelegate* network_delegate) {
109 em::DeviceManagementRequest request_msg; 115 em::DeviceManagementRequest request_msg;
110 if (!ValidRequest(request, "register", &request_msg)) 116 if (!ValidRequest(request, "register", &request_msg))
111 return BadRequestJobCallback(request, network_delegate); 117 return BadRequestJobCallback(request, network_delegate);
112 118
113 if (!request_msg.has_register_request() || 119 if (!request_msg.has_register_request() ||
114 request_msg.has_unregister_request() || 120 request_msg.has_unregister_request() ||
115 request_msg.has_policy_request() || 121 request_msg.has_policy_request() ||
116 request_msg.has_device_status_report_request() || 122 request_msg.has_device_status_report_request() ||
117 request_msg.has_session_status_report_request() || 123 request_msg.has_session_status_report_request() ||
118 request_msg.has_auto_enrollment_request()) { 124 request_msg.has_auto_enrollment_request() ||
125 request_msg.has_remote_command_request()) {
119 return BadRequestJobCallback(request, network_delegate); 126 return BadRequestJobCallback(request, network_delegate);
120 } 127 }
121 128
122 const em::DeviceRegisterRequest& register_request = 129 const em::DeviceRegisterRequest& register_request =
123 request_msg.register_request(); 130 request_msg.register_request();
124 if (expect_reregister && 131 if (expect_reregister &&
125 (!register_request.has_reregister() || !register_request.reregister())) { 132 (!register_request.has_reregister() || !register_request.reregister())) {
126 return BadRequestJobCallback(request, network_delegate); 133 return BadRequestJobCallback(request, network_delegate);
127 } else if (!expect_reregister && 134 } else if (!expect_reregister &&
128 register_request.has_reregister() && 135 register_request.has_reregister() &&
129 register_request.reregister()) { 136 register_request.reregister()) {
130 return BadRequestJobCallback(request, network_delegate); 137 return BadRequestJobCallback(request, network_delegate);
131 } 138 }
132 139
133 if (!register_request.has_type() || register_request.type() != expected_type) 140 if (!register_request.has_type() || register_request.type() != expected_type)
134 return BadRequestJobCallback(request, network_delegate); 141 return BadRequestJobCallback(request, network_delegate);
135 142
136 em::DeviceManagementResponse response; 143 em::DeviceManagementResponse response;
137 em::DeviceRegisterResponse* register_response = 144 em::DeviceRegisterResponse* register_response =
138 response.mutable_register_response(); 145 response.mutable_register_response();
139 register_response->set_device_management_token("s3cr3t70k3n"); 146 register_response->set_device_management_token("s3cr3t70k3n");
140 std::string data; 147 std::string data;
141 response.SerializeToString(&data); 148 response.SerializeToString(&data);
142 149
143 static const char kGoodHeaders[] = 150 std::string headers(kGoodHeaders, arraysize(kGoodHeaders));
bartfab (slow) 2015/02/12 14:29:17 Nit: const.
binjin 2015/02/16 22:46:22 Done.
144 "HTTP/1.1 200 OK\0" 151 return new net::URLRequestTestJob(request, network_delegate, headers, data,
145 "Content-type: application/protobuf\0" 152 true);
146 "\0"; 153 }
154
155 net::URLRequestJob* FetchRemoteCommandsJobCallback(
156 TestingRemoteCommandsServer* server,
157 bool ignore_other_requests,
158 net::URLRequest* request,
159 net::NetworkDelegate* network_delegate) {
160 em::DeviceManagementRequest request_msg;
161 if (!ValidRequest(request, "remote_commands", &request_msg)) {
162 return ignore_other_requests ? nullptr : BadRequestJobCallback(
163 request, network_delegate);
164 }
165
166 if (!request_msg.has_remote_command_request())
167 return BadRequestJobCallback(request, network_delegate);
168
169 const em::DeviceRemoteCommandRequest& remote_command_request =
170 request_msg.remote_command_request();
171 if (!remote_command_request.has_last_command_unique_id())
172 return BadRequestJobCallback(request, network_delegate);
173
174 std::vector<em::RemoteCommandResult> previous_results(
175 remote_command_request.command_results().begin(),
176 remote_command_request.command_results().end());
177 std::vector<em::RemoteCommand> fetched_commands;
178 server->FetchCommandsFromIO(remote_command_request.last_command_unique_id(),
179 previous_results, &fetched_commands);
180
181 em::DeviceManagementResponse response;
182 em::DeviceRemoteCommandResponse* remote_command_response =
183 response.mutable_remote_command_response();
184
185 for (const auto& fetched_command : fetched_commands)
186 *remote_command_response->add_commands() = fetched_command;
187 std::string data;
188 response.SerializeToString(&data);
189
147 std::string headers(kGoodHeaders, arraysize(kGoodHeaders)); 190 std::string headers(kGoodHeaders, arraysize(kGoodHeaders));
148 return new net::URLRequestTestJob( 191 return new net::URLRequestTestJob(
149 request, network_delegate, headers, data, true); 192 request, network_delegate, headers, data, true);
150 } 193 }
151 194
152 void RegisterHttpInterceptor( 195 void RegisterHttpInterceptor(
153 const std::string& hostname, 196 const std::string& hostname,
154 scoped_ptr<net::URLRequestInterceptor> interceptor) { 197 scoped_ptr<net::URLRequestInterceptor> interceptor) {
155 net::URLRequestFilter::GetInstance()->AddHostnameInterceptor( 198 net::URLRequestFilter::GetInstance()->AddHostnameInterceptor(
156 "http", hostname, interceptor.Pass()); 199 "http", hostname, interceptor.Pass());
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 // Reject requests to other servers. 249 // Reject requests to other servers.
207 return ErrorJobCallback( 250 return ErrorJobCallback(
208 net::ERR_CONNECTION_REFUSED, request, network_delegate); 251 net::ERR_CONNECTION_REFUSED, request, network_delegate);
209 } 252 }
210 253
211 if (pending_job_callbacks_.empty()) { 254 if (pending_job_callbacks_.empty()) {
212 // Reject dmserver requests by default. 255 // Reject dmserver requests by default.
213 return BadRequestJobCallback(request, network_delegate); 256 return BadRequestJobCallback(request, network_delegate);
214 } 257 }
215 258
259 net::URLRequestJob* new_request =
260 pending_job_callbacks_.front().Run(request, network_delegate);
261
262 if (!new_request) {
263 // The current request job is legal and explicitly ignored by the next
264 // pending job callback.
265 return BadRequestJobCallback(request, network_delegate);
bartfab (slow) 2015/02/12 14:29:17 This early return will cause the callbacks below n
binjin 2015/02/16 22:46:22 Yes, it's designed to not be consumed from callbac
266 }
267
268 pending_job_callbacks_.pop();
269
216 // Invoke any callbacks that are waiting for the next request to be serviced 270 // Invoke any callbacks that are waiting for the next request to be serviced
217 // after this job is serviced. 271 // after this job is serviced.
218 if (!request_serviced_callbacks_.empty()) { 272 if (!request_serviced_callbacks_.empty()) {
bartfab (slow) 2015/02/12 14:29:17 These callbacks used to run *before* the ob, now t
binjin 2015/02/16 22:46:22 I think the callback is for intercepting, parsing
219 scoped_ptr<std::vector<base::Closure>> callbacks( 273 scoped_ptr<std::vector<base::Closure>> callbacks(
220 new std::vector<base::Closure>); 274 new std::vector<base::Closure>);
221 callbacks->swap(request_serviced_callbacks_); 275 callbacks->swap(request_serviced_callbacks_);
222 io_task_runner_->PostTask( 276 io_task_runner_->PostTask(
223 FROM_HERE, base::Bind(&Delegate::InvokeRequestServicedCallbacks, 277 FROM_HERE, base::Bind(&Delegate::InvokeRequestServicedCallbacks,
224 base::Passed(&callbacks))); 278 base::Passed(&callbacks)));
225 } 279 }
226 280
227 JobCallback callback = pending_job_callbacks_.front(); 281 return new_request;
228 pending_job_callbacks_.pop();
229 return callback.Run(request, network_delegate);
230 } 282 }
231 283
232 void TestRequestInterceptor::Delegate::GetPendingSize( 284 void TestRequestInterceptor::Delegate::GetPendingSize(
233 size_t* pending_size) const { 285 size_t* pending_size) const {
234 CHECK(io_task_runner_->RunsTasksOnCurrentThread()); 286 CHECK(io_task_runner_->RunsTasksOnCurrentThread());
235 *pending_size = pending_job_callbacks_.size(); 287 *pending_size = pending_job_callbacks_.size();
236 } 288 }
237 289
238 void TestRequestInterceptor::Delegate::AddRequestServicedCallback( 290 void TestRequestInterceptor::Delegate::AddRequestServicedCallback(
239 const base::Closure& callback) { 291 const base::Closure& callback) {
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 bool expect_reregister) { 370 bool expect_reregister) {
319 return base::Bind(&RegisterJobCallback, expected_type, expect_reregister); 371 return base::Bind(&RegisterJobCallback, expected_type, expect_reregister);
320 } 372 }
321 373
322 // static 374 // static
323 TestRequestInterceptor::JobCallback TestRequestInterceptor::FileJob( 375 TestRequestInterceptor::JobCallback TestRequestInterceptor::FileJob(
324 const base::FilePath& file_path) { 376 const base::FilePath& file_path) {
325 return base::Bind(&FileJobCallback, file_path); 377 return base::Bind(&FileJobCallback, file_path);
326 } 378 }
327 379
380 // static
381 TestRequestInterceptor::JobCallback
382 TestRequestInterceptor::FetchRemoteCommandsJob(
383 TestingRemoteCommandsServer* server,
384 bool ignore_other_requests) {
385 return base::Bind(&FetchRemoteCommandsJobCallback, server,
386 ignore_other_requests);
387 }
388
328 void TestRequestInterceptor::PostToIOAndWait(const base::Closure& task) { 389 void TestRequestInterceptor::PostToIOAndWait(const base::Closure& task) {
329 io_task_runner_->PostTask(FROM_HERE, task); 390 io_task_runner_->PostTask(FROM_HERE, task);
330 base::RunLoop run_loop; 391 base::RunLoop run_loop;
331 io_task_runner_->PostTask( 392 io_task_runner_->PostTask(
332 FROM_HERE, 393 FROM_HERE,
333 base::Bind( 394 base::Bind(
334 base::IgnoreResult(&base::MessageLoopProxy::PostTask), 395 base::IgnoreResult(&base::MessageLoopProxy::PostTask),
335 base::MessageLoopProxy::current(), 396 base::MessageLoopProxy::current(),
336 FROM_HERE, 397 FROM_HERE,
337 run_loop.QuitClosure())); 398 run_loop.QuitClosure()));
338 run_loop.Run(); 399 run_loop.Run();
339 } 400 }
340 401
341 } // namespace policy 402 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698