Home | History | Annotate | Download | only in extensions
      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
      3 // found in the LICENSE file.
      4 
      5 #include "base/files/file_util.h"
      6 #include "base/files/scoped_temp_dir.h"
      7 #include "base/path_service.h"
      8 #include "base/strings/string_util.h"
      9 #include "base/strings/utf_string_conversions.h"
     10 #include "base/values.h"
     11 #include "chrome/common/chrome_paths.h"
     12 #include "chrome/utility/extensions/unpacker.h"
     13 #include "extensions/common/constants.h"
     14 #include "extensions/common/extension.h"
     15 #include "extensions/common/manifest_constants.h"
     16 #include "testing/gtest/include/gtest/gtest.h"
     17 #include "third_party/skia/include/core/SkBitmap.h"
     18 
     19 using base::ASCIIToUTF16;
     20 
     21 namespace extensions {
     22 
     23 namespace errors = manifest_errors;
     24 namespace keys = manifest_keys;
     25 
     26 class UnpackerTest : public testing::Test {
     27  public:
     28   virtual ~UnpackerTest() {
     29     LOG(WARNING) << "Deleting temp dir: "
     30                  << temp_dir_.path().LossyDisplayName();
     31     LOG(WARNING) << temp_dir_.Delete();
     32   }
     33 
     34   void SetupUnpacker(const std::string& crx_name) {
     35     base::FilePath original_path;
     36     ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &original_path));
     37     original_path = original_path.AppendASCII("extensions")
     38         .AppendASCII("unpacker")
     39         .AppendASCII(crx_name);
     40     ASSERT_TRUE(base::PathExists(original_path)) << original_path.value();
     41 
     42     // Try bots won't let us write into DIR_TEST_DATA, so we have to create
     43     // a temp folder to play in.
     44     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
     45 
     46     base::FilePath crx_path = temp_dir_.path().AppendASCII(crx_name);
     47     ASSERT_TRUE(base::CopyFile(original_path, crx_path)) <<
     48         "Original path " << original_path.value() <<
     49         ", Crx path " << crx_path.value();
     50 
     51     unpacker_.reset(new Unpacker(crx_path,
     52                                  std::string(),
     53                                  Manifest::INTERNAL,
     54                                  Extension::NO_FLAGS));
     55   }
     56 
     57  protected:
     58   base::ScopedTempDir temp_dir_;
     59   scoped_ptr<Unpacker> unpacker_;
     60 };
     61 
     62 TEST_F(UnpackerTest, EmptyDefaultLocale) {
     63   SetupUnpacker("empty_default_locale.crx");
     64   EXPECT_FALSE(unpacker_->Run());
     65   EXPECT_EQ(ASCIIToUTF16(errors::kInvalidDefaultLocale),
     66             unpacker_->error_message());
     67 }
     68 
     69 TEST_F(UnpackerTest, HasDefaultLocaleMissingLocalesFolder) {
     70   SetupUnpacker("has_default_missing_locales.crx");
     71   EXPECT_FALSE(unpacker_->Run());
     72   EXPECT_EQ(ASCIIToUTF16(errors::kLocalesTreeMissing),
     73             unpacker_->error_message());
     74 }
     75 
     76 TEST_F(UnpackerTest, InvalidDefaultLocale) {
     77   SetupUnpacker("invalid_default_locale.crx");
     78   EXPECT_FALSE(unpacker_->Run());
     79   EXPECT_EQ(ASCIIToUTF16(errors::kInvalidDefaultLocale),
     80             unpacker_->error_message());
     81 }
     82 
     83 TEST_F(UnpackerTest, InvalidMessagesFile) {
     84   SetupUnpacker("invalid_messages_file.crx");
     85   EXPECT_FALSE(unpacker_->Run());
     86   EXPECT_TRUE(MatchPattern(unpacker_->error_message(),
     87     ASCIIToUTF16("*_locales?en_US?messages.json: Line: 2, column: 11,"
     88         " Syntax error."))) << unpacker_->error_message();
     89 }
     90 
     91 TEST_F(UnpackerTest, MissingDefaultData) {
     92   SetupUnpacker("missing_default_data.crx");
     93   EXPECT_FALSE(unpacker_->Run());
     94   EXPECT_EQ(ASCIIToUTF16(errors::kLocalesNoDefaultMessages),
     95             unpacker_->error_message());
     96 }
     97 
     98 TEST_F(UnpackerTest, MissingDefaultLocaleHasLocalesFolder) {
     99   SetupUnpacker("missing_default_has_locales.crx");
    100   EXPECT_FALSE(unpacker_->Run());
    101   EXPECT_EQ(ASCIIToUTF16(errors::kLocalesNoDefaultLocaleSpecified),
    102             unpacker_->error_message());
    103 }
    104 
    105 TEST_F(UnpackerTest, MissingMessagesFile) {
    106   SetupUnpacker("missing_messages_file.crx");
    107   EXPECT_FALSE(unpacker_->Run());
    108   EXPECT_TRUE(MatchPattern(unpacker_->error_message(),
    109     ASCIIToUTF16(errors::kLocalesMessagesFileMissing) +
    110     ASCIIToUTF16("*_locales?en_US?messages.json")));
    111 }
    112 
    113 TEST_F(UnpackerTest, NoLocaleData) {
    114   SetupUnpacker("no_locale_data.crx");
    115   EXPECT_FALSE(unpacker_->Run());
    116   EXPECT_EQ(ASCIIToUTF16(errors::kLocalesNoDefaultMessages),
    117             unpacker_->error_message());
    118 }
    119 
    120 TEST_F(UnpackerTest, GoodL10n) {
    121   SetupUnpacker("good_l10n.crx");
    122   EXPECT_TRUE(unpacker_->Run());
    123   EXPECT_TRUE(unpacker_->error_message().empty());
    124   ASSERT_EQ(2U, unpacker_->parsed_catalogs()->size());
    125 }
    126 
    127 TEST_F(UnpackerTest, NoL10n) {
    128   SetupUnpacker("no_l10n.crx");
    129   EXPECT_TRUE(unpacker_->Run());
    130   EXPECT_TRUE(unpacker_->error_message().empty());
    131   EXPECT_EQ(0U, unpacker_->parsed_catalogs()->size());
    132 }
    133 
    134 TEST_F(UnpackerTest, UnzipDirectoryError) {
    135   const char* kExpected = "Could not create directory for unzipping: ";
    136   SetupUnpacker("good_package.crx");
    137   base::FilePath path =
    138       temp_dir_.path().AppendASCII(kTempExtensionName);
    139   ASSERT_TRUE(base::WriteFile(path, "foo", 3));
    140   EXPECT_FALSE(unpacker_->Run());
    141   EXPECT_TRUE(StartsWith(unpacker_->error_message(),
    142               ASCIIToUTF16(kExpected),
    143               false)) << "Expected prefix: \"" << kExpected
    144                       << "\", actual error: \"" << unpacker_->error_message()
    145                       << "\"";
    146 }
    147 
    148 TEST_F(UnpackerTest, UnzipError) {
    149   const char* kExpected = "Could not unzip extension";
    150   SetupUnpacker("bad_zip.crx");
    151   EXPECT_FALSE(unpacker_->Run());
    152   EXPECT_EQ(ASCIIToUTF16(kExpected), unpacker_->error_message());
    153 }
    154 
    155 TEST_F(UnpackerTest, BadPathError) {
    156   const char* kExpected = "Illegal path (absolute or relative with '..'): ";
    157   SetupUnpacker("bad_path.crx");
    158   EXPECT_FALSE(unpacker_->Run());
    159   EXPECT_TRUE(StartsWith(unpacker_->error_message(),
    160               ASCIIToUTF16(kExpected),
    161               false)) << "Expected prefix: \"" << kExpected
    162                       << "\", actual error: \"" << unpacker_->error_message()
    163                       << "\"";
    164 }
    165 
    166 
    167 TEST_F(UnpackerTest, ImageDecodingError) {
    168   const char* kExpected = "Could not decode image: ";
    169   SetupUnpacker("bad_image.crx");
    170   EXPECT_FALSE(unpacker_->Run());
    171   EXPECT_TRUE(StartsWith(unpacker_->error_message(),
    172               ASCIIToUTF16(kExpected),
    173               false)) << "Expected prefix: \"" << kExpected
    174                       << "\", actual error: \"" << unpacker_->error_message()
    175                       << "\"";
    176 }
    177 
    178 }  // namespace extensions
    179