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

Side by Side Diff: chrome/common/extensions/manifest_handler_unittest.cc

Issue 12091115: Allow manifest handlers to declare keys they depend on that must be parsed before them. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: dcronin Created 7 years, 10 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 | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2013 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 <string>
6 #include <vector>
7
8 #include "base/file_path.h"
9 #include "base/stl_util.h"
10 #include "base/utf_string_conversions.h"
11 #include "chrome/common/extensions/extension.h"
12 #include "chrome/common/extensions/extension_builder.h"
13 #include "chrome/common/extensions/manifest_handler.h"
14 #include "chrome/common/extensions/value_builder.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16
17 namespace extensions {
18
19 class ManifestHandlerTest : public testing::Test {
20 public:
21 class ParsingWatcher {
22 public:
23 // Called when a manifest handler parses.
24 void Record(const std::string& name) {
25 parsed_names_.push_back(name);
26 }
27
28 const std::vector<std::string>& parsed_names() {
29 return parsed_names_;
30 }
31
32 // Returns true if |name_before| was parsed before |name_after|.
33 bool ParsedBefore(const std::string& name_before,
34 const std::string& name_after) {
35 size_t i_before = parsed_names_.size();
36 size_t i_after = 0;
37 for (size_t i = 0; i < parsed_names_.size(); ++i) {
38 if (parsed_names_[i] == name_before)
39 i_before = i;
40 if (parsed_names_[i] == name_after)
41 i_after = i;
42 }
43 if (i_before < i_after)
44 return true;
45 return false;
46 }
47
48 private:
49 // The order of manifest handlers that we watched parsing.
50 std::vector<std::string> parsed_names_;
51 };
52
53 class TestManifestHandler : public ManifestHandler {
54 public:
55 TestManifestHandler(const std::string& name,
56 const std::vector<std::string>& prereqs,
57 ParsingWatcher* watcher)
58 : name_(name), prereqs_(prereqs), watcher_(watcher) {
59 }
60
61 virtual bool Parse(Extension* extension, string16* error) OVERRIDE {
62 watcher_->Record(name_);
63 return true;
64 }
65
66 virtual const std::vector<std::string>& PrerequisiteKeys() OVERRIDE {
67 return prereqs_;
68 }
69
70 protected:
71 std::string name_;
72 std::vector<std::string> prereqs_;
73 ParsingWatcher* watcher_;
74 };
75
76 class FailingTestManifestHandler : public TestManifestHandler {
77 public:
78 FailingTestManifestHandler(const std::string& name,
79 const std::vector<std::string> prereqs,
80 ParsingWatcher* watcher)
81 : TestManifestHandler(name, prereqs, watcher) {
82 }
83 virtual bool Parse(Extension* extension, string16* error) OVERRIDE {
84 *error = ASCIIToUTF16(name_);
85 return false;
86 }
87 };
88
89 class AlwaysParseTestManifestHandler : public TestManifestHandler {
90 public:
91 AlwaysParseTestManifestHandler(const std::string& name,
92 const std::vector<std::string> prereqs,
93 ParsingWatcher* watcher)
94 : TestManifestHandler(name, prereqs, watcher) {
95 }
96
97 virtual bool AlwaysParseForType(Manifest::Type type) OVERRIDE {
98 return true;
99 }
100 };
101
102 protected:
103 virtual void SetUp() OVERRIDE {
104 ManifestHandler::ClearRegistryForTesting();
105 }
106 };
107
108 TEST_F(ManifestHandlerTest, DependentHandlers) {
109 ParsingWatcher watcher;
110 std::vector<std::string> prereqs;
111 ManifestHandler::Register(
112 "a", make_linked_ptr(new TestManifestHandler("A", prereqs, &watcher)));
113 ManifestHandler::Register(
114 "b", make_linked_ptr(new TestManifestHandler("B", prereqs, &watcher)));
115 ManifestHandler::Register(
116 "j", make_linked_ptr(new TestManifestHandler("J", prereqs, &watcher)));
117 ManifestHandler::Register(
118 "k", make_linked_ptr(
119 new AlwaysParseTestManifestHandler("K", prereqs, &watcher)));
120 prereqs.push_back("c.d");
121 linked_ptr<TestManifestHandler> handler_c2(
122 new TestManifestHandler("C.EZ", prereqs, &watcher));
123 ManifestHandler::Register("c.e", handler_c2);
124 ManifestHandler::Register("c.z", handler_c2);
125 prereqs.clear();
126 prereqs.push_back("b");
127 prereqs.push_back("k");
128 ManifestHandler::Register(
129 "c.d", make_linked_ptr(new TestManifestHandler(
130 "C.D", prereqs, &watcher)));
131
132 scoped_refptr<Extension> extension = ExtensionBuilder()
133 .SetManifest(DictionaryBuilder()
134 .Set("name", "no name")
135 .Set("version", "0")
136 .Set("manifest_version", 2)
137 .Set("a", 1)
138 .Set("b", 2)
139 .Set("c", DictionaryBuilder()
140 .Set("d", 3)
141 .Set("e", 4)
142 .Set("f", 5))
143 .Set("g", 6))
144 .Build();
145
146 // A, B, C.EZ, C.D, K
147 EXPECT_EQ(5u, watcher.parsed_names().size());
148 EXPECT_TRUE(watcher.ParsedBefore("B", "C.D"));
149 EXPECT_TRUE(watcher.ParsedBefore("K", "C.D"));
150 EXPECT_TRUE(watcher.ParsedBefore("C.D", "C.EZ"));
151 }
152
153 TEST_F(ManifestHandlerTest, FailingHandlers) {
154 // Can't use ExtensionBuilder, because this extension will fail to
155 // be parsed.
156 scoped_ptr<base::DictionaryValue> manifest_a(
157 DictionaryBuilder()
158 .Set("name", "no name")
159 .Set("version", "0")
160 .Set("manifest_version", 2)
161 .Set("a", 1)
162 .Build());
163
164 // Succeeds when "a" is not recognized.
165 std::string error;
166 scoped_refptr<Extension> extension = Extension::Create(
167 FilePath(),
168 Manifest::INVALID_LOCATION,
169 *manifest_a,
170 Extension::NO_FLAGS,
171 &error);
172 EXPECT_TRUE(extension);
173
174 // Register a handler for "a" that fails.
175 ParsingWatcher watcher;
176 ManifestHandler::Register(
177 "a", make_linked_ptr(new FailingTestManifestHandler(
178 "A", std::vector<std::string>(), &watcher)));
179
180 extension = Extension::Create(
181 FilePath(),
182 Manifest::INVALID_LOCATION,
183 *manifest_a,
184 Extension::NO_FLAGS,
185 &error);
186 EXPECT_FALSE(extension);
187 EXPECT_EQ("A", error);
188 }
189
190 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/common/extensions/manifest_handler.cc ('k') | chrome/common/extensions/manifest_tests/extension_manifest_test.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698