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

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

Issue 12209070: Fix cloud policy duplicate registrations issue. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "base/bind.h"
6 #include "base/bind_helpers.h"
5 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
6 #include "base/message_loop.h" 8 #include "base/message_loop.h"
7 #include "base/stl_util.h" 9 #include "base/stl_util.h"
8 #include "chrome/browser/policy/cloud_policy_constants.h" 10 #include "chrome/browser/policy/cloud_policy_constants.h"
9 #include "chrome/browser/policy/device_management_service.h" 11 #include "chrome/browser/policy/device_management_service.h"
12 #include "chrome/browser/policy/test_request_interceptor.h"
10 #include "chrome/test/base/in_process_browser_test.h" 13 #include "chrome/test/base/in_process_browser_test.h"
11 #include "content/public/browser/browser_thread.h"
12 #include "net/base/upload_bytes_element_reader.h" 14 #include "net/base/upload_bytes_element_reader.h"
13 #include "net/base/upload_data_stream.h" 15 #include "net/base/upload_data_stream.h"
14 #include "net/test/test_server.h" 16 #include "net/test/test_server.h"
15 #include "net/url_request/url_fetcher.h"
16 #include "net/url_request/url_request.h" 17 #include "net/url_request/url_request.h"
17 #include "net/url_request/url_request_filter.h"
18 #include "net/url_request/url_request_job_factory.h"
19 #include "net/url_request/url_request_test_job.h" 18 #include "net/url_request/url_request_test_job.h"
20 #include "testing/gmock/include/gmock/gmock.h" 19 #include "testing/gmock/include/gmock/gmock.h"
21 #include "testing/gtest/include/gtest/gtest.h" 20 #include "testing/gtest/include/gtest/gtest.h"
22 21
23 using content::BrowserThread;
24 using testing::DoAll; 22 using testing::DoAll;
25 using testing::Invoke; 23 using testing::Invoke;
26 using testing::InvokeWithoutArgs; 24 using testing::InvokeWithoutArgs;
27 using testing::_; 25 using testing::_;
28 26
29 namespace em = enterprise_management; 27 namespace em = enterprise_management;
30 28
31 namespace policy { 29 namespace policy {
32 30
33 // Dummy service URL for testing with request interception enabled. 31 namespace {
34 const char kServiceUrl[] = "http://example.com/device_management";
35 32
36 // During construction and destruction of CannedResponseInterceptor tasks are 33 // Parses the DeviceManagementRequest in |request_data| and writes a serialized
37 // posted to the IO thread to add and remove an interceptor for URLRequest's of 34 // DeviceManagementResponse to |response_data|.
38 // |service_url|. The interceptor returns test data back to the service. 35 void ConstructResponse(const char* request_data,
39 class CannedResponseInterceptor { 36 uint64 request_data_length,
40 public: 37 std::string* response_data) {
41 explicit CannedResponseInterceptor(const GURL& service_url) 38 em::DeviceManagementRequest request;
42 : delegate_(new Delegate(service_url)) { 39 ASSERT_TRUE(request.ParseFromArray(request_data, request_data_length));
43 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 40 em::DeviceManagementResponse response;
44 base::Bind(&Delegate::Register, 41 if (request.has_register_request()) {
45 base::Unretained(delegate_))); 42 response.mutable_register_response()->set_device_management_token(
43 "fake_token");
44 } else if (request.has_unregister_request()) {
45 response.mutable_unregister_response();
46 } else if (request.has_policy_request()) {
47 response.mutable_policy_response()->add_response();
48 } else if (request.has_auto_enrollment_request()) {
49 response.mutable_auto_enrollment_response();
50 } else {
51 FAIL() << "Failed to parse request.";
52 }
53 ASSERT_TRUE(response.SerializeToString(response_data));
54 }
55
56 // JobCallback for the interceptor.
57 net::URLRequestJob* ResponseJob(
58 net::URLRequest* request,
59 net::NetworkDelegate* network_delegate) {
60 const net::UploadDataStream* upload = request->get_upload();
61 if (upload != NULL &&
62 upload->element_readers().size() == 1 &&
63 upload->element_readers()[0]->AsBytesReader()) {
64 std::string response_data;
65 const net::UploadBytesElementReader* bytes_reader =
66 upload->element_readers()[0]->AsBytesReader();
67 ConstructResponse(bytes_reader->bytes(),
68 bytes_reader->length(),
69 &response_data);
70 return new net::URLRequestTestJob(
71 request,
72 network_delegate,
73 net::URLRequestTestJob::test_headers(),
74 response_data,
75 true);
46 } 76 }
47 77
48 virtual ~CannedResponseInterceptor() { 78 return NULL;
49 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 79 }
50 base::Bind(&Delegate::Unregister));
51 }
52 80
53 private: 81 } // namespace
54 class Delegate : public net::URLRequestJobFactory::ProtocolHandler {
55 public:
56 explicit Delegate(const GURL& service_url) : service_url_(service_url) {}
57 virtual ~Delegate() {}
58
59 void Register() {
60 net::URLRequestFilter::GetInstance()->AddHostnameProtocolHandler(
61 "http", "example.com",
62 scoped_ptr<net::URLRequestJobFactory::ProtocolHandler>(this));
63 }
64
65 static void Unregister() {
66 net::URLRequestFilter::GetInstance()->RemoveHostnameHandler(
67 "http", "example.com");
68 }
69
70 // net::URLRequestJobFactory::ProtocolHandler overrides.
71 virtual net::URLRequestJob* MaybeCreateJob(
72 net::URLRequest* request,
73 net::NetworkDelegate* network_delegate) const OVERRIDE {
74 const net::UploadDataStream* upload = request->get_upload();
75 if (request->url().GetOrigin() == service_url_.GetOrigin() &&
76 request->url().path() == service_url_.path() &&
77 upload != NULL &&
78 upload->element_readers().size() == 1 &&
79 upload->element_readers()[0]->AsBytesReader()) {
80 std::string response_data;
81 const net::UploadBytesElementReader* bytes_reader =
82 upload->element_readers()[0]->AsBytesReader();
83 ConstructResponse(bytes_reader->bytes(),
84 bytes_reader->length(),
85 &response_data);
86 return new net::URLRequestTestJob(
87 request,
88 network_delegate,
89 net::URLRequestTestJob::test_headers(),
90 response_data,
91 true);
92 }
93
94 return NULL;
95 }
96
97 private:
98 void ConstructResponse(const char* request_data,
99 uint64 request_data_length,
100 std::string* response_data) const {
101 em::DeviceManagementRequest request;
102 ASSERT_TRUE(request.ParseFromArray(request_data, request_data_length));
103 em::DeviceManagementResponse response;
104 if (request.has_register_request()) {
105 response.mutable_register_response()->set_device_management_token(
106 "fake_token");
107 } else if (request.has_unregister_request()) {
108 response.mutable_unregister_response();
109 } else if (request.has_policy_request()) {
110 response.mutable_policy_response()->add_response();
111 } else if (request.has_auto_enrollment_request()) {
112 response.mutable_auto_enrollment_response();
113 } else {
114 FAIL() << "Failed to parse request.";
115 }
116 ASSERT_TRUE(response.SerializeToString(response_data));
117 }
118
119 const GURL service_url_;
120 };
121
122 Delegate* delegate_;
123 };
124 82
125 class DeviceManagementServiceIntegrationTest 83 class DeviceManagementServiceIntegrationTest
126 : public InProcessBrowserTest, 84 : public InProcessBrowserTest,
127 public testing::WithParamInterface< 85 public testing::WithParamInterface<
128 std::string (DeviceManagementServiceIntegrationTest::*)(void)> { 86 std::string (DeviceManagementServiceIntegrationTest::*)(void)> {
129 public: 87 public:
130 MOCK_METHOD2(OnJobDone, void(DeviceManagementStatus, 88 MOCK_METHOD2(OnJobDone, void(DeviceManagementStatus,
131 const em::DeviceManagementResponse&)); 89 const em::DeviceManagementResponse&));
132 90
133 std::string InitCannedResponse() { 91 std::string InitCannedResponse() {
134 net::URLFetcher::SetEnableInterceptionForTests(true); 92 interceptor_.reset(new TestRequestInterceptor("localhost"));
135 interceptor_.reset(new CannedResponseInterceptor(GURL(kServiceUrl))); 93 return "http://localhost";
136 return kServiceUrl;
137 } 94 }
138 95
139 std::string InitTestServer() { 96 std::string InitTestServer() {
140 StartTestServer(); 97 StartTestServer();
141 return test_server_->GetURL("device_management").spec(); 98 return test_server_->GetURL("device_management").spec();
142 } 99 }
143 100
144 protected: 101 protected:
102 void ExpectRequest() {
103 if (interceptor_)
104 interceptor_->PushJobCallback(base::Bind(&ResponseJob));
105 }
106
145 void PerformRegistration() { 107 void PerformRegistration() {
108 ExpectRequest();
146 EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _)) 109 EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _))
147 .WillOnce( 110 .WillOnce(
148 DoAll(Invoke(this, 111 DoAll(Invoke(this,
149 &DeviceManagementServiceIntegrationTest::RecordToken), 112 &DeviceManagementServiceIntegrationTest::RecordToken),
150 InvokeWithoutArgs(MessageLoop::current(), 113 InvokeWithoutArgs(MessageLoop::current(),
151 &MessageLoop::Quit))); 114 &MessageLoop::Quit)));
152 scoped_ptr<DeviceManagementRequestJob> job( 115 scoped_ptr<DeviceManagementRequestJob> job(
153 service_->CreateJob(DeviceManagementRequestJob::TYPE_REGISTRATION)); 116 service_->CreateJob(DeviceManagementRequestJob::TYPE_REGISTRATION));
154 job->SetGaiaToken("gaia_auth_token"); 117 job->SetGaiaToken("gaia_auth_token");
155 job->SetOAuthToken("oauth_token"); 118 job->SetOAuthToken("oauth_token");
(...skipping 26 matching lines...) Expand all
182 } 145 }
183 146
184 void RecordToken(DeviceManagementStatus status, 147 void RecordToken(DeviceManagementStatus status,
185 const em::DeviceManagementResponse& response) { 148 const em::DeviceManagementResponse& response) {
186 token_ = response.register_response().device_management_token(); 149 token_ = response.register_response().device_management_token();
187 } 150 }
188 151
189 std::string token_; 152 std::string token_;
190 scoped_ptr<DeviceManagementService> service_; 153 scoped_ptr<DeviceManagementService> service_;
191 scoped_ptr<net::TestServer> test_server_; 154 scoped_ptr<net::TestServer> test_server_;
192 scoped_ptr<CannedResponseInterceptor> interceptor_; 155 scoped_ptr<TestRequestInterceptor> interceptor_;
193 }; 156 };
194 157
195 IN_PROC_BROWSER_TEST_P(DeviceManagementServiceIntegrationTest, Registration) { 158 IN_PROC_BROWSER_TEST_P(DeviceManagementServiceIntegrationTest, Registration) {
196 PerformRegistration(); 159 PerformRegistration();
197 EXPECT_FALSE(token_.empty()); 160 EXPECT_FALSE(token_.empty());
198 } 161 }
199 162
200 IN_PROC_BROWSER_TEST_P(DeviceManagementServiceIntegrationTest, PolicyFetch) { 163 IN_PROC_BROWSER_TEST_P(DeviceManagementServiceIntegrationTest, PolicyFetch) {
201 PerformRegistration(); 164 PerformRegistration();
202 165
166 ExpectRequest();
203 EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _)) 167 EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _))
204 .WillOnce(InvokeWithoutArgs(MessageLoop::current(), &MessageLoop::Quit)); 168 .WillOnce(InvokeWithoutArgs(MessageLoop::current(), &MessageLoop::Quit));
205 scoped_ptr<DeviceManagementRequestJob> job( 169 scoped_ptr<DeviceManagementRequestJob> job(
206 service_->CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH)); 170 service_->CreateJob(DeviceManagementRequestJob::TYPE_POLICY_FETCH));
207 job->SetDMToken(token_); 171 job->SetDMToken(token_);
208 job->SetUserAffiliation(USER_AFFILIATION_NONE); 172 job->SetUserAffiliation(USER_AFFILIATION_NONE);
209 job->SetClientID("testid"); 173 job->SetClientID("testid");
210 em::DevicePolicyRequest* request = 174 em::DevicePolicyRequest* request =
211 job->GetRequest()->mutable_policy_request(); 175 job->GetRequest()->mutable_policy_request();
212 request->add_request()->set_policy_type(dm_protocol::kChromeUserPolicyType); 176 request->add_request()->set_policy_type(dm_protocol::kChromeUserPolicyType);
213 job->Start(base::Bind(&DeviceManagementServiceIntegrationTest::OnJobDone, 177 job->Start(base::Bind(&DeviceManagementServiceIntegrationTest::OnJobDone,
214 base::Unretained(this))); 178 base::Unretained(this)));
215 MessageLoop::current()->Run(); 179 MessageLoop::current()->Run();
216 } 180 }
217 181
218 IN_PROC_BROWSER_TEST_P(DeviceManagementServiceIntegrationTest, Unregistration) { 182 IN_PROC_BROWSER_TEST_P(DeviceManagementServiceIntegrationTest, Unregistration) {
219 PerformRegistration(); 183 PerformRegistration();
220 184
185 ExpectRequest();
221 EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _)) 186 EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _))
222 .WillOnce(InvokeWithoutArgs(MessageLoop::current(), &MessageLoop::Quit)); 187 .WillOnce(InvokeWithoutArgs(MessageLoop::current(), &MessageLoop::Quit));
223 scoped_ptr<DeviceManagementRequestJob> job( 188 scoped_ptr<DeviceManagementRequestJob> job(
224 service_->CreateJob(DeviceManagementRequestJob::TYPE_UNREGISTRATION)); 189 service_->CreateJob(DeviceManagementRequestJob::TYPE_UNREGISTRATION));
225 job->SetDMToken(token_); 190 job->SetDMToken(token_);
226 job->SetClientID("testid"); 191 job->SetClientID("testid");
227 job->GetRequest()->mutable_unregister_request(); 192 job->GetRequest()->mutable_unregister_request();
228 job->Start(base::Bind(&DeviceManagementServiceIntegrationTest::OnJobDone, 193 job->Start(base::Bind(&DeviceManagementServiceIntegrationTest::OnJobDone,
229 base::Unretained(this))); 194 base::Unretained(this)));
230 MessageLoop::current()->Run(); 195 MessageLoop::current()->Run();
231 } 196 }
232 197
233 IN_PROC_BROWSER_TEST_P(DeviceManagementServiceIntegrationTest, AutoEnrollment) { 198 IN_PROC_BROWSER_TEST_P(DeviceManagementServiceIntegrationTest, AutoEnrollment) {
199 ExpectRequest();
234 EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _)) 200 EXPECT_CALL(*this, OnJobDone(DM_STATUS_SUCCESS, _))
235 .WillOnce(InvokeWithoutArgs(MessageLoop::current(), &MessageLoop::Quit)); 201 .WillOnce(InvokeWithoutArgs(MessageLoop::current(), &MessageLoop::Quit));
236 scoped_ptr<DeviceManagementRequestJob> job( 202 scoped_ptr<DeviceManagementRequestJob> job(
237 service_->CreateJob(DeviceManagementRequestJob::TYPE_AUTO_ENROLLMENT)); 203 service_->CreateJob(DeviceManagementRequestJob::TYPE_AUTO_ENROLLMENT));
238 job->SetClientID("testid"); 204 job->SetClientID("testid");
239 job->GetRequest()->mutable_auto_enrollment_request()->set_remainder(0); 205 job->GetRequest()->mutable_auto_enrollment_request()->set_remainder(0);
240 job->GetRequest()->mutable_auto_enrollment_request()->set_modulus(1); 206 job->GetRequest()->mutable_auto_enrollment_request()->set_modulus(1);
241 job->Start(base::Bind(&DeviceManagementServiceIntegrationTest::OnJobDone, 207 job->Start(base::Bind(&DeviceManagementServiceIntegrationTest::OnJobDone,
242 base::Unretained(this))); 208 base::Unretained(this)));
243 MessageLoop::current()->Run(); 209 MessageLoop::current()->Run();
244 } 210 }
245 211
246 INSTANTIATE_TEST_CASE_P( 212 INSTANTIATE_TEST_CASE_P(
247 DeviceManagementServiceIntegrationTestInstance, 213 DeviceManagementServiceIntegrationTestInstance,
248 DeviceManagementServiceIntegrationTest, 214 DeviceManagementServiceIntegrationTest,
249 testing::Values(&DeviceManagementServiceIntegrationTest::InitCannedResponse, 215 testing::Values(&DeviceManagementServiceIntegrationTest::InitCannedResponse,
250 &DeviceManagementServiceIntegrationTest::InitTestServer)); 216 &DeviceManagementServiceIntegrationTest::InitTestServer));
251 217
252 } // namespace policy 218 } // namespace policy
OLDNEW
« no previous file with comments | « chrome/browser/policy/device_management_service.cc ('k') | chrome/browser/policy/device_management_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698