1 // Copyright (c) 2006-2009 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.
5 // This test is POSIX only.
7 #include "ipc/file_descriptor_set_posix.h"
12 #include "base/basictypes.h"
13 #include "base/eintr_wrapper.h"
14 #include "testing/gtest/include/gtest/gtest.h"
18 // Get a safe file descriptor for test purposes.
20 return open("/dev/null", O_RDONLY);
23 // Returns true if fd was already closed. Closes fd if not closed.
24 bool VerifyClosed(int fd) {
25 const int duped = dup(fd);
27 EXPECT_NE(HANDLE_EINTR(close(duped)), -1);
28 EXPECT_NE(HANDLE_EINTR(close(fd)), -1);
34 // The FileDescriptorSet will try and close some of the descriptor numbers
35 // which we given it. This is the base descriptor value. It's great enough such
36 // that no real descriptor will accidently be closed.
37 static const int kFDBase = 50000;
39 TEST(FileDescriptorSet, BasicAdd) {
40 scoped_refptr<FileDescriptorSet> set(new FileDescriptorSet);
42 ASSERT_EQ(set->size(), 0u);
43 ASSERT_TRUE(set->empty());
44 ASSERT_TRUE(set->Add(kFDBase));
45 ASSERT_EQ(set->size(), 1u);
46 ASSERT_TRUE(!set->empty());
48 // Empties the set and stops a warning about deleting a set with unconsumed
53 TEST(FileDescriptorSet, BasicAddAndClose) {
54 scoped_refptr<FileDescriptorSet> set(new FileDescriptorSet);
56 ASSERT_EQ(set->size(), 0u);
57 ASSERT_TRUE(set->empty());
58 const int fd = GetSafeFd();
59 ASSERT_TRUE(set->AddAndAutoClose(fd));
60 ASSERT_EQ(set->size(), 1u);
61 ASSERT_TRUE(!set->empty());
65 ASSERT_TRUE(VerifyClosed(fd));
67 TEST(FileDescriptorSet, MaxSize) {
68 scoped_refptr<FileDescriptorSet> set(new FileDescriptorSet);
71 i < FileDescriptorSet::MAX_DESCRIPTORS_PER_MESSAGE; ++i) {
72 ASSERT_TRUE(set->Add(kFDBase + 1 + i));
75 ASSERT_TRUE(!set->Add(kFDBase));
80 TEST(FileDescriptorSet, SetDescriptors) {
81 scoped_refptr<FileDescriptorSet> set(new FileDescriptorSet);
83 ASSERT_TRUE(set->empty());
84 set->SetDescriptors(NULL, 0);
85 ASSERT_TRUE(set->empty());
87 const int fd = GetSafeFd();
88 static const int fds[] = {fd};
89 set->SetDescriptors(fds, 1);
90 ASSERT_TRUE(!set->empty());
91 ASSERT_EQ(set->size(), 1u);
95 ASSERT_TRUE(VerifyClosed(fd));
98 TEST(FileDescriptorSet, GetDescriptors) {
99 scoped_refptr<FileDescriptorSet> set(new FileDescriptorSet);
101 set->GetDescriptors(NULL);
102 ASSERT_TRUE(set->Add(kFDBase));
106 set->GetDescriptors(fds);
107 ASSERT_EQ(fds[0], kFDBase);
109 ASSERT_TRUE(set->empty());
112 TEST(FileDescriptorSet, WalkInOrder) {
113 scoped_refptr<FileDescriptorSet> set(new FileDescriptorSet);
115 ASSERT_TRUE(set->Add(kFDBase));
116 ASSERT_TRUE(set->Add(kFDBase + 1));
117 ASSERT_TRUE(set->Add(kFDBase + 2));
119 ASSERT_EQ(set->GetDescriptorAt(0), kFDBase);
120 ASSERT_EQ(set->GetDescriptorAt(1), kFDBase + 1);
121 ASSERT_EQ(set->GetDescriptorAt(2), kFDBase + 2);
126 TEST(FileDescriptorSet, WalkWrongOrder) {
127 scoped_refptr<FileDescriptorSet> set(new FileDescriptorSet);
129 ASSERT_TRUE(set->Add(kFDBase));
130 ASSERT_TRUE(set->Add(kFDBase + 1));
131 ASSERT_TRUE(set->Add(kFDBase + 2));
133 ASSERT_EQ(set->GetDescriptorAt(0), kFDBase);
134 ASSERT_EQ(set->GetDescriptorAt(2), -1);
139 TEST(FileDescriptorSet, WalkCycle) {
140 scoped_refptr<FileDescriptorSet> set(new FileDescriptorSet);
142 ASSERT_TRUE(set->Add(kFDBase));
143 ASSERT_TRUE(set->Add(kFDBase + 1));
144 ASSERT_TRUE(set->Add(kFDBase + 2));
146 ASSERT_EQ(set->GetDescriptorAt(0), kFDBase);
147 ASSERT_EQ(set->GetDescriptorAt(1), kFDBase + 1);
148 ASSERT_EQ(set->GetDescriptorAt(2), kFDBase + 2);
149 ASSERT_EQ(set->GetDescriptorAt(0), kFDBase);
150 ASSERT_EQ(set->GetDescriptorAt(1), kFDBase + 1);
151 ASSERT_EQ(set->GetDescriptorAt(2), kFDBase + 2);
152 ASSERT_EQ(set->GetDescriptorAt(0), kFDBase);
153 ASSERT_EQ(set->GetDescriptorAt(1), kFDBase + 1);
154 ASSERT_EQ(set->GetDescriptorAt(2), kFDBase + 2);
159 TEST(FileDescriptorSet, DontClose) {
160 scoped_refptr<FileDescriptorSet> set(new FileDescriptorSet);
162 const int fd = GetSafeFd();
163 ASSERT_TRUE(set->Add(fd));
166 ASSERT_FALSE(VerifyClosed(fd));
169 TEST(FileDescriptorSet, DoClose) {
170 scoped_refptr<FileDescriptorSet> set(new FileDescriptorSet);
172 const int fd = GetSafeFd();
173 ASSERT_TRUE(set->AddAndAutoClose(fd));
176 ASSERT_TRUE(VerifyClosed(fd));