| OLD | NEW | 
|    1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |    1 // Copyright (c) 2012 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 "chrome/common/extensions/extension_file_util.h" |    5 #include "chrome/common/extensions/extension_file_util.h" | 
|    6  |    6  | 
|    7 #include "base/file_util.h" |    7 #include "base/file_util.h" | 
|    8 #include "base/files/scoped_temp_dir.h" |    8 #include "base/files/scoped_temp_dir.h" | 
|    9 #include "base/json/json_string_value_serializer.h" |    9 #include "base/json/json_string_value_serializer.h" | 
|   10 #include "base/path_service.h" |   10 #include "base/path_service.h" | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
|   29 }; |   29 }; | 
|   30  |   30  | 
|   31 TEST_F(ExtensionFileUtilTest, InstallUninstallGarbageCollect) { |   31 TEST_F(ExtensionFileUtilTest, InstallUninstallGarbageCollect) { | 
|   32   base::ScopedTempDir temp; |   32   base::ScopedTempDir temp; | 
|   33   ASSERT_TRUE(temp.CreateUniqueTempDir()); |   33   ASSERT_TRUE(temp.CreateUniqueTempDir()); | 
|   34  |   34  | 
|   35   // Create a source extension. |   35   // Create a source extension. | 
|   36   std::string extension_id("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); |   36   std::string extension_id("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); | 
|   37   std::string version("1.0"); |   37   std::string version("1.0"); | 
|   38   base::FilePath src = temp.path().AppendASCII(extension_id); |   38   base::FilePath src = temp.path().AppendASCII(extension_id); | 
|   39   ASSERT_TRUE(file_util::CreateDirectory(src)); |   39   ASSERT_TRUE(base::CreateDirectory(src)); | 
|   40  |   40  | 
|   41   // Create a extensions tree. |   41   // Create a extensions tree. | 
|   42   base::FilePath all_extensions = temp.path().AppendASCII("extensions"); |   42   base::FilePath all_extensions = temp.path().AppendASCII("extensions"); | 
|   43   ASSERT_TRUE(file_util::CreateDirectory(all_extensions)); |   43   ASSERT_TRUE(base::CreateDirectory(all_extensions)); | 
|   44  |   44  | 
|   45   // Install in empty directory. Should create parent directories as needed. |   45   // Install in empty directory. Should create parent directories as needed. | 
|   46   base::FilePath version_1 = extension_file_util::InstallExtension( |   46   base::FilePath version_1 = extension_file_util::InstallExtension( | 
|   47       src, |   47       src, | 
|   48       extension_id, |   48       extension_id, | 
|   49       version, |   49       version, | 
|   50       all_extensions); |   50       all_extensions); | 
|   51   ASSERT_EQ(version_1.value(), |   51   ASSERT_EQ(version_1.value(), | 
|   52             all_extensions.AppendASCII(extension_id).AppendASCII("1.0_0") |   52             all_extensions.AppendASCII(extension_id).AppendASCII("1.0_0") | 
|   53                 .value()); |   53                 .value()); | 
|   54   ASSERT_TRUE(base::DirectoryExists(version_1)); |   54   ASSERT_TRUE(base::DirectoryExists(version_1)); | 
|   55  |   55  | 
|   56   // Should have moved the source. |   56   // Should have moved the source. | 
|   57   ASSERT_FALSE(base::DirectoryExists(src)); |   57   ASSERT_FALSE(base::DirectoryExists(src)); | 
|   58  |   58  | 
|   59   // Install again. Should create a new one with different name. |   59   // Install again. Should create a new one with different name. | 
|   60   ASSERT_TRUE(file_util::CreateDirectory(src)); |   60   ASSERT_TRUE(base::CreateDirectory(src)); | 
|   61   base::FilePath version_2 = extension_file_util::InstallExtension( |   61   base::FilePath version_2 = extension_file_util::InstallExtension( | 
|   62       src, |   62       src, | 
|   63       extension_id, |   63       extension_id, | 
|   64       version, |   64       version, | 
|   65       all_extensions); |   65       all_extensions); | 
|   66   ASSERT_EQ(version_2.value(), |   66   ASSERT_EQ(version_2.value(), | 
|   67             all_extensions.AppendASCII(extension_id).AppendASCII("1.0_1") |   67             all_extensions.AppendASCII(extension_id).AppendASCII("1.0_1") | 
|   68                 .value()); |   68                 .value()); | 
|   69   ASSERT_TRUE(base::DirectoryExists(version_2)); |   69   ASSERT_TRUE(base::DirectoryExists(version_2)); | 
|   70  |   70  | 
|   71   // Should have moved the source. |   71   // Should have moved the source. | 
|   72   ASSERT_FALSE(base::DirectoryExists(src)); |   72   ASSERT_FALSE(base::DirectoryExists(src)); | 
|   73  |   73  | 
|   74   // Install yet again. Should create a new one with a different name. |   74   // Install yet again. Should create a new one with a different name. | 
|   75   ASSERT_TRUE(file_util::CreateDirectory(src)); |   75   ASSERT_TRUE(base::CreateDirectory(src)); | 
|   76   base::FilePath version_3 = extension_file_util::InstallExtension( |   76   base::FilePath version_3 = extension_file_util::InstallExtension( | 
|   77       src, |   77       src, | 
|   78       extension_id, |   78       extension_id, | 
|   79       version, |   79       version, | 
|   80       all_extensions); |   80       all_extensions); | 
|   81   ASSERT_EQ(version_3.value(), |   81   ASSERT_EQ(version_3.value(), | 
|   82             all_extensions.AppendASCII(extension_id).AppendASCII("1.0_2") |   82             all_extensions.AppendASCII(extension_id).AppendASCII("1.0_2") | 
|   83                 .value()); |   83                 .value()); | 
|   84   ASSERT_TRUE(base::DirectoryExists(version_3)); |   84   ASSERT_TRUE(base::DirectoryExists(version_3)); | 
|   85  |   85  | 
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  132       install_dir, Manifest::UNPACKED, Extension::NO_FLAGS, &error)); |  132       install_dir, Manifest::UNPACKED, Extension::NO_FLAGS, &error)); | 
|  133   ASSERT_FALSE(extension.get() == NULL); |  133   ASSERT_FALSE(extension.get() == NULL); | 
|  134   EXPECT_TRUE(error.empty()); |  134   EXPECT_TRUE(error.empty()); | 
|  135 } |  135 } | 
|  136  |  136  | 
|  137 TEST_F(ExtensionFileUtilTest, CheckIllegalFilenamesNoUnderscores) { |  137 TEST_F(ExtensionFileUtilTest, CheckIllegalFilenamesNoUnderscores) { | 
|  138   base::ScopedTempDir temp; |  138   base::ScopedTempDir temp; | 
|  139   ASSERT_TRUE(temp.CreateUniqueTempDir()); |  139   ASSERT_TRUE(temp.CreateUniqueTempDir()); | 
|  140  |  140  | 
|  141   base::FilePath src_path = temp.path().AppendASCII("some_dir"); |  141   base::FilePath src_path = temp.path().AppendASCII("some_dir"); | 
|  142   ASSERT_TRUE(file_util::CreateDirectory(src_path)); |  142   ASSERT_TRUE(base::CreateDirectory(src_path)); | 
|  143  |  143  | 
|  144   std::string data = "{ \"name\": { \"message\": \"foobar\" } }"; |  144   std::string data = "{ \"name\": { \"message\": \"foobar\" } }"; | 
|  145   ASSERT_TRUE(file_util::WriteFile(src_path.AppendASCII("some_file.txt"), |  145   ASSERT_TRUE(file_util::WriteFile(src_path.AppendASCII("some_file.txt"), | 
|  146                                    data.c_str(), data.length())); |  146                                    data.c_str(), data.length())); | 
|  147   std::string error; |  147   std::string error; | 
|  148   EXPECT_TRUE(extension_file_util::CheckForIllegalFilenames(temp.path(), |  148   EXPECT_TRUE(extension_file_util::CheckForIllegalFilenames(temp.path(), | 
|  149                                                             &error)); |  149                                                             &error)); | 
|  150 } |  150 } | 
|  151  |  151  | 
|  152 TEST_F(ExtensionFileUtilTest, CheckIllegalFilenamesOnlyReserved) { |  152 TEST_F(ExtensionFileUtilTest, CheckIllegalFilenamesOnlyReserved) { | 
|  153   base::ScopedTempDir temp; |  153   base::ScopedTempDir temp; | 
|  154   ASSERT_TRUE(temp.CreateUniqueTempDir()); |  154   ASSERT_TRUE(temp.CreateUniqueTempDir()); | 
|  155  |  155  | 
|  156   const base::FilePath::CharType* folders[] = |  156   const base::FilePath::CharType* folders[] = | 
|  157       { extensions::kLocaleFolder, extensions::kPlatformSpecificFolder }; |  157       { extensions::kLocaleFolder, extensions::kPlatformSpecificFolder }; | 
|  158  |  158  | 
|  159   for (size_t i = 0; i < arraysize(folders); i++) { |  159   for (size_t i = 0; i < arraysize(folders); i++) { | 
|  160     base::FilePath src_path = temp.path().Append(folders[i]); |  160     base::FilePath src_path = temp.path().Append(folders[i]); | 
|  161     ASSERT_TRUE(file_util::CreateDirectory(src_path)); |  161     ASSERT_TRUE(base::CreateDirectory(src_path)); | 
|  162   } |  162   } | 
|  163  |  163  | 
|  164   std::string error; |  164   std::string error; | 
|  165   EXPECT_TRUE(extension_file_util::CheckForIllegalFilenames(temp.path(), |  165   EXPECT_TRUE(extension_file_util::CheckForIllegalFilenames(temp.path(), | 
|  166                                                             &error)); |  166                                                             &error)); | 
|  167 } |  167 } | 
|  168  |  168  | 
|  169 TEST_F(ExtensionFileUtilTest, CheckIllegalFilenamesReservedAndIllegal) { |  169 TEST_F(ExtensionFileUtilTest, CheckIllegalFilenamesReservedAndIllegal) { | 
|  170   base::ScopedTempDir temp; |  170   base::ScopedTempDir temp; | 
|  171   ASSERT_TRUE(temp.CreateUniqueTempDir()); |  171   ASSERT_TRUE(temp.CreateUniqueTempDir()); | 
|  172  |  172  | 
|  173   base::FilePath src_path = temp.path().Append(extensions::kLocaleFolder); |  173   base::FilePath src_path = temp.path().Append(extensions::kLocaleFolder); | 
|  174   ASSERT_TRUE(file_util::CreateDirectory(src_path)); |  174   ASSERT_TRUE(base::CreateDirectory(src_path)); | 
|  175  |  175  | 
|  176   src_path = temp.path().AppendASCII("_some_dir"); |  176   src_path = temp.path().AppendASCII("_some_dir"); | 
|  177   ASSERT_TRUE(file_util::CreateDirectory(src_path)); |  177   ASSERT_TRUE(base::CreateDirectory(src_path)); | 
|  178  |  178  | 
|  179   std::string error; |  179   std::string error; | 
|  180   EXPECT_FALSE(extension_file_util::CheckForIllegalFilenames(temp.path(), |  180   EXPECT_FALSE(extension_file_util::CheckForIllegalFilenames(temp.path(), | 
|  181                                                              &error)); |  181                                                              &error)); | 
|  182 } |  182 } | 
|  183  |  183  | 
|  184 TEST_F(ExtensionFileUtilTest, |  184 TEST_F(ExtensionFileUtilTest, | 
|  185        LoadExtensionGivesHelpfullErrorOnMissingManifest) { |  185        LoadExtensionGivesHelpfullErrorOnMissingManifest) { | 
|  186   base::FilePath install_dir; |  186   base::FilePath install_dir; | 
|  187   ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &install_dir)); |  187   ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &install_dir)); | 
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  350     "uOwrmnQYxaMReFV68Z2w9DcLZn07f7/R9Wn72z89CxwJAFsDoNaDes4h48bX7plct\n" |  350     "uOwrmnQYxaMReFV68Z2w9DcLZn07f7/R9Wn72z89CxwJAFsDoNaDes4h48bX7plct\n" | 
|  351     "s9ACjmTwcCigZjN2K7AGv7ntCLF3DnV5dK0dTHNaAdD3SbY3jl29Rk2CwiURSX6Ee\n" |  351     "s9ACjmTwcCigZjN2K7AGv7ntCLF3DnV5dK0dTHNaAdD3SbY3jl29Rk2CwiURSX6Ee\n" | 
|  352     "g==\n" |  352     "g==\n" | 
|  353     "-----END PRIVATE KEY-----\n"; |  353     "-----END PRIVATE KEY-----\n"; | 
|  354  |  354  | 
|  355 TEST_F(ExtensionFileUtilTest, FindPrivateKeyFiles) { |  355 TEST_F(ExtensionFileUtilTest, FindPrivateKeyFiles) { | 
|  356   base::ScopedTempDir temp; |  356   base::ScopedTempDir temp; | 
|  357   ASSERT_TRUE(temp.CreateUniqueTempDir()); |  357   ASSERT_TRUE(temp.CreateUniqueTempDir()); | 
|  358  |  358  | 
|  359   base::FilePath src_path = temp.path().AppendASCII("some_dir"); |  359   base::FilePath src_path = temp.path().AppendASCII("some_dir"); | 
|  360   ASSERT_TRUE(file_util::CreateDirectory(src_path)); |  360   ASSERT_TRUE(base::CreateDirectory(src_path)); | 
|  361  |  361  | 
|  362   ASSERT_TRUE(file_util::WriteFile(src_path.AppendASCII("a_key.pem"), |  362   ASSERT_TRUE(file_util::WriteFile(src_path.AppendASCII("a_key.pem"), | 
|  363                                    private_key, arraysize(private_key))); |  363                                    private_key, arraysize(private_key))); | 
|  364   ASSERT_TRUE(file_util::WriteFile(src_path.AppendASCII("second_key.pem"), |  364   ASSERT_TRUE(file_util::WriteFile(src_path.AppendASCII("second_key.pem"), | 
|  365                                    private_key, arraysize(private_key))); |  365                                    private_key, arraysize(private_key))); | 
|  366   // Shouldn't find a key with a different extension. |  366   // Shouldn't find a key with a different extension. | 
|  367   ASSERT_TRUE(file_util::WriteFile(src_path.AppendASCII("key.diff_ext"), |  367   ASSERT_TRUE(file_util::WriteFile(src_path.AppendASCII("key.diff_ext"), | 
|  368                                    private_key, arraysize(private_key))); |  368                                    private_key, arraysize(private_key))); | 
|  369   // Shouldn't find a key that isn't parsable. |  369   // Shouldn't find a key that isn't parsable. | 
|  370   ASSERT_TRUE(file_util::WriteFile(src_path.AppendASCII("unparsable_key.pem"), |  370   ASSERT_TRUE(file_util::WriteFile(src_path.AppendASCII("unparsable_key.pem"), | 
|  371                                    private_key, arraysize(private_key) - 30)); |  371                                    private_key, arraysize(private_key) - 30)); | 
|  372   std::vector<base::FilePath> private_keys = |  372   std::vector<base::FilePath> private_keys = | 
|  373       extension_file_util::FindPrivateKeyFiles(temp.path()); |  373       extension_file_util::FindPrivateKeyFiles(temp.path()); | 
|  374   EXPECT_EQ(2U, private_keys.size()); |  374   EXPECT_EQ(2U, private_keys.size()); | 
|  375   EXPECT_THAT(private_keys, |  375   EXPECT_THAT(private_keys, | 
|  376               testing::Contains(src_path.AppendASCII("a_key.pem"))); |  376               testing::Contains(src_path.AppendASCII("a_key.pem"))); | 
|  377   EXPECT_THAT(private_keys, |  377   EXPECT_THAT(private_keys, | 
|  378               testing::Contains(src_path.AppendASCII("second_key.pem"))); |  378               testing::Contains(src_path.AppendASCII("second_key.pem"))); | 
|  379 } |  379 } | 
|  380  |  380  | 
|  381 TEST_F(ExtensionFileUtilTest, WarnOnPrivateKey) { |  381 TEST_F(ExtensionFileUtilTest, WarnOnPrivateKey) { | 
|  382   base::ScopedTempDir temp; |  382   base::ScopedTempDir temp; | 
|  383   ASSERT_TRUE(temp.CreateUniqueTempDir()); |  383   ASSERT_TRUE(temp.CreateUniqueTempDir()); | 
|  384  |  384  | 
|  385   base::FilePath ext_path = temp.path().AppendASCII("ext_root"); |  385   base::FilePath ext_path = temp.path().AppendASCII("ext_root"); | 
|  386   ASSERT_TRUE(file_util::CreateDirectory(ext_path)); |  386   ASSERT_TRUE(base::CreateDirectory(ext_path)); | 
|  387  |  387  | 
|  388   const char manifest[] = |  388   const char manifest[] = | 
|  389       "{\n" |  389       "{\n" | 
|  390       "  \"name\": \"Test Extension\",\n" |  390       "  \"name\": \"Test Extension\",\n" | 
|  391       "  \"version\": \"1.0\",\n" |  391       "  \"version\": \"1.0\",\n" | 
|  392       "  \"manifest_version\": 2,\n" |  392       "  \"manifest_version\": 2,\n" | 
|  393       "  \"description\": \"The first extension that I made.\"\n" |  393       "  \"description\": \"The first extension that I made.\"\n" | 
|  394       "}\n"; |  394       "}\n"; | 
|  395   ASSERT_TRUE(file_util::WriteFile(ext_path.AppendASCII("manifest.json"), |  395   ASSERT_TRUE(file_util::WriteFile(ext_path.AppendASCII("manifest.json"), | 
|  396                                    manifest, strlen(manifest))); |  396                                    manifest, strlen(manifest))); | 
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  458   scoped_refptr<Extension> extension3(extension_file_util::LoadExtension( |  458   scoped_refptr<Extension> extension3(extension_file_util::LoadExtension( | 
|  459       ext_dir, Manifest::UNPACKED, Extension::NO_FLAGS, &error)); |  459       ext_dir, Manifest::UNPACKED, Extension::NO_FLAGS, &error)); | 
|  460   EXPECT_TRUE(extension3.get() == NULL); |  460   EXPECT_TRUE(extension3.get() == NULL); | 
|  461   EXPECT_STREQ("Could not load icon 'icon.png' for page action.", |  461   EXPECT_STREQ("Could not load icon 'icon.png' for page action.", | 
|  462                error.c_str()); |  462                error.c_str()); | 
|  463 } |  463 } | 
|  464  |  464  | 
|  465 // TODO(aa): More tests as motivation allows. Maybe steal some from |  465 // TODO(aa): More tests as motivation allows. Maybe steal some from | 
|  466 // ExtensionService? Many of them could probably be tested here without the |  466 // ExtensionService? Many of them could probably be tested here without the | 
|  467 // MessageLoop shenanigans. |  467 // MessageLoop shenanigans. | 
| OLD | NEW |