OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 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 <string> | 5 #include <string> |
6 #include <vector> | 6 #include <vector> |
7 | 7 |
8 #include "base/files/file_path.h" | 8 #include "base/files/file_path.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
11 #include "chrome/common/extensions/extension.h" | 11 #include "chrome/common/extensions/extension.h" |
12 #include "chrome/common/extensions/extension_builder.h" | 12 #include "chrome/common/extensions/extension_builder.h" |
13 #include "chrome/common/extensions/manifest_handler.h" | 13 #include "chrome/common/extensions/manifest_handler.h" |
14 #include "chrome/common/extensions/value_builder.h" | 14 #include "chrome/common/extensions/value_builder.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
16 | 16 |
17 namespace extensions { | 17 namespace extensions { |
18 | 18 |
| 19 namespace { |
| 20 |
| 21 std::vector<std::string> SingleKey(const std::string& key) { |
| 22 return std::vector<std::string>(1, key); |
| 23 } |
| 24 |
| 25 } // namespace |
| 26 |
19 class ManifestHandlerTest : public testing::Test { | 27 class ManifestHandlerTest : public testing::Test { |
20 public: | 28 public: |
21 class ParsingWatcher { | 29 class ParsingWatcher { |
22 public: | 30 public: |
23 // Called when a manifest handler parses. | 31 // Called when a manifest handler parses. |
24 void Record(const std::string& name) { | 32 void Record(const std::string& name) { |
25 parsed_names_.push_back(name); | 33 parsed_names_.push_back(name); |
26 } | 34 } |
27 | 35 |
28 const std::vector<std::string>& parsed_names() { | 36 const std::vector<std::string>& parsed_names() { |
(...skipping 17 matching lines...) Expand all Loading... |
46 } | 54 } |
47 | 55 |
48 private: | 56 private: |
49 // The order of manifest handlers that we watched parsing. | 57 // The order of manifest handlers that we watched parsing. |
50 std::vector<std::string> parsed_names_; | 58 std::vector<std::string> parsed_names_; |
51 }; | 59 }; |
52 | 60 |
53 class TestManifestHandler : public ManifestHandler { | 61 class TestManifestHandler : public ManifestHandler { |
54 public: | 62 public: |
55 TestManifestHandler(const std::string& name, | 63 TestManifestHandler(const std::string& name, |
| 64 const std::vector<std::string>& keys, |
56 const std::vector<std::string>& prereqs, | 65 const std::vector<std::string>& prereqs, |
57 ParsingWatcher* watcher) | 66 ParsingWatcher* watcher) |
58 : name_(name), prereqs_(prereqs), watcher_(watcher) { | 67 : name_(name), keys_(keys), prereqs_(prereqs), watcher_(watcher) { |
59 } | 68 } |
60 | 69 |
61 virtual bool Parse(Extension* extension, string16* error) OVERRIDE { | 70 virtual bool Parse(Extension* extension, string16* error) OVERRIDE { |
62 watcher_->Record(name_); | 71 watcher_->Record(name_); |
63 return true; | 72 return true; |
64 } | 73 } |
65 | 74 |
66 virtual const std::vector<std::string>& PrerequisiteKeys() OVERRIDE { | 75 virtual const std::vector<std::string> PrerequisiteKeys() const OVERRIDE { |
67 return prereqs_; | 76 return prereqs_; |
68 } | 77 } |
69 | 78 |
70 protected: | 79 protected: |
71 std::string name_; | 80 std::string name_; |
| 81 std::vector<std::string> keys_; |
72 std::vector<std::string> prereqs_; | 82 std::vector<std::string> prereqs_; |
73 ParsingWatcher* watcher_; | 83 ParsingWatcher* watcher_; |
| 84 |
| 85 private: |
| 86 virtual const std::vector<std::string> Keys() const OVERRIDE { |
| 87 return keys_; |
| 88 } |
74 }; | 89 }; |
75 | 90 |
76 class FailingTestManifestHandler : public TestManifestHandler { | 91 class FailingTestManifestHandler : public TestManifestHandler { |
77 public: | 92 public: |
78 FailingTestManifestHandler(const std::string& name, | 93 FailingTestManifestHandler(const std::string& name, |
79 const std::vector<std::string> prereqs, | 94 const std::vector<std::string>& keys, |
| 95 const std::vector<std::string>& prereqs, |
80 ParsingWatcher* watcher) | 96 ParsingWatcher* watcher) |
81 : TestManifestHandler(name, prereqs, watcher) { | 97 : TestManifestHandler(name, keys, prereqs, watcher) { |
82 } | 98 } |
83 virtual bool Parse(Extension* extension, string16* error) OVERRIDE { | 99 virtual bool Parse(Extension* extension, string16* error) OVERRIDE { |
84 *error = ASCIIToUTF16(name_); | 100 *error = ASCIIToUTF16(name_); |
85 return false; | 101 return false; |
86 } | 102 } |
87 }; | 103 }; |
88 | 104 |
89 class AlwaysParseTestManifestHandler : public TestManifestHandler { | 105 class AlwaysParseTestManifestHandler : public TestManifestHandler { |
90 public: | 106 public: |
91 AlwaysParseTestManifestHandler(const std::string& name, | 107 AlwaysParseTestManifestHandler(const std::string& name, |
92 const std::vector<std::string> prereqs, | 108 const std::vector<std::string>& keys, |
| 109 const std::vector<std::string>& prereqs, |
93 ParsingWatcher* watcher) | 110 ParsingWatcher* watcher) |
94 : TestManifestHandler(name, prereqs, watcher) { | 111 : TestManifestHandler(name, keys, prereqs, watcher) { |
95 } | 112 } |
96 | 113 |
97 virtual bool AlwaysParseForType(Manifest::Type type) OVERRIDE { | 114 virtual bool AlwaysParseForType(Manifest::Type type) const OVERRIDE { |
98 return true; | 115 return true; |
99 } | 116 } |
100 }; | 117 }; |
101 | 118 |
102 protected: | 119 protected: |
103 virtual void TearDown() OVERRIDE { | 120 virtual void TearDown() OVERRIDE { |
104 ManifestHandler::ClearRegistryForTesting(); | 121 ManifestHandler::ClearRegistryForTesting(); |
105 } | 122 } |
106 }; | 123 }; |
107 | 124 |
108 TEST_F(ManifestHandlerTest, DependentHandlers) { | 125 TEST_F(ManifestHandlerTest, DependentHandlers) { |
109 ParsingWatcher watcher; | 126 ParsingWatcher watcher; |
110 std::vector<std::string> prereqs; | 127 std::vector<std::string> prereqs; |
111 ManifestHandler::Register( | 128 (new TestManifestHandler("A", SingleKey("a"), prereqs, &watcher))->Register(); |
112 "a", make_linked_ptr(new TestManifestHandler("A", prereqs, &watcher))); | 129 (new TestManifestHandler("B", SingleKey("b"), prereqs, &watcher))->Register(); |
113 ManifestHandler::Register( | 130 (new TestManifestHandler("J", SingleKey("j"), prereqs, &watcher))->Register(); |
114 "b", make_linked_ptr(new TestManifestHandler("B", prereqs, &watcher))); | 131 (new AlwaysParseTestManifestHandler("K", SingleKey("k"), prereqs, &watcher))-> |
115 ManifestHandler::Register( | 132 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"); | 133 prereqs.push_back("c.d"); |
121 linked_ptr<TestManifestHandler> handler_c2( | 134 std::vector<std::string> keys; |
122 new TestManifestHandler("C.EZ", prereqs, &watcher)); | 135 keys.push_back("c.e"); |
123 ManifestHandler::Register("c.e", handler_c2); | 136 keys.push_back("c.z"); |
124 ManifestHandler::Register("c.z", handler_c2); | 137 (new TestManifestHandler("C.EZ", keys, prereqs, &watcher))->Register(); |
125 prereqs.clear(); | 138 prereqs.clear(); |
126 prereqs.push_back("b"); | 139 prereqs.push_back("b"); |
127 prereqs.push_back("k"); | 140 prereqs.push_back("k"); |
128 ManifestHandler::Register( | 141 (new TestManifestHandler("C.D", SingleKey("c.d"), prereqs, &watcher))-> |
129 "c.d", make_linked_ptr(new TestManifestHandler( | 142 Register(); |
130 "C.D", prereqs, &watcher))); | |
131 | 143 |
132 scoped_refptr<Extension> extension = ExtensionBuilder() | 144 scoped_refptr<Extension> extension = ExtensionBuilder() |
133 .SetManifest(DictionaryBuilder() | 145 .SetManifest(DictionaryBuilder() |
134 .Set("name", "no name") | 146 .Set("name", "no name") |
135 .Set("version", "0") | 147 .Set("version", "0") |
136 .Set("manifest_version", 2) | 148 .Set("manifest_version", 2) |
137 .Set("a", 1) | 149 .Set("a", 1) |
138 .Set("b", 2) | 150 .Set("b", 2) |
139 .Set("c", DictionaryBuilder() | 151 .Set("c", DictionaryBuilder() |
140 .Set("d", 3) | 152 .Set("d", 3) |
(...skipping 25 matching lines...) Expand all Loading... |
166 scoped_refptr<Extension> extension = Extension::Create( | 178 scoped_refptr<Extension> extension = Extension::Create( |
167 base::FilePath(), | 179 base::FilePath(), |
168 Manifest::INVALID_LOCATION, | 180 Manifest::INVALID_LOCATION, |
169 *manifest_a, | 181 *manifest_a, |
170 Extension::NO_FLAGS, | 182 Extension::NO_FLAGS, |
171 &error); | 183 &error); |
172 EXPECT_TRUE(extension); | 184 EXPECT_TRUE(extension); |
173 | 185 |
174 // Register a handler for "a" that fails. | 186 // Register a handler for "a" that fails. |
175 ParsingWatcher watcher; | 187 ParsingWatcher watcher; |
176 ManifestHandler::Register( | 188 (new FailingTestManifestHandler( |
177 "a", make_linked_ptr(new FailingTestManifestHandler( | 189 "A", SingleKey("a"), std::vector<std::string>(), &watcher))->Register(); |
178 "A", std::vector<std::string>(), &watcher))); | |
179 | 190 |
180 extension = Extension::Create( | 191 extension = Extension::Create( |
181 base::FilePath(), | 192 base::FilePath(), |
182 Manifest::INVALID_LOCATION, | 193 Manifest::INVALID_LOCATION, |
183 *manifest_a, | 194 *manifest_a, |
184 Extension::NO_FLAGS, | 195 Extension::NO_FLAGS, |
185 &error); | 196 &error); |
186 EXPECT_FALSE(extension); | 197 EXPECT_FALSE(extension); |
187 EXPECT_EQ("A", error); | 198 EXPECT_EQ("A", error); |
188 } | 199 } |
189 | 200 |
190 } // namespace extensions | 201 } // namespace extensions |
OLD | NEW |