Commit f60a8fe2 authored by Yann Dago's avatar Yann Dago Committed by Commit Bot

Policy: reduce number of copy for policy conflicts

Policy conflicts used to be deep copied when merging policies, they are
now simply moved using std::move instead of being deep copied.

Bug: 1006422
Change-Id: I71239424fd7c2b31fc39c56e6f703bf68b6bd241
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1827545Reviewed-by: default avatarGreg Thompson <grt@chromium.org>
Reviewed-by: default avatarJulian Pastarmov <pastarmovj@chromium.org>
Commit-Queue: Yann Dago <ydago@chromium.org>
Cr-Commit-Position: refs/heads/master@{#703711}
parent d8e884d8
...@@ -246,7 +246,7 @@ TEST_F(ConfigDirPolicyLoaderTest, ReadPrefsMergePrefs) { ...@@ -246,7 +246,7 @@ TEST_F(ConfigDirPolicyLoaderTest, ReadPrefsMergePrefs) {
conflict_policy.value = std::make_unique<base::Value>("http://bar.com"); conflict_policy.value = std::make_unique<base::Value>("http://bar.com");
expected_bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) expected_bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
.GetMutable(kHomepageLocation) .GetMutable(kHomepageLocation)
->AddConflictingPolicy(conflict_policy); ->AddConflictingPolicy(std::move(conflict_policy));
expected_bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) expected_bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
.GetMutable(kHomepageLocation) .GetMutable(kHomepageLocation)
->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE); ->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE);
......
...@@ -194,9 +194,9 @@ TEST(PolicyBundleTest, MergeFrom) { ...@@ -194,9 +194,9 @@ TEST(PolicyBundleTest, MergeFrom) {
expected.Set(kPolicyClashing0, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, expected.Set(kPolicyClashing0, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD, std::make_unique<base::Value>(0), nullptr); POLICY_SOURCE_CLOUD, std::make_unique<base::Value>(0), nullptr);
expected.GetMutable(kPolicyClashing0) expected.GetMutable(kPolicyClashing0)
->AddConflictingPolicy(*policy1.Get(kPolicyClashing0)); ->AddConflictingPolicy(policy1.Get(kPolicyClashing0)->DeepCopy());
expected.GetMutable(kPolicyClashing0) expected.GetMutable(kPolicyClashing0)
->AddConflictingPolicy(*policy2.Get(kPolicyClashing0)); ->AddConflictingPolicy(policy2.Get(kPolicyClashing0)->DeepCopy());
expected.GetMutable(kPolicyClashing0) expected.GetMutable(kPolicyClashing0)
->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE); ->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE);
expected.GetMutable(kPolicyClashing0) expected.GetMutable(kPolicyClashing0)
...@@ -204,9 +204,9 @@ TEST(PolicyBundleTest, MergeFrom) { ...@@ -204,9 +204,9 @@ TEST(PolicyBundleTest, MergeFrom) {
expected.Set(kPolicyClashing1, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, expected.Set(kPolicyClashing1, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
POLICY_SOURCE_CLOUD, std::make_unique<base::Value>(1), nullptr); POLICY_SOURCE_CLOUD, std::make_unique<base::Value>(1), nullptr);
expected.GetMutable(kPolicyClashing1) expected.GetMutable(kPolicyClashing1)
->AddConflictingPolicy(*policy0.Get(kPolicyClashing1)); ->AddConflictingPolicy(policy0.Get(kPolicyClashing1)->DeepCopy());
expected.GetMutable(kPolicyClashing1) expected.GetMutable(kPolicyClashing1)
->AddConflictingPolicy(*policy2.Get(kPolicyClashing1)); ->AddConflictingPolicy(policy2.Get(kPolicyClashing1)->DeepCopy());
expected.GetMutable(kPolicyClashing1) expected.GetMutable(kPolicyClashing1)
->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE); ->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE);
expected.GetMutable(kPolicyClashing1) expected.GetMutable(kPolicyClashing1)
......
...@@ -464,7 +464,7 @@ TEST_F(PolicyLoaderWinTest, HKLMOverHKCU) { ...@@ -464,7 +464,7 @@ TEST_F(PolicyLoaderWinTest, HKLMOverHKCU) {
std::make_unique<base::Value>("hkcu"), nullptr); std::make_unique<base::Value>("hkcu"), nullptr);
expected.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) expected.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
.GetMutable(test_keys::kKeyString) .GetMutable(test_keys::kKeyString)
->AddConflictingPolicy(conflict); ->AddConflictingPolicy(std::move(conflict));
EXPECT_TRUE(Matches(expected)); EXPECT_TRUE(Matches(expected));
} }
...@@ -530,9 +530,12 @@ TEST_F(PolicyLoaderWinTest, Merge3rdPartyPolicies) { ...@@ -530,9 +530,12 @@ TEST_F(PolicyLoaderWinTest, Merge3rdPartyPolicies) {
PolicyMap::Entry a_conflict_3( PolicyMap::Entry a_conflict_3(
POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, POLICY_SOURCE_PLATFORM, POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, POLICY_SOURCE_PLATFORM,
std::make_unique<base::Value>(kUserRecommended), nullptr); std::make_unique<base::Value>(kUserRecommended), nullptr);
expected_policy.GetMutable("a")->AddConflictingPolicy(a_conflict_1); expected_policy.GetMutable("a")->AddConflictingPolicy(
expected_policy.GetMutable("a")->AddConflictingPolicy(a_conflict_2); std::move(a_conflict_1));
expected_policy.GetMutable("a")->AddConflictingPolicy(a_conflict_3); expected_policy.GetMutable("a")->AddConflictingPolicy(
std::move(a_conflict_2));
expected_policy.GetMutable("a")->AddConflictingPolicy(
std::move(a_conflict_3));
expected_policy.Set("b", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, expected_policy.Set("b", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_PLATFORM, POLICY_SOURCE_PLATFORM,
...@@ -546,8 +549,10 @@ TEST_F(PolicyLoaderWinTest, Merge3rdPartyPolicies) { ...@@ -546,8 +549,10 @@ TEST_F(PolicyLoaderWinTest, Merge3rdPartyPolicies) {
PolicyMap::Entry b_conflict_2( PolicyMap::Entry b_conflict_2(
POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, POLICY_SOURCE_PLATFORM, POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, POLICY_SOURCE_PLATFORM,
std::make_unique<base::Value>(kUserRecommended), nullptr); std::make_unique<base::Value>(kUserRecommended), nullptr);
expected_policy.GetMutable("b")->AddConflictingPolicy(b_conflict_1); expected_policy.GetMutable("b")->AddConflictingPolicy(
expected_policy.GetMutable("b")->AddConflictingPolicy(b_conflict_2); std::move(b_conflict_1));
expected_policy.GetMutable("b")->AddConflictingPolicy(
std::move(b_conflict_2));
expected_policy.Set("c", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_MACHINE, expected_policy.Set("c", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_MACHINE,
POLICY_SOURCE_PLATFORM, POLICY_SOURCE_PLATFORM,
...@@ -558,7 +563,8 @@ TEST_F(PolicyLoaderWinTest, Merge3rdPartyPolicies) { ...@@ -558,7 +563,8 @@ TEST_F(PolicyLoaderWinTest, Merge3rdPartyPolicies) {
PolicyMap::Entry c_conflict_1( PolicyMap::Entry c_conflict_1(
POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, POLICY_SOURCE_PLATFORM, POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, POLICY_SOURCE_PLATFORM,
std::make_unique<base::Value>(kUserRecommended), nullptr); std::make_unique<base::Value>(kUserRecommended), nullptr);
expected_policy.GetMutable("c")->AddConflictingPolicy(c_conflict_1); expected_policy.GetMutable("c")->AddConflictingPolicy(
std::move(c_conflict_1));
expected_policy.Set("d", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, expected_policy.Set("d", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER,
POLICY_SOURCE_PLATFORM, POLICY_SOURCE_PLATFORM,
......
...@@ -55,34 +55,24 @@ PolicyMap::Entry::Entry(Entry&&) noexcept = default; ...@@ -55,34 +55,24 @@ PolicyMap::Entry::Entry(Entry&&) noexcept = default;
PolicyMap::Entry& PolicyMap::Entry::operator=(Entry&&) noexcept = default; PolicyMap::Entry& PolicyMap::Entry::operator=(Entry&&) noexcept = default;
PolicyMap::Entry PolicyMap::Entry::DeepCopy() const { PolicyMap::Entry PolicyMap::Entry::DeepCopy() const {
Entry copy; Entry copy(level, scope, source, value ? value->CreateDeepCopy() : nullptr,
copy.level = level; external_data_fetcher
copy.scope = scope; ? std::make_unique<ExternalDataFetcher>(*external_data_fetcher)
copy.source = source; : nullptr);
if (value)
copy.value = value->CreateDeepCopy();
copy.error_strings_ = error_strings_; copy.error_strings_ = error_strings_;
copy.error_message_ids_ = error_message_ids_; copy.error_message_ids_ = error_message_ids_;
copy.warning_message_ids_ = warning_message_ids_; copy.warning_message_ids_ = warning_message_ids_;
if (external_data_fetcher) { copy.conflicts.reserve(conflicts.size());
copy.external_data_fetcher.reset(
new ExternalDataFetcher(*external_data_fetcher));
}
for (const auto& conflict : conflicts) { for (const auto& conflict : conflicts) {
copy.AddConflictingPolicy(conflict); copy.AddConflictingPolicy(conflict.DeepCopy());
} }
return copy; return copy;
} }
bool PolicyMap::Entry::has_higher_priority_than( bool PolicyMap::Entry::has_higher_priority_than(
const PolicyMap::Entry& other) const { const PolicyMap::Entry& other) const {
if (level != other.level) return std::tie(level, scope, source) >
return level > other.level; std::tie(other.level, other.scope, other.source);
if (scope != other.scope)
return scope > other.scope;
return source > other.source;
} }
bool PolicyMap::Entry::Equals(const PolicyMap::Entry& other) const { bool PolicyMap::Entry::Equals(const PolicyMap::Entry& other) const {
...@@ -116,19 +106,15 @@ void PolicyMap::Entry::AddWarning(int message_id) { ...@@ -116,19 +106,15 @@ void PolicyMap::Entry::AddWarning(int message_id) {
warning_message_ids_.insert(message_id); warning_message_ids_.insert(message_id);
} }
void PolicyMap::Entry::AddConflictingPolicy(const Entry& conflict) { void PolicyMap::Entry::AddConflictingPolicy(Entry&& conflict) {
Entry conflicted_policy_copy = conflict.DeepCopy(); // Move all of the newly conflicting Entry's conflicts into this Entry.
std::move(conflict.conflicts.begin(), conflict.conflicts.end(),
for (const auto& conflict : conflicted_policy_copy.conflicts) { std::back_inserter(conflicts));
AddConflictingPolicy(conflict);
}
// Avoid conflict nesting // Avoid conflict nesting
conflicted_policy_copy.conflicts.clear(); conflicts.emplace_back(conflict.level, conflict.scope, conflict.source,
conflicted_policy_copy.error_message_ids_.clear(); std::move(conflict.value),
conflicted_policy_copy.warning_message_ids_.clear(); std::move(conflict.external_data_fetcher));
conflicted_policy_copy.error_strings_.clear();
conflicts.push_back(std::move(conflicted_policy_copy));
} }
void PolicyMap::Entry::ClearConflicts() { void PolicyMap::Entry::ClearConflicts() {
...@@ -278,35 +264,37 @@ std::unique_ptr<PolicyMap> PolicyMap::DeepCopy() const { ...@@ -278,35 +264,37 @@ std::unique_ptr<PolicyMap> PolicyMap::DeepCopy() const {
} }
void PolicyMap::MergeFrom(const PolicyMap& other) { void PolicyMap::MergeFrom(const PolicyMap& other) {
for (const auto& it : other) { for (const auto& policy_and_entry : other) {
Entry* current_policy = GetMutableUntrusted(it.first); Entry* current_policy = GetMutableUntrusted(policy_and_entry.first);
auto other_policy = it.second.DeepCopy(); Entry other_policy = policy_and_entry.second.DeepCopy();
if (!current_policy) { if (!current_policy) {
Set(it.first, std::move(other_policy)); Set(policy_and_entry.first, std::move(other_policy));
continue; continue;
} }
auto& new_policy = other_policy.has_higher_priority_than(*current_policy) const bool other_is_higher_priority =
? other_policy policy_and_entry.second.has_higher_priority_than(*current_policy);
: *current_policy;
auto& conflict = Entry& higher_policy =
current_policy == &new_policy ? other_policy : *current_policy; other_is_higher_priority ? other_policy : *current_policy;
Entry& conflicting_policy =
other_is_higher_priority ? *current_policy : other_policy;
bool overwriting_default_policy = const bool overwriting_default_policy =
new_policy.source != conflict.source && higher_policy.source != conflicting_policy.source &&
conflict.source == POLICY_SOURCE_ENTERPRISE_DEFAULT; conflicting_policy.source == POLICY_SOURCE_ENTERPRISE_DEFAULT;
if (!overwriting_default_policy) { if (!overwriting_default_policy) {
new_policy.AddConflictingPolicy(conflict); higher_policy.AddConflictingPolicy(std::move(conflicting_policy));
new_policy.AddWarning( higher_policy.AddWarning(
(current_policy->value && (current_policy->value &&
it.second.value->Equals(current_policy->value.get())) *policy_and_entry.second.value == *current_policy->value)
? IDS_POLICY_CONFLICT_SAME_VALUE ? IDS_POLICY_CONFLICT_SAME_VALUE
: IDS_POLICY_CONFLICT_DIFF_VALUE); : IDS_POLICY_CONFLICT_DIFF_VALUE);
} }
if (current_policy != &new_policy) if (other_is_higher_priority)
Set(it.first, std::move(new_policy)); *current_policy = std::move(other_policy);
} }
} }
......
...@@ -73,7 +73,7 @@ class POLICY_EXPORT PolicyMap { ...@@ -73,7 +73,7 @@ class POLICY_EXPORT PolicyMap {
void AddWarning(int message_id); void AddWarning(int message_id);
// Adds a conflicting policy. // Adds a conflicting policy.
void AddConflictingPolicy(const Entry& conflict); void AddConflictingPolicy(Entry&& conflict);
// Removes all the conflicts. // Removes all the conflicts.
void ClearConflicts(); void ClearConflicts();
......
...@@ -264,31 +264,34 @@ TEST_F(PolicyMapTest, MergeFrom) { ...@@ -264,31 +264,34 @@ TEST_F(PolicyMapTest, MergeFrom) {
POLICY_SOURCE_CLOUD, std::make_unique<base::Value>("chromium.org"), POLICY_SOURCE_CLOUD, std::make_unique<base::Value>("chromium.org"),
nullptr); nullptr);
c.GetMutable(kTestPolicyName1)->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE); c.GetMutable(kTestPolicyName1)->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE);
c.GetMutable(kTestPolicyName1)->AddConflictingPolicy(conflicted_policy_1); c.GetMutable(kTestPolicyName1)
->AddConflictingPolicy(std::move(conflicted_policy_1));
// |a| has precedence over |b|. // |a| has precedence over |b|.
c.Set(kTestPolicyName2, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, c.Set(kTestPolicyName2, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
POLICY_SOURCE_CLOUD, std::make_unique<base::Value>(true), nullptr); POLICY_SOURCE_CLOUD, std::make_unique<base::Value>(true), nullptr);
c.GetMutable(kTestPolicyName2)->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE); c.GetMutable(kTestPolicyName2)->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE);
c.GetMutable(kTestPolicyName2) c.GetMutable(kTestPolicyName2)
->AddConflictingPolicy(*b.Get(kTestPolicyName2)); ->AddConflictingPolicy(b.Get(kTestPolicyName2)->DeepCopy());
c.Set(kTestPolicyName3, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, c.Set(kTestPolicyName3, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
POLICY_SOURCE_ENTERPRISE_DEFAULT, nullptr, POLICY_SOURCE_ENTERPRISE_DEFAULT, nullptr,
CreateExternalDataFetcher("a")); CreateExternalDataFetcher("a"));
c.GetMutable(kTestPolicyName3)->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE); c.GetMutable(kTestPolicyName3)->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE);
c.GetMutable(kTestPolicyName3) c.GetMutable(kTestPolicyName3)
->AddConflictingPolicy(*b.Get(kTestPolicyName3)); ->AddConflictingPolicy(b.Get(kTestPolicyName3)->DeepCopy());
// POLICY_SCOPE_MACHINE over POLICY_SCOPE_USER for POLICY_LEVEL_RECOMMENDED. // POLICY_SCOPE_MACHINE over POLICY_SCOPE_USER for POLICY_LEVEL_RECOMMENDED.
c.Set(kTestPolicyName4, POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_MACHINE, c.Set(kTestPolicyName4, POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_MACHINE,
POLICY_SOURCE_DEVICE_LOCAL_ACCOUNT_OVERRIDE, POLICY_SOURCE_DEVICE_LOCAL_ACCOUNT_OVERRIDE,
std::make_unique<base::Value>(true), nullptr); std::make_unique<base::Value>(true), nullptr);
c.GetMutable(kTestPolicyName4)->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE); c.GetMutable(kTestPolicyName4)->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE);
c.GetMutable(kTestPolicyName4)->AddConflictingPolicy(conflicted_policy_4); c.GetMutable(kTestPolicyName4)
->AddConflictingPolicy(std::move(conflicted_policy_4));
// POLICY_LEVEL_MANDATORY over POLICY_LEVEL_RECOMMENDED. // POLICY_LEVEL_MANDATORY over POLICY_LEVEL_RECOMMENDED.
c.Set(kTestPolicyName5, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, c.Set(kTestPolicyName5, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
POLICY_SOURCE_PLATFORM, std::make_unique<base::Value>(std::string()), POLICY_SOURCE_PLATFORM, std::make_unique<base::Value>(std::string()),
nullptr); nullptr);
c.GetMutable(kTestPolicyName5)->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE); c.GetMutable(kTestPolicyName5)->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE);
c.GetMutable(kTestPolicyName5)->AddConflictingPolicy(conflicted_policy_5); c.GetMutable(kTestPolicyName5)
->AddConflictingPolicy(std::move(conflicted_policy_5));
// Merge new ones. // Merge new ones.
c.Set(kTestPolicyName6, POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, c.Set(kTestPolicyName6, POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD, std::make_unique<base::Value>(true), nullptr); POLICY_SOURCE_CLOUD, std::make_unique<base::Value>(true), nullptr);
...@@ -302,7 +305,8 @@ TEST_F(PolicyMapTest, MergeFrom) { ...@@ -302,7 +305,8 @@ TEST_F(PolicyMapTest, MergeFrom) {
POLICY_SOURCE_ACTIVE_DIRECTORY, POLICY_SOURCE_ACTIVE_DIRECTORY,
std::make_unique<base::Value>("blocked AD policy"), nullptr); std::make_unique<base::Value>("blocked AD policy"), nullptr);
c.GetMutable(kTestPolicyName8)->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE); c.GetMutable(kTestPolicyName8)->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE);
c.GetMutable(kTestPolicyName8)->AddConflictingPolicy(conflicted_policy_8); c.GetMutable(kTestPolicyName8)
->AddConflictingPolicy(std::move(conflicted_policy_8));
c.GetMutable(kTestPolicyName8)->SetBlocked(); c.GetMutable(kTestPolicyName8)->SetBlocked();
EXPECT_TRUE(a.Equals(c)); EXPECT_TRUE(a.Equals(c));
...@@ -363,7 +367,7 @@ TEST_F(PolicyMapTest, MergeValuesList) { ...@@ -363,7 +367,7 @@ TEST_F(PolicyMapTest, MergeValuesList) {
PolicyMap::Entry expected_case1(POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, PolicyMap::Entry expected_case1(POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_MERGED, POLICY_SOURCE_MERGED,
std::make_unique<base::Value>(abcd), nullptr); std::make_unique<base::Value>(abcd), nullptr);
expected_case1.AddConflictingPolicy(case1); expected_case1.AddConflictingPolicy(case1.DeepCopy());
// Case 2 - kTestPolicyName2 // Case 2 - kTestPolicyName2
// Policies should only be merged with other policies with the same target, // Policies should only be merged with other policies with the same target,
...@@ -383,7 +387,7 @@ TEST_F(PolicyMapTest, MergeValuesList) { ...@@ -383,7 +387,7 @@ TEST_F(PolicyMapTest, MergeValuesList) {
PolicyMap::Entry expected_case2( PolicyMap::Entry expected_case2(
POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_MACHINE, POLICY_SOURCE_MERGED, POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_MACHINE, POLICY_SOURCE_MERGED,
std::make_unique<base::Value>(int1234), nullptr); std::make_unique<base::Value>(int1234), nullptr);
expected_case2.AddConflictingPolicy(case2); expected_case2.AddConflictingPolicy(case2.DeepCopy());
// Case 3 - kTestPolicyName3 // Case 3 - kTestPolicyName3
// Trivial case with 2 sources. // Trivial case with 2 sources.
...@@ -400,7 +404,7 @@ TEST_F(PolicyMapTest, MergeValuesList) { ...@@ -400,7 +404,7 @@ TEST_F(PolicyMapTest, MergeValuesList) {
std::make_unique<base::Value>(abcd), nullptr); std::make_unique<base::Value>(abcd), nullptr);
auto case3_blocked_by_group = expected_case3.DeepCopy(); auto case3_blocked_by_group = expected_case3.DeepCopy();
case3_blocked_by_group.SetIgnoredByPolicyAtomicGroup(); case3_blocked_by_group.SetIgnoredByPolicyAtomicGroup();
expected_case3.AddConflictingPolicy(case3); expected_case3.AddConflictingPolicy(case3.DeepCopy());
// Case 4 - kTestPolicyName4 // Case 4 - kTestPolicyName4
// Policies with a single source should stay the same. // Policies with a single source should stay the same.
...@@ -410,7 +414,7 @@ TEST_F(PolicyMapTest, MergeValuesList) { ...@@ -410,7 +414,7 @@ TEST_F(PolicyMapTest, MergeValuesList) {
PolicyMap::Entry expected_case4(POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, PolicyMap::Entry expected_case4(POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
POLICY_SOURCE_MERGED, POLICY_SOURCE_MERGED,
std::make_unique<base::Value>(ef), nullptr); std::make_unique<base::Value>(ef), nullptr);
expected_case4.AddConflictingPolicy(case4); expected_case4.AddConflictingPolicy(case4.DeepCopy());
// Case 5 - kTestPolicyName5 // Case 5 - kTestPolicyName5
// Policies that are not lists should not be merged. // Policies that are not lists should not be merged.
...@@ -440,7 +444,7 @@ TEST_F(PolicyMapTest, MergeValuesList) { ...@@ -440,7 +444,7 @@ TEST_F(PolicyMapTest, MergeValuesList) {
PolicyMap::Entry expected_case6(POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, PolicyMap::Entry expected_case6(POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_MERGED, POLICY_SOURCE_MERGED,
std::make_unique<base::Value>(ab), nullptr); std::make_unique<base::Value>(ab), nullptr);
expected_case6.AddConflictingPolicy(case6); expected_case6.AddConflictingPolicy(case6.DeepCopy());
// Case 7 - kTestPolicyName7 // Case 7 - kTestPolicyName7
// Lists of dictionaries should not have duplicates. // Lists of dictionaries should not have duplicates.
...@@ -460,7 +464,7 @@ TEST_F(PolicyMapTest, MergeValuesList) { ...@@ -460,7 +464,7 @@ TEST_F(PolicyMapTest, MergeValuesList) {
PolicyMap::Entry expected_case7( PolicyMap::Entry expected_case7(
POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, POLICY_SOURCE_MERGED, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, POLICY_SOURCE_MERGED,
std::make_unique<base::Value>(list_dict_abcd), nullptr); std::make_unique<base::Value>(list_dict_abcd), nullptr);
expected_case7.AddConflictingPolicy(case7); expected_case7.AddConflictingPolicy(case7.DeepCopy());
PolicyMap policy_not_merged; PolicyMap policy_not_merged;
policy_not_merged.Set(kTestPolicyName1, case1.DeepCopy()); policy_not_merged.Set(kTestPolicyName1, case1.DeepCopy());
...@@ -570,7 +574,7 @@ TEST_F(PolicyMapTest, MergeDictionaryValues) { ...@@ -570,7 +574,7 @@ TEST_F(PolicyMapTest, MergeDictionaryValues) {
PolicyMap::Entry expected_case1( PolicyMap::Entry expected_case1(
POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, POLICY_SOURCE_MERGED, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, POLICY_SOURCE_MERGED,
base::Value::ToUniquePtrValue(merged_dict_case1.Clone()), nullptr); base::Value::ToUniquePtrValue(merged_dict_case1.Clone()), nullptr);
expected_case1.AddConflictingPolicy(case1); expected_case1.AddConflictingPolicy(case1.DeepCopy());
// Case - kTestPolicyName2 // Case - kTestPolicyName2
// Policies should only be merged with other policies with the same target, // Policies should only be merged with other policies with the same target,
...@@ -595,7 +599,7 @@ TEST_F(PolicyMapTest, MergeDictionaryValues) { ...@@ -595,7 +599,7 @@ TEST_F(PolicyMapTest, MergeDictionaryValues) {
PolicyMap::Entry expected_case2( PolicyMap::Entry expected_case2(
POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_MACHINE, POLICY_SOURCE_MERGED, POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_MACHINE, POLICY_SOURCE_MERGED,
base::Value::ToUniquePtrValue(merged_dict_case2.Clone()), nullptr); base::Value::ToUniquePtrValue(merged_dict_case2.Clone()), nullptr);
expected_case2.AddConflictingPolicy(case2); expected_case2.AddConflictingPolicy(case2.DeepCopy());
// Case 3 - kTestPolicyName3 // Case 3 - kTestPolicyName3
// Enterprise default policies should not be merged with other sources. // Enterprise default policies should not be merged with other sources.
...@@ -624,7 +628,7 @@ TEST_F(PolicyMapTest, MergeDictionaryValues) { ...@@ -624,7 +628,7 @@ TEST_F(PolicyMapTest, MergeDictionaryValues) {
PolicyMap::Entry expected_case3( PolicyMap::Entry expected_case3(
POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, POLICY_SOURCE_MERGED, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, POLICY_SOURCE_MERGED,
base::Value::ToUniquePtrValue(merged_dict_case3.Clone()), nullptr); base::Value::ToUniquePtrValue(merged_dict_case3.Clone()), nullptr);
expected_case3.AddConflictingPolicy(case3); expected_case3.AddConflictingPolicy(case3.DeepCopy());
// Case 4 - kTestPolicyName4 // Case 4 - kTestPolicyName4
// Policies with a single source should be merged. // Policies with a single source should be merged.
...@@ -635,7 +639,7 @@ TEST_F(PolicyMapTest, MergeDictionaryValues) { ...@@ -635,7 +639,7 @@ TEST_F(PolicyMapTest, MergeDictionaryValues) {
PolicyMap::Entry expected_case4( PolicyMap::Entry expected_case4(
POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, POLICY_SOURCE_MERGED, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, POLICY_SOURCE_MERGED,
base::Value::ToUniquePtrValue(dict_a.Clone()), nullptr); base::Value::ToUniquePtrValue(dict_a.Clone()), nullptr);
expected_case4.AddConflictingPolicy(case4); expected_case4.AddConflictingPolicy(case4.DeepCopy());
// Case 5 - kTestPolicyName5 // Case 5 - kTestPolicyName5
// Policies that are not dictionaries should not be merged. // Policies that are not dictionaries should not be merged.
...@@ -666,7 +670,7 @@ TEST_F(PolicyMapTest, MergeDictionaryValues) { ...@@ -666,7 +670,7 @@ TEST_F(PolicyMapTest, MergeDictionaryValues) {
PolicyMap::Entry expected_case6( PolicyMap::Entry expected_case6(
POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, POLICY_SOURCE_MERGED, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, POLICY_SOURCE_MERGED,
base::Value::ToUniquePtrValue(dict_a.Clone()), nullptr); base::Value::ToUniquePtrValue(dict_a.Clone()), nullptr);
expected_case6.AddConflictingPolicy(case6); expected_case6.AddConflictingPolicy(case6.DeepCopy());
// Case 7 - kTestPolicyName7 // Case 7 - kTestPolicyName7
// Policies that are not dictionaries should not be merged. // Policies that are not dictionaries should not be merged.
...@@ -939,8 +943,8 @@ TEST_F(PolicyMapTest, EntryAddConflict) { ...@@ -939,8 +943,8 @@ TEST_F(PolicyMapTest, EntryAddConflict) {
PolicyMap::Entry entry_c = entry_a.DeepCopy(); PolicyMap::Entry entry_c = entry_a.DeepCopy();
entry_c.source = POLICY_SOURCE_PLATFORM; entry_c.source = POLICY_SOURCE_PLATFORM;
entry_b.AddConflictingPolicy(entry_c); entry_b.AddConflictingPolicy(entry_c.DeepCopy());
entry_a.AddConflictingPolicy(entry_b); entry_a.AddConflictingPolicy(entry_b.DeepCopy());
EXPECT_TRUE(entry_a.conflicts.size() == 2); EXPECT_TRUE(entry_a.conflicts.size() == 2);
EXPECT_TRUE(entry_b.conflicts.size() == 1); EXPECT_TRUE(entry_b.conflicts.size() == 1);
......
...@@ -122,7 +122,7 @@ void PolicyListMerger::DoMerge(PolicyMap::Entry* policy) const { ...@@ -122,7 +122,7 @@ void PolicyListMerger::DoMerge(PolicyMap::Entry* policy) const {
policy->value.reset(new_value); policy->value.reset(new_value);
} }
policy->ClearConflicts(); policy->ClearConflicts();
policy->AddConflictingPolicy(new_conflict); policy->AddConflictingPolicy(std::move(new_conflict));
policy->source = POLICY_SOURCE_MERGED; policy->source = POLICY_SOURCE_MERGED;
} }
...@@ -212,7 +212,7 @@ void PolicyDictionaryMerger::DoMerge(PolicyMap::Entry* policy) const { ...@@ -212,7 +212,7 @@ void PolicyDictionaryMerger::DoMerge(PolicyMap::Entry* policy) const {
policy->value = base::Value::ToUniquePtrValue(std::move(merged_dictionary)); policy->value = base::Value::ToUniquePtrValue(std::move(merged_dictionary));
policy->ClearConflicts(); policy->ClearConflicts();
policy->AddConflictingPolicy(new_conflict); policy->AddConflictingPolicy(std::move(new_conflict));
policy->source = POLICY_SOURCE_MERGED; policy->source = POLICY_SOURCE_MERGED;
} }
......
...@@ -403,8 +403,10 @@ TEST_F(PolicyServiceTest, Priorities) { ...@@ -403,8 +403,10 @@ TEST_F(PolicyServiceTest, Priorities) {
provider0_.UpdateChromePolicy(policy0_); provider0_.UpdateChromePolicy(policy0_);
provider1_.UpdateChromePolicy(policy1_); provider1_.UpdateChromePolicy(policy1_);
provider2_.UpdateChromePolicy(policy2_); provider2_.UpdateChromePolicy(policy2_);
expected.GetMutable("aaa")->AddConflictingPolicy(*policy1_.Get("aaa")); expected.GetMutable("aaa")->AddConflictingPolicy(
expected.GetMutable("aaa")->AddConflictingPolicy(*policy2_.Get("aaa")); policy1_.Get("aaa")->DeepCopy());
expected.GetMutable("aaa")->AddConflictingPolicy(
policy2_.Get("aaa")->DeepCopy());
EXPECT_TRUE(VerifyPolicies( EXPECT_TRUE(VerifyPolicies(
PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()), expected)); PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()), expected));
...@@ -414,7 +416,8 @@ TEST_F(PolicyServiceTest, Priorities) { ...@@ -414,7 +416,8 @@ TEST_F(PolicyServiceTest, Priorities) {
expected.GetMutable("aaa")->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE); expected.GetMutable("aaa")->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE);
policy0_.Erase("aaa"); policy0_.Erase("aaa");
provider0_.UpdateChromePolicy(policy0_); provider0_.UpdateChromePolicy(policy0_);
expected.GetMutable("aaa")->AddConflictingPolicy(*policy2_.Get("aaa")); expected.GetMutable("aaa")->AddConflictingPolicy(
policy2_.Get("aaa")->DeepCopy());
EXPECT_TRUE(VerifyPolicies( EXPECT_TRUE(VerifyPolicies(
PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()), expected)); PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()), expected));
...@@ -423,7 +426,8 @@ TEST_F(PolicyServiceTest, Priorities) { ...@@ -423,7 +426,8 @@ TEST_F(PolicyServiceTest, Priorities) {
expected.GetMutable("aaa")->AddWarning(IDS_POLICY_CONFLICT_SAME_VALUE); expected.GetMutable("aaa")->AddWarning(IDS_POLICY_CONFLICT_SAME_VALUE);
policy1_.Set("aaa", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, policy1_.Set("aaa", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD, std::make_unique<base::Value>(1), nullptr); POLICY_SOURCE_CLOUD, std::make_unique<base::Value>(1), nullptr);
expected.GetMutable("aaa")->AddConflictingPolicy(*policy2_.Get("aaa")); expected.GetMutable("aaa")->AddConflictingPolicy(
policy2_.Get("aaa")->DeepCopy());
provider1_.UpdateChromePolicy(policy2_); provider1_.UpdateChromePolicy(policy2_);
EXPECT_TRUE(VerifyPolicies( EXPECT_TRUE(VerifyPolicies(
PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()), expected)); PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()), expected));
...@@ -577,12 +581,14 @@ TEST_F(PolicyServiceTest, NamespaceMerge) { ...@@ -577,12 +581,14 @@ TEST_F(PolicyServiceTest, NamespaceMerge) {
->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE); ->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE);
expected.GetMutable(kSameLevelPolicy) expected.GetMutable(kSameLevelPolicy)
->AddConflictingPolicy( ->AddConflictingPolicy(
*bundle1->Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) bundle1->Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
.Get(kSameLevelPolicy)); .Get(kSameLevelPolicy)
->DeepCopy());
expected.GetMutable(kSameLevelPolicy) expected.GetMutable(kSameLevelPolicy)
->AddConflictingPolicy( ->AddConflictingPolicy(
*bundle2->Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) bundle2->Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
.Get(kSameLevelPolicy)); .Get(kSameLevelPolicy)
->DeepCopy());
// For policies with different levels and scopes, the highest priority // For policies with different levels and scopes, the highest priority
// level/scope combination takes precedence, on every namespace. // level/scope combination takes precedence, on every namespace.
expected.Set(kDiffLevelPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, expected.Set(kDiffLevelPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
...@@ -592,12 +598,14 @@ TEST_F(PolicyServiceTest, NamespaceMerge) { ...@@ -592,12 +598,14 @@ TEST_F(PolicyServiceTest, NamespaceMerge) {
->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE); ->AddWarning(IDS_POLICY_CONFLICT_DIFF_VALUE);
expected.GetMutable(kDiffLevelPolicy) expected.GetMutable(kDiffLevelPolicy)
->AddConflictingPolicy( ->AddConflictingPolicy(
*bundle0->Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) bundle0->Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
.Get(kDiffLevelPolicy)); .Get(kDiffLevelPolicy)
->DeepCopy());
expected.GetMutable(kDiffLevelPolicy) expected.GetMutable(kDiffLevelPolicy)
->AddConflictingPolicy( ->AddConflictingPolicy(
*bundle1->Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) bundle1->Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
.Get(kDiffLevelPolicy)); .Get(kDiffLevelPolicy)
->DeepCopy());
provider0_.UpdatePolicy(std::move(bundle0)); provider0_.UpdatePolicy(std::move(bundle0));
provider1_.UpdatePolicy(std::move(bundle1)); provider1_.UpdatePolicy(std::move(bundle1));
......
...@@ -186,7 +186,7 @@ TEST_F(SchemaMapTest, FilterBundle) { ...@@ -186,7 +186,7 @@ TEST_F(SchemaMapTest, FilterBundle) {
expected_bundle.Get(chrome_ns) expected_bundle.Get(chrome_ns)
.GetMutable("ChromePolicy") .GetMutable("ChromePolicy")
->AddConflictingPolicy( ->AddConflictingPolicy(
*expected_bundle.Get(chrome_ns).Get("ChromePolicy")); expected_bundle.Get(chrome_ns).Get("ChromePolicy")->DeepCopy());
expected_bundle.Get(chrome_ns) expected_bundle.Get(chrome_ns)
.GetMutable("ChromePolicy") .GetMutable("ChromePolicy")
->AddWarning(IDS_POLICY_CONFLICT_SAME_VALUE); ->AddWarning(IDS_POLICY_CONFLICT_SAME_VALUE);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment