| Index: chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc
|
| diff --git a/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc b/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc
|
| index b8b6df156f55e9c454622d65ab29074d258a1172..77f81c4f741b6b9189e2406e47051a2f3d99dd2a 100644
|
| --- a/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc
|
| +++ b/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc
|
| @@ -13,6 +13,7 @@
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/path_service.h"
|
| #include "base/platform_file.h"
|
| +#include "base/rand_util.h"
|
| #include "base/run_loop.h"
|
| #include "base/strings/stringprintf.h"
|
| #include "base/test/test_timeouts.h"
|
| @@ -31,6 +32,13 @@
|
| #include "content/public/test/test_browser_thread_bundle.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| +#if defined(OS_WIN)
|
| +#include <windows.h>
|
| +#include "base/win/scoped_handle.h"
|
| +#else
|
| +#include <unistd.h>
|
| +#endif
|
| +
|
| using content::BrowserThread;
|
|
|
| namespace {
|
| @@ -50,17 +58,30 @@ namespace extensions {
|
|
|
| class FakeLauncher : public NativeProcessLauncher {
|
| public:
|
| - FakeLauncher(base::FilePath read_file, base::FilePath write_file) {
|
| - read_file_ = base::CreatePlatformFile(
|
| - read_file,
|
| - base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ |
|
| - base::PLATFORM_FILE_ASYNC,
|
| - NULL, NULL);
|
| - write_file_ = base::CreatePlatformFile(
|
| - write_file,
|
| - base::PLATFORM_FILE_CREATE | base::PLATFORM_FILE_WRITE |
|
| - base::PLATFORM_FILE_ASYNC,
|
| - NULL, NULL);
|
| + FakeLauncher(base::PlatformFile read_file, base::PlatformFile write_file)
|
| + : read_file_(read_file),
|
| + write_file_(write_file) {
|
| + }
|
| +
|
| + static scoped_ptr<NativeProcessLauncher> Create(base::FilePath read_file,
|
| + base::FilePath write_file) {
|
| + int read_flags = base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ |
|
| + base::PLATFORM_FILE_ASYNC;
|
| + int write_flags = base::PLATFORM_FILE_CREATE | base::PLATFORM_FILE_WRITE |
|
| + base::PLATFORM_FILE_ASYNC;
|
| + return scoped_ptr<NativeProcessLauncher>(new FakeLauncher(
|
| + base::CreatePlatformFile(read_file, read_flags, NULL, NULL),
|
| + base::CreatePlatformFile(write_file, write_flags, NULL, NULL)));
|
| + }
|
| +
|
| + static scoped_ptr<NativeProcessLauncher> CreateWithPipeInput(
|
| + base::PlatformFile read_pipe,
|
| + base::FilePath write_file) {
|
| + int write_flags = base::PLATFORM_FILE_CREATE | base::PLATFORM_FILE_WRITE |
|
| + base::PLATFORM_FILE_ASYNC;
|
| + return scoped_ptr<NativeProcessLauncher>(new FakeLauncher(
|
| + read_pipe,
|
| + base::CreatePlatformFile(write_file, write_flags, NULL, NULL)));
|
| }
|
|
|
| virtual void Launch(const GURL& origin,
|
| @@ -158,8 +179,8 @@ TEST_F(NativeMessagingTest, SingleSendMessageRead) {
|
| base::FilePath temp_output_file = temp_dir_.path().AppendASCII("output");
|
| base::FilePath temp_input_file = CreateTempFileWithMessage(kTestMessage);
|
|
|
| - scoped_ptr<NativeProcessLauncher> launcher(
|
| - new FakeLauncher(temp_input_file, temp_output_file));
|
| + scoped_ptr<NativeProcessLauncher> launcher =
|
| + FakeLauncher::Create(temp_input_file, temp_output_file).Pass();
|
| native_message_process_host_ = NativeMessageProcessHost::CreateWithLauncher(
|
| AsWeakPtr(), kTestNativeMessagingExtensionId, "empty_app.py",
|
| 0, launcher.Pass());
|
| @@ -179,10 +200,34 @@ TEST_F(NativeMessagingTest, SingleSendMessageRead) {
|
| // |temp_file| and should match the contents of single_message_request.msg.
|
| TEST_F(NativeMessagingTest, SingleSendMessageWrite) {
|
| base::FilePath temp_output_file = temp_dir_.path().AppendASCII("output");
|
| - base::FilePath temp_input_file = CreateTempFileWithMessage(std::string());
|
|
|
| - scoped_ptr<NativeProcessLauncher> launcher(
|
| - new FakeLauncher(temp_input_file, temp_output_file));
|
| + base::PlatformFile read_file;
|
| +#if defined(OS_WIN)
|
| + string16 pipe_name = base::StringPrintf(
|
| + L"\\\\.\\pipe\\chrome.nativeMessaging.out.%llx", base::RandUint64());
|
| + base::win::ScopedHandle write_handle(
|
| + CreateNamedPipeW(pipe_name.c_str(),
|
| + PIPE_ACCESS_OUTBOUND | FILE_FLAG_OVERLAPPED |
|
| + FILE_FLAG_FIRST_PIPE_INSTANCE,
|
| + PIPE_TYPE_BYTE, 1, 0, 0, 5000, NULL));
|
| + ASSERT_TRUE(write_handle);
|
| + base::win::ScopedHandle read_handle(
|
| + CreateFileW(pipe_name.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING,
|
| + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL));
|
| + ASSERT_TRUE(read_handle);
|
| +
|
| + read_file = read_handle.Get();
|
| +#else // defined(OS_WIN)
|
| + base::PlatformFile pipe_handles[2];
|
| + ASSERT_EQ(0, pipe(pipe_handles));
|
| + file_util::ScopedFD read_fd(pipe_handles);
|
| + file_util::ScopedFD write_fd(pipe_handles + 1);
|
| +
|
| + read_file = pipe_handles[0];
|
| +#endif // !defined(OS_WIN)
|
| +
|
| + scoped_ptr<NativeProcessLauncher> launcher =
|
| + FakeLauncher::CreateWithPipeInput(read_file, temp_output_file).Pass();
|
| native_message_process_host_ = NativeMessageProcessHost::CreateWithLauncher(
|
| AsWeakPtr(), kTestNativeMessagingExtensionId, "empty_app.py",
|
| 0, launcher.Pass());
|
|
|