| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/component_updater/origin_trials_component_installer.h" | 5 #include "chrome/browser/component_updater/origin_trials_component_installer.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 namespace { | 23 namespace { |
| 24 | 24 |
| 25 // Mirror the constants used in the component installer. Do not share the | 25 // Mirror the constants used in the component installer. Do not share the |
| 26 // constants, as want to catch inadvertent changes in the tests. The keys will | 26 // constants, as want to catch inadvertent changes in the tests. The keys will |
| 27 // will be generated server-side, so any changes need to be intentional and | 27 // will be generated server-side, so any changes need to be intentional and |
| 28 // coordinated. | 28 // coordinated. |
| 29 static const char kManifestOriginTrialsKey[] = "origin-trials"; | 29 static const char kManifestOriginTrialsKey[] = "origin-trials"; |
| 30 static const char kManifestPublicKeyPath[] = "origin-trials.public-key"; | 30 static const char kManifestPublicKeyPath[] = "origin-trials.public-key"; |
| 31 static const char kManifestDisabledFeaturesPath[] = | 31 static const char kManifestDisabledFeaturesPath[] = |
| 32 "origin-trials.disabled-features"; | 32 "origin-trials.disabled-features"; |
| 33 static const char kManifestDisabledTokensPath[] = |
| 34 "origin-trials.disabled-tokens"; |
| 35 static const char kManifestDisabledTokenSignaturesPath[] = |
| 36 "origin-trials.disabled-tokens.signatures"; |
| 33 | 37 |
| 34 static const char kTestUpdateVersion[] = "1.0"; | 38 static const char kTestUpdateVersion[] = "1.0"; |
| 35 static const char kExistingPublicKey[] = "existing public key"; | 39 static const char kExistingPublicKey[] = "existing public key"; |
| 36 static const char kNewPublicKey[] = "new public key"; | 40 static const char kNewPublicKey[] = "new public key"; |
| 37 static const char kExistingDisabledFeature[] = "already disabled"; | 41 static const char kExistingDisabledFeature[] = "already disabled"; |
| 38 static const std::vector<std::string> kExistingDisabledFeatures = { | 42 static const std::vector<std::string> kExistingDisabledFeatures = { |
| 39 kExistingDisabledFeature}; | 43 kExistingDisabledFeature}; |
| 40 static const char kNewDisabledFeature1[] = "newly disabled 1"; | 44 static const char kNewDisabledFeature1[] = "newly disabled 1"; |
| 41 static const char kNewDisabledFeature2[] = "newly disabled 2"; | 45 static const char kNewDisabledFeature2[] = "newly disabled 2"; |
| 42 static const std::vector<std::string> kNewDisabledFeatures = { | 46 static const std::vector<std::string> kNewDisabledFeatures = { |
| 43 kNewDisabledFeature1, kNewDisabledFeature2}; | 47 kNewDisabledFeature1, kNewDisabledFeature2}; |
| 48 static const char kExistingDisabledToken[] = "already disabled token"; |
| 49 static const std::vector<std::string> kExistingDisabledTokens = { |
| 50 kExistingDisabledToken}; |
| 51 static const char kNewDisabledToken1[] = "newly disabled token 1"; |
| 52 static const char kNewDisabledToken2[] = "newly disabled token 2"; |
| 53 static const std::vector<std::string> kNewDisabledTokens = {kNewDisabledToken1, |
| 54 kNewDisabledToken2}; |
| 44 | 55 |
| 45 } // namespace | 56 } // namespace |
| 46 | 57 |
| 47 namespace component_updater { | 58 namespace component_updater { |
| 48 | 59 |
| 49 class OriginTrialsComponentInstallerTest : public PlatformTest { | 60 class OriginTrialsComponentInstallerTest : public PlatformTest { |
| 50 public: | 61 public: |
| 51 OriginTrialsComponentInstallerTest() | 62 OriginTrialsComponentInstallerTest() |
| 52 : testing_local_state_(TestingBrowserProcess::GetGlobal()) {} | 63 : testing_local_state_(TestingBrowserProcess::GetGlobal()) {} |
| 53 | 64 |
| 54 void SetUp() override { | 65 void SetUp() override { |
| 55 PlatformTest::SetUp(); | 66 PlatformTest::SetUp(); |
| 56 | 67 |
| 57 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 68 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 58 | 69 |
| 59 traits_.reset(new OriginTrialsComponentInstallerTraits()); | 70 traits_.reset(new OriginTrialsComponentInstallerTraits()); |
| 60 } | 71 } |
| 61 | 72 |
| 62 void LoadUpdates(std::unique_ptr<base::DictionaryValue> manifest) { | 73 void LoadUpdates(std::unique_ptr<base::DictionaryValue> manifest) { |
| 63 if (!manifest) { | 74 if (!manifest) { |
| 64 manifest = base::MakeUnique<base::DictionaryValue>(); | 75 manifest = base::MakeUnique<base::DictionaryValue>(); |
| 65 manifest->SetString(kManifestOriginTrialsKey, ""); | 76 manifest->Set(kManifestOriginTrialsKey, base::MakeUnique<base::Value>()); |
| 66 } | 77 } |
| 67 ASSERT_TRUE(traits_->VerifyInstallation(*manifest, temp_dir_.GetPath())); | 78 ASSERT_TRUE(traits_->VerifyInstallation(*manifest, temp_dir_.GetPath())); |
| 68 const base::Version expected_version(kTestUpdateVersion); | 79 const base::Version expected_version(kTestUpdateVersion); |
| 69 traits_->ComponentReady(expected_version, temp_dir_.GetPath(), | 80 traits_->ComponentReady(expected_version, temp_dir_.GetPath(), |
| 70 std::move(manifest)); | 81 std::move(manifest)); |
| 71 } | 82 } |
| 72 | 83 |
| 73 void AddDisabledFeaturesToPrefs(const std::vector<std::string>& features) { | 84 void AddDisabledFeaturesToPrefs(const std::vector<std::string>& features) { |
| 74 base::ListValue disabled_feature_list; | 85 base::ListValue disabled_feature_list; |
| 75 disabled_feature_list.AppendStrings(features); | 86 disabled_feature_list.AppendStrings(features); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 94 const bool found = disabled_feature_list->GetString(i, &disabled_feature); | 105 const bool found = disabled_feature_list->GetString(i, &disabled_feature); |
| 95 EXPECT_TRUE(found) << "Entry not found or not a string at index " << i; | 106 EXPECT_TRUE(found) << "Entry not found or not a string at index " << i; |
| 96 if (!found) { | 107 if (!found) { |
| 97 continue; | 108 continue; |
| 98 } | 109 } |
| 99 EXPECT_EQ(features[i], disabled_feature) | 110 EXPECT_EQ(features[i], disabled_feature) |
| 100 << "Feature lists differ at index " << i; | 111 << "Feature lists differ at index " << i; |
| 101 } | 112 } |
| 102 } | 113 } |
| 103 | 114 |
| 115 void AddDisabledTokensToPrefs(const std::vector<std::string>& tokens) { |
| 116 base::ListValue disabled_token_list; |
| 117 disabled_token_list.AppendStrings(tokens); |
| 118 ListPrefUpdate update(local_state(), prefs::kOriginTrialDisabledTokens); |
| 119 update->Swap(&disabled_token_list); |
| 120 } |
| 121 |
| 122 void CheckDisabledTokensPrefs(const std::vector<std::string>& tokens) { |
| 123 ASSERT_FALSE(tokens.empty()); |
| 124 |
| 125 ASSERT_TRUE(local_state()->HasPrefPath(prefs::kOriginTrialDisabledTokens)); |
| 126 |
| 127 const base::ListValue* disabled_token_list = |
| 128 local_state()->GetList(prefs::kOriginTrialDisabledTokens); |
| 129 ASSERT_TRUE(disabled_token_list); |
| 130 |
| 131 ASSERT_EQ(tokens.size(), disabled_token_list->GetSize()); |
| 132 |
| 133 std::string disabled_token; |
| 134 for (size_t i = 0; i < tokens.size(); ++i) { |
| 135 const bool found = disabled_token_list->GetString(i, &disabled_token); |
| 136 EXPECT_TRUE(found) << "Entry not found or not a string at index " << i; |
| 137 if (!found) { |
| 138 continue; |
| 139 } |
| 140 EXPECT_EQ(tokens[i], disabled_token) |
| 141 << "Token lists differ at index " << i; |
| 142 } |
| 143 } |
| 144 |
| 104 PrefService* local_state() { return g_browser_process->local_state(); } | 145 PrefService* local_state() { return g_browser_process->local_state(); } |
| 105 | 146 |
| 106 protected: | 147 protected: |
| 107 base::ScopedTempDir temp_dir_; | 148 base::ScopedTempDir temp_dir_; |
| 108 ScopedTestingLocalState testing_local_state_; | 149 ScopedTestingLocalState testing_local_state_; |
| 109 std::unique_ptr<ComponentInstallerTraits> traits_; | 150 std::unique_ptr<ComponentInstallerTraits> traits_; |
| 110 | 151 |
| 111 private: | 152 private: |
| 112 DISALLOW_COPY_AND_ASSIGN(OriginTrialsComponentInstallerTest); | 153 DISALLOW_COPY_AND_ASSIGN(OriginTrialsComponentInstallerTest); |
| 113 }; | 154 }; |
| 114 | 155 |
| 115 TEST_F(OriginTrialsComponentInstallerTest, | 156 TEST_F(OriginTrialsComponentInstallerTest, |
| 116 PublicKeyResetToDefaultWhenOverrideMissing) { | 157 PublicKeyResetToDefaultWhenOverrideMissing) { |
| 117 local_state()->Set(prefs::kOriginTrialPublicKey, | 158 local_state()->SetString(prefs::kOriginTrialPublicKey, kExistingPublicKey); |
| 118 base::Value(kExistingPublicKey)); | |
| 119 ASSERT_EQ(kExistingPublicKey, | 159 ASSERT_EQ(kExistingPublicKey, |
| 120 local_state()->GetString(prefs::kOriginTrialPublicKey)); | 160 local_state()->GetString(prefs::kOriginTrialPublicKey)); |
| 121 | 161 |
| 122 // Load with empty section in manifest | 162 // Load with empty section in manifest |
| 123 LoadUpdates(nullptr); | 163 LoadUpdates(nullptr); |
| 124 | 164 |
| 125 EXPECT_FALSE(local_state()->HasPrefPath(prefs::kOriginTrialPublicKey)); | 165 EXPECT_FALSE(local_state()->HasPrefPath(prefs::kOriginTrialPublicKey)); |
| 126 } | 166 } |
| 127 | 167 |
| 128 TEST_F(OriginTrialsComponentInstallerTest, PublicKeySetWhenOverrideExists) { | 168 TEST_F(OriginTrialsComponentInstallerTest, PublicKeySetWhenOverrideExists) { |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 auto disabled_feature_list = base::MakeUnique<base::ListValue>(); | 226 auto disabled_feature_list = base::MakeUnique<base::ListValue>(); |
| 187 disabled_feature_list->AppendStrings(kNewDisabledFeatures); | 227 disabled_feature_list->AppendStrings(kNewDisabledFeatures); |
| 188 manifest->Set(kManifestDisabledFeaturesPath, | 228 manifest->Set(kManifestDisabledFeaturesPath, |
| 189 std::move(disabled_feature_list)); | 229 std::move(disabled_feature_list)); |
| 190 | 230 |
| 191 LoadUpdates(std::move(manifest)); | 231 LoadUpdates(std::move(manifest)); |
| 192 | 232 |
| 193 CheckDisabledFeaturesPrefs(kNewDisabledFeatures); | 233 CheckDisabledFeaturesPrefs(kNewDisabledFeatures); |
| 194 } | 234 } |
| 195 | 235 |
| 236 TEST_F(OriginTrialsComponentInstallerTest, |
| 237 DisabledTokensResetToDefaultWhenListMissing) { |
| 238 AddDisabledTokensToPrefs(kExistingDisabledTokens); |
| 239 ASSERT_TRUE(local_state()->HasPrefPath(prefs::kOriginTrialDisabledTokens)); |
| 240 |
| 241 // Load with empty section in manifest |
| 242 LoadUpdates(nullptr); |
| 243 |
| 244 EXPECT_FALSE(local_state()->HasPrefPath(prefs::kOriginTrialDisabledTokens)); |
| 245 } |
| 246 |
| 247 TEST_F(OriginTrialsComponentInstallerTest, |
| 248 DisabledTokensResetToDefaultWhenKeyExistsAndListMissing) { |
| 249 AddDisabledTokensToPrefs(kExistingDisabledTokens); |
| 250 ASSERT_TRUE(local_state()->HasPrefPath(prefs::kOriginTrialDisabledTokens)); |
| 251 |
| 252 // Load with disabled tokens key in manifest, but no list values |
| 253 auto manifest = base::MakeUnique<base::DictionaryValue>(); |
| 254 manifest->Set(kManifestDisabledTokensPath, base::MakeUnique<base::Value>()); |
| 255 |
| 256 LoadUpdates(std::move(manifest)); |
| 257 |
| 258 EXPECT_FALSE(local_state()->HasPrefPath(prefs::kOriginTrialDisabledTokens)); |
| 259 } |
| 260 |
| 261 TEST_F(OriginTrialsComponentInstallerTest, |
| 262 DisabledTokensResetToDefaultWhenListEmpty) { |
| 263 AddDisabledTokensToPrefs(kExistingDisabledTokens); |
| 264 ASSERT_TRUE(local_state()->HasPrefPath(prefs::kOriginTrialDisabledTokens)); |
| 265 |
| 266 auto manifest = base::MakeUnique<base::DictionaryValue>(); |
| 267 auto disabled_token_list = base::MakeUnique<base::ListValue>(); |
| 268 manifest->Set(kManifestDisabledTokenSignaturesPath, |
| 269 std::move(disabled_token_list)); |
| 270 |
| 271 LoadUpdates(std::move(manifest)); |
| 272 |
| 273 EXPECT_FALSE(local_state()->HasPrefPath(prefs::kOriginTrialDisabledTokens)); |
| 274 } |
| 275 |
| 276 TEST_F(OriginTrialsComponentInstallerTest, DisabledTokensSetWhenListExists) { |
| 277 ASSERT_FALSE(local_state()->HasPrefPath(prefs::kOriginTrialDisabledTokens)); |
| 278 |
| 279 auto manifest = base::MakeUnique<base::DictionaryValue>(); |
| 280 auto disabled_token_list = base::MakeUnique<base::ListValue>(); |
| 281 disabled_token_list->AppendString(kNewDisabledToken1); |
| 282 manifest->Set(kManifestDisabledTokenSignaturesPath, |
| 283 std::move(disabled_token_list)); |
| 284 |
| 285 LoadUpdates(std::move(manifest)); |
| 286 |
| 287 std::vector<std::string> tokens = {kNewDisabledToken1}; |
| 288 CheckDisabledTokensPrefs(tokens); |
| 289 } |
| 290 |
| 291 TEST_F(OriginTrialsComponentInstallerTest, |
| 292 DisabledTokensReplacedWhenListExists) { |
| 293 AddDisabledTokensToPrefs(kExistingDisabledTokens); |
| 294 ASSERT_TRUE(local_state()->HasPrefPath(prefs::kOriginTrialDisabledTokens)); |
| 295 |
| 296 auto manifest = base::MakeUnique<base::DictionaryValue>(); |
| 297 auto disabled_token_list = base::MakeUnique<base::ListValue>(); |
| 298 disabled_token_list->AppendStrings(kNewDisabledTokens); |
| 299 manifest->Set(kManifestDisabledTokenSignaturesPath, |
| 300 std::move(disabled_token_list)); |
| 301 |
| 302 LoadUpdates(std::move(manifest)); |
| 303 |
| 304 CheckDisabledTokensPrefs(kNewDisabledTokens); |
| 305 } |
| 306 |
| 196 } // namespace component_updater | 307 } // namespace component_updater |
| OLD | NEW |