blob: d9107f9f881ce67324b53fbd6653a5a9437abb94 [file] [log] [blame]
[email protected]05094a32011-09-01 00:50:131// Copyright (c) 2011 The Chromium Authors. All rights reserved.
[email protected]c792d812009-02-13 02:36:082// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// This test is POSIX only.
6
[email protected]22b42c592010-12-20 06:59:237#include "ipc/file_descriptor_set_posix.h"
8
[email protected]89a104d2009-02-13 02:40:469#include <unistd.h>
[email protected]56dacae2009-02-13 02:45:4810#include <fcntl.h>
[email protected]89a104d2009-02-13 02:40:4611
[email protected]c792d812009-02-13 02:36:0812#include "base/basictypes.h"
[email protected]2025d002012-11-14 20:54:3513#include "base/posix/eintr_wrapper.h"
[email protected]c792d812009-02-13 02:36:0814#include "testing/gtest/include/gtest/gtest.h"
15
[email protected]042070d2009-05-13 23:30:2016namespace {
17
18// Get a safe file descriptor for test purposes.
19int GetSafeFd() {
20 return open("/dev/null", O_RDONLY);
21}
22
23// Returns true if fd was already closed. Closes fd if not closed.
24bool VerifyClosed(int fd) {
25 const int duped = dup(fd);
26 if (duped != -1) {
[email protected]d89eec82013-12-03 14:10:5927 EXPECT_NE(IGNORE_EINTR(close(duped)), -1);
28 EXPECT_NE(IGNORE_EINTR(close(fd)), -1);
[email protected]042070d2009-05-13 23:30:2029 return false;
30 }
31 return true;
32}
33
[email protected]c792d812009-02-13 02:36:0834// 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.
37static const int kFDBase = 50000;
38
39TEST(FileDescriptorSet, BasicAdd) {
[email protected]ad8e04a2010-11-01 04:16:2740 scoped_refptr<FileDescriptorSet> set(new FileDescriptorSet);
[email protected]c792d812009-02-13 02:36:0841
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());
47
48 // Empties the set and stops a warning about deleting a set with unconsumed
49 // descriptors
50 set->CommitAll();
51}
52
53TEST(FileDescriptorSet, BasicAddAndClose) {
[email protected]ad8e04a2010-11-01 04:16:2754 scoped_refptr<FileDescriptorSet> set(new FileDescriptorSet);
[email protected]c792d812009-02-13 02:36:0855
56 ASSERT_EQ(set->size(), 0u);
57 ASSERT_TRUE(set->empty());
[email protected]042070d2009-05-13 23:30:2058 const int fd = GetSafeFd();
59 ASSERT_TRUE(set->AddAndAutoClose(fd));
[email protected]c792d812009-02-13 02:36:0860 ASSERT_EQ(set->size(), 1u);
61 ASSERT_TRUE(!set->empty());
62
63 set->CommitAll();
[email protected]c792d812009-02-13 02:36:0864
[email protected]042070d2009-05-13 23:30:2065 ASSERT_TRUE(VerifyClosed(fd));
66}
[email protected]c792d812009-02-13 02:36:0867TEST(FileDescriptorSet, MaxSize) {
[email protected]ad8e04a2010-11-01 04:16:2768 scoped_refptr<FileDescriptorSet> set(new FileDescriptorSet);
[email protected]c792d812009-02-13 02:36:0869
[email protected]05094a32011-09-01 00:50:1370 for (size_t i = 0; i < FileDescriptorSet::kMaxDescriptorsPerMessage; ++i)
[email protected]c792d812009-02-13 02:36:0871 ASSERT_TRUE(set->Add(kFDBase + 1 + i));
[email protected]c792d812009-02-13 02:36:0872
73 ASSERT_TRUE(!set->Add(kFDBase));
74
75 set->CommitAll();
76}
77
78TEST(FileDescriptorSet, SetDescriptors) {
[email protected]ad8e04a2010-11-01 04:16:2779 scoped_refptr<FileDescriptorSet> set(new FileDescriptorSet);
[email protected]c792d812009-02-13 02:36:0880
81 ASSERT_TRUE(set->empty());
82 set->SetDescriptors(NULL, 0);
83 ASSERT_TRUE(set->empty());
84
[email protected]042070d2009-05-13 23:30:2085 const int fd = GetSafeFd();
86 static const int fds[] = {fd};
[email protected]c792d812009-02-13 02:36:0887 set->SetDescriptors(fds, 1);
88 ASSERT_TRUE(!set->empty());
89 ASSERT_EQ(set->size(), 1u);
90
91 set->CommitAll();
[email protected]042070d2009-05-13 23:30:2092
93 ASSERT_TRUE(VerifyClosed(fd));
[email protected]c792d812009-02-13 02:36:0894}
95
96TEST(FileDescriptorSet, GetDescriptors) {
[email protected]ad8e04a2010-11-01 04:16:2797 scoped_refptr<FileDescriptorSet> set(new FileDescriptorSet);
[email protected]c792d812009-02-13 02:36:0898
99 set->GetDescriptors(NULL);
100 ASSERT_TRUE(set->Add(kFDBase));
101
102 int fds[1];
103 fds[0] = 0;
104 set->GetDescriptors(fds);
105 ASSERT_EQ(fds[0], kFDBase);
106 set->CommitAll();
107 ASSERT_TRUE(set->empty());
108}
109
110TEST(FileDescriptorSet, WalkInOrder) {
[email protected]ad8e04a2010-11-01 04:16:27111 scoped_refptr<FileDescriptorSet> set(new FileDescriptorSet);
[email protected]c792d812009-02-13 02:36:08112
113 ASSERT_TRUE(set->Add(kFDBase));
114 ASSERT_TRUE(set->Add(kFDBase + 1));
115 ASSERT_TRUE(set->Add(kFDBase + 2));
116
117 ASSERT_EQ(set->GetDescriptorAt(0), kFDBase);
118 ASSERT_EQ(set->GetDescriptorAt(1), kFDBase + 1);
119 ASSERT_EQ(set->GetDescriptorAt(2), kFDBase + 2);
120
121 set->CommitAll();
122}
123
124TEST(FileDescriptorSet, WalkWrongOrder) {
[email protected]ad8e04a2010-11-01 04:16:27125 scoped_refptr<FileDescriptorSet> set(new FileDescriptorSet);
[email protected]c792d812009-02-13 02:36:08126
127 ASSERT_TRUE(set->Add(kFDBase));
128 ASSERT_TRUE(set->Add(kFDBase + 1));
129 ASSERT_TRUE(set->Add(kFDBase + 2));
130
131 ASSERT_EQ(set->GetDescriptorAt(0), kFDBase);
132 ASSERT_EQ(set->GetDescriptorAt(2), -1);
133
134 set->CommitAll();
135}
136
137TEST(FileDescriptorSet, WalkCycle) {
[email protected]ad8e04a2010-11-01 04:16:27138 scoped_refptr<FileDescriptorSet> set(new FileDescriptorSet);
[email protected]c792d812009-02-13 02:36:08139
140 ASSERT_TRUE(set->Add(kFDBase));
141 ASSERT_TRUE(set->Add(kFDBase + 1));
142 ASSERT_TRUE(set->Add(kFDBase + 2));
143
144 ASSERT_EQ(set->GetDescriptorAt(0), kFDBase);
145 ASSERT_EQ(set->GetDescriptorAt(1), kFDBase + 1);
146 ASSERT_EQ(set->GetDescriptorAt(2), kFDBase + 2);
147 ASSERT_EQ(set->GetDescriptorAt(0), kFDBase);
148 ASSERT_EQ(set->GetDescriptorAt(1), kFDBase + 1);
149 ASSERT_EQ(set->GetDescriptorAt(2), kFDBase + 2);
150 ASSERT_EQ(set->GetDescriptorAt(0), kFDBase);
151 ASSERT_EQ(set->GetDescriptorAt(1), kFDBase + 1);
152 ASSERT_EQ(set->GetDescriptorAt(2), kFDBase + 2);
153
154 set->CommitAll();
155}
156
157TEST(FileDescriptorSet, DontClose) {
[email protected]ad8e04a2010-11-01 04:16:27158 scoped_refptr<FileDescriptorSet> set(new FileDescriptorSet);
[email protected]c792d812009-02-13 02:36:08159
[email protected]042070d2009-05-13 23:30:20160 const int fd = GetSafeFd();
[email protected]c792d812009-02-13 02:36:08161 ASSERT_TRUE(set->Add(fd));
162 set->CommitAll();
163
[email protected]042070d2009-05-13 23:30:20164 ASSERT_FALSE(VerifyClosed(fd));
[email protected]c792d812009-02-13 02:36:08165}
166
167TEST(FileDescriptorSet, DoClose) {
[email protected]ad8e04a2010-11-01 04:16:27168 scoped_refptr<FileDescriptorSet> set(new FileDescriptorSet);
[email protected]c792d812009-02-13 02:36:08169
[email protected]042070d2009-05-13 23:30:20170 const int fd = GetSafeFd();
[email protected]c792d812009-02-13 02:36:08171 ASSERT_TRUE(set->AddAndAutoClose(fd));
172 set->CommitAll();
173
[email protected]042070d2009-05-13 23:30:20174 ASSERT_TRUE(VerifyClosed(fd));
[email protected]c792d812009-02-13 02:36:08175}
[email protected]042070d2009-05-13 23:30:20176
177} // namespace