12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/path_service.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/run_loop.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/browser_process.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_test_message_listener.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/policy/browser_policy_connector.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/policy/cloud/cloud_policy_constants.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/policy/cloud/mock_cloud_policy_client.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/policy/policy_service.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/policy/profile_policy_connector.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/policy/profile_policy_connector_factory.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/policy/proto/cloud/chrome_extension_policy.pb.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/policy/test/local_policy_test_server.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/policy/test_utils.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_paths.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/extension.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "policy/proto/cloud_policy.pb.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chromeos.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_paths.h"
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/policy/cloud/user_cloud_policy_manager.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/policy/cloud/user_cloud_policy_manager_factory.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/signin/signin_manager.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::InvokeWithoutArgs;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::Mock;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::Return;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::_;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace em = enterprise_management;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace policy {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kDMToken[] = "dmtoken";
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kDeviceID[] = "deviceid";
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kTestExtension[] = "kjmkgkdkpedkejedfhmfcenooemhbpbo";
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kTestExtension2[] = "behllobkkfkfnphdnhnkndlbkcpglgmj";
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kTestExtensionPath[] =
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FILE_PATH_LITERAL("extensions/managed_extension");
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kTestExtension2Path[] =
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FILE_PATH_LITERAL("extensions/managed_extension2");
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kTestPolicy[] =
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "{"
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "  \"Name\": {"
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "    \"Value\": \"disable_all_the_things\""
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "  }"
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "}";
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kTestPolicyJSON[] = "{\"Name\":\"disable_all_the_things\"}";
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kTestPolicy2[] =
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "{"
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "  \"Another\": {"
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "    \"Value\": \"turn_it_off\""
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "  }"
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "}";
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kTestPolicy2JSON[] = "{\"Another\":\"turn_it_off\"}";
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ComponentCloudPolicyTest : public ExtensionBrowserTest {
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ComponentCloudPolicyTest() {}
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ComponentCloudPolicyTest() {}
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ExtensionBrowserTest::SetUpCommandLine(command_line);
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // ExtensionBrowserTest sets the login users to a non-managed value;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // replace it. This is the default username sent in policy blobs from the
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // testserver.
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    command_line->AppendSwitchASCII(
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        chromeos::switches::kLoginUser, "user@example.com");
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_server_.RegisterClient(kDMToken, kDeviceID);
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(test_server_.UpdatePolicyData(
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        dm_protocol::kChromeExtensionPolicyType, kTestExtension, kTestPolicy));
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(test_server_.Start());
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string url = test_server_.GetServiceURL().spec();
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CommandLine* command_line = CommandLine::ForCurrentProcess();
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    command_line->AppendSwitchASCII(switches::kDeviceManagementUrl, url);
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    command_line->AppendSwitch(switches::kEnableComponentCloudPolicy);
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ExtensionBrowserTest::SetUpInProcessBrowserTestFixture();
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(PolicyServiceIsEmpty(g_browser_process->policy_service()))
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << "Pre-existing policies in this machine will make this test fail.";
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Install the initial extension.
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ExtensionTestMessageListener ready_listener("ready", true);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    event_listener_.reset(new ExtensionTestMessageListener("event", true));
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extension_ = LoadExtension(kTestExtensionPath);
124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ASSERT_TRUE(extension_.get());
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(kTestExtension, extension_->id());
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(ready_listener.WaitUntilSatisfied());
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BrowserPolicyConnector* connector =
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        g_browser_process->browser_policy_connector();
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    connector->ScheduleServiceInitialization(0);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UserCloudPolicyManagerChromeOS* policy_manager =
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        UserCloudPolicyManagerFactoryChromeOS::GetForProfile(
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            browser()->profile());
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(policy_manager);
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Mock a signed-in user. This is used by the UserCloudPolicyStore to pass
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the username to the UserCloudPolicyValidator.
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SigninManager* signin_manager =
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SigninManagerFactory::GetForProfile(browser()->profile());
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(signin_manager);
143a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    signin_manager->SetAuthenticatedUsername("user@example.com");
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UserCloudPolicyManager* policy_manager =
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        UserCloudPolicyManagerFactory::GetForProfile(browser()->profile());
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(policy_manager);
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    policy_manager->Connect(g_browser_process->local_state(),
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            UserCloudPolicyManager::CreateCloudPolicyClient(
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                connector->device_management_service()).Pass());
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // defined(OS_CHROMEOS)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Register the cloud policy client.
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(policy_manager->core()->client());
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::RunLoop run_loop;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockCloudPolicyClientObserver observer;
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(observer, OnRegistrationStateChanged(_))
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    policy_manager->core()->client()->AddObserver(&observer);
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    policy_manager->core()->client()->SetupRegistration(kDMToken, kDeviceID);
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    run_loop.Run();
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Mock::VerifyAndClearExpectations(&observer);
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    policy_manager->core()->client()->RemoveObserver(&observer);
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The extension will receive an update event.
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(event_listener_->WaitUntilSatisfied());
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ExtensionBrowserTest::SetUpOnMainThread();
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<const extensions::Extension> LoadExtension(
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath::CharType* path) {
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath full_path;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!PathService::Get(chrome::DIR_TEST_DATA, &full_path)) {
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ADD_FAILURE();
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return NULL;
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<const extensions::Extension> extension(
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ExtensionBrowserTest::LoadExtension(full_path.Append(path)));
180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (!extension.get()) {
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ADD_FAILURE();
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return NULL;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return extension;
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RefreshPolicies() {
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ProfilePolicyConnector* profile_connector =
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ProfilePolicyConnectorFactory::GetForProfile(browser()->profile());
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PolicyService* policy_service = profile_connector->policy_service();
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::RunLoop run_loop;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    policy_service->RefreshPolicies(run_loop.QuitClosure());
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    run_loop.Run();
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LocalPolicyTestServer test_server_;
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<const extensions::Extension> extension_;
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ExtensionTestMessageListener> event_listener_;
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(joaodasilva): enable these for other platforms once ready.
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ComponentCloudPolicyTest, FetchExtensionPolicy) {
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Read the initial policy.
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionTestMessageListener policy_listener(kTestPolicyJSON, true);
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_listener_->Reply("get-policy-Name");
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(policy_listener.WaitUntilSatisfied());
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ComponentCloudPolicyTest, UpdateExtensionPolicy) {
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Read the initial policy.
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionTestMessageListener policy_listener(kTestPolicyJSON, true);
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_listener_->Reply("get-policy-Name");
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(policy_listener.WaitUntilSatisfied());
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Update the policy at the server and reload policy.
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_listener_.reset(new ExtensionTestMessageListener("event", true));
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  policy_listener.Reply("idle");
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(test_server_.UpdatePolicyData(
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dm_protocol::kChromeExtensionPolicyType, kTestExtension, kTestPolicy2));
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RefreshPolicies();
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check that the update event was received, and verify the new policy
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // values.
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(event_listener_->WaitUntilSatisfied());
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This policy was removed.
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionTestMessageListener policy_listener1("{}", true);
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event_listener_->Reply("get-policy-Name");
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(policy_listener1.WaitUntilSatisfied());
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionTestMessageListener policy_listener2(kTestPolicy2JSON, true);
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  policy_listener1.Reply("get-policy-Another");
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(policy_listener2.WaitUntilSatisfied());
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ComponentCloudPolicyTest, InstallNewExtension) {
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(test_server_.UpdatePolicyData(
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dm_protocol::kChromeExtensionPolicyType, kTestExtension2, kTestPolicy2));
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionTestMessageListener result_listener("ok", true);
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result_listener.AlsoListenForFailureMessage("fail");
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<const extensions::Extension> extension2 =
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LoadExtension(kTestExtension2Path);
2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(extension2.get());
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(kTestExtension2, extension2->id());
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This extension only sends the 'policy' signal once it receives the policy,
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and after verifying it has the expected value. Otherwise it sends 'fail'.
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(result_listener.WaitUntilSatisfied());
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // OS_CHROMEOS
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace policy
257