1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 28ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Use of this source code is governed by a BSD-style license that can be 38ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// found in the LICENSE file. 48ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 58ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/file_util.h" 68ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/path_service.h" 78ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/string_util.h" 88ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/values.h" 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_temp_dir.h" 108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/chrome_paths.h" 118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/extension_constants.h" 128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "chrome/common/extensions/extension_unpacker.h" 138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "testing/gtest/include/gtest/gtest.h" 148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "third_party/skia/include/core/SkBitmap.h" 158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsennamespace errors = extension_manifest_errors; 178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsennamespace keys = extension_manifest_keys; 188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenclass ExtensionUnpackerTest : public testing::Test { 208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenpublic: 218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void SetupUnpacker(const std::string& crx_name) { 228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen FilePath original_path; 238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &original_path)); 248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen original_path = original_path.AppendASCII("extensions") 258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen .AppendASCII("unpacker") 268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen .AppendASCII(crx_name); 278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ASSERT_TRUE(file_util::PathExists(original_path)) << original_path.value(); 288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Try bots won't let us write into DIR_TEST_DATA, so we have to create 308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // a temp folder to play in. 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FilePath crx_path = temp_dir_.path().AppendASCII(crx_name); 348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ASSERT_TRUE(file_util::CopyFile(original_path, crx_path)) << 358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen "Original path " << original_path.value() << 368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ", Crx path " << crx_path.value(); 378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen unpacker_.reset(new ExtensionUnpacker(crx_path)); 398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen protected: 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ScopedTempDir temp_dir_; 438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen scoped_ptr<ExtensionUnpacker> unpacker_; 448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}; 458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 468ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST_F(ExtensionUnpackerTest, EmptyDefaultLocale) { 478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SetupUnpacker("empty_default_locale.crx"); 488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_FALSE(unpacker_->Run()); 498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ(errors::kInvalidDefaultLocale, unpacker_->error_message()); 508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 528ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST_F(ExtensionUnpackerTest, HasDefaultLocaleMissingLocalesFolder) { 538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SetupUnpacker("has_default_missing_locales.crx"); 548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_FALSE(unpacker_->Run()); 558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ(errors::kLocalesTreeMissing, unpacker_->error_message()); 568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 588ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST_F(ExtensionUnpackerTest, InvalidDefaultLocale) { 598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SetupUnpacker("invalid_default_locale.crx"); 608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_FALSE(unpacker_->Run()); 618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ(errors::kInvalidDefaultLocale, unpacker_->error_message()); 628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 648ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST_F(ExtensionUnpackerTest, InvalidMessagesFile) { 658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SetupUnpacker("invalid_messages_file.crx"); 668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_FALSE(unpacker_->Run()); 678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_TRUE(MatchPattern(unpacker_->error_message(), 688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string("*_locales?en_US?messages.json: Line: 2, column: 3," 698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen " Dictionary keys must be quoted."))); 708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 728ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST_F(ExtensionUnpackerTest, MissingDefaultData) { 738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SetupUnpacker("missing_default_data.crx"); 748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_FALSE(unpacker_->Run()); 758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ(errors::kLocalesNoDefaultMessages, unpacker_->error_message()); 768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 788ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST_F(ExtensionUnpackerTest, MissingDefaultLocaleHasLocalesFolder) { 798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SetupUnpacker("missing_default_has_locales.crx"); 808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_FALSE(unpacker_->Run()); 818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ(errors::kLocalesNoDefaultLocaleSpecified, 828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen unpacker_->error_message()); 838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 858ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST_F(ExtensionUnpackerTest, MissingMessagesFile) { 868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SetupUnpacker("missing_messages_file.crx"); 878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_FALSE(unpacker_->Run()); 888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_TRUE(MatchPattern(unpacker_->error_message(), 898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen errors::kLocalesMessagesFileMissing + 908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string("*_locales?en_US?messages.json"))); 918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 938ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST_F(ExtensionUnpackerTest, NoLocaleData) { 948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SetupUnpacker("no_locale_data.crx"); 958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_FALSE(unpacker_->Run()); 968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ(errors::kLocalesNoDefaultMessages, unpacker_->error_message()); 978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 998ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST_F(ExtensionUnpackerTest, GoodL10n) { 1008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SetupUnpacker("good_l10n.crx"); 1018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_TRUE(unpacker_->Run()); 1028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_TRUE(unpacker_->error_message().empty()); 1038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ASSERT_EQ(2U, unpacker_->parsed_catalogs()->size()); 1048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 1058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1068ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTEST_F(ExtensionUnpackerTest, NoL10n) { 1078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SetupUnpacker("no_l10n.crx"); 1088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_TRUE(unpacker_->Run()); 1098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_TRUE(unpacker_->error_message().empty()); 1108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen EXPECT_EQ(0U, unpacker_->parsed_catalogs()->size()); 1118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 112