Index: chrome/browser/policy/device_management_service_unittest.cc |
diff --git a/chrome/browser/policy/device_management_backend_impl_unittest.cc b/chrome/browser/policy/device_management_service_unittest.cc |
similarity index 69% |
rename from chrome/browser/policy/device_management_backend_impl_unittest.cc |
rename to chrome/browser/policy/device_management_service_unittest.cc |
index 1e93f3a6ef6e6356d7ee025fd5055b84f54a8319..cabc7f7ad24da56643dcc01036fcb83d6f9d09e6 100644 |
--- a/chrome/browser/policy/device_management_backend_impl_unittest.cc |
+++ b/chrome/browser/policy/device_management_service_unittest.cc |
@@ -2,15 +2,16 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "chrome/browser/policy/device_management_backend_impl.h" |
- |
#include "base/message_loop.h" |
#include "base/string_split.h" |
#include "chrome/browser/browser_thread.h" |
#include "chrome/browser/policy/device_management_backend_mock.h" |
+#include "chrome/browser/policy/device_management_service.h" |
#include "chrome/common/net/test_url_fetcher_factory.h" |
+#include "chrome/test/test_url_request_context_getter.h" |
#include "net/base/escape.h" |
#include "net/url_request/url_request_status.h" |
+#include "net/url_request/url_request_unittest.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include "testing/gmock/include/gmock/gmock.h" |
@@ -18,9 +19,7 @@ using testing::_; |
namespace policy { |
-namespace { |
- |
-const char kServiceURL[] = "https://example.com/management_service"; |
+const char kServiceUrl[] = "https://example.com/management_service"; |
// Encoded error response messages for testing the error code paths. |
const char kResponseEmpty[] = "\x08\x00"; |
@@ -31,17 +30,18 @@ const char kResponseErrorActivationPending[] = "\x08\x04"; |
#define PROTO_STRING(name) (std::string(name, arraysize(name) - 1)) |
-} // namespace |
- |
-// Unit tests for the google apps policy backend. The pattern here is each test |
-// case triggeres a request and installs a mock delegate. The test will run and |
-// the default action installed on the test delegate will quit the loop. |
+// Unit tests for the device management policy service. The tests are run |
+// against a TestURLFetcherFactory that is used to short-circuit the request |
+// without calling into the actual network stack. |
template<typename TESTBASE> |
-class DeviceManagementBackendImplTestBase : public TESTBASE { |
+class DeviceManagementServiceTestBase : public TESTBASE { |
protected: |
- DeviceManagementBackendImplTestBase() |
- : io_thread_(BrowserThread::IO, &loop_), |
- service_(kServiceURL) {} |
+ DeviceManagementServiceTestBase() |
+ : request_context_(new TestURLRequestContextGetter()), |
+ io_thread_(BrowserThread::IO, &loop_) { |
+ ResetService(); |
+ service_->Initialize(request_context_.get()); |
+ } |
virtual void SetUp() { |
URLFetcher::set_factory(&factory_); |
@@ -49,13 +49,26 @@ class DeviceManagementBackendImplTestBase : public TESTBASE { |
virtual void TearDown() { |
URLFetcher::set_factory(NULL); |
+ backend_.reset(); |
+ service_.reset(); |
+ request_context_ = NULL; |
loop_.RunAllPending(); |
} |
+ void ResetService() { |
+ backend_.reset(); |
+ service_.reset(new DeviceManagementService(kServiceUrl)); |
+ backend_.reset(service_->CreateBackend()); |
+ } |
+ |
+ TestURLFetcherFactory factory_; |
+ scoped_refptr<TestURLRequestContextGetter> request_context_; |
+ scoped_ptr<DeviceManagementService> service_; |
+ scoped_ptr<DeviceManagementBackend> backend_; |
+ |
+ private: |
MessageLoopForUI loop_; |
BrowserThread io_thread_; |
- TestURLFetcherFactory factory_; |
- DeviceManagementBackendImpl service_; |
}; |
struct FailedRequestParams { |
@@ -76,44 +89,44 @@ struct FailedRequestParams { |
// A parameterized test case for erroneous response situations, they're mostly |
// the same for all kinds of requests. |
-class DeviceManagementBackendImplFailedRequestTest |
- : public DeviceManagementBackendImplTestBase< |
+class DeviceManagementServiceFailedRequestTest |
+ : public DeviceManagementServiceTestBase< |
testing::TestWithParam<FailedRequestParams> > { |
}; |
-TEST_P(DeviceManagementBackendImplFailedRequestTest, RegisterRequest) { |
+TEST_P(DeviceManagementServiceFailedRequestTest, RegisterRequest) { |
DeviceRegisterResponseDelegateMock mock; |
EXPECT_CALL(mock, OnError(GetParam().expected_error_)); |
em::DeviceRegisterRequest request; |
- service_.ProcessRegisterRequest("token", "device id", request, &mock); |
+ backend_->ProcessRegisterRequest("token", "device id", request, &mock); |
TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
ASSERT_TRUE(fetcher); |
fetcher->delegate()->OnURLFetchComplete(fetcher, |
- GURL(kServiceURL), |
+ GURL(kServiceUrl), |
GetParam().request_status_, |
GetParam().http_status_, |
ResponseCookies(), |
GetParam().response_); |
} |
-TEST_P(DeviceManagementBackendImplFailedRequestTest, UnregisterRequest) { |
+TEST_P(DeviceManagementServiceFailedRequestTest, UnregisterRequest) { |
DeviceUnregisterResponseDelegateMock mock; |
EXPECT_CALL(mock, OnError(GetParam().expected_error_)); |
em::DeviceUnregisterRequest request; |
- service_.ProcessUnregisterRequest("token", request, &mock); |
+ backend_->ProcessUnregisterRequest("token", request, &mock); |
TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
ASSERT_TRUE(fetcher); |
fetcher->delegate()->OnURLFetchComplete(fetcher, |
- GURL(kServiceURL), |
+ GURL(kServiceUrl), |
GetParam().request_status_, |
GetParam().http_status_, |
ResponseCookies(), |
GetParam().response_); |
} |
-TEST_P(DeviceManagementBackendImplFailedRequestTest, PolicyRequest) { |
+TEST_P(DeviceManagementServiceFailedRequestTest, PolicyRequest) { |
DevicePolicyResponseDelegateMock mock; |
EXPECT_CALL(mock, OnError(GetParam().expected_error_)); |
em::DevicePolicyRequest request; |
@@ -121,12 +134,12 @@ TEST_P(DeviceManagementBackendImplFailedRequestTest, PolicyRequest) { |
em::DevicePolicySettingRequest* setting_request = |
request.add_setting_request(); |
setting_request->set_key("policy"); |
- service_.ProcessPolicyRequest("token", request, &mock); |
+ backend_->ProcessPolicyRequest("token", request, &mock); |
TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
ASSERT_TRUE(fetcher); |
fetcher->delegate()->OnURLFetchComplete(fetcher, |
- GURL(kServiceURL), |
+ GURL(kServiceUrl), |
GetParam().request_status_, |
GetParam().http_status_, |
ResponseCookies(), |
@@ -134,8 +147,8 @@ TEST_P(DeviceManagementBackendImplFailedRequestTest, PolicyRequest) { |
} |
INSTANTIATE_TEST_CASE_P( |
- DeviceManagementBackendImplFailedRequestTestInstance, |
- DeviceManagementBackendImplFailedRequestTest, |
+ DeviceManagementServiceFailedRequestTestInstance, |
+ DeviceManagementServiceFailedRequestTest, |
testing::Values( |
FailedRequestParams( |
DeviceManagementBackend::kErrorRequestFailed, |
@@ -173,8 +186,8 @@ INSTANTIATE_TEST_CASE_P( |
200, |
PROTO_STRING(kResponseErrorActivationPending)))); |
-class DeviceManagementBackendImplTest |
- : public DeviceManagementBackendImplTestBase<testing::Test> { |
+class DeviceManagementServiceTest |
+ : public DeviceManagementServiceTestBase<testing::Test> { |
}; |
MATCHER_P(MessageEquals, reference, "") { |
@@ -225,19 +238,19 @@ class QueryParams { |
ParamMap params_; |
}; |
-TEST_F(DeviceManagementBackendImplTest, RegisterRequest) { |
+TEST_F(DeviceManagementServiceTest, RegisterRequest) { |
DeviceRegisterResponseDelegateMock mock; |
em::DeviceRegisterResponse expected_response; |
expected_response.set_device_management_token("mtoken"); |
EXPECT_CALL(mock, HandleRegisterResponse(MessageEquals(expected_response))); |
em::DeviceRegisterRequest request; |
- service_.ProcessRegisterRequest("token", "device id", request, &mock); |
+ backend_->ProcessRegisterRequest("token", "device id", request, &mock); |
TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
ASSERT_TRUE(fetcher); |
// Check the data the fetcher received. |
const GURL& request_url(fetcher->original_url()); |
- const GURL service_url(kServiceURL); |
+ const GURL service_url(kServiceUrl); |
EXPECT_EQ(service_url.scheme(), request_url.scheme()); |
EXPECT_EQ(service_url.host(), request_url.host()); |
EXPECT_EQ(service_url.port(), request_url.port()); |
@@ -261,25 +274,25 @@ TEST_F(DeviceManagementBackendImplTest, RegisterRequest) { |
ASSERT_TRUE(response_wrapper.SerializeToString(&response_data)); |
URLRequestStatus status(URLRequestStatus::SUCCESS, 0); |
fetcher->delegate()->OnURLFetchComplete(fetcher, |
- GURL(kServiceURL), |
+ GURL(kServiceUrl), |
status, |
200, |
ResponseCookies(), |
response_data); |
} |
-TEST_F(DeviceManagementBackendImplTest, UnregisterRequest) { |
+TEST_F(DeviceManagementServiceTest, UnregisterRequest) { |
DeviceUnregisterResponseDelegateMock mock; |
em::DeviceUnregisterResponse expected_response; |
EXPECT_CALL(mock, HandleUnregisterResponse(MessageEquals(expected_response))); |
em::DeviceUnregisterRequest request; |
- service_.ProcessUnregisterRequest("dmtokenvalue", request, &mock); |
+ backend_->ProcessUnregisterRequest("dmtokenvalue", request, &mock); |
TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
ASSERT_TRUE(fetcher); |
// Check the data the fetcher received. |
const GURL& request_url(fetcher->original_url()); |
- const GURL service_url(kServiceURL); |
+ const GURL service_url(kServiceUrl); |
EXPECT_EQ(service_url.scheme(), request_url.scheme()); |
EXPECT_EQ(service_url.host(), request_url.host()); |
EXPECT_EQ(service_url.port(), request_url.port()); |
@@ -303,18 +316,18 @@ TEST_F(DeviceManagementBackendImplTest, UnregisterRequest) { |
ASSERT_TRUE(response_wrapper.SerializeToString(&response_data)); |
URLRequestStatus status(URLRequestStatus::SUCCESS, 0); |
fetcher->delegate()->OnURLFetchComplete(fetcher, |
- GURL(kServiceURL), |
+ GURL(kServiceUrl), |
status, |
200, |
ResponseCookies(), |
response_data); |
} |
-TEST_F(DeviceManagementBackendImplTest, PolicyRequest) { |
+TEST_F(DeviceManagementServiceTest, PolicyRequest) { |
DevicePolicyResponseDelegateMock mock; |
em::DevicePolicyResponse expected_response; |
em::DevicePolicySetting* policy_setting = expected_response.add_setting(); |
- policy_setting->set_policy_key("policy"); |
+ policy_setting->set_policy_key("chrome-policy"); |
policy_setting->set_watermark("fresh"); |
em::GenericSetting* policy_value = policy_setting->mutable_policy_value(); |
em::GenericNamedValue* named_value = policy_value->add_named_value(); |
@@ -330,18 +343,18 @@ TEST_F(DeviceManagementBackendImplTest, PolicyRequest) { |
EXPECT_CALL(mock, HandlePolicyResponse(MessageEquals(expected_response))); |
em::DevicePolicyRequest request; |
- request.set_policy_scope("chromium"); |
+ request.set_policy_scope("chromeos/device"); |
em::DevicePolicySettingRequest* setting_request = |
request.add_setting_request(); |
setting_request->set_key("policy"); |
setting_request->set_watermark("stale"); |
- service_.ProcessPolicyRequest("dmtokenvalue", request, &mock); |
+ backend_->ProcessPolicyRequest("dmtokenvalue", request, &mock); |
TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
ASSERT_TRUE(fetcher); |
// Check the data the fetcher received. |
const GURL& request_url(fetcher->original_url()); |
- const GURL service_url(kServiceURL); |
+ const GURL service_url(kServiceUrl); |
EXPECT_EQ(service_url.scheme(), request_url.scheme()); |
EXPECT_EQ(service_url.host(), request_url.host()); |
EXPECT_EQ(service_url.port(), request_url.port()); |
@@ -365,7 +378,83 @@ TEST_F(DeviceManagementBackendImplTest, PolicyRequest) { |
ASSERT_TRUE(response_wrapper.SerializeToString(&response_data)); |
URLRequestStatus status(URLRequestStatus::SUCCESS, 0); |
fetcher->delegate()->OnURLFetchComplete(fetcher, |
- GURL(kServiceURL), |
+ GURL(kServiceUrl), |
+ status, |
+ 200, |
+ ResponseCookies(), |
+ response_data); |
+} |
+ |
+TEST_F(DeviceManagementServiceTest, CancelRegisterRequest) { |
+ DeviceRegisterResponseDelegateMock mock; |
+ EXPECT_CALL(mock, HandleRegisterResponse(_)).Times(0); |
+ em::DeviceRegisterRequest request; |
+ backend_->ProcessRegisterRequest("token", "device id", request, &mock); |
+ TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ ASSERT_TRUE(fetcher); |
+ |
+ // There shouldn't be any callbacks. |
+ backend_.reset(); |
+} |
+ |
+TEST_F(DeviceManagementServiceTest, CancelUnregisterRequest) { |
+ DeviceUnregisterResponseDelegateMock mock; |
+ EXPECT_CALL(mock, HandleUnregisterResponse(_)).Times(0); |
+ em::DeviceUnregisterRequest request; |
+ backend_->ProcessUnregisterRequest("dmtokenvalue", request, &mock); |
+ TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ ASSERT_TRUE(fetcher); |
+ |
+ // There shouldn't be any callbacks. |
+ backend_.reset(); |
+} |
+ |
+TEST_F(DeviceManagementServiceTest, CancelPolicyRequest) { |
+ DevicePolicyResponseDelegateMock mock; |
+ EXPECT_CALL(mock, HandlePolicyResponse(_)).Times(0); |
+ em::DevicePolicyRequest request; |
+ request.set_policy_scope("chromium"); |
+ em::DevicePolicySettingRequest* setting_request = |
+ request.add_setting_request(); |
+ setting_request->set_key("policy"); |
+ setting_request->set_watermark("stale"); |
+ backend_->ProcessPolicyRequest("dmtokenvalue", request, &mock); |
+ TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ ASSERT_TRUE(fetcher); |
+ |
+ // There shouldn't be any callbacks. |
+ backend_.reset(); |
+} |
+ |
+TEST_F(DeviceManagementServiceTest, JobQueueing) { |
+ // Start with a non-initialized service. |
+ ResetService(); |
+ |
+ // Make a request. We should not see any fetchers being created. |
+ DeviceRegisterResponseDelegateMock mock; |
+ em::DeviceRegisterResponse expected_response; |
+ expected_response.set_device_management_token("mtoken"); |
+ EXPECT_CALL(mock, HandleRegisterResponse(MessageEquals(expected_response))); |
+ em::DeviceRegisterRequest request; |
+ backend_->ProcessRegisterRequest("token", "device id", request, &mock); |
+ TestURLFetcher* fetcher = factory_.GetFetcherByID(0); |
+ ASSERT_FALSE(fetcher); |
+ |
+ // Now initialize the service. That should start the job. |
+ service_->Initialize(request_context_.get()); |
+ fetcher = factory_.GetFetcherByID(0); |
+ ASSERT_TRUE(fetcher); |
+ factory_.RemoveFetcherFromMap(0); |
+ |
+ // Check that the request is processed as expected. |
+ std::string response_data; |
+ em::DeviceManagementResponse response_wrapper; |
+ response_wrapper.set_error(em::DeviceManagementResponse::SUCCESS); |
+ response_wrapper.mutable_register_response()->CopyFrom(expected_response); |
+ ASSERT_TRUE(response_wrapper.SerializeToString(&response_data)); |
+ URLRequestStatus status(URLRequestStatus::SUCCESS, 0); |
+ fetcher->delegate()->OnURLFetchComplete(fetcher, |
+ GURL(kServiceUrl), |
status, |
200, |
ResponseCookies(), |