summaryrefslogtreecommitdiffstats
path: root/chrome/common/extensions/simple_feature_provider_unittest.cc
blob: fd0fd34f2d23b5c048839b2d7d5ef022b8a8f34c (plain)
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
// Copyright (c) 2012 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/simple_feature_provider.h"

#include "testing/gtest/include/gtest/gtest.h"

using extensions::Extension;
using extensions::Feature;
using extensions::SimpleFeatureProvider;

TEST(SimpleFeatureProvider, ManifestFeatures) {
  SimpleFeatureProvider* provider =
      SimpleFeatureProvider::GetManifestFeatures();
  Feature* feature = provider->GetFeature("description");
  ASSERT_TRUE(feature);
  EXPECT_EQ(5u, feature->extension_types()->size());
  EXPECT_EQ(1u, feature->extension_types()->count(Extension::TYPE_EXTENSION));
  EXPECT_EQ(1u,
            feature->extension_types()->count(Extension::TYPE_PACKAGED_APP));
  EXPECT_EQ(1u,
            feature->extension_types()->count(Extension::TYPE_PLATFORM_APP));
  EXPECT_EQ(1u, feature->extension_types()->count(Extension::TYPE_HOSTED_APP));
  EXPECT_EQ(1u, feature->extension_types()->count(Extension::TYPE_THEME));

  DictionaryValue manifest;
  manifest.SetString("name", "test extension");
  manifest.SetString("version", "1");
  manifest.SetString("description", "hello there");

  std::string error;
  scoped_refptr<const Extension> extension(Extension::Create(
      FilePath(), Extension::INTERNAL, manifest, Extension::NO_FLAGS,
      &error));

  ASSERT_TRUE(extension.get());
  EXPECT_EQ(Feature::IS_AVAILABLE, feature->IsAvailableToContext(
      extension.get(), Feature::UNSPECIFIED_CONTEXT));

  feature = provider->GetFeature("theme");
  ASSERT_TRUE(feature);
  EXPECT_EQ(Feature::INVALID_TYPE, feature->IsAvailableToContext(
      extension.get(), Feature::UNSPECIFIED_CONTEXT));

  feature = provider->GetFeature("devtools_page");
  ASSERT_TRUE(feature);
  EXPECT_EQ(Feature::NOT_PRESENT, feature->IsAvailableToContext(
      extension.get(), Feature::UNSPECIFIED_CONTEXT));
}

TEST(SimpleFeatureProvider, PermissionFeatures) {
  SimpleFeatureProvider* provider =
      SimpleFeatureProvider::GetPermissionFeatures();
  Feature* feature = provider->GetFeature("browsingData");
  ASSERT_TRUE(feature);
  EXPECT_EQ(3u, feature->extension_types()->size());
  EXPECT_EQ(1u, feature->extension_types()->count(Extension::TYPE_EXTENSION));
  EXPECT_EQ(1u,
            feature->extension_types()->count(Extension::TYPE_PACKAGED_APP));
  EXPECT_EQ(1u,
            feature->extension_types()->count(Extension::TYPE_PLATFORM_APP));

  DictionaryValue manifest;
  manifest.SetString("name", "test extension");
  manifest.SetString("version", "1");
  ListValue* permissions = new ListValue();
  manifest.Set("permissions", permissions);
  permissions->Append(Value::CreateStringValue("browsingData"));

  std::string error;
  scoped_refptr<const Extension> extension(Extension::Create(
      FilePath(), Extension::INTERNAL, manifest, Extension::NO_FLAGS,
      &error));

  ASSERT_TRUE(extension.get());
  EXPECT_EQ(Feature::IS_AVAILABLE, feature->IsAvailableToContext(
      extension.get(), Feature::UNSPECIFIED_CONTEXT));

  feature = provider->GetFeature("chromePrivate");
  ASSERT_TRUE(feature);
  EXPECT_EQ(Feature::NOT_FOUND_IN_WHITELIST, feature->IsAvailableToContext(
      extension.get(), Feature::UNSPECIFIED_CONTEXT));

  feature = provider->GetFeature("clipboardWrite");
  ASSERT_TRUE(feature);
  EXPECT_EQ(Feature::NOT_PRESENT, feature->IsAvailableToContext(
      extension.get(), Feature::UNSPECIFIED_CONTEXT));
}

TEST(SimpleFeatureProvider, Validation) {
  scoped_ptr<DictionaryValue> value(new DictionaryValue());

  DictionaryValue* feature1 = new DictionaryValue();
  value->Set("feature1", feature1);

  DictionaryValue* feature2 = new DictionaryValue();
  ListValue* extension_types = new ListValue();
  extension_types->Append(Value::CreateStringValue("extension"));
  feature2->Set("extension_types", extension_types);
  ListValue* contexts = new ListValue();
  contexts->Append(Value::CreateStringValue("blessed_extension"));
  feature2->Set("contexts", contexts);
  value->Set("feature2", feature2);

  scoped_ptr<SimpleFeatureProvider> provider(
      new SimpleFeatureProvider(value.get(), NULL));

  // 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 SimpleFeatureProvider(value.get(), NULL));
  EXPECT_TRUE(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 SimpleFeatureProvider(value.get(), NULL));
  EXPECT_TRUE(provider->GetFeature("feature2"));
}