// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/message_loop.h" #include "chrome/browser/policy/device_management_backend_mock.h" #include "chrome/browser/policy/device_management_service.h" #include "chrome/browser/policy/proto/device_management_constants.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/test/in_process_browser_test.h" #include "net/test/test_server.h" #include "net/url_request/url_request.h" #include "net/url_request/url_request_test_job.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" using testing::_; using testing::DoAll; using testing::Invoke; using testing::InvokeWithoutArgs; namespace policy { // Dummy service URL for testing with request interception enabled. const char kServiceUrl[] = "http://example.com/device_management"; // Binary representation of successful register response containing a token. const char kServiceResponseRegister[] = "\x08\x00\x1a\x22\x0a\x20\x64\x64\x32\x63\x38\x63\x33\x65\x64\x61" "\x63\x63\x34\x61\x33\x32\x38\x31\x66\x33\x38\x62\x36\x35\x31\x31" "\x36\x64\x61\x62\x66\x63"; // Contains a single policy setting, namely HomepageIsNewTabPage: false. const char kServiceResponsePolicy[] = "\x08\x00\x2a\x2a\x0a\x28\x0a\x06\x70\x6f\x6c\x69\x63\x79\x12\x1e" "\x0a\x1c\x0a\x14\x48\x6f\x6d\x65\x70\x61\x67\x65\x49\x73\x4e\x65" "\x77\x54\x61\x62\x50\x61\x67\x65\x12\x04\x08\x01\x10\x00"; // Successful unregister response. const char kServiceResponseUnregister[] = "\x08\x00\x22\x00"; #define PROTO_STRING(name) (std::string(name, arraysize(name) - 1)) // Interceptor implementation that returns test data back to the service. class CannedResponseInterceptor : public net::URLRequest::Interceptor { public: CannedResponseInterceptor(const GURL& service_url, const std::string& response_data) : service_url_(service_url), response_data_(response_data) { net::URLRequest::RegisterRequestInterceptor(this); } virtual ~CannedResponseInterceptor() { net::URLRequest::UnregisterRequestInterceptor(this); } private: // net::URLRequest::Interceptor overrides. virtual net::URLRequestJob* MaybeIntercept(net::URLRequest* request) { if (request->url().GetOrigin() == service_url_.GetOrigin() && request->url().path() == service_url_.path()) { return new net::URLRequestTestJob(request, net::URLRequestTestJob::test_headers(), response_data_, true); } return NULL; } const GURL service_url_; const std::string response_data_; }; class DeviceManagementServiceIntegrationTest : public InProcessBrowserTest { public: void CaptureToken(const em::DeviceRegisterResponse& response) { token_ = response.device_management_token(); } protected: std::string token_; }; static void QuitMessageLoop() { MessageLoop::current()->Quit(); } IN_PROC_BROWSER_TEST_F(DeviceManagementServiceIntegrationTest, CannedResponses) { URLFetcher::enable_interception_for_tests(true); DeviceManagementService service(kServiceUrl); service.Initialize(browser()->profile()->GetRequestContext()); scoped_ptr<DeviceManagementBackend> backend(service.CreateBackend()); { CannedResponseInterceptor interceptor( GURL(kServiceUrl), PROTO_STRING(kServiceResponseRegister)); DeviceRegisterResponseDelegateMock delegate; EXPECT_CALL(delegate, HandleRegisterResponse(_)) .WillOnce(DoAll(Invoke(this, &DeviceManagementServiceIntegrationTest ::CaptureToken), InvokeWithoutArgs(QuitMessageLoop))); em::DeviceRegisterRequest request; backend->ProcessRegisterRequest("token", "testid", request, &delegate); MessageLoop::current()->Run(); } { CannedResponseInterceptor interceptor( GURL(kServiceUrl), PROTO_STRING(kServiceResponsePolicy)); DevicePolicyResponseDelegateMock delegate; EXPECT_CALL(delegate, HandlePolicyResponse(_)) .WillOnce(InvokeWithoutArgs(QuitMessageLoop)); em::DevicePolicyRequest request; request.set_policy_scope(kChromePolicyScope); em::DevicePolicySettingRequest* setting_request = request.add_setting_request(); setting_request->set_key(kChromeDevicePolicySettingKey); backend->ProcessPolicyRequest(token_, "testid", request, &delegate); MessageLoop::current()->Run(); } { CannedResponseInterceptor interceptor( GURL(kServiceUrl), PROTO_STRING(kServiceResponseUnregister)); DeviceUnregisterResponseDelegateMock delegate; EXPECT_CALL(delegate, HandleUnregisterResponse(_)) .WillOnce(InvokeWithoutArgs(QuitMessageLoop)); em::DeviceUnregisterRequest request; backend->ProcessUnregisterRequest(token_, "testid", request, &delegate); MessageLoop::current()->Run(); } } IN_PROC_BROWSER_TEST_F(DeviceManagementServiceIntegrationTest, WithTestServer) { net::TestServer test_server_( net::TestServer::TYPE_HTTP, FilePath(FILE_PATH_LITERAL("chrome/test/data/policy"))); ASSERT_TRUE(test_server_.Start()); DeviceManagementService service( test_server_.GetURL("device_management").spec()); service.Initialize(browser()->profile()->GetRequestContext()); scoped_ptr<DeviceManagementBackend> backend(service.CreateBackend()); { DeviceRegisterResponseDelegateMock delegate; EXPECT_CALL(delegate, HandleRegisterResponse(_)) .WillOnce(DoAll(Invoke(this, &DeviceManagementServiceIntegrationTest ::CaptureToken), InvokeWithoutArgs(QuitMessageLoop))); em::DeviceRegisterRequest request; backend->ProcessRegisterRequest("token", "testid", request, &delegate); MessageLoop::current()->Run(); } { em::DevicePolicyResponse expected_response; DevicePolicyResponseDelegateMock delegate; EXPECT_CALL(delegate, HandlePolicyResponse(_)) .WillOnce(InvokeWithoutArgs(QuitMessageLoop)); em::DevicePolicyRequest request; em::PolicyFetchRequest* fetch_request = request.add_request(); fetch_request->set_signature_type(em::PolicyFetchRequest::SHA1_RSA); fetch_request->set_policy_type(kChromeUserPolicyType); backend->ProcessPolicyRequest(token_, "testid", request, &delegate); MessageLoop::current()->Run(); } { DeviceUnregisterResponseDelegateMock delegate; EXPECT_CALL(delegate, HandleUnregisterResponse(_)) .WillOnce(InvokeWithoutArgs(QuitMessageLoop)); em::DeviceUnregisterRequest request; backend->ProcessUnregisterRequest(token_, "testid", request, &delegate); MessageLoop::current()->Run(); } } } // namespace policy