| Index: chrome/browser/policy/cloud_policy_subsystem_unittest.cc
|
| diff --git a/chrome/browser/policy/cloud_policy_subsystem_unittest.cc b/chrome/browser/policy/cloud_policy_subsystem_unittest.cc
|
| deleted file mode 100644
|
| index 261bf1da512dc4a110dd2c9e9fab5acdd070637d..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/policy/cloud_policy_subsystem_unittest.cc
|
| +++ /dev/null
|
| @@ -1,469 +0,0 @@
|
| -// Copyright (c) 2012 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 <vector>
|
| -
|
| -#include "base/files/scoped_temp_dir.h"
|
| -#include "base/logging.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/message_loop.h"
|
| -#include "base/values.h"
|
| -#include "chrome/browser/browser_process.h"
|
| -#include "chrome/browser/policy/cloud_policy_data_store.h"
|
| -#include "chrome/browser/policy/logging_work_scheduler.h"
|
| -#include "chrome/browser/policy/proto/cloud_policy.pb.h"
|
| -#include "chrome/browser/policy/proto/device_management_backend.pb.h"
|
| -#include "chrome/browser/policy/testing_cloud_policy_subsystem.h"
|
| -#include "chrome/browser/policy/testing_policy_url_fetcher_factory.h"
|
| -#include "chrome/browser/policy/user_policy_cache.h"
|
| -#include "chrome/common/pref_names.h"
|
| -#include "chrome/test/base/testing_browser_process.h"
|
| -#include "chrome/test/base/testing_pref_service.h"
|
| -#include "content/public/test/test_browser_thread.h"
|
| -#include "policy/policy_constants.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace policy {
|
| -
|
| -using ::testing::AtMost;
|
| -using ::testing::InSequence;
|
| -using ::testing::_;
|
| -using content::BrowserThread;
|
| -
|
| -namespace em = enterprise_management;
|
| -
|
| -namespace {
|
| -
|
| -const char kGaiaAuthHeader[] = "GoogleLogin auth=secret123";
|
| -const char kDMAuthHeader[] = "GoogleDMToken token=token123456";
|
| -const char kDMToken[] = "token123456";
|
| -
|
| -const char kDeviceManagementUrl[] =
|
| - "http://localhost:12345/device_management_test";
|
| -
|
| -// Fake data to be included in requests.
|
| -const char kUsername[] = "john@smith.com";
|
| -const char kAuthToken[] = "secret123";
|
| -const char kPolicyType[] = "google/chrome/test";
|
| -const char kMachineId[] = "test-machine-id";
|
| -
|
| -} // namespace
|
| -
|
| -// An action that returns an URLRequestJob with an HTTP error code.
|
| -ACTION_P(CreateFailedResponse, http_error_code) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - em::DeviceManagementResponse response_data;
|
| -
|
| - arg3->response_data = response_data.SerializeAsString();
|
| - arg3->response_code = http_error_code;
|
| -}
|
| -
|
| -// An action that returns an URLRequestJob with a successful device
|
| -// registration response.
|
| -ACTION_P(CreateSuccessfulRegisterResponse, token) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - em::DeviceManagementResponse response_data;
|
| - response_data.mutable_register_response()->set_device_management_token(token);
|
| - response_data.mutable_register_response()->set_enrollment_type(
|
| - em::DeviceRegisterResponse::ENTERPRISE);
|
| -
|
| - arg3->response_data = response_data.SerializeAsString();
|
| - arg3->response_code = 200;
|
| -}
|
| -
|
| -// An action that returns an URLRequestJob with a successful policy response.
|
| -ACTION_P3(CreateSuccessfulPolicyResponse,
|
| - homepage_location,
|
| - set_serial_valid,
|
| - serial_valid) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - em::CloudPolicySettings settings;
|
| - settings.mutable_homepagelocation()->set_value(homepage_location);
|
| - em::PolicyData policy_data;
|
| - policy_data.set_policy_type(kPolicyType);
|
| - policy_data.set_policy_value(settings.SerializeAsString());
|
| - if (set_serial_valid)
|
| - policy_data.set_valid_serial_number_missing(serial_valid);
|
| -
|
| - em::DeviceManagementResponse response_data;
|
| - em::DevicePolicyResponse* policy_response =
|
| - response_data.mutable_policy_response();
|
| - em::PolicyFetchResponse* fetch_response = policy_response->add_response();
|
| - fetch_response->set_error_code(200);
|
| - fetch_response->set_policy_data(policy_data.SerializeAsString());
|
| -
|
| - arg3->response_data = response_data.SerializeAsString();
|
| - arg3->response_code = 200;
|
| -}
|
| -
|
| -// Tests CloudPolicySubsystem by intercepting its network requests.
|
| -// The requests are intercepted by PolicyRequestInterceptor and they are
|
| -// logged by LoggingWorkScheduler for further examination.
|
| -class CloudPolicySubsystemTestBase : public testing::Test {
|
| - public:
|
| - CloudPolicySubsystemTestBase()
|
| - : ui_thread_(BrowserThread::UI, &loop_),
|
| - file_thread_(BrowserThread::FILE, &loop_),
|
| - io_thread_(BrowserThread::IO, &loop_) {}
|
| -
|
| - virtual ~CloudPolicySubsystemTestBase() {}
|
| -
|
| - protected:
|
| - void StopMessageLoop() {
|
| - loop_.QuitNow();
|
| - }
|
| -
|
| - virtual void SetUp() {
|
| - prefs_.reset(new TestingPrefServiceSimple);
|
| - CloudPolicySubsystem::RegisterPrefs(prefs_.get());
|
| - ((TestingBrowserProcess*) g_browser_process)->SetLocalState(prefs_.get());
|
| -
|
| - logger_.reset(new EventLogger);
|
| - factory_.reset(new TestingPolicyURLFetcherFactory(logger_.get()));
|
| - ASSERT_TRUE(temp_user_data_dir_.CreateUniqueTempDir());
|
| - data_store_.reset(CloudPolicyDataStore::CreateForUserPolicies());
|
| - cache_ = new UserPolicyCache(
|
| - temp_user_data_dir_.path().AppendASCII("CloudPolicyControllerTest"),
|
| - false /* wait_for_policy_fetch */);
|
| - cloud_policy_subsystem_.reset(new TestingCloudPolicySubsystem(
|
| - data_store_.get(), cache_,
|
| - kDeviceManagementUrl, logger_.get()));
|
| - cloud_policy_subsystem_->CompleteInitialization(
|
| - prefs::kDevicePolicyRefreshRate, 0);
|
| -
|
| - // Abort the test on unexpected requests.
|
| - ON_CALL(factory(), Intercept(_, _, _, _))
|
| - .WillByDefault(InvokeWithoutArgs(
|
| - this,
|
| - &CloudPolicySubsystemTestBase::StopMessageLoop));
|
| - }
|
| -
|
| - virtual void TearDown() {
|
| - TestingBrowserProcess::GetGlobal()->SetLocalState(NULL);
|
| - cloud_policy_subsystem_->Shutdown();
|
| - cloud_policy_subsystem_.reset();
|
| - data_store_.reset();
|
| - factory_.reset();
|
| - logger_.reset();
|
| - prefs_.reset();
|
| - }
|
| -
|
| - void ExecuteTest() {
|
| - // Stop the test once all the expectations are met. This relies on a
|
| - // sequence being active (see tests below).
|
| - EXPECT_CALL(factory(), Intercept(_, _, _, _))
|
| - .Times(AtMost(1))
|
| - .WillRepeatedly(
|
| - InvokeWithoutArgs(this,
|
| - &CloudPolicySubsystemTestBase::StopMessageLoop));
|
| -
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - data_store_->set_user_name(kUsername);
|
| - data_store_->SetGaiaToken(kAuthToken);
|
| - data_store_->SetDeviceToken("", true);
|
| - loop_.RunUntilIdle();
|
| - }
|
| -
|
| - void VerifyTest(const std::string& homepage_location) {
|
| - // Test conditions.
|
| - EXPECT_EQ(CloudPolicySubsystem::SUCCESS, cloud_policy_subsystem_->state());
|
| - StringValue homepage_value(homepage_location);
|
| - VerifyPolicy(key::kHomepageLocation, &homepage_value);
|
| - VerifyServerLoad();
|
| - }
|
| -
|
| - void VerifyState(CloudPolicySubsystem::PolicySubsystemState state) {
|
| - EXPECT_EQ(state, cloud_policy_subsystem_->state());
|
| - }
|
| -
|
| - void ExpectSuccessfulRegistration() {
|
| - EXPECT_CALL(factory(), Intercept(kGaiaAuthHeader, "register", _, _))
|
| - .WillOnce(CreateSuccessfulRegisterResponse(kDMToken));
|
| - }
|
| -
|
| - void ExpectFailedRegistration(int n, int code) {
|
| - EXPECT_CALL(factory(), Intercept(kGaiaAuthHeader, "register", _, _))
|
| - .Times(n)
|
| - .WillRepeatedly(CreateFailedResponse(code));
|
| - }
|
| -
|
| - void ExpectFailedPolicy(int n, int code) {
|
| - EXPECT_CALL(factory(), Intercept(kDMAuthHeader, "policy", _, _))
|
| - .Times(n)
|
| - .WillRepeatedly(CreateFailedResponse(code));
|
| - }
|
| -
|
| - void ExpectSuccessfulPolicy(int n,
|
| - const std::string& homepage) {
|
| - EXPECT_CALL(factory(), Intercept(kDMAuthHeader, "policy", _, _))
|
| - .Times(n)
|
| - .WillRepeatedly(CreateSuccessfulPolicyResponse(homepage, false, false));
|
| - }
|
| -
|
| - TestingPolicyURLFetcherFactory& factory() { return *factory_; }
|
| - CloudPolicyDataStore* data_store() { return data_store_.get(); }
|
| -
|
| - private:
|
| - // Verifies for a given policy that it is provided by the subsystem.
|
| - void VerifyPolicy(const char* policy_name, Value* expected) {
|
| - const PolicyMap* policy_map = cache_->policy();
|
| - ASSERT_TRUE(Value::Equals(expected, policy_map->GetValue(policy_name)));
|
| - }
|
| -
|
| - // Verifies that the last recorded run of the subsystem did not issue
|
| - // too frequent requests:
|
| - // - no more than 10 requests in the first 10 minutes
|
| - // - no more then 12 requests per hour in the next 10 hours
|
| - // TODO(gfeher): Thighten these conditions further. This will require
|
| - // fine-tuning of the subsystem. See: http://crosbug.com/16637
|
| - void VerifyServerLoad() {
|
| - std::vector<int64> events;
|
| - logger_->Swap(&events);
|
| -
|
| - ASSERT_FALSE(events.empty());
|
| -
|
| - int64 cur = 0;
|
| - int count = 0;
|
| -
|
| - // Length and max number of requests for the first interval.
|
| - int64 length = 10 * 60 * 1000; // 10 minutes
|
| - int64 limit = 10; // maximum nr of requests in the first 10 minutes
|
| -
|
| - while (cur <= events.back()) {
|
| - EXPECT_LE(EventLogger::CountEvents(events, cur, length), limit);
|
| - count++;
|
| -
|
| - cur += length;
|
| -
|
| - // Length and max number of requests for the subsequent intervals.
|
| - length = 60 * 60 * 1000; // 60 minutes
|
| - limit = 12; // maxminum nr of requests in the next 60 minutes
|
| - }
|
| -
|
| - EXPECT_GE(count, 11)
|
| - << "No enough requests were fired during the test run.";
|
| - }
|
| -
|
| - base::ScopedTempDir temp_user_data_dir_;
|
| -
|
| - MessageLoop loop_;
|
| - content::TestBrowserThread ui_thread_;
|
| - content::TestBrowserThread file_thread_;
|
| - content::TestBrowserThread io_thread_;
|
| -
|
| - scoped_ptr<EventLogger> logger_;
|
| - scoped_ptr<CloudPolicyDataStore> data_store_;
|
| - scoped_ptr<CloudPolicySubsystem> cloud_policy_subsystem_;
|
| - scoped_ptr<PrefServiceSimple> prefs_;
|
| - CloudPolicyCacheBase* cache_;
|
| -
|
| - scoped_ptr<TestingPolicyURLFetcherFactory> factory_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(CloudPolicySubsystemTestBase);
|
| -};
|
| -
|
| -// A parameterized test case that simulates 100 failed registration attempts,
|
| -// then a successful one, then 100 failed policy fetch attempts and then 100
|
| -// successful policy fetches. The two parameters are the error codes for the
|
| -// failed registration and policy responses.
|
| -
|
| -class CombinedTestDesc {
|
| - public:
|
| - CombinedTestDesc(int registration_error_code, int policy_error_code)
|
| - : registration_error_code_(registration_error_code),
|
| - policy_error_code_(policy_error_code) {
|
| - }
|
| -
|
| - ~CombinedTestDesc() {}
|
| -
|
| - int registration_error_code() const { return registration_error_code_; }
|
| - int policy_error_code() const { return policy_error_code_; }
|
| -
|
| - private:
|
| - int registration_error_code_;
|
| - int policy_error_code_;
|
| -};
|
| -
|
| -class CloudPolicySubsystemCombinedTest
|
| - : public CloudPolicySubsystemTestBase,
|
| - public testing::WithParamInterface<CombinedTestDesc> {
|
| -};
|
| -
|
| -TEST_P(CloudPolicySubsystemCombinedTest, Combined) {
|
| - InSequence s;
|
| - ExpectFailedRegistration(100, GetParam().registration_error_code());
|
| - ExpectSuccessfulRegistration();
|
| - ExpectFailedPolicy(100, GetParam().policy_error_code());
|
| - ExpectSuccessfulPolicy(100, "http://www.google.com");
|
| - ExpectSuccessfulPolicy(1, "http://www.chromium.org");
|
| - ExecuteTest();
|
| - VerifyTest("http://www.chromium.org");
|
| -}
|
| -
|
| -// A random sample of error code pairs. Note that the following policy error
|
| -// codes (401, 403, 410) make the policy subsystem to try and reregister, and
|
| -// that is not expected in these tests.
|
| -INSTANTIATE_TEST_CASE_P(
|
| - CloudPolicySubsystemCombinedTestInstance,
|
| - CloudPolicySubsystemCombinedTest,
|
| - testing::Values(
|
| - CombinedTestDesc(403, 400),
|
| - CombinedTestDesc(403, 404),
|
| - CombinedTestDesc(403, 412),
|
| - CombinedTestDesc(403, 500),
|
| - CombinedTestDesc(403, 503),
|
| - CombinedTestDesc(403, 902),
|
| - CombinedTestDesc(902, 400),
|
| - CombinedTestDesc(503, 404),
|
| - CombinedTestDesc(500, 412),
|
| - CombinedTestDesc(412, 500),
|
| - CombinedTestDesc(404, 503),
|
| - CombinedTestDesc(400, 902)));
|
| -
|
| -// A parameterized test case that simulates 100 failed registration attempts,
|
| -// then a successful one, and then a succesful policy fetch. The parameter is
|
| -// the error code returned for registration attempts.
|
| -
|
| -class CloudPolicySubsystemRegistrationTest
|
| - : public CloudPolicySubsystemTestBase,
|
| - public testing::WithParamInterface<int> {
|
| -};
|
| -
|
| -TEST_P(CloudPolicySubsystemRegistrationTest, Registration) {
|
| - InSequence s;
|
| - ExpectFailedRegistration(100, GetParam());
|
| - ExpectSuccessfulRegistration();
|
| - ExpectSuccessfulPolicy(1, "http://www.youtube.com");
|
| - ExecuteTest();
|
| - VerifyTest("http://www.youtube.com");
|
| -}
|
| -
|
| -INSTANTIATE_TEST_CASE_P(
|
| - CloudPolicySubsystemRegistrationTestInstance,
|
| - CloudPolicySubsystemRegistrationTest,
|
| - // For the case of 401 see CloudPolicySubsystemRegistrationFailureTest
|
| - testing::Values(400, 403, 404, 410, 412, 500, 503, 902));
|
| -
|
| -// A test case that verifies that the subsystem understands the "not managed"
|
| -// response from the server.
|
| -
|
| -class CloudPolicySubsystemRegistrationFailureTest
|
| - : public CloudPolicySubsystemTestBase {
|
| -};
|
| -
|
| -TEST_F(CloudPolicySubsystemRegistrationFailureTest, RegistrationFailure) {
|
| - InSequence s;
|
| - ExpectFailedRegistration(1, 401);
|
| - ExecuteTest();
|
| - VerifyState(CloudPolicySubsystem::BAD_GAIA_TOKEN);
|
| -}
|
| -
|
| -// A parameterized test case that simulates a successful registration, then 100
|
| -// failed policy fetch attempts and then a successful one. The parameter is
|
| -// the error code returned for failed policy attempts.
|
| -
|
| -class CloudPolicySubsystemPolicyTest
|
| - : public CloudPolicySubsystemTestBase,
|
| - public testing::WithParamInterface<int> {
|
| -};
|
| -
|
| -TEST_P(CloudPolicySubsystemPolicyTest, Policy) {
|
| - InSequence s;
|
| - ExpectSuccessfulRegistration();
|
| - ExpectFailedPolicy(100, GetParam());
|
| - ExpectSuccessfulPolicy(1, "http://www.youtube.com");
|
| - ExecuteTest();
|
| - VerifyTest("http://www.youtube.com");
|
| -}
|
| -
|
| -INSTANTIATE_TEST_CASE_P(
|
| - CloudPolicySubsystemPolicyTestInstance,
|
| - CloudPolicySubsystemPolicyTest,
|
| - testing::Values(400, 404, 412, 500, 503, 902));
|
| -
|
| -// A parameterized test case that simulates a successful registration, then 40
|
| -// failed policy fetch attempts and a successful registration after each of
|
| -// them. The parameter is the error code returned for registration attempts.
|
| -
|
| -class CloudPolicySubsystemPolicyReregisterTest
|
| - : public CloudPolicySubsystemTestBase,
|
| - public testing::WithParamInterface<int> {
|
| -};
|
| -
|
| -TEST_P(CloudPolicySubsystemPolicyReregisterTest, Policy) {
|
| - // This logs a lot of WARNINGs. Temporarily increase the logging threshold.
|
| - int prev_level = logging::GetMinLogLevel();
|
| - logging::SetMinLogLevel(logging::LOG_ERROR);
|
| -
|
| - InSequence s;
|
| - for (int i = 0; i < 40; i++) {
|
| - ExpectSuccessfulRegistration();
|
| - ExpectFailedPolicy(1, GetParam());
|
| - }
|
| - ExpectSuccessfulRegistration();
|
| - ExpectSuccessfulPolicy(1, "http://www.youtube.com");
|
| - ExecuteTest();
|
| - VerifyTest("http://www.youtube.com");
|
| -
|
| - logging::SetMinLogLevel(prev_level);
|
| -}
|
| -
|
| -INSTANTIATE_TEST_CASE_P(
|
| - CloudPolicySubsystemPolicyReregisterTestInstance,
|
| - CloudPolicySubsystemPolicyReregisterTest,
|
| - testing::Values(401, 403, 410));
|
| -
|
| -MATCHER_P(PolicyWithSerial, expected_serial, "") {
|
| - return arg.policy_request().request(0).machine_id() == expected_serial;
|
| -}
|
| -
|
| -class CloudPolicySubsystemSerialNumberRecoveryTest
|
| - : public CloudPolicySubsystemTestBase {
|
| - protected:
|
| - virtual ~CloudPolicySubsystemSerialNumberRecoveryTest() {}
|
| -
|
| - virtual void SetUp() {
|
| - CloudPolicySubsystemTestBase::SetUp();
|
| - data_store()->set_machine_id(kMachineId);
|
| - }
|
| -
|
| - void ExpectPolicyRequest(const std::string& serial,
|
| - bool set_serial_valid,
|
| - bool serial_valid) {
|
| - EXPECT_CALL(factory(), Intercept(kDMAuthHeader, "policy",
|
| - PolicyWithSerial(serial), _))
|
| - .WillOnce(CreateSuccessfulPolicyResponse("", set_serial_valid,
|
| - serial_valid));
|
| - }
|
| -};
|
| -
|
| -// Tests that no serial is sent if the flag is not set.
|
| -TEST_F(CloudPolicySubsystemSerialNumberRecoveryTest, FlagNotSet) {
|
| - InSequence s;
|
| - ExpectSuccessfulRegistration();
|
| - ExpectPolicyRequest("", false, false);
|
| - ExpectPolicyRequest("", false, false);
|
| - ExecuteTest();
|
| -}
|
| -
|
| -// Tests that no serial is sent if the flag is set to false.
|
| -TEST_F(CloudPolicySubsystemSerialNumberRecoveryTest, FlagFalse) {
|
| - InSequence s;
|
| - ExpectSuccessfulRegistration();
|
| - ExpectPolicyRequest("", true, false);
|
| - ExpectPolicyRequest("", false, false);
|
| - ExecuteTest();
|
| -}
|
| -
|
| -// Tests that the serial is sent once if the server requests it.
|
| -TEST_F(CloudPolicySubsystemSerialNumberRecoveryTest, SerialRequested) {
|
| - InSequence s;
|
| - ExpectSuccessfulRegistration();
|
| - ExpectPolicyRequest("", true, true);
|
| - ExpectPolicyRequest(kMachineId, false, false);
|
| - ExpectPolicyRequest("", false, false);
|
| - ExecuteTest();
|
| -}
|
| -
|
| -} // policy
|
|
|