1// Copyright (c) 2012 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 "content/renderer/pepper/pepper_broker.h"
6
7#if defined(OS_POSIX)
8#include <fcntl.h>
9#include <sys/socket.h>
10#endif  // defined(OS_POSIX)
11
12#include "content/test/mock_render_process.h"
13#include "testing/gtest/include/gtest/gtest.h"
14
15namespace content {
16
17class PepperBrokerTest : public ::testing::Test {
18 protected:
19  base::MessageLoopForIO message_loop_;
20  // We need a render process for ppapi::proxy::ProxyChannel to work.
21  MockRenderProcess mock_process_;
22};
23
24// Try to initialize PepperBrokerDispatcherWrapper with invalid ChannelHandle.
25// Initialization should fail.
26TEST_F(PepperBrokerTest, InitFailure) {
27  PepperBrokerDispatcherWrapper dispatcher_wrapper;
28  IPC::ChannelHandle invalid_channel;  // Invalid by default.
29
30  // An invalid handle should result in a failure (false) without a LOG(FATAL),
31  // such as the one in CreatePipe().  Call it twice because without the invalid
32  // handle check, the posix code would hit a one-time path due to a static
33  // variable and go through the LOG(FATAL) path.
34  EXPECT_FALSE(dispatcher_wrapper.Init(base::kNullProcessId, invalid_channel));
35  EXPECT_FALSE(dispatcher_wrapper.Init(base::kNullProcessId, invalid_channel));
36}
37
38// On valid ChannelHandle, initialization should succeed.
39TEST_F(PepperBrokerTest, InitSuccess) {
40  PepperBrokerDispatcherWrapper dispatcher_wrapper;
41  const char kChannelName[] = "PepperHelperImplTestChannelName";
42#if defined(OS_POSIX)
43  int fds[2] = {-1, -1};
44  ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, fds));
45  // Channel::ChannelImpl::CreatePipe needs the fd to be non-blocking.
46  ASSERT_EQ(0, fcntl(fds[1], F_SETFL, O_NONBLOCK));
47  base::FileDescriptor file_descriptor(fds[1], true);  // Auto close.
48  IPC::ChannelHandle valid_channel(kChannelName, file_descriptor);
49#else
50  IPC::ChannelHandle valid_channel(kChannelName);
51#endif  // defined(OS_POSIX));
52
53  EXPECT_TRUE(dispatcher_wrapper.Init(base::kNullProcessId, valid_channel));
54
55#if defined(OS_POSIX)
56  EXPECT_EQ(0, ::close(fds[0]));
57#endif  // defined(OS_POSIX));
58}
59
60}  // namespace content
61