Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(194)

Side by Side Diff: extensions/browser/requirements_checker_unittest.cc

Issue 2783813002: Move ChromeRequirementsChecker to //extensions as a PreloadCheck (Closed)
Patch Set: rebase? Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « extensions/browser/requirements_checker.cc ('k') | extensions/common/BUILD.gn » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "extensions/browser/requirements_checker.h"
6
7 #include <memory>
8 #include <vector>
9
10 #include "base/memory/ptr_util.h"
11 #include "base/memory/ref_counted.h"
12 #include "base/strings/string16.h"
13 #include "base/strings/utf_string_conversions.h"
14 #include "base/values.h"
15 #include "content/public/browser/gpu_data_manager.h"
16 #include "content/public/test/test_browser_thread_bundle.h"
17 #include "extensions/browser/extension_system.h"
18 #include "extensions/browser/extensions_test.h"
19 #include "extensions/browser/preload_check.h"
20 #include "extensions/browser/preload_check_test_util.h"
21 #include "extensions/common/extension.h"
22 #include "extensions/common/manifest.h"
23 #include "testing/gmock/include/gmock/gmock.h"
24 #include "testing/gtest/include/gtest/gtest.h"
25 #include "ui/base/l10n/l10n_util.h"
26
27 namespace extensions {
28
29 namespace {
30
31 // Whether this build supports the window.shape requirement.
32 const bool kSupportsWindowShape =
33 #if defined(USE_AURA)
34 true;
35 #else
36 false;
37 #endif
38
39 // Whether this build supports the plugins.npapi requirement.
40 const bool kSupportsNPAPI =
41 #if defined(OS_POSIX) && !defined(OS_MACOSX)
42 false;
43 #else
44 true;
45 #endif
46
47 // Returns true if a WebGL check might not fail immediately.
48 bool MightSupportWebGL() {
49 return content::GpuDataManager::GetInstance()->GpuAccessAllowed(nullptr);
50 }
51
52 const char kFeaturesKey[] = "requirements.3D.features";
53 const char kFeatureWebGL[] = "webgl";
54 const char kFeatureCSS3d[] = "css3d";
55
56 } // namespace
57
58 class RequirementsCheckerTest : public ExtensionsTest {
59 public:
60 RequirementsCheckerTest() {
61 manifest_dict_ = base::MakeUnique<base::DictionaryValue>();
62 }
63
64 ~RequirementsCheckerTest() override {}
65
66 void CreateExtension() {
67 manifest_dict_->SetString("name", "dummy name");
68 manifest_dict_->SetString("version", "1");
69
70 std::string error;
71 extension_ =
72 Extension::Create(base::FilePath(), Manifest::UNPACKED, *manifest_dict_,
73 Extension::NO_FLAGS, &error);
74 ASSERT_TRUE(extension_.get()) << error;
75 }
76
77 protected:
78 void StartChecker() {
79 checker_ = base::MakeUnique<RequirementsChecker>(extension_);
80 // TODO(michaelpg): This should normally not have to be async. Use Run()
81 // instead of RunUntilComplete() after crbug.com/708354 is addressed.
82 runner_.RunUntilComplete(checker_.get());
83 }
84
85 void RequireWindowShape() {
86 manifest_dict_->SetBoolean("requirements.window.shape", true);
87 }
88
89 void RequireNPAPI() {
90 manifest_dict_->SetBoolean("requirements.plugins.npapi", true);
91 }
92
93 void RequireFeature(const char feature[]) {
94 if (!manifest_dict_->HasKey(kFeaturesKey))
95 manifest_dict_->Set(kFeaturesKey, base::MakeUnique<base::ListValue>());
96 base::ListValue* features_list = nullptr;
97 ASSERT_TRUE(manifest_dict_->GetList(kFeaturesKey, &features_list));
98 features_list->AppendString(feature);
99 }
100
101 std::unique_ptr<RequirementsChecker> checker_;
102 PreloadCheckRunner runner_;
103
104 private:
105 content::TestBrowserThreadBundle bundle_;
106 scoped_refptr<Extension> extension_;
107 std::unique_ptr<base::DictionaryValue> manifest_dict_;
108 };
109
110 // Tests no requirements.
111 TEST_F(RequirementsCheckerTest, RequirementsEmpty) {
112 CreateExtension();
113 StartChecker();
114 EXPECT_TRUE(runner_.called());
115 EXPECT_EQ(0u, runner_.errors().size());
116 EXPECT_TRUE(checker_->GetErrorMessage().empty());
117 }
118
119 // Tests fulfilled requirements.
120 TEST_F(RequirementsCheckerTest, RequirementsSuccess) {
121 if (kSupportsWindowShape)
122 RequireWindowShape();
123 if (kSupportsNPAPI)
124 RequireNPAPI();
125 RequireFeature(kFeatureCSS3d);
126
127 CreateExtension();
128 StartChecker();
129 EXPECT_TRUE(runner_.called());
130 EXPECT_EQ(0u, runner_.errors().size());
131 EXPECT_TRUE(checker_->GetErrorMessage().empty());
132 }
133
134 // Tests multiple requirements failing (on some builds).
135 TEST_F(RequirementsCheckerTest, RequirementsFailMultiple) {
136 size_t expected_errors = 0u;
137 if (!kSupportsWindowShape) {
138 RequireWindowShape();
139 expected_errors++;
140 }
141 if (!kSupportsNPAPI) {
142 RequireNPAPI();
143 expected_errors++;
144 }
145 if (!MightSupportWebGL()) {
146 RequireFeature(kFeatureWebGL);
147 expected_errors++;
148 }
149 // css3d should always succeed.
150 RequireFeature(kFeatureCSS3d);
151
152 CreateExtension();
153 StartChecker();
154 EXPECT_TRUE(runner_.called());
155 EXPECT_EQ(expected_errors, runner_.errors().size());
156 EXPECT_EQ(expected_errors == 0, checker_->GetErrorMessage().empty());
157 }
158
159 // Tests a requirement that might fail asynchronously.
160 TEST_F(RequirementsCheckerTest, RequirementsFailWebGL) {
161 content::GpuDataManager::GetInstance()->BlacklistWebGLForTesting();
162 RequireFeature(kFeatureWebGL);
163 CreateExtension();
164 StartChecker();
165
166 // TODO(michaelpg): Check that the runner actually finishes, which requires
167 // waiting for the GPU check to succeed: crbug.com/706204.
168 runner_.WaitForIdle();
169 if (runner_.errors().size()) {
170 EXPECT_THAT(runner_.errors(), testing::UnorderedElementsAre(
171 PreloadCheck::WEBGL_NOT_SUPPORTED));
172 EXPECT_FALSE(checker_->GetErrorMessage().empty());
173 }
174 }
175
176 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/browser/requirements_checker.cc ('k') | extensions/common/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698