Index: content/public/browser/file_descriptor_info_unittest.cc |
diff --git a/content/public/browser/file_descriptor_info_unittest.cc b/content/public/browser/file_descriptor_info_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8c9008607835a1f0ac0f84ae76a06aedfaa43b0a |
--- /dev/null |
+++ b/content/public/browser/file_descriptor_info_unittest.cc |
@@ -0,0 +1,99 @@ |
+// 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/public/browser/file_descriptor_info.h" |
+ |
+#include <fcntl.h> |
+#include <unistd.h> |
+ |
+#include "base/basictypes.h" |
+#include "base/posix/eintr_wrapper.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace { |
+ |
+// Get a safe file descriptor for test purposes. |
+// TODO(morrita) Merge with things in file_descriptor_set_posix_unittest.cc |
+int GetSafeFd() { |
+ return open("/dev/null", O_RDONLY); |
+} |
+ |
+// Returns true if fd was already closed. Closes fd if not closed. |
+// TODO(morrita) Merge with things in file_descriptor_set_posix_unittest.cc |
+bool VerifyClosed(int fd) { |
+ const int duped = dup(fd); |
+ if (duped != -1) { |
+ EXPECT_NE(IGNORE_EINTR(close(duped)), -1); |
+ EXPECT_NE(IGNORE_EINTR(close(fd)), -1); |
+ return false; |
+ } |
+ return true; |
+} |
+ |
+} // namespace |
+ |
+namespace content { |
+ |
+typedef testing::Test FileDescriptorInfoTest; |
+ |
+TEST_F(FileDescriptorInfoTest, Transfer) { |
+ int testingId = 42; |
+ scoped_ptr<FileDescriptorInfo> target(new FileDescriptorInfo()); |
+ base::ScopedFD fd(GetSafeFd()); |
+ |
+ int raw_fd = fd.get(); |
+ target->Transfer(testingId, fd.Pass()); |
+ ASSERT_EQ(1U, target->GetMappingSize()); |
+ ASSERT_EQ(target->GetFDAt(0), raw_fd); |
+ ASSERT_EQ(target->GetIDAt(0), testingId); |
+ |
+ target.reset(); |
+ |
+ ASSERT_TRUE(VerifyClosed(raw_fd)); |
+} |
+ |
+TEST_F(FileDescriptorInfoTest, TransferWithoutMapping) { |
+ scoped_ptr<FileDescriptorInfo> target(new FileDescriptorInfo()); |
+ base::ScopedFD fd(GetSafeFd()); |
+ |
+ int raw_fd = fd.get(); |
+ target->TransferWithoutMapping(fd.Pass()); |
+ ASSERT_EQ(0U, target->GetMappingSize()); |
+ |
+ target.reset(); |
+ |
+ ASSERT_TRUE(VerifyClosed(raw_fd)); |
+} |
+ |
+TEST_F(FileDescriptorInfoTest, Share) { |
+ int testingId = 42; |
+ scoped_ptr<FileDescriptorInfo> target(new FileDescriptorInfo()); |
+ base::ScopedFD fd(GetSafeFd()); |
+ |
+ int raw_fd = fd.get(); |
+ target->Share(testingId, fd.get()); |
+ ASSERT_EQ(1U, target->GetMappingSize()); |
+ ASSERT_EQ(target->GetFDAt(0), raw_fd); |
+ ASSERT_EQ(target->GetIDAt(0), testingId); |
+ |
+ target.reset(); |
+ |
+ ASSERT_TRUE(!VerifyClosed(fd.release())); |
+} |
+ |
+TEST_F(FileDescriptorInfoTest, GetMappingWithIDAdjustment) { |
+ int testingId1 = 42; |
+ int testingId2 = 43; |
+ scoped_ptr<FileDescriptorInfo> target(new FileDescriptorInfo()); |
+ |
+ target->Transfer(testingId1, base::ScopedFD(GetSafeFd())); |
+ target->Transfer(testingId2, base::ScopedFD(GetSafeFd())); |
+ |
+ base::FileHandleMappingVector mapping = |
+ target->GetMappingWithIDAdjustment(100); |
+ ASSERT_EQ(mapping[0].second, 142); |
+ ASSERT_EQ(mapping[1].second, 143); |
+} |
+ |
+} // namespace content |