| Index: chrome/common/extensions/features/chrome_channel_feature_filter_unittest.cc
|
| diff --git a/chrome/common/extensions/features/chrome_channel_feature_filter_unittest.cc b/chrome/common/extensions/features/chrome_channel_feature_filter_unittest.cc
|
| deleted file mode 100644
|
| index 6ed7199b96033f4e04f2de98151d7d7f6d31b0a9..0000000000000000000000000000000000000000
|
| --- a/chrome/common/extensions/features/chrome_channel_feature_filter_unittest.cc
|
| +++ /dev/null
|
| @@ -1,302 +0,0 @@
|
| -// Copyright 2014 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 "chrome/common/extensions/features/chrome_channel_feature_filter.h"
|
| -
|
| -#include <memory>
|
| -#include <string>
|
| -#include <utility>
|
| -
|
| -#include "base/macros.h"
|
| -#include "base/values.h"
|
| -#include "chrome/common/extensions/features/feature_channel.h"
|
| -#include "components/version_info/version_info.h"
|
| -#include "extensions/common/features/complex_feature.h"
|
| -#include "extensions/common/features/json_feature_provider.h"
|
| -#include "extensions/common/features/permission_feature.h"
|
| -#include "extensions/common/features/simple_feature.h"
|
| -#include "extensions/common/value_builder.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace extensions {
|
| -namespace {
|
| -
|
| -template <class FeatureClass>
|
| -SimpleFeature* CreateFeature() {
|
| - SimpleFeature* feature = new FeatureClass();
|
| - feature->AddFilter(std::unique_ptr<SimpleFeatureFilter>(
|
| - new ChromeChannelFeatureFilter(feature)));
|
| - return feature;
|
| -}
|
| -
|
| -Feature::AvailabilityResult IsAvailableInChannel(
|
| - const std::string& channel,
|
| - version_info::Channel channel_for_testing) {
|
| - ScopedCurrentChannel current_channel(channel_for_testing);
|
| -
|
| - SimpleFeature feature;
|
| - feature.AddFilter(std::unique_ptr<SimpleFeatureFilter>(
|
| - new ChromeChannelFeatureFilter(&feature)));
|
| -
|
| - base::DictionaryValue feature_value;
|
| - feature_value.SetString("channel", channel);
|
| - feature.Parse(&feature_value);
|
| -
|
| - return feature.IsAvailableToManifest("random-extension",
|
| - Manifest::TYPE_UNKNOWN,
|
| - Manifest::INVALID_LOCATION,
|
| - -1,
|
| - Feature::GetCurrentPlatform()).result();
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -class ChromeChannelFeatureFilterTest : public testing::Test {
|
| - protected:
|
| - ChromeChannelFeatureFilterTest()
|
| - : current_channel_(version_info::Channel::UNKNOWN) {}
|
| - ~ChromeChannelFeatureFilterTest() override {}
|
| -
|
| - private:
|
| - ScopedCurrentChannel current_channel_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ChromeChannelFeatureFilterTest);
|
| -};
|
| -
|
| -// Tests that all combinations of feature channel and Chrome channel correctly
|
| -// compute feature availability.
|
| -TEST_F(ChromeChannelFeatureFilterTest, SupportedChannel) {
|
| - // stable supported.
|
| - EXPECT_EQ(Feature::IS_AVAILABLE,
|
| - IsAvailableInChannel("stable", version_info::Channel::UNKNOWN));
|
| - EXPECT_EQ(Feature::IS_AVAILABLE,
|
| - IsAvailableInChannel("stable", version_info::Channel::CANARY));
|
| - EXPECT_EQ(Feature::IS_AVAILABLE,
|
| - IsAvailableInChannel("stable", version_info::Channel::DEV));
|
| - EXPECT_EQ(Feature::IS_AVAILABLE,
|
| - IsAvailableInChannel("stable", version_info::Channel::BETA));
|
| - EXPECT_EQ(Feature::IS_AVAILABLE,
|
| - IsAvailableInChannel("stable", version_info::Channel::STABLE));
|
| -
|
| - // beta supported.
|
| - EXPECT_EQ(Feature::IS_AVAILABLE,
|
| - IsAvailableInChannel("beta", version_info::Channel::UNKNOWN));
|
| - EXPECT_EQ(Feature::IS_AVAILABLE,
|
| - IsAvailableInChannel("beta", version_info::Channel::CANARY));
|
| - EXPECT_EQ(Feature::IS_AVAILABLE,
|
| - IsAvailableInChannel("beta", version_info::Channel::DEV));
|
| - EXPECT_EQ(Feature::IS_AVAILABLE,
|
| - IsAvailableInChannel("beta", version_info::Channel::BETA));
|
| - EXPECT_EQ(Feature::UNSUPPORTED_CHANNEL,
|
| - IsAvailableInChannel("beta", version_info::Channel::STABLE));
|
| -
|
| - // dev supported.
|
| - EXPECT_EQ(Feature::IS_AVAILABLE,
|
| - IsAvailableInChannel("dev", version_info::Channel::UNKNOWN));
|
| - EXPECT_EQ(Feature::IS_AVAILABLE,
|
| - IsAvailableInChannel("dev", version_info::Channel::CANARY));
|
| - EXPECT_EQ(Feature::IS_AVAILABLE,
|
| - IsAvailableInChannel("dev", version_info::Channel::DEV));
|
| - EXPECT_EQ(Feature::UNSUPPORTED_CHANNEL,
|
| - IsAvailableInChannel("dev", version_info::Channel::BETA));
|
| - EXPECT_EQ(Feature::UNSUPPORTED_CHANNEL,
|
| - IsAvailableInChannel("dev", version_info::Channel::STABLE));
|
| -
|
| - // canary supported.
|
| - EXPECT_EQ(Feature::IS_AVAILABLE,
|
| - IsAvailableInChannel("canary", version_info::Channel::UNKNOWN));
|
| - EXPECT_EQ(Feature::IS_AVAILABLE,
|
| - IsAvailableInChannel("canary", version_info::Channel::CANARY));
|
| - EXPECT_EQ(Feature::UNSUPPORTED_CHANNEL,
|
| - IsAvailableInChannel("canary", version_info::Channel::DEV));
|
| - EXPECT_EQ(Feature::UNSUPPORTED_CHANNEL,
|
| - IsAvailableInChannel("canary", version_info::Channel::BETA));
|
| - EXPECT_EQ(Feature::UNSUPPORTED_CHANNEL,
|
| - IsAvailableInChannel("canary", version_info::Channel::STABLE));
|
| -
|
| - // trunk supported.
|
| - EXPECT_EQ(Feature::IS_AVAILABLE,
|
| - IsAvailableInChannel("trunk", version_info::Channel::UNKNOWN));
|
| - EXPECT_EQ(Feature::UNSUPPORTED_CHANNEL,
|
| - IsAvailableInChannel("trunk", version_info::Channel::CANARY));
|
| - EXPECT_EQ(Feature::UNSUPPORTED_CHANNEL,
|
| - IsAvailableInChannel("trunk", version_info::Channel::DEV));
|
| - EXPECT_EQ(Feature::UNSUPPORTED_CHANNEL,
|
| - IsAvailableInChannel("trunk", version_info::Channel::BETA));
|
| - EXPECT_EQ(Feature::UNSUPPORTED_CHANNEL,
|
| - IsAvailableInChannel("trunk", version_info::Channel::STABLE));
|
| -}
|
| -
|
| -// Tests the validation of features with channel entries.
|
| -TEST_F(ChromeChannelFeatureFilterTest, FeatureValidation) {
|
| - std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue());
|
| -
|
| - base::DictionaryValue* feature1 = new base::DictionaryValue();
|
| - feature1->SetString("channel", "trunk");
|
| - value->Set("feature1", feature1);
|
| -
|
| - base::DictionaryValue* feature2 = new base::DictionaryValue();
|
| - feature2->SetString("channel", "trunk");
|
| - base::ListValue* extension_types = new base::ListValue();
|
| - extension_types->AppendString("extension");
|
| - feature2->Set("extension_types", extension_types);
|
| - base::ListValue* contexts = new base::ListValue();
|
| - contexts->AppendString("blessed_extension");
|
| - feature2->Set("contexts", contexts);
|
| - value->Set("feature2", feature2);
|
| -
|
| - std::unique_ptr<JSONFeatureProvider> provider(
|
| - new JSONFeatureProvider(*value, CreateFeature<PermissionFeature>));
|
| -
|
| - // feature1 won't validate because it lacks an extension type.
|
| - EXPECT_FALSE(provider->GetFeature("feature1"));
|
| -
|
| - // If we add one, it works.
|
| - feature1->Set("extension_types", extension_types->DeepCopy());
|
| - provider.reset(
|
| - new JSONFeatureProvider(*value, CreateFeature<PermissionFeature>));
|
| - EXPECT_TRUE(provider->GetFeature("feature1"));
|
| -
|
| - // Remove the channel, and feature1 won't validate.
|
| - feature1->Remove("channel", NULL);
|
| - provider.reset(
|
| - new JSONFeatureProvider(*value, CreateFeature<PermissionFeature>));
|
| - EXPECT_FALSE(provider->GetFeature("feature1"));
|
| -
|
| - // feature2 won't validate because of the presence of "contexts".
|
| - EXPECT_FALSE(provider->GetFeature("feature2"));
|
| -
|
| - // If we remove it, it works.
|
| - feature2->Remove("contexts", NULL);
|
| - provider.reset(
|
| - new JSONFeatureProvider(*value, CreateFeature<PermissionFeature>));
|
| - EXPECT_TRUE(provider->GetFeature("feature2"));
|
| -}
|
| -
|
| -// Tests simple feature availability across channels.
|
| -TEST_F(ChromeChannelFeatureFilterTest, SimpleFeatureAvailability) {
|
| - std::unique_ptr<base::DictionaryValue> rule(
|
| - DictionaryBuilder()
|
| - .Set("feature1",
|
| - ListBuilder()
|
| - .Append(DictionaryBuilder()
|
| - .Set("channel", "beta")
|
| - .Set("extension_types",
|
| - ListBuilder().Append("extension").Build())
|
| - .Build())
|
| - .Append(DictionaryBuilder()
|
| - .Set("channel", "beta")
|
| - .Set("extension_types",
|
| - ListBuilder()
|
| - .Append("legacy_packaged_app")
|
| - .Build())
|
| - .Build())
|
| - .Build())
|
| - .Build());
|
| -
|
| - std::unique_ptr<JSONFeatureProvider> provider(
|
| - new JSONFeatureProvider(*rule, CreateFeature<SimpleFeature>));
|
| -
|
| - Feature* feature = provider->GetFeature("feature1");
|
| - EXPECT_TRUE(feature);
|
| -
|
| - // Make sure both rules are applied correctly.
|
| - {
|
| - ScopedCurrentChannel current_channel(version_info::Channel::BETA);
|
| - EXPECT_EQ(
|
| - Feature::IS_AVAILABLE,
|
| - feature->IsAvailableToManifest("1",
|
| - Manifest::TYPE_EXTENSION,
|
| - Manifest::INVALID_LOCATION,
|
| - Feature::UNSPECIFIED_PLATFORM).result());
|
| - EXPECT_EQ(
|
| - Feature::IS_AVAILABLE,
|
| - feature->IsAvailableToManifest("2",
|
| - Manifest::TYPE_LEGACY_PACKAGED_APP,
|
| - Manifest::INVALID_LOCATION,
|
| - Feature::UNSPECIFIED_PLATFORM).result());
|
| - }
|
| - {
|
| - ScopedCurrentChannel current_channel(version_info::Channel::STABLE);
|
| - EXPECT_NE(
|
| - Feature::IS_AVAILABLE,
|
| - feature->IsAvailableToManifest("1",
|
| - Manifest::TYPE_EXTENSION,
|
| - Manifest::INVALID_LOCATION,
|
| - Feature::UNSPECIFIED_PLATFORM).result());
|
| - EXPECT_NE(
|
| - Feature::IS_AVAILABLE,
|
| - feature->IsAvailableToManifest("2",
|
| - Manifest::TYPE_LEGACY_PACKAGED_APP,
|
| - Manifest::INVALID_LOCATION,
|
| - Feature::UNSPECIFIED_PLATFORM).result());
|
| - }
|
| -}
|
| -
|
| -// Tests complex feature availability across channels.
|
| -TEST_F(ChromeChannelFeatureFilterTest, ComplexFeatureAvailability) {
|
| - std::unique_ptr<ComplexFeature::FeatureList> features(
|
| - new ComplexFeature::FeatureList());
|
| -
|
| - // Rule: "extension", channel trunk.
|
| - std::unique_ptr<SimpleFeature> simple_feature(CreateFeature<SimpleFeature>());
|
| - std::unique_ptr<base::DictionaryValue> rule(
|
| - DictionaryBuilder()
|
| - .Set("channel", "trunk")
|
| - .Set("extension_types", ListBuilder().Append("extension").Build())
|
| - .Build());
|
| - simple_feature->Parse(rule.get());
|
| - features->push_back(std::move(simple_feature));
|
| -
|
| - // Rule: "legacy_packaged_app", channel stable.
|
| - simple_feature.reset(CreateFeature<SimpleFeature>());
|
| - rule = DictionaryBuilder()
|
| - .Set("channel", "stable")
|
| - .Set("extension_types",
|
| - ListBuilder().Append("legacy_packaged_app").Build())
|
| - .Build();
|
| - simple_feature->Parse(rule.get());
|
| - features->push_back(std::move(simple_feature));
|
| -
|
| - std::unique_ptr<ComplexFeature> feature(
|
| - new ComplexFeature(std::move(features)));
|
| -
|
| - // Test match 1st rule.
|
| - {
|
| - ScopedCurrentChannel current_channel(version_info::Channel::UNKNOWN);
|
| - EXPECT_EQ(
|
| - Feature::IS_AVAILABLE,
|
| - feature->IsAvailableToManifest("1",
|
| - Manifest::TYPE_EXTENSION,
|
| - Manifest::INVALID_LOCATION,
|
| - Feature::UNSPECIFIED_PLATFORM,
|
| - Feature::GetCurrentPlatform()).result());
|
| - }
|
| -
|
| - // Test match 2nd rule.
|
| - {
|
| - ScopedCurrentChannel current_channel(version_info::Channel::BETA);
|
| - EXPECT_EQ(
|
| - Feature::IS_AVAILABLE,
|
| - feature->IsAvailableToManifest("2",
|
| - Manifest::TYPE_LEGACY_PACKAGED_APP,
|
| - Manifest::INVALID_LOCATION,
|
| - Feature::UNSPECIFIED_PLATFORM,
|
| - Feature::GetCurrentPlatform()).result());
|
| - }
|
| -
|
| - // Test feature not available to extensions above channel unknown.
|
| - {
|
| - ScopedCurrentChannel current_channel(version_info::Channel::BETA);
|
| - EXPECT_NE(
|
| - Feature::IS_AVAILABLE,
|
| - feature->IsAvailableToManifest("1",
|
| - Manifest::TYPE_EXTENSION,
|
| - Manifest::INVALID_LOCATION,
|
| - Feature::UNSPECIFIED_PLATFORM,
|
| - Feature::GetCurrentPlatform()).result());
|
| - }
|
| -}
|
| -
|
| -} // namespace extensions
|
|
|