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 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
|
// Copyright 2022 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/updater/policy/policy_manager.h"
#include <memory>
#include <optional>
#include <string>
#include <utility>
#include <vector>
#include "base/memory/ref_counted.h"
#include "base/strings/strcat.h"
#include "base/values.h"
#include "chrome/updater/updater_scope.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace updater {
constexpr char kTestAppID[] = "{d07d2b56-f583-4631-9e8e-9942f63765be}";
constexpr char kTestAppIDForceInstall[] = "appidforceinstall";
class PolicyManagerTests : public ::testing::Test {};
TEST_F(PolicyManagerTests, NoPolicies) {
scoped_refptr<PolicyManagerInterface> policy_manager =
CreateDictPolicyManager({});
EXPECT_FALSE(policy_manager);
}
TEST_F(PolicyManagerTests, InvalidPolicies) {
base::Value::Dict policies;
policies.Set("autoupdatecheckperiodminutes", "NotAnInteger");
scoped_refptr<PolicyManagerInterface> policy_manager =
CreateDictPolicyManager(std::move(policies));
EXPECT_TRUE(policy_manager->HasActiveDevicePolicies());
EXPECT_EQ(policy_manager->source(), "DictValuePolicy");
EXPECT_EQ(policy_manager->CloudPolicyOverridesPlatformPolicy(), std::nullopt);
EXPECT_EQ(policy_manager->GetLastCheckPeriod(), std::nullopt);
EXPECT_EQ(policy_manager->GetUpdatesSuppressedTimes(), std::nullopt);
EXPECT_EQ(policy_manager->GetDownloadPreference(), std::nullopt);
EXPECT_EQ(policy_manager->GetPackageCacheSizeLimitMBytes(), std::nullopt);
EXPECT_EQ(policy_manager->GetPackageCacheExpirationTimeDays(), std::nullopt);
EXPECT_EQ(policy_manager->GetProxyMode(), std::nullopt);
EXPECT_EQ(policy_manager->GetProxyServer(), std::nullopt);
EXPECT_EQ(policy_manager->GetProxyPacUrl(), std::nullopt);
EXPECT_EQ(policy_manager->GetEffectivePolicyForAppInstalls(kTestAppID),
std::nullopt);
EXPECT_FALSE(policy_manager->GetEffectivePolicyForAppInstalls(
"non-exist-app-fallback-to-global"));
EXPECT_EQ(policy_manager->GetEffectivePolicyForAppUpdates(kTestAppID),
std::nullopt);
EXPECT_FALSE(policy_manager->GetEffectivePolicyForAppUpdates(
"non-exist-app-fallback-to-global"));
EXPECT_EQ(policy_manager->GetTargetChannel(kTestAppID), std::nullopt);
EXPECT_EQ(policy_manager->GetTargetChannel("non-exist-app"), std::nullopt);
EXPECT_EQ(policy_manager->GetTargetVersionPrefix(kTestAppID), std::nullopt);
EXPECT_EQ(policy_manager->GetTargetVersionPrefix("non-exist-app"),
std::nullopt);
EXPECT_EQ(policy_manager->IsRollbackToTargetVersionAllowed(kTestAppID),
std::nullopt);
EXPECT_FALSE(
policy_manager->IsRollbackToTargetVersionAllowed("non-exist-app"));
EXPECT_EQ(policy_manager->GetForceInstallApps(), std::nullopt);
}
TEST_F(PolicyManagerTests, PolicyRead) {
base::Value::Dict policies;
policies.Set("autoupdatecheckperiodminutes", 480);
policies.Set("updatessuppressedstarthour", 2);
policies.Set("updatessuppressedstartmin", 30);
policies.Set("updatessuppresseddurationmin", 500);
policies.Set("downloadpreference", "cacheable");
policies.Set("packagecachesizelimit", 100);
policies.Set("packagecachelifelimit", 45);
policies.Set("proxymode", "fixed_servers");
policies.Set("proxyserver", "http://foo.bar");
policies.Set("proxypacurl", "go/pac.url");
policies.Set("installdefault", 2);
policies.Set("updatedefault", 1);
// Set app policies
policies.Set(base::StrCat({"install", kTestAppID}), 3);
policies.Set(base::StrCat({"update", kTestAppID}), 2);
policies.Set(base::StrCat({"targetversionprefix", kTestAppID}), "55.55.");
policies.Set(base::StrCat({"targetchannel", kTestAppID}), "beta");
policies.Set(base::StrCat({"rollbacktotargetversion", kTestAppID}), 1);
policies.Set(base::StrCat({"install", kTestAppIDForceInstall}),
kPolicyForceInstallUser);
policies.Set(base::StrCat({"majorversionrollout", kTestAppID}), 1);
policies.Set(base::StrCat({"minorversionrollout", kTestAppID}), 2);
scoped_refptr<PolicyManagerInterface> policy_manager =
CreateDictPolicyManager(std::move(policies));
EXPECT_TRUE(policy_manager->HasActiveDevicePolicies());
EXPECT_EQ(policy_manager->CloudPolicyOverridesPlatformPolicy(), std::nullopt);
EXPECT_EQ(policy_manager->GetLastCheckPeriod(), base::Minutes(480));
std::optional<UpdatesSuppressedTimes> suppressed_times =
policy_manager->GetUpdatesSuppressedTimes();
ASSERT_TRUE(suppressed_times);
EXPECT_EQ(suppressed_times->start_hour_, 2);
EXPECT_EQ(suppressed_times->start_minute_, 30);
EXPECT_EQ(suppressed_times->duration_minute_, 500);
EXPECT_EQ(policy_manager->GetDownloadPreference(), "cacheable");
EXPECT_EQ(policy_manager->GetPackageCacheSizeLimitMBytes(), 100);
EXPECT_EQ(policy_manager->GetPackageCacheExpirationTimeDays(), 45);
EXPECT_EQ(policy_manager->GetProxyMode(), "fixed_servers");
EXPECT_EQ(policy_manager->GetProxyServer(), "http://foo.bar");
EXPECT_EQ(policy_manager->GetProxyPacUrl(), "go/pac.url");
EXPECT_EQ(policy_manager->GetEffectivePolicyForAppInstalls(kTestAppID), 3);
EXPECT_EQ(policy_manager->GetEffectivePolicyForAppInstalls(
"non-exist-app-fallback-to-global"),
2);
EXPECT_EQ(policy_manager->GetEffectivePolicyForAppUpdates(kTestAppID), 2);
EXPECT_EQ(policy_manager->GetEffectivePolicyForAppUpdates(
"non-exist-app-fallback-to-global"),
1);
EXPECT_EQ(policy_manager->GetTargetChannel(kTestAppID), "beta");
EXPECT_EQ(policy_manager->GetTargetChannel("non-exist-app"), std::nullopt);
EXPECT_EQ(policy_manager->GetTargetVersionPrefix(kTestAppID), "55.55.");
EXPECT_EQ(policy_manager->GetTargetVersionPrefix("non-exist-app"),
std::nullopt);
EXPECT_EQ(policy_manager->IsRollbackToTargetVersionAllowed(kTestAppID), true);
EXPECT_FALSE(
policy_manager->IsRollbackToTargetVersionAllowed("non-exist-app"));
EXPECT_EQ(policy_manager->GetMajorVersionRolloutPolicy(kTestAppID), 1);
EXPECT_EQ(policy_manager->GetMinorVersionRolloutPolicy(kTestAppID), 2);
EXPECT_FALSE(policy_manager->GetMajorVersionRolloutPolicy("non-exist-app"));
EXPECT_FALSE(policy_manager->GetMajorVersionRolloutPolicy("non-exist-app"));
std::optional<std::vector<std::string>> force_install_apps =
policy_manager->GetForceInstallApps();
ASSERT_EQ(force_install_apps.has_value(), !IsSystemInstall());
if (!IsSystemInstall()) {
ASSERT_EQ(force_install_apps->size(), 1U);
EXPECT_EQ(force_install_apps->at(0), kTestAppIDForceInstall);
}
}
TEST_F(PolicyManagerTests, WrongPolicyValueType) {
base::Value::Dict policies;
// Set global policies.
policies.Set("autoupdatecheckperiodminutes", "NotAnInteger");
policies.Set("updatessuppressedstarthour", "");
policies.Set("updatessuppressedstartmin", "30");
policies.Set("updatessuppresseddurationmin", "WrongType");
policies.Set("downloadpreference", 15);
policies.Set("packagecachesizelimit", "100");
policies.Set("packagecachelifelimit", "45");
policies.Set("proxymode", 10);
policies.Set("proxyserver", 1);
policies.Set("proxypacurl", 2);
policies.Set("installdefault", "install");
policies.Set("updatedefault", "automatic");
// Set app policies
policies.Set(base::StrCat({"install", kTestAppID}), "3");
policies.Set(base::StrCat({"update", kTestAppID}), "2");
policies.Set(base::StrCat({"targetversionprefix", kTestAppID}), 55);
policies.Set(base::StrCat({"targetchannel", kTestAppID}), 10);
policies.Set(base::StrCat({"rollbacktotargetversion", kTestAppID}), "1");
scoped_refptr<PolicyManagerInterface> policy_manager =
CreateDictPolicyManager(std::move(policies));
EXPECT_TRUE(policy_manager->HasActiveDevicePolicies());
EXPECT_EQ(policy_manager->CloudPolicyOverridesPlatformPolicy(), std::nullopt);
EXPECT_EQ(policy_manager->GetLastCheckPeriod(), std::nullopt);
EXPECT_EQ(policy_manager->GetUpdatesSuppressedTimes(), std::nullopt);
EXPECT_EQ(policy_manager->GetDownloadPreference(), std::nullopt);
EXPECT_EQ(policy_manager->GetPackageCacheSizeLimitMBytes(), std::nullopt);
EXPECT_EQ(policy_manager->GetPackageCacheExpirationTimeDays(), std::nullopt);
EXPECT_EQ(policy_manager->GetProxyMode(), std::nullopt);
EXPECT_EQ(policy_manager->GetProxyServer(), std::nullopt);
EXPECT_EQ(policy_manager->GetProxyPacUrl(), std::nullopt);
EXPECT_EQ(policy_manager->GetEffectivePolicyForAppInstalls(kTestAppID),
std::nullopt);
EXPECT_FALSE(policy_manager->GetEffectivePolicyForAppInstalls(
"non-exist-app-fallback-to-global"));
EXPECT_EQ(policy_manager->GetEffectivePolicyForAppUpdates(kTestAppID),
std::nullopt);
EXPECT_FALSE(policy_manager->GetEffectivePolicyForAppUpdates(
"non-exist-app-fallback-to-global"));
EXPECT_EQ(policy_manager->GetTargetChannel(kTestAppID), std::nullopt);
EXPECT_EQ(policy_manager->GetTargetChannel("non-exist-app"), std::nullopt);
EXPECT_EQ(policy_manager->GetTargetVersionPrefix(kTestAppID), std::nullopt);
EXPECT_EQ(policy_manager->GetTargetVersionPrefix("non-exist-app"),
std::nullopt);
EXPECT_EQ(policy_manager->IsRollbackToTargetVersionAllowed(kTestAppID),
std::nullopt);
EXPECT_FALSE(
policy_manager->IsRollbackToTargetVersionAllowed("non-exist-app"));
}
} // namespace updater
|