Index: chrome/browser/importer/firefox_importer_unittest_utils_mac.cc |
diff --git a/chrome/browser/importer/firefox_importer_unittest_utils_mac.cc b/chrome/browser/importer/firefox_importer_unittest_utils_mac.cc |
deleted file mode 100644 |
index 33c877a03eb3b30e52055031dea7f5042eda6e12..0000000000000000000000000000000000000000 |
--- a/chrome/browser/importer/firefox_importer_unittest_utils_mac.cc |
+++ /dev/null |
@@ -1,280 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/importer/firefox_importer_unittest_utils.h" |
- |
-#include "base/base_switches.h" |
-#include "base/bind.h" |
-#include "base/command_line.h" |
-#include "base/file_util.h" |
-#include "base/files/file_path.h" |
-#include "base/message_loop.h" |
-#include "base/test/test_timeouts.h" |
-#include "chrome/browser/importer/firefox_importer_utils.h" |
-#include "ipc/ipc_channel.h" |
-#include "ipc/ipc_descriptors.h" |
-#include "ipc/ipc_listener.h" |
-#include "ipc/ipc_message.h" |
-#include "ipc/ipc_multiprocess_test.h" |
-#include "ipc/ipc_switches.h" |
-#include "testing/multiprocess_func_list.h" |
- |
-#define IPC_MESSAGE_IMPL |
-#include "chrome/browser/importer/firefox_importer_unittest_messages_internal.h" |
- |
-namespace { |
- |
-// Name of IPC Channel to use for Server<-> Child Communications. |
-const char kTestChannelID[] = "T1"; |
- |
-// Launch the child process: |
-// |nss_path| - path to the NSS directory holding the decryption libraries. |
-// |channel| - IPC Channel to use for communication. |
-// |handle| - On return, the process handle to use to communicate with the |
-// child. |
-bool LaunchNSSDecrypterChildProcess(const base::FilePath& nss_path, |
- IPC::Channel* channel, base::ProcessHandle* handle) { |
- CommandLine cl(*CommandLine::ForCurrentProcess()); |
- cl.AppendSwitchASCII(switches::kTestChildProcess, "NSSDecrypterChildProcess"); |
- |
- // Set env variable needed for FF encryption libs to load. |
- // See "chrome/browser/importer/nss_decryptor_mac.mm" for an explanation of |
- // why we need this. |
- base::EnvironmentVector env; |
- std::pair<std::string, std::string> dyld_override; |
- dyld_override.first = "DYLD_FALLBACK_LIBRARY_PATH"; |
- dyld_override.second = nss_path.value(); |
- env.push_back(dyld_override); |
- |
- int ipcfd = channel->TakeClientFileDescriptor(); |
- if (ipcfd == -1) |
- return false; |
- |
- file_util::ScopedFD client_file_descriptor_closer(&ipcfd); |
- base::FileHandleMappingVector fds_to_map; |
- fds_to_map.push_back(std::pair<int,int>(ipcfd, kPrimaryIPCChannel + 3)); |
- |
- bool debug_on_start = CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kDebugChildren); |
- base::LaunchOptions options; |
- options.environ = &env; |
- options.fds_to_remap = &fds_to_map; |
- options.wait = debug_on_start; |
- return base::LaunchProcess(cl.argv(), options, handle); |
-} |
- |
-} // namespace |
- |
-//----------------------- Server -------------------- |
- |
-// Class to communicate on the server side of the IPC Channel. |
-// Method calls are sent over IPC and replies are read back into class |
-// variables. |
-// This class needs to be called on a single thread. |
-class FFDecryptorServerChannelListener : public IPC::Listener { |
- public: |
- FFDecryptorServerChannelListener() |
- : got_result(false), sender_(NULL) {} |
- |
- void SetSender(IPC::Sender* sender) { |
- sender_ = sender; |
- } |
- |
- void OnInitDecryptorResponse(bool result) { |
- DCHECK(!got_result); |
- result_bool = result; |
- got_result = true; |
- base::MessageLoop::current()->Quit(); |
- } |
- |
- void OnDecryptedTextResonse(const string16& decrypted_text) { |
- DCHECK(!got_result); |
- result_string = decrypted_text; |
- got_result = true; |
- base::MessageLoop::current()->Quit(); |
- } |
- |
- void QuitClient() { |
- if (sender_) |
- sender_->Send(new Msg_Decryptor_Quit()); |
- } |
- |
- virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE { |
- bool handled = true; |
- IPC_BEGIN_MESSAGE_MAP(FFDecryptorServerChannelListener, msg) |
- IPC_MESSAGE_HANDLER(Msg_Decryptor_InitReturnCode, OnInitDecryptorResponse) |
- IPC_MESSAGE_HANDLER(Msg_Decryptor_Response, OnDecryptedTextResonse) |
- IPC_MESSAGE_UNHANDLED(handled = false) |
- IPC_END_MESSAGE_MAP() |
- return handled; |
- } |
- |
- // If an error occured, just kill the message Loop. |
- virtual void OnChannelError() OVERRIDE { |
- got_result = false; |
- base::MessageLoop::current()->Quit(); |
- } |
- |
- // Results of IPC calls. |
- string16 result_string; |
- bool result_bool; |
- // True if IPC call succeeded and data in above variables is valid. |
- bool got_result; |
- |
- private: |
- IPC::Sender* sender_; // weak |
-}; |
- |
-FFUnitTestDecryptorProxy::FFUnitTestDecryptorProxy() |
- : child_process_(0) { |
-} |
- |
-bool FFUnitTestDecryptorProxy::Setup(const base::FilePath& nss_path) { |
- // Create a new message loop and spawn the child process. |
- message_loop_.reset(new base::MessageLoopForIO()); |
- |
- listener_.reset(new FFDecryptorServerChannelListener()); |
- channel_.reset(new IPC::Channel(kTestChannelID, |
- IPC::Channel::MODE_SERVER, |
- listener_.get())); |
- CHECK(channel_->Connect()); |
- listener_->SetSender(channel_.get()); |
- |
- // Spawn child and set up sync IPC connection. |
- bool ret = LaunchNSSDecrypterChildProcess(nss_path, |
- channel_.get(), |
- &child_process_); |
- return ret && (child_process_ != 0); |
-} |
- |
-FFUnitTestDecryptorProxy::~FFUnitTestDecryptorProxy() { |
- listener_->QuitClient(); |
- channel_->Close(); |
- |
- if (child_process_) { |
- base::WaitForSingleProcess(child_process_, base::TimeDelta::FromSeconds(5)); |
- base::CloseProcessHandle(child_process_); |
- } |
-} |
- |
-// A message_loop task that quits the message loop when invoked, setting cancel |
-// causes the task to do nothing when invoked. |
-class CancellableQuitMsgLoop : public base::RefCounted<CancellableQuitMsgLoop> { |
- public: |
- CancellableQuitMsgLoop() : cancelled_(false) {} |
- void QuitNow() { |
- if (!cancelled_) |
- base::MessageLoop::current()->Quit(); |
- } |
- bool cancelled_; |
- |
- private: |
- friend class base::RefCounted<CancellableQuitMsgLoop>; |
- ~CancellableQuitMsgLoop() {} |
-}; |
- |
-// Spin until either a client response arrives or a timeout occurs. |
-bool FFUnitTestDecryptorProxy::WaitForClientResponse() { |
- // What we're trying to do here is to wait for an RPC message to go over the |
- // wire and the client to reply. If the client does not reply by a given |
- // timeout we kill the message loop. |
- // The way we do this is to post a CancellableQuitMsgLoop for 3 seconds in |
- // the future and cancel it if an RPC message comes back earlier. |
- // This relies on the IPC listener class to quit the message loop itself when |
- // a message comes in. |
- scoped_refptr<CancellableQuitMsgLoop> quit_task( |
- new CancellableQuitMsgLoop()); |
- base::MessageLoop::current()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&CancellableQuitMsgLoop::QuitNow, quit_task.get()), |
- TestTimeouts::action_max_timeout()); |
- |
- message_loop_->Run(); |
- bool ret = !quit_task->cancelled_; |
- quit_task->cancelled_ = false; |
- return ret; |
-} |
- |
-bool FFUnitTestDecryptorProxy::DecryptorInit(const base::FilePath& dll_path, |
- const base::FilePath& db_path) { |
- channel_->Send(new Msg_Decryptor_Init(dll_path, db_path)); |
- bool ok = WaitForClientResponse(); |
- if (ok && listener_->got_result) { |
- listener_->got_result = false; |
- return listener_->result_bool; |
- } |
- return false; |
-} |
- |
-string16 FFUnitTestDecryptorProxy::Decrypt(const std::string& crypt) { |
- channel_->Send(new Msg_Decrypt(crypt)); |
- bool ok = WaitForClientResponse(); |
- if (ok && listener_->got_result) { |
- listener_->got_result = false; |
- return listener_->result_string; |
- } |
- return string16(); |
-} |
- |
-//---------------------------- Child Process ----------------------- |
- |
-// Class to listen on the client side of the ipc channel, it calls through |
-// to the NSSDecryptor and sends back a reply. |
-class FFDecryptorClientChannelListener : public IPC::Listener { |
- public: |
- FFDecryptorClientChannelListener() |
- : sender_(NULL) {} |
- |
- void SetSender(IPC::Sender* sender) { |
- sender_ = sender; |
- } |
- |
- void OnDecryptor_Init(base::FilePath dll_path, base::FilePath db_path) { |
- bool ret = decryptor_.Init(dll_path, db_path); |
- sender_->Send(new Msg_Decryptor_InitReturnCode(ret)); |
- } |
- |
- void OnDecrypt(std::string crypt) { |
- string16 unencrypted_str = decryptor_.Decrypt(crypt); |
- sender_->Send(new Msg_Decryptor_Response(unencrypted_str)); |
- } |
- |
- void OnQuitRequest() { |
- base::MessageLoop::current()->Quit(); |
- } |
- |
- virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE { |
- bool handled = true; |
- IPC_BEGIN_MESSAGE_MAP(FFDecryptorClientChannelListener, msg) |
- IPC_MESSAGE_HANDLER(Msg_Decryptor_Init, OnDecryptor_Init) |
- IPC_MESSAGE_HANDLER(Msg_Decrypt, OnDecrypt) |
- IPC_MESSAGE_HANDLER(Msg_Decryptor_Quit, OnQuitRequest) |
- IPC_MESSAGE_UNHANDLED(handled = false) |
- IPC_END_MESSAGE_MAP() |
- return handled; |
- } |
- |
- virtual void OnChannelError() OVERRIDE { |
- base::MessageLoop::current()->Quit(); |
- } |
- |
- private: |
- NSSDecryptor decryptor_; |
- IPC::Sender* sender_; |
-}; |
- |
-// Entry function in child process. |
-MULTIPROCESS_IPC_TEST_MAIN(NSSDecrypterChildProcess) { |
- base::MessageLoopForIO main_message_loop; |
- FFDecryptorClientChannelListener listener; |
- |
- IPC::Channel channel(kTestChannelID, IPC::Channel::MODE_CLIENT, &listener); |
- CHECK(channel.Connect()); |
- listener.SetSender(&channel); |
- |
- // run message loop |
- base::MessageLoop::current()->Run(); |
- |
- return 0; |
-} |