1// Copyright 2013 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 "chrome/browser/extensions/test_extension_dir.h" 6 7#include "base/file_util.h" 8#include "base/json/json_writer.h" 9#include "base/safe_numerics.h" 10#include "base/test/values_test_util.h" 11#include "chrome/browser/extensions/extension_creator.h" 12#include "testing/gtest/include/gtest/gtest.h" 13 14namespace extensions { 15 16TestExtensionDir::TestExtensionDir() { 17 EXPECT_TRUE(dir_.CreateUniqueTempDir()); 18 EXPECT_TRUE(crx_dir_.CreateUniqueTempDir()); 19} 20 21TestExtensionDir::~TestExtensionDir() { 22} 23 24void TestExtensionDir::WriteManifest(base::StringPiece manifest) { 25 // TODO(kalman): Write some more convenient way to specify a manifest than 26 // via JSON, which requires awkwardly escaping all quotes. E.g. add a feature 27 // to JSONReader that can parse '' literals rather than "". 28 WriteFile(FILE_PATH_LITERAL("manifest.json"), manifest); 29} 30 31void TestExtensionDir::WriteFile(const base::FilePath::StringType& filename, 32 base::StringPiece contents) { 33 EXPECT_EQ( 34 base::checked_numeric_cast<int>(contents.size()), 35 file_util::WriteFile( 36 dir_.path().Append(filename), contents.data(), contents.size())); 37} 38 39// This function packs the extension into a .crx, and returns the path to that 40// .crx. Multiple calls to Pack() will produce extensions with the same ID. 41base::FilePath TestExtensionDir::Pack() { 42 ExtensionCreator creator; 43 base::FilePath crx_path = 44 crx_dir_.path().Append(FILE_PATH_LITERAL("ext.crx")); 45 base::FilePath pem_path = 46 crx_dir_.path().Append(FILE_PATH_LITERAL("ext.pem")); 47 base::FilePath pem_in_path, pem_out_path; 48 if (base::PathExists(pem_path)) 49 pem_in_path = pem_path; 50 else 51 pem_out_path = pem_path; 52 if (!creator.Run(dir_.path(), 53 crx_path, 54 pem_in_path, 55 pem_out_path, 56 ExtensionCreator::kOverwriteCRX)) { 57 ADD_FAILURE() 58 << "ExtensionCreator::Run() failed: " << creator.error_message(); 59 return base::FilePath(); 60 } 61 if (!base::PathExists(crx_path)) { 62 ADD_FAILURE() << crx_path.value() << " was not created."; 63 return base::FilePath(); 64 } 65 return crx_path; 66} 67 68} // namespace extensions 69