chrome.exe --package-extension generates .crx from extension directory

R=aa
BUG=12114

Review URL: http://codereview.chromium.org/118328

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@17927 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/extensions/extensions_service_unittest.cc b/chrome/browser/extensions/extensions_service_unittest.cc
index 630e71f3..720b3a6 100644
--- a/chrome/browser/extensions/extensions_service_unittest.cc
+++ b/chrome/browser/extensions/extensions_service_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/path_service.h"
 #include "base/string_util.h"
 #include "base/time.h"
+#include "chrome/browser/extensions/extension_creator.h"
 #include "chrome/browser/extensions/extensions_service.h"
 #include "chrome/common/extensions/extension.h"
 #include "chrome/common/extensions/url_pattern.h"
@@ -420,6 +421,70 @@
   // TODO(erikkay): add tests for upgrade cases.
 }
 
+#if defined(OS_WIN)  // TODO(port)
+// Test Packaging and installing an extension.
+// TODO(aa): add a test that uses an openssl-generate private key.
+// TODO(rafaelw): add more tests for failure cases.
+TEST_F(ExtensionsServiceTest, PackExtension) {
+  SetExtensionsEnabled(true);
+
+  FilePath extensions_path;
+  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path));
+  extensions_path = extensions_path.AppendASCII("extensions");
+  FilePath input_directory = extensions_path.AppendASCII("good")
+      .AppendASCII("extension1").AppendASCII("1");
+
+  FilePath output_directory;
+  file_util::CreateNewTempDirectory(FILE_PATH_LITERAL("chrome_"),
+      &output_directory);
+  FilePath crx_path(output_directory.AppendASCII("ex1.crx"));
+  FilePath privkey_path(output_directory.AppendASCII("privkey.pem"));
+
+  scoped_ptr<ExtensionCreator> creator(new ExtensionCreator());
+  ASSERT_TRUE(creator->Run(input_directory, crx_path, FilePath(),
+      privkey_path));
+
+  InstallExtension(crx_path, true);
+
+  ASSERT_TRUE(file_util::PathExists(privkey_path));
+
+  file_util::Delete(crx_path, false);
+  file_util::Delete(privkey_path, false);
+}
+
+// Test Packaging and installing an extension using an openssl generated key.
+// The openssl is generated with the following:
+// > openssl genrsa -out privkey.pem 1024 

+// > openssl pkcs8 -topk8 -nocrypt -in privkey.pem -out privkey_asn1.pem

+// The privkey.pem is a PrivateKey, and the pcks8 -topk8 creates a 
+// PrivateKeyInfo ASN.1 structure, we our RSAPrivateKey expects.
+TEST_F(ExtensionsServiceTest, PackExtensionOpenSSLKey) {
+  SetExtensionsEnabled(true);
+
+  FilePath extensions_path;
+  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path));
+  extensions_path = extensions_path.AppendASCII("extensions");
+  FilePath input_directory = extensions_path.AppendASCII("good")
+      .AppendASCII("extension1").AppendASCII("1");
+  FilePath privkey_path(extensions_path.AppendASCII(
+      "openssl_privkey_asn1.pem"));
+  ASSERT_TRUE(file_util::PathExists(privkey_path));
+
+  FilePath output_directory;
+  file_util::CreateNewTempDirectory(FILE_PATH_LITERAL("chrome_"),
+      &output_directory);
+  FilePath crx_path(output_directory.AppendASCII("ex1.crx"));
+
+  scoped_ptr<ExtensionCreator> creator(new ExtensionCreator());
+  ASSERT_TRUE(creator->Run(input_directory, crx_path, privkey_path,
+      FilePath()));
+
+  InstallExtension(crx_path, true);
+
+  file_util::Delete(crx_path, false);
+}
+#endif // defined(OS_WIN)
+
 TEST_F(ExtensionsServiceTest, InstallTheme) {
   FilePath extensions_path;
   ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path));