17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// found in the LICENSE file. 47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/extensions/test_extension_dir.h" 67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/json/json_writer.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/numerics/safe_conversions.h" 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/test/values_test_util.h" 117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/extensions/extension_creator.h" 127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "testing/gtest/include/gtest/gtest.h" 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace extensions { 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTestExtensionDir::TestExtensionDir() { 177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(dir_.CreateUniqueTempDir()); 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(crx_dir_.CreateUniqueTempDir()); 197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTestExtensionDir::~TestExtensionDir() { 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid TestExtensionDir::WriteManifest(base::StringPiece manifest) { 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // TODO(kalman): Write some more convenient way to specify a manifest than 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // via JSON, which requires awkwardly escaping all quotes. E.g. add a feature 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // to JSONReader that can parse '' literals rather than "". 287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WriteFile(FILE_PATH_LITERAL("manifest.json"), manifest); 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid TestExtensionDir::WriteFile(const base::FilePath::StringType& filename, 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::StringPiece contents) { 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ( 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::checked_cast<int>(contents.size()), 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::WriteFile( 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch dir_.path().Append(filename), contents.data(), contents.size())); 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// This function packs the extension into a .crx, and returns the path to that 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// .crx. Multiple calls to Pack() will produce extensions with the same ID. 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbase::FilePath TestExtensionDir::Pack() { 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ExtensionCreator creator; 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::FilePath crx_path = 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch crx_dir_.path().Append(FILE_PATH_LITERAL("ext.crx")); 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::FilePath pem_path = 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch crx_dir_.path().Append(FILE_PATH_LITERAL("ext.pem")); 477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::FilePath pem_in_path, pem_out_path; 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (base::PathExists(pem_path)) 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pem_in_path = pem_path; 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch else 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pem_out_path = pem_path; 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!creator.Run(dir_.path(), 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch crx_path, 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pem_in_path, 557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pem_out_path, 567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ExtensionCreator::kOverwriteCRX)) { 577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ADD_FAILURE() 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch << "ExtensionCreator::Run() failed: " << creator.error_message(); 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return base::FilePath(); 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::PathExists(crx_path)) { 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ADD_FAILURE() << crx_path.value() << " was not created."; 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return base::FilePath(); 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return crx_path; 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace extensions 69