| Index: ipc/file_descriptor_set_unittest.cc | 
| diff --git a/ipc/file_descriptor_set_unittest.cc b/ipc/file_descriptor_set_unittest.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..243d29e28ebbb2994a140da3bf3943b039ee2fbc | 
| --- /dev/null | 
| +++ b/ipc/file_descriptor_set_unittest.cc | 
| @@ -0,0 +1,178 @@ | 
| +// Copyright (c) 2006-2009 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. | 
| + | 
| +// This test is POSIX only. | 
| + | 
| +#include <unistd.h> | 
| +#include <fcntl.h> | 
| + | 
| +#include "base/basictypes.h" | 
| +#include "base/eintr_wrapper.h" | 
| +#include "ipc/file_descriptor_set_posix.h" | 
| +#include "testing/gtest/include/gtest/gtest.h" | 
| + | 
| +namespace { | 
| + | 
| +// Get a safe file descriptor for test purposes. | 
| +int GetSafeFd() { | 
| +  return open("/dev/null", O_RDONLY); | 
| +} | 
| + | 
| +// Returns true if fd was already closed.  Closes fd if not closed. | 
| +bool VerifyClosed(int fd) { | 
| +  const int duped = dup(fd); | 
| +  if (duped != -1) { | 
| +    HANDLE_EINTR(close(duped)); | 
| +    HANDLE_EINTR(close(fd)); | 
| +    return false; | 
| +  } | 
| +  return true; | 
| +} | 
| + | 
| +// The FileDescriptorSet will try and close some of the descriptor numbers | 
| +// which we given it. This is the base descriptor value. It's great enough such | 
| +// that no real descriptor will accidently be closed. | 
| +static const int kFDBase = 50000; | 
| + | 
| +TEST(FileDescriptorSet, BasicAdd) { | 
| +  scoped_refptr<FileDescriptorSet> set = new FileDescriptorSet; | 
| + | 
| +  ASSERT_EQ(set->size(), 0u); | 
| +  ASSERT_TRUE(set->empty()); | 
| +  ASSERT_TRUE(set->Add(kFDBase)); | 
| +  ASSERT_EQ(set->size(), 1u); | 
| +  ASSERT_TRUE(!set->empty()); | 
| + | 
| +  // Empties the set and stops a warning about deleting a set with unconsumed | 
| +  // descriptors | 
| +  set->CommitAll(); | 
| +} | 
| + | 
| +TEST(FileDescriptorSet, BasicAddAndClose) { | 
| +  scoped_refptr<FileDescriptorSet> set = new FileDescriptorSet; | 
| + | 
| +  ASSERT_EQ(set->size(), 0u); | 
| +  ASSERT_TRUE(set->empty()); | 
| +  const int fd = GetSafeFd(); | 
| +  ASSERT_TRUE(set->AddAndAutoClose(fd)); | 
| +  ASSERT_EQ(set->size(), 1u); | 
| +  ASSERT_TRUE(!set->empty()); | 
| + | 
| +  set->CommitAll(); | 
| + | 
| +  ASSERT_TRUE(VerifyClosed(fd)); | 
| +} | 
| +TEST(FileDescriptorSet, MaxSize) { | 
| +  scoped_refptr<FileDescriptorSet> set = new FileDescriptorSet; | 
| + | 
| +  for (unsigned i = 0; | 
| +       i < FileDescriptorSet::MAX_DESCRIPTORS_PER_MESSAGE; ++i) { | 
| +    ASSERT_TRUE(set->Add(kFDBase + 1 + i)); | 
| +  } | 
| + | 
| +  ASSERT_TRUE(!set->Add(kFDBase)); | 
| + | 
| +  set->CommitAll(); | 
| +} | 
| + | 
| +TEST(FileDescriptorSet, SetDescriptors) { | 
| +  scoped_refptr<FileDescriptorSet> set = new FileDescriptorSet; | 
| + | 
| +  ASSERT_TRUE(set->empty()); | 
| +  set->SetDescriptors(NULL, 0); | 
| +  ASSERT_TRUE(set->empty()); | 
| + | 
| +  const int fd = GetSafeFd(); | 
| +  static const int fds[] = {fd}; | 
| +  set->SetDescriptors(fds, 1); | 
| +  ASSERT_TRUE(!set->empty()); | 
| +  ASSERT_EQ(set->size(), 1u); | 
| + | 
| +  set->CommitAll(); | 
| + | 
| +  ASSERT_TRUE(VerifyClosed(fd)); | 
| +} | 
| + | 
| +TEST(FileDescriptorSet, GetDescriptors) { | 
| +  scoped_refptr<FileDescriptorSet> set = new FileDescriptorSet; | 
| + | 
| +  set->GetDescriptors(NULL); | 
| +  ASSERT_TRUE(set->Add(kFDBase)); | 
| + | 
| +  int fds[1]; | 
| +  fds[0] = 0; | 
| +  set->GetDescriptors(fds); | 
| +  ASSERT_EQ(fds[0], kFDBase); | 
| +  set->CommitAll(); | 
| +  ASSERT_TRUE(set->empty()); | 
| +} | 
| + | 
| +TEST(FileDescriptorSet, WalkInOrder) { | 
| +  scoped_refptr<FileDescriptorSet> set = new FileDescriptorSet; | 
| + | 
| +  ASSERT_TRUE(set->Add(kFDBase)); | 
| +  ASSERT_TRUE(set->Add(kFDBase + 1)); | 
| +  ASSERT_TRUE(set->Add(kFDBase + 2)); | 
| + | 
| +  ASSERT_EQ(set->GetDescriptorAt(0), kFDBase); | 
| +  ASSERT_EQ(set->GetDescriptorAt(1), kFDBase + 1); | 
| +  ASSERT_EQ(set->GetDescriptorAt(2), kFDBase + 2); | 
| + | 
| +  set->CommitAll(); | 
| +} | 
| + | 
| +TEST(FileDescriptorSet, WalkWrongOrder) { | 
| +  scoped_refptr<FileDescriptorSet> set = new FileDescriptorSet; | 
| + | 
| +  ASSERT_TRUE(set->Add(kFDBase)); | 
| +  ASSERT_TRUE(set->Add(kFDBase + 1)); | 
| +  ASSERT_TRUE(set->Add(kFDBase + 2)); | 
| + | 
| +  ASSERT_EQ(set->GetDescriptorAt(0), kFDBase); | 
| +  ASSERT_EQ(set->GetDescriptorAt(2), -1); | 
| + | 
| +  set->CommitAll(); | 
| +} | 
| + | 
| +TEST(FileDescriptorSet, WalkCycle) { | 
| +  scoped_refptr<FileDescriptorSet> set = new FileDescriptorSet; | 
| + | 
| +  ASSERT_TRUE(set->Add(kFDBase)); | 
| +  ASSERT_TRUE(set->Add(kFDBase + 1)); | 
| +  ASSERT_TRUE(set->Add(kFDBase + 2)); | 
| + | 
| +  ASSERT_EQ(set->GetDescriptorAt(0), kFDBase); | 
| +  ASSERT_EQ(set->GetDescriptorAt(1), kFDBase + 1); | 
| +  ASSERT_EQ(set->GetDescriptorAt(2), kFDBase + 2); | 
| +  ASSERT_EQ(set->GetDescriptorAt(0), kFDBase); | 
| +  ASSERT_EQ(set->GetDescriptorAt(1), kFDBase + 1); | 
| +  ASSERT_EQ(set->GetDescriptorAt(2), kFDBase + 2); | 
| +  ASSERT_EQ(set->GetDescriptorAt(0), kFDBase); | 
| +  ASSERT_EQ(set->GetDescriptorAt(1), kFDBase + 1); | 
| +  ASSERT_EQ(set->GetDescriptorAt(2), kFDBase + 2); | 
| + | 
| +  set->CommitAll(); | 
| +} | 
| + | 
| +TEST(FileDescriptorSet, DontClose) { | 
| +  scoped_refptr<FileDescriptorSet> set = new FileDescriptorSet; | 
| + | 
| +  const int fd = GetSafeFd(); | 
| +  ASSERT_TRUE(set->Add(fd)); | 
| +  set->CommitAll(); | 
| + | 
| +  ASSERT_FALSE(VerifyClosed(fd)); | 
| +} | 
| + | 
| +TEST(FileDescriptorSet, DoClose) { | 
| +  scoped_refptr<FileDescriptorSet> set = new FileDescriptorSet; | 
| + | 
| +  const int fd = GetSafeFd(); | 
| +  ASSERT_TRUE(set->AddAndAutoClose(fd)); | 
| +  set->CommitAll(); | 
| + | 
| +  ASSERT_TRUE(VerifyClosed(fd)); | 
| +} | 
| + | 
| +}  // namespace | 
|  |