1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/policy/chrome_extension_policy_migrator.h"
#include <string>
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "extensions/common/hashed_extension_id.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/l10n/l10n_util.h"
namespace policy {
namespace {
const char kExtensionId[] = "abcdefghijklmnopabcdefghijklmnop";
const char kOldPolicy1[] = "OldPolicyOne";
const char kOldPolicy2[] = "OldPolicyTwo";
const char kOldPolicy3[] = "OldPolicyThree";
const char kOldPolicy4[] = "OldPolicyFour";
const char kOldPolicy5[] = "OldPolicyFive";
const char kNewPolicy1[] = "NewPolicyOne";
const char kNewPolicy2[] = "NewPolicyTwo";
const char kNewPolicy3[] = "NewPolicyThree";
const char kNewPolicy4[] = "NewPolicyFour";
const int kOldValue1 = 111;
const int kOldValue2 = 222;
const int kOldValue3 = 333;
const int kOldValue4 = 444;
const int kOldValue5 = 555;
const int kNewValue3 = 999;
const int kNewValue4 = 888;
void MultiplyByTwo(base::Value* val) {
*val = base::Value(val->GetInt() * 2);
}
void SetPolicy(PolicyMap* policy, const char* policy_name, base::Value value) {
policy->Set(policy_name, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD, std::move(value), nullptr);
}
class TestingPolicyMigrator : public ChromeExtensionPolicyMigrator {
public:
void Migrate(PolicyBundle* bundle) override {
using Migration = PolicyMigrator::Migration;
const Migration migrations[] = {
Migration(kOldPolicy1, kNewPolicy1),
Migration(kOldPolicy2, kNewPolicy2),
Migration(kOldPolicy3, kNewPolicy3),
Migration(kOldPolicy4, kNewPolicy4,
base::BindRepeating(&MultiplyByTwo)),
};
CopyPoliciesIfUnset(bundle,
extensions::HashedExtensionId(kExtensionId).value(),
migrations);
}
};
} // namespace
TEST(ChromeExtensionPolicyMigratorTest, CopyPoliciesIfUnset) {
PolicyBundle bundle;
PolicyMap& chrome_map = bundle.Get(
PolicyNamespace(POLICY_DOMAIN_CHROME, /* component_id */ std::string()));
SetPolicy(&chrome_map, kNewPolicy3, base::Value(kNewValue3));
PolicyMap& extension_map =
bundle.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtensionId));
SetPolicy(&extension_map, kOldPolicy1, base::Value(kOldValue1));
SetPolicy(&extension_map, kOldPolicy2, base::Value(kOldValue2));
SetPolicy(&extension_map, kOldPolicy3, base::Value(kOldValue3));
SetPolicy(&extension_map, kOldPolicy4, base::Value(kOldValue4));
SetPolicy(&extension_map, kOldPolicy5, base::Value(kOldValue5));
TestingPolicyMigrator().Migrate(&bundle);
// Policies in kMigrations should be renamed + copied into the Chrome domain.
EXPECT_EQ(4u, chrome_map.size());
ASSERT_TRUE(chrome_map.GetValue(kNewPolicy1, base::Value::Type::INTEGER));
EXPECT_EQ(base::Value(kOldValue1),
*chrome_map.GetValue(kNewPolicy1, base::Value::Type::INTEGER));
ASSERT_TRUE(chrome_map.GetValue(kNewPolicy2, base::Value::Type::INTEGER));
EXPECT_EQ(base::Value(kOldValue2),
*chrome_map.GetValue(kNewPolicy2, base::Value::Type::INTEGER));
// kNewPolicy3 is already set, and should not be overwritten.
ASSERT_TRUE(chrome_map.GetValue(kNewPolicy3, base::Value::Type::INTEGER));
EXPECT_EQ(base::Value(kNewValue3),
*chrome_map.GetValue(kNewPolicy3, base::Value::Type::INTEGER));
// This policy was transformed by MultiplyByTwo.
ASSERT_TRUE(chrome_map.GetValue(kNewPolicy4, base::Value::Type::INTEGER));
EXPECT_EQ(base::Value(kNewValue4),
*chrome_map.GetValue(kNewPolicy4, base::Value::Type::INTEGER));
}
TEST(ChromeExtensionPolicyMigratorTest, DeprecatedWarnings) {
PolicyBundle bundle;
PolicyMap& chrome_map = bundle.Get(
PolicyNamespace(POLICY_DOMAIN_CHROME, /* component_id */ std::string()));
PolicyMap& extension_map =
bundle.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtensionId));
SetPolicy(&extension_map, kOldPolicy1, base::Value(kOldValue1));
TestingPolicyMigrator().Migrate(&bundle);
// Policies in kMigrations should be renamed + copied into the Chrome domain.
EXPECT_EQ(1u, chrome_map.size());
ASSERT_TRUE(chrome_map.GetValue(kNewPolicy1, base::Value::Type::INTEGER));
base::RepeatingCallback<std::u16string(int)> l10nlookup =
base::BindRepeating(&l10n_util::GetStringUTF16);
EXPECT_FALSE(
chrome_map.Get(kNewPolicy1)
->GetLocalizedMessages(PolicyMap::MessageType::kWarning, l10nlookup)
.empty());
}
} // namespace policy
|