|  | // Copyright 2013 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/strings/utf_string_conversions.h" | 
|  | #include "extensions/browser/management_policy.h" | 
|  | #include "extensions/browser/test_management_policy.h" | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  |  | 
|  | typedef extensions::TestManagementPolicyProvider TestProvider; | 
|  | using extensions::Extension; | 
|  |  | 
|  | class ManagementPolicyTest : public testing::Test { | 
|  | public: | 
|  | void SetUp() override { | 
|  | allow_all_.SetProhibitedActions(TestProvider::ALLOW_ALL); | 
|  | no_modify_status_.SetProhibitedActions( | 
|  | TestProvider::PROHIBIT_MODIFY_STATUS); | 
|  | no_load_.SetProhibitedActions(TestProvider::PROHIBIT_LOAD); | 
|  | must_remain_enabled_.SetProhibitedActions( | 
|  | TestProvider::MUST_REMAIN_ENABLED); | 
|  | must_remain_disabled_.SetProhibitedActions( | 
|  | TestProvider::MUST_REMAIN_DISABLED); | 
|  | must_remain_disabled_.SetDisableReason( | 
|  | extensions::disable_reason::DISABLE_SIDELOAD_WIPEOUT); | 
|  | must_remain_installed_.SetProhibitedActions( | 
|  | TestProvider::MUST_REMAIN_INSTALLED); | 
|  | restrict_all_.SetProhibitedActions(TestProvider::PROHIBIT_MODIFY_STATUS | | 
|  | TestProvider::PROHIBIT_LOAD | | 
|  | TestProvider::MUST_REMAIN_ENABLED); | 
|  | } | 
|  |  | 
|  | protected: | 
|  | extensions::ManagementPolicy policy_; | 
|  |  | 
|  | TestProvider allow_all_; | 
|  | TestProvider no_modify_status_; | 
|  | TestProvider no_load_; | 
|  | TestProvider must_remain_enabled_; | 
|  | TestProvider must_remain_disabled_; | 
|  | TestProvider must_remain_installed_; | 
|  | TestProvider restrict_all_; | 
|  | }; | 
|  |  | 
|  | TEST_F(ManagementPolicyTest, RegisterAndUnregister) { | 
|  | EXPECT_EQ(0, policy_.GetNumProviders()); | 
|  | policy_.RegisterProvider(&allow_all_); | 
|  | EXPECT_EQ(1, policy_.GetNumProviders()); | 
|  | policy_.RegisterProvider(&allow_all_); | 
|  | EXPECT_EQ(1, policy_.GetNumProviders()); | 
|  |  | 
|  | policy_.RegisterProvider(&no_modify_status_); | 
|  | EXPECT_EQ(2, policy_.GetNumProviders()); | 
|  | policy_.UnregisterProvider(&allow_all_); | 
|  | EXPECT_EQ(1, policy_.GetNumProviders()); | 
|  | policy_.UnregisterProvider(&allow_all_); | 
|  | EXPECT_EQ(1, policy_.GetNumProviders()); | 
|  | policy_.UnregisterProvider(&no_modify_status_); | 
|  | EXPECT_EQ(0, policy_.GetNumProviders()); | 
|  |  | 
|  | policy_.RegisterProvider(&allow_all_); | 
|  | policy_.RegisterProvider(&no_modify_status_); | 
|  | EXPECT_EQ(2, policy_.GetNumProviders()); | 
|  | policy_.UnregisterAllProviders(); | 
|  | EXPECT_EQ(0, policy_.GetNumProviders()); | 
|  | } | 
|  |  | 
|  | TEST_F(ManagementPolicyTest, UserMayLoad) { | 
|  | // No providers registered. | 
|  | base::string16 error; | 
|  | // The extension and location are irrelevant to the | 
|  | // TestManagementPolicyProviders. | 
|  | EXPECT_TRUE(policy_.UserMayLoad(NULL, &error)); | 
|  | EXPECT_TRUE(error.empty()); | 
|  |  | 
|  | // One provider, no relevant restriction. | 
|  | policy_.RegisterProvider(&no_modify_status_); | 
|  | EXPECT_TRUE(policy_.UserMayLoad(NULL, &error)); | 
|  | EXPECT_TRUE(error.empty()); | 
|  |  | 
|  | // Two providers, no relevant restrictions. | 
|  | policy_.RegisterProvider(&must_remain_enabled_); | 
|  | EXPECT_TRUE(policy_.UserMayLoad(NULL, &error)); | 
|  | EXPECT_TRUE(error.empty()); | 
|  |  | 
|  | // Three providers, one with a relevant restriction. | 
|  | policy_.RegisterProvider(&no_load_); | 
|  | EXPECT_FALSE(policy_.UserMayLoad(NULL, &error)); | 
|  | EXPECT_FALSE(error.empty()); | 
|  |  | 
|  | // Remove the restriction. | 
|  | policy_.UnregisterProvider(&no_load_); | 
|  | error.clear(); | 
|  | EXPECT_TRUE(policy_.UserMayLoad(NULL, &error)); | 
|  | EXPECT_TRUE(error.empty()); | 
|  | } | 
|  | TEST_F(ManagementPolicyTest, UserMayModifySettings) { | 
|  | // No providers registered. | 
|  | base::string16 error; | 
|  | EXPECT_TRUE(policy_.UserMayModifySettings(NULL, &error)); | 
|  | EXPECT_TRUE(error.empty()); | 
|  |  | 
|  | // One provider, no relevant restriction. | 
|  | policy_.RegisterProvider(&allow_all_); | 
|  | EXPECT_TRUE(policy_.UserMayModifySettings(NULL, &error)); | 
|  | EXPECT_TRUE(error.empty()); | 
|  |  | 
|  | // Two providers, no relevant restrictions. | 
|  | policy_.RegisterProvider(&no_load_); | 
|  | EXPECT_TRUE(policy_.UserMayModifySettings(NULL, &error)); | 
|  | EXPECT_TRUE(error.empty()); | 
|  |  | 
|  | // Three providers, one with a relevant restriction. | 
|  | policy_.RegisterProvider(&no_modify_status_); | 
|  | EXPECT_FALSE(policy_.UserMayModifySettings(NULL, &error)); | 
|  | EXPECT_FALSE(error.empty()); | 
|  |  | 
|  | // Remove the restriction. | 
|  | policy_.UnregisterProvider(&no_modify_status_); | 
|  | error.clear(); | 
|  | EXPECT_TRUE(policy_.UserMayModifySettings(NULL, &error)); | 
|  | EXPECT_TRUE(error.empty()); | 
|  | } | 
|  |  | 
|  | TEST_F(ManagementPolicyTest, MustRemainEnabled) { | 
|  | // No providers registered. | 
|  | base::string16 error; | 
|  | EXPECT_FALSE(policy_.MustRemainEnabled(NULL, &error)); | 
|  | EXPECT_TRUE(error.empty()); | 
|  |  | 
|  | // One provider, no relevant restriction. | 
|  | policy_.RegisterProvider(&allow_all_); | 
|  | EXPECT_FALSE(policy_.MustRemainEnabled(NULL, &error)); | 
|  | EXPECT_TRUE(error.empty()); | 
|  |  | 
|  | // Two providers, no relevant restrictions. | 
|  | policy_.RegisterProvider(&no_modify_status_); | 
|  | EXPECT_FALSE(policy_.MustRemainEnabled(NULL, &error)); | 
|  | EXPECT_TRUE(error.empty()); | 
|  |  | 
|  | // Three providers, one with a relevant restriction. | 
|  | policy_.RegisterProvider(&must_remain_enabled_); | 
|  | EXPECT_TRUE(policy_.MustRemainEnabled(NULL, &error)); | 
|  | EXPECT_FALSE(error.empty()); | 
|  |  | 
|  | // Remove the restriction. | 
|  | policy_.UnregisterProvider(&must_remain_enabled_); | 
|  | error.clear(); | 
|  | EXPECT_FALSE(policy_.MustRemainEnabled(NULL, &error)); | 
|  | EXPECT_TRUE(error.empty()); | 
|  | } | 
|  |  | 
|  | TEST_F(ManagementPolicyTest, MustRemainDisabled) { | 
|  | // No providers registered. | 
|  | base::string16 error; | 
|  | EXPECT_FALSE(policy_.MustRemainDisabled(NULL, NULL, &error)); | 
|  | EXPECT_TRUE(error.empty()); | 
|  |  | 
|  | // One provider, no relevant restriction. | 
|  | policy_.RegisterProvider(&allow_all_); | 
|  | EXPECT_FALSE(policy_.MustRemainDisabled(NULL, NULL, &error)); | 
|  | EXPECT_TRUE(error.empty()); | 
|  |  | 
|  | // Two providers, no relevant restrictions. | 
|  | policy_.RegisterProvider(&no_modify_status_); | 
|  | EXPECT_FALSE(policy_.MustRemainDisabled(NULL, NULL, &error)); | 
|  | EXPECT_TRUE(error.empty()); | 
|  |  | 
|  | // Three providers, one with a relevant restriction. | 
|  | extensions::disable_reason::DisableReason reason = | 
|  | extensions::disable_reason::DISABLE_NONE; | 
|  | policy_.RegisterProvider(&must_remain_disabled_); | 
|  | EXPECT_TRUE(policy_.MustRemainDisabled(NULL, &reason, &error)); | 
|  | EXPECT_FALSE(error.empty()); | 
|  | EXPECT_EQ(extensions::disable_reason::DISABLE_SIDELOAD_WIPEOUT, reason); | 
|  |  | 
|  | // Remove the restriction. | 
|  | policy_.UnregisterProvider(&must_remain_disabled_); | 
|  | error.clear(); | 
|  | EXPECT_FALSE(policy_.MustRemainDisabled(NULL, NULL, &error)); | 
|  | EXPECT_TRUE(error.empty()); | 
|  | } | 
|  |  | 
|  | TEST_F(ManagementPolicyTest, MustRemainInstalled) { | 
|  | // No providers registered. | 
|  | base::string16 error; | 
|  | EXPECT_FALSE(policy_.MustRemainInstalled(NULL, &error)); | 
|  | EXPECT_TRUE(error.empty()); | 
|  |  | 
|  | // One provider, no relevant restriction. | 
|  | policy_.RegisterProvider(&allow_all_); | 
|  | EXPECT_FALSE(policy_.MustRemainInstalled(NULL, &error)); | 
|  | EXPECT_TRUE(error.empty()); | 
|  |  | 
|  | // Two providers, no relevant restrictions. | 
|  | policy_.RegisterProvider(&no_modify_status_); | 
|  | EXPECT_FALSE(policy_.MustRemainInstalled(NULL, &error)); | 
|  | EXPECT_TRUE(error.empty()); | 
|  |  | 
|  | // Three providers, one with a relevant restriction. | 
|  | policy_.RegisterProvider(&must_remain_installed_); | 
|  | EXPECT_TRUE(policy_.MustRemainInstalled(NULL, &error)); | 
|  | EXPECT_FALSE(error.empty()); | 
|  |  | 
|  | // Remove the restriction. | 
|  | policy_.UnregisterProvider(&must_remain_installed_); | 
|  | error.clear(); | 
|  | EXPECT_FALSE(policy_.MustRemainInstalled(NULL, &error)); | 
|  | EXPECT_TRUE(error.empty()); | 
|  | } | 
|  |  | 
|  | // Tests error handling in the ManagementPolicy. | 
|  | TEST_F(ManagementPolicyTest, ErrorHandling) { | 
|  | // The error parameter should be unchanged if no restriction was found. | 
|  | std::string original_error = "Ceci est en effet une erreur."; | 
|  | base::string16 original_error16 = base::UTF8ToUTF16(original_error); | 
|  | base::string16 error = original_error16; | 
|  | EXPECT_TRUE(policy_.UserMayLoad(NULL, &error)); | 
|  | EXPECT_EQ(original_error, base::UTF16ToUTF8(error)); | 
|  | EXPECT_TRUE(policy_.UserMayModifySettings(NULL, &error)); | 
|  | EXPECT_EQ(original_error, base::UTF16ToUTF8(error)); | 
|  | EXPECT_FALSE(policy_.MustRemainEnabled(NULL, &error)); | 
|  | EXPECT_EQ(original_error, base::UTF16ToUTF8(error)); | 
|  |  | 
|  | // Ensure no crashes if no error message was requested. | 
|  | EXPECT_TRUE(policy_.UserMayLoad(NULL, NULL)); | 
|  | EXPECT_TRUE(policy_.UserMayModifySettings(NULL, NULL)); | 
|  | EXPECT_FALSE(policy_.MustRemainEnabled(NULL, NULL)); | 
|  | policy_.RegisterProvider(&restrict_all_); | 
|  | EXPECT_FALSE(policy_.UserMayLoad(NULL, NULL)); | 
|  | EXPECT_FALSE(policy_.UserMayModifySettings(NULL, NULL)); | 
|  | EXPECT_TRUE(policy_.MustRemainEnabled(NULL, NULL)); | 
|  |  | 
|  | // Make sure returned error is correct. | 
|  | error = original_error16; | 
|  | EXPECT_FALSE(policy_.UserMayLoad(NULL, &error)); | 
|  | EXPECT_EQ(base::UTF8ToUTF16(TestProvider::expected_error()), error); | 
|  | error = original_error16; | 
|  | EXPECT_FALSE(policy_.UserMayModifySettings(NULL, &error)); | 
|  | EXPECT_EQ(base::UTF8ToUTF16(TestProvider::expected_error()), error); | 
|  | error = original_error16; | 
|  | EXPECT_TRUE(policy_.MustRemainEnabled(NULL, &error)); | 
|  | EXPECT_EQ(base::UTF8ToUTF16(TestProvider::expected_error()), error); | 
|  | } |