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

Side by Side Diff: chrome/browser/policy/device_management_backend_impl_unittest.cc

Issue 4098004: Implement device management backend. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix nits. Created 10 years, 1 month 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 | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2010 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 "chrome/browser/policy/device_management_backend_impl.h"
6
7 #include "base/message_loop.h"
8 #include "base/string_split.h"
9 #include "chrome/browser/browser_thread.h"
10 #include "chrome/browser/policy/device_management_backend_mock.h"
11 #include "chrome/common/net/test_url_fetcher_factory.h"
12 #include "net/base/escape.h"
13 #include "net/url_request/url_request_status.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "testing/gmock/include/gmock/gmock.h"
16
17 using testing::_;
18
19 namespace policy {
20
21 namespace {
22
23 const char kServiceURL[] = "https://example.com/management_service";
24
25 // Encoded error response messages for testing the error code paths.
26 const char kResponseEmpty[] = "\x08\x00";
27 const char kResponseErrorManagementNotSupported[] = "\x08\x01";
28 const char kResponseErrorDeviceNotFound[] = "\x08\x02";
29 const char kResponseErrorManagementTokenInvalid[] = "\x08\x03";
30 const char kResponseErrorActivationPending[] = "\x08\x04";
31
32 #define PROTO_STRING(name) (std::string(name, arraysize(name) - 1))
33
34 } // namespace
35
36 // Unit tests for the google apps policy backend. The pattern here is each test
37 // case triggeres a request and installs a mock delegate. The test will run and
38 // the default action installed on the test delegate will quit the loop.
39 template<typename TESTBASE>
40 class DeviceManagementBackendImplTestBase : public TESTBASE {
41 protected:
42 DeviceManagementBackendImplTestBase()
43 : io_thread_(BrowserThread::IO, &loop_),
44 service_(kServiceURL) {}
45
46 virtual void SetUp() {
47 URLFetcher::set_factory(&factory_);
48 }
49
50 virtual void TearDown() {
51 URLFetcher::set_factory(NULL);
52 loop_.RunAllPending();
53 }
54
55 MessageLoopForUI loop_;
56 BrowserThread io_thread_;
57 TestURLFetcherFactory factory_;
58 DeviceManagementBackendImpl service_;
59 };
60
61 struct FailedRequestParams {
62 FailedRequestParams(DeviceManagementBackend::ErrorCode expected_error,
63 URLRequestStatus::Status request_status,
64 int http_status,
65 const std::string& response)
66 : expected_error_(expected_error),
67 request_status_(request_status, 0),
68 http_status_(http_status),
69 response_(response) {}
70
71 DeviceManagementBackend::ErrorCode expected_error_;
72 URLRequestStatus request_status_;
73 int http_status_;
74 std::string response_;
75 };
76
77 // A parameterized test case for erroneous response situations, they're mostly
78 // the same for all kinds of requests.
79 class DeviceManagementBackendImplFailedRequestTest
80 : public DeviceManagementBackendImplTestBase<
81 testing::TestWithParam<FailedRequestParams> > {
82 };
83
84 TEST_P(DeviceManagementBackendImplFailedRequestTest, RegisterRequest) {
85 DeviceRegisterResponseDelegateMock mock;
86 EXPECT_CALL(mock, OnError(GetParam().expected_error_));
87 em::DeviceRegisterRequest request;
88 service_.ProcessRegisterRequest("token", "device id", request, &mock);
89 TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
90 ASSERT_TRUE(fetcher);
91
92 fetcher->delegate()->OnURLFetchComplete(fetcher,
93 GURL(kServiceURL),
94 GetParam().request_status_,
95 GetParam().http_status_,
96 ResponseCookies(),
97 GetParam().response_);
98 }
99
100 TEST_P(DeviceManagementBackendImplFailedRequestTest, UnregisterRequest) {
101 DeviceUnregisterResponseDelegateMock mock;
102 EXPECT_CALL(mock, OnError(GetParam().expected_error_));
103 em::DeviceUnregisterRequest request;
104 service_.ProcessUnregisterRequest("token", request, &mock);
105 TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
106 ASSERT_TRUE(fetcher);
107
108 fetcher->delegate()->OnURLFetchComplete(fetcher,
109 GURL(kServiceURL),
110 GetParam().request_status_,
111 GetParam().http_status_,
112 ResponseCookies(),
113 GetParam().response_);
114 }
115
116 TEST_P(DeviceManagementBackendImplFailedRequestTest, PolicyRequest) {
117 DevicePolicyResponseDelegateMock mock;
118 EXPECT_CALL(mock, OnError(GetParam().expected_error_));
119 em::DevicePolicyRequest request;
120 request.set_policy_scope("Chrome");
121 em::DevicePolicySettingRequest* setting_request =
122 request.add_setting_request();
123 setting_request->set_key("policy");
124 service_.ProcessPolicyRequest("token", request, &mock);
125 TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
126 ASSERT_TRUE(fetcher);
127
128 fetcher->delegate()->OnURLFetchComplete(fetcher,
129 GURL(kServiceURL),
130 GetParam().request_status_,
131 GetParam().http_status_,
132 ResponseCookies(),
133 GetParam().response_);
134 }
135
136 INSTANTIATE_TEST_CASE_P(
137 DeviceManagementBackendImplFailedRequestTestInstance,
138 DeviceManagementBackendImplFailedRequestTest,
139 testing::Values(
140 FailedRequestParams(
141 DeviceManagementBackend::kErrorRequestFailed,
142 URLRequestStatus::FAILED,
143 200,
144 PROTO_STRING(kResponseEmpty)),
145 FailedRequestParams(
146 DeviceManagementBackend::kErrorHttpStatus,
147 URLRequestStatus::SUCCESS,
148 500,
149 PROTO_STRING(kResponseEmpty)),
150 FailedRequestParams(
151 DeviceManagementBackend::kErrorResponseDecoding,
152 URLRequestStatus::SUCCESS,
153 200,
154 PROTO_STRING("Not a protobuf.")),
155 FailedRequestParams(
156 DeviceManagementBackend::kErrorServiceManagementNotSupported,
157 URLRequestStatus::SUCCESS,
158 200,
159 PROTO_STRING(kResponseErrorManagementNotSupported)),
160 FailedRequestParams(
161 DeviceManagementBackend::kErrorServiceDeviceNotFound,
162 URLRequestStatus::SUCCESS,
163 200,
164 PROTO_STRING(kResponseErrorDeviceNotFound)),
165 FailedRequestParams(
166 DeviceManagementBackend::kErrorServiceManagementTokenInvalid,
167 URLRequestStatus::SUCCESS,
168 200,
169 PROTO_STRING(kResponseErrorManagementTokenInvalid)),
170 FailedRequestParams(
171 DeviceManagementBackend::kErrorServiceActivationPending,
172 URLRequestStatus::SUCCESS,
173 200,
174 PROTO_STRING(kResponseErrorActivationPending))));
175
176 class DeviceManagementBackendImplTest
177 : public DeviceManagementBackendImplTestBase<testing::Test> {
178 };
179
180 MATCHER_P(MessageEquals, reference, "") {
181 std::string reference_data;
182 std::string arg_data;
183 return arg.SerializeToString(&arg_data) &&
184 reference.SerializeToString(&reference_data) &&
185 arg_data == reference_data;
186 }
187
188 // Simple query parameter parser for testing.
189 class QueryParams {
190 public:
191 explicit QueryParams(const std::string& query) {
192 base::SplitStringIntoKeyValuePairs(query, '=', '&', &params_);
193 }
194
195 bool Check(const std::string& name, const std::string& expected_value) {
196 bool found = false;
197 for (ParamMap::const_iterator i(params_.begin()); i != params_.end(); ++i) {
198 std::string unescaped_name(
199 UnescapeURLComponent(i->first,
200 UnescapeRule::NORMAL |
201 UnescapeRule::SPACES |
202 UnescapeRule::URL_SPECIAL_CHARS |
203 UnescapeRule::CONTROL_CHARS |
204 UnescapeRule::REPLACE_PLUS_WITH_SPACE));
205 if (unescaped_name == name) {
206 if (found)
207 return false;
208 found = true;
209 std::string unescaped_value(
210 UnescapeURLComponent(i->second,
211 UnescapeRule::NORMAL |
212 UnescapeRule::SPACES |
213 UnescapeRule::URL_SPECIAL_CHARS |
214 UnescapeRule::CONTROL_CHARS |
215 UnescapeRule::REPLACE_PLUS_WITH_SPACE));
216 if (unescaped_value != expected_value)
217 return false;
218 }
219 }
220 return found;
221 }
222
223 private:
224 typedef std::vector<std::pair<std::string, std::string> > ParamMap;
225 ParamMap params_;
226 };
227
228 TEST_F(DeviceManagementBackendImplTest, RegisterRequest) {
229 DeviceRegisterResponseDelegateMock mock;
230 em::DeviceRegisterResponse expected_response;
231 expected_response.set_device_management_token("mtoken");
232 EXPECT_CALL(mock, HandleRegisterResponse(MessageEquals(expected_response)));
233 em::DeviceRegisterRequest request;
234 service_.ProcessRegisterRequest("token", "device id", request, &mock);
235 TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
236 ASSERT_TRUE(fetcher);
237
238 // Check the data the fetcher received.
239 const GURL& request_url(fetcher->original_url());
240 const GURL service_url(kServiceURL);
241 EXPECT_EQ(service_url.scheme(), request_url.scheme());
242 EXPECT_EQ(service_url.host(), request_url.host());
243 EXPECT_EQ(service_url.port(), request_url.port());
244 EXPECT_EQ(service_url.path(), request_url.path());
245
246 QueryParams query_params(request_url.query());
247 EXPECT_TRUE(query_params.Check("request", "register"));
248
249 em::DeviceManagementRequest expected_request_wrapper;
250 expected_request_wrapper.mutable_register_request()->CopyFrom(request);
251 std::string expected_request_data;
252 ASSERT_TRUE(expected_request_wrapper.SerializeToString(
253 &expected_request_data));
254 EXPECT_EQ(expected_request_data, fetcher->upload_data());
255
256 // Generate the response.
257 std::string response_data;
258 em::DeviceManagementResponse response_wrapper;
259 response_wrapper.set_error(em::DeviceManagementResponse::SUCCESS);
260 response_wrapper.mutable_register_response()->CopyFrom(expected_response);
261 ASSERT_TRUE(response_wrapper.SerializeToString(&response_data));
262 URLRequestStatus status(URLRequestStatus::SUCCESS, 0);
263 fetcher->delegate()->OnURLFetchComplete(fetcher,
264 GURL(kServiceURL),
265 status,
266 200,
267 ResponseCookies(),
268 response_data);
269 }
270
271 TEST_F(DeviceManagementBackendImplTest, UnregisterRequest) {
272 DeviceUnregisterResponseDelegateMock mock;
273 em::DeviceUnregisterResponse expected_response;
274 EXPECT_CALL(mock, HandleUnregisterResponse(MessageEquals(expected_response)));
275 em::DeviceUnregisterRequest request;
276 service_.ProcessUnregisterRequest("dmtokenvalue", request, &mock);
277 TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
278 ASSERT_TRUE(fetcher);
279
280 // Check the data the fetcher received.
281 const GURL& request_url(fetcher->original_url());
282 const GURL service_url(kServiceURL);
283 EXPECT_EQ(service_url.scheme(), request_url.scheme());
284 EXPECT_EQ(service_url.host(), request_url.host());
285 EXPECT_EQ(service_url.port(), request_url.port());
286 EXPECT_EQ(service_url.path(), request_url.path());
287
288 QueryParams query_params(request_url.query());
289 EXPECT_TRUE(query_params.Check("request", "unregister"));
290
291 em::DeviceManagementRequest expected_request_wrapper;
292 expected_request_wrapper.mutable_unregister_request()->CopyFrom(request);
293 std::string expected_request_data;
294 ASSERT_TRUE(expected_request_wrapper.SerializeToString(
295 &expected_request_data));
296 EXPECT_EQ(expected_request_data, fetcher->upload_data());
297
298 // Generate the response.
299 std::string response_data;
300 em::DeviceManagementResponse response_wrapper;
301 response_wrapper.set_error(em::DeviceManagementResponse::SUCCESS);
302 response_wrapper.mutable_unregister_response()->CopyFrom(expected_response);
303 ASSERT_TRUE(response_wrapper.SerializeToString(&response_data));
304 URLRequestStatus status(URLRequestStatus::SUCCESS, 0);
305 fetcher->delegate()->OnURLFetchComplete(fetcher,
306 GURL(kServiceURL),
307 status,
308 200,
309 ResponseCookies(),
310 response_data);
311 }
312
313 TEST_F(DeviceManagementBackendImplTest, PolicyRequest) {
314 DevicePolicyResponseDelegateMock mock;
315 em::DevicePolicyResponse expected_response;
316 em::DevicePolicySetting* policy_setting = expected_response.add_setting();
317 policy_setting->set_policy_key("policy");
318 policy_setting->set_watermark("fresh");
319 em::GenericSetting* policy_value = policy_setting->mutable_policy_value();
320 em::GenericNamedValue* named_value = policy_value->add_named_value();
321 named_value->set_name("HomepageLocation");
322 named_value->mutable_value()->set_value_type(
323 em::GenericValue::VALUE_TYPE_STRING);
324 named_value->mutable_value()->set_string_value("http://www.chromium.org");
325 named_value = policy_value->add_named_value();
326 named_value->set_name("HomepageIsNewTabPage");
327 named_value->mutable_value()->set_value_type(
328 em::GenericValue::VALUE_TYPE_BOOL);
329 named_value->mutable_value()->set_bool_value(false);
330 EXPECT_CALL(mock, HandlePolicyResponse(MessageEquals(expected_response)));
331
332 em::DevicePolicyRequest request;
333 request.set_policy_scope("chromium");
334 em::DevicePolicySettingRequest* setting_request =
335 request.add_setting_request();
336 setting_request->set_key("policy");
337 setting_request->set_watermark("stale");
338 service_.ProcessPolicyRequest("dmtokenvalue", request, &mock);
339 TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
340 ASSERT_TRUE(fetcher);
341
342 // Check the data the fetcher received.
343 const GURL& request_url(fetcher->original_url());
344 const GURL service_url(kServiceURL);
345 EXPECT_EQ(service_url.scheme(), request_url.scheme());
346 EXPECT_EQ(service_url.host(), request_url.host());
347 EXPECT_EQ(service_url.port(), request_url.port());
348 EXPECT_EQ(service_url.path(), request_url.path());
349
350 QueryParams query_params(request_url.query());
351 EXPECT_TRUE(query_params.Check("request", "policy"));
352
353 em::DeviceManagementRequest expected_request_wrapper;
354 expected_request_wrapper.mutable_policy_request()->CopyFrom(request);
355 std::string expected_request_data;
356 ASSERT_TRUE(expected_request_wrapper.SerializeToString(
357 &expected_request_data));
358 EXPECT_EQ(expected_request_data, fetcher->upload_data());
359
360 // Generate the response.
361 std::string response_data;
362 em::DeviceManagementResponse response_wrapper;
363 response_wrapper.set_error(em::DeviceManagementResponse::SUCCESS);
364 response_wrapper.mutable_policy_response()->CopyFrom(expected_response);
365 ASSERT_TRUE(response_wrapper.SerializeToString(&response_data));
366 URLRequestStatus status(URLRequestStatus::SUCCESS, 0);
367 fetcher->delegate()->OnURLFetchComplete(fetcher,
368 GURL(kServiceURL),
369 status,
370 200,
371 ResponseCookies(),
372 response_data);
373 }
374
375 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698