| 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 |