// 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 "content/renderer/pepper/pepper_broker.h"

#if defined(OS_POSIX)
#include <fcntl.h>
#include <sys/socket.h>
#endif  // defined(OS_POSIX)

#include "content/test/mock_render_process.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace content {

class PepperBrokerTest : public ::testing::Test {
 protected:
  base::MessageLoopForIO message_loop_;
  // We need a render process for ppapi::proxy::ProxyChannel to work.
  MockRenderProcess mock_process_;
};

// Try to initialize PepperBrokerDispatcherWrapper with invalid ChannelHandle.
// Initialization should fail.
TEST_F(PepperBrokerTest, InitFailure) {
  PepperBrokerDispatcherWrapper dispatcher_wrapper;
  IPC::ChannelHandle invalid_channel;  // Invalid by default.

  // An invalid handle should result in a failure (false) without a LOG(FATAL),
  // such as the one in CreatePipe().  Call it twice because without the invalid
  // handle check, the posix code would hit a one-time path due to a static
  // variable and go through the LOG(FATAL) path.
  EXPECT_FALSE(dispatcher_wrapper.Init(base::kNullProcessId, invalid_channel));
  EXPECT_FALSE(dispatcher_wrapper.Init(base::kNullProcessId, invalid_channel));
}

// On valid ChannelHandle, initialization should succeed.
TEST_F(PepperBrokerTest, InitSuccess) {
  PepperBrokerDispatcherWrapper dispatcher_wrapper;
  const char kChannelName[] = "PepperHelperImplTestChannelName";
#if defined(OS_POSIX)
  int fds[2] = {-1, -1};
  ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, fds));
  // Channel::ChannelImpl::CreatePipe needs the fd to be non-blocking.
  ASSERT_EQ(0, fcntl(fds[1], F_SETFL, O_NONBLOCK));
  base::FileDescriptor file_descriptor(fds[1], true);  // Auto close.
  IPC::ChannelHandle valid_channel(kChannelName, file_descriptor);
#else
  IPC::ChannelHandle valid_channel(kChannelName);
#endif  // defined(OS_POSIX));

  EXPECT_TRUE(dispatcher_wrapper.Init(base::kNullProcessId, valid_channel));

#if defined(OS_POSIX)
  EXPECT_EQ(0, ::close(fds[0]));
#endif  // defined(OS_POSIX));
}

}  // namespace content