blob: ddbe6a6707ba614162b8f864364fd9ff48ac5e00 [file] [log] [blame]
[email protected]c792d812009-02-13 02:36:081// 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.
4
5// This test is POSIX only.
6
[email protected]89a104d2009-02-13 02:40:467#include <unistd.h>
8#include <stdio.h>
9
[email protected]c792d812009-02-13 02:36:0810#include "base/basictypes.h"
11#include "chrome/common/file_descriptor_set_posix.h"
12#include "testing/gtest/include/gtest/gtest.h"
13
14// The FileDescriptorSet will try and close some of the descriptor numbers
15// which we given it. This is the base descriptor value. It's great enough such
16// that no real descriptor will accidently be closed.
17static const int kFDBase = 50000;
18
19TEST(FileDescriptorSet, BasicAdd) {
20 scoped_refptr<FileDescriptorSet> set = new FileDescriptorSet;
21
22 ASSERT_EQ(set->size(), 0u);
23 ASSERT_TRUE(set->empty());
24 ASSERT_TRUE(set->Add(kFDBase));
25 ASSERT_EQ(set->size(), 1u);
26 ASSERT_TRUE(!set->empty());
27
28 // Empties the set and stops a warning about deleting a set with unconsumed
29 // descriptors
30 set->CommitAll();
31}
32
33TEST(FileDescriptorSet, BasicAddAndClose) {
34 scoped_refptr<FileDescriptorSet> set = new FileDescriptorSet;
35
36 ASSERT_EQ(set->size(), 0u);
37 ASSERT_TRUE(set->empty());
38 ASSERT_TRUE(set->AddAndAutoClose(kFDBase));
39 ASSERT_EQ(set->size(), 1u);
40 ASSERT_TRUE(!set->empty());
41
42 set->CommitAll();
43}
44
45TEST(FileDescriptorSet, MaxSize) {
46 scoped_refptr<FileDescriptorSet> set = new FileDescriptorSet;
47
48 for (unsigned i = 0;
49 i < FileDescriptorSet::MAX_DESCRIPTORS_PER_MESSAGE; ++i) {
50 ASSERT_TRUE(set->Add(kFDBase + 1 + i));
51 }
52
53 ASSERT_TRUE(!set->Add(kFDBase));
54
55 set->CommitAll();
56}
57
58TEST(FileDescriptorSet, SetDescriptors) {
59 scoped_refptr<FileDescriptorSet> set = new FileDescriptorSet;
60
61 ASSERT_TRUE(set->empty());
62 set->SetDescriptors(NULL, 0);
63 ASSERT_TRUE(set->empty());
64
65 static const int fds[] = {kFDBase};
66 set->SetDescriptors(fds, 1);
67 ASSERT_TRUE(!set->empty());
68 ASSERT_EQ(set->size(), 1u);
69
70 set->CommitAll();
71}
72
73TEST(FileDescriptorSet, GetDescriptors) {
74 scoped_refptr<FileDescriptorSet> set = new FileDescriptorSet;
75
76 set->GetDescriptors(NULL);
77 ASSERT_TRUE(set->Add(kFDBase));
78
79 int fds[1];
80 fds[0] = 0;
81 set->GetDescriptors(fds);
82 ASSERT_EQ(fds[0], kFDBase);
83 set->CommitAll();
84 ASSERT_TRUE(set->empty());
85}
86
87TEST(FileDescriptorSet, WalkInOrder) {
88 scoped_refptr<FileDescriptorSet> set = new FileDescriptorSet;
89
90 ASSERT_TRUE(set->Add(kFDBase));
91 ASSERT_TRUE(set->Add(kFDBase + 1));
92 ASSERT_TRUE(set->Add(kFDBase + 2));
93
94 ASSERT_EQ(set->GetDescriptorAt(0), kFDBase);
95 ASSERT_EQ(set->GetDescriptorAt(1), kFDBase + 1);
96 ASSERT_EQ(set->GetDescriptorAt(2), kFDBase + 2);
97
98 set->CommitAll();
99}
100
101TEST(FileDescriptorSet, WalkWrongOrder) {
102 scoped_refptr<FileDescriptorSet> set = new FileDescriptorSet;
103
104 ASSERT_TRUE(set->Add(kFDBase));
105 ASSERT_TRUE(set->Add(kFDBase + 1));
106 ASSERT_TRUE(set->Add(kFDBase + 2));
107
108 ASSERT_EQ(set->GetDescriptorAt(0), kFDBase);
109 ASSERT_EQ(set->GetDescriptorAt(2), -1);
110
111 set->CommitAll();
112}
113
114TEST(FileDescriptorSet, WalkCycle) {
115 scoped_refptr<FileDescriptorSet> set = new FileDescriptorSet;
116
117 ASSERT_TRUE(set->Add(kFDBase));
118 ASSERT_TRUE(set->Add(kFDBase + 1));
119 ASSERT_TRUE(set->Add(kFDBase + 2));
120
121 ASSERT_EQ(set->GetDescriptorAt(0), kFDBase);
122 ASSERT_EQ(set->GetDescriptorAt(1), kFDBase + 1);
123 ASSERT_EQ(set->GetDescriptorAt(2), kFDBase + 2);
124 ASSERT_EQ(set->GetDescriptorAt(0), kFDBase);
125 ASSERT_EQ(set->GetDescriptorAt(1), kFDBase + 1);
126 ASSERT_EQ(set->GetDescriptorAt(2), kFDBase + 2);
127 ASSERT_EQ(set->GetDescriptorAt(0), kFDBase);
128 ASSERT_EQ(set->GetDescriptorAt(1), kFDBase + 1);
129 ASSERT_EQ(set->GetDescriptorAt(2), kFDBase + 2);
130
131 set->CommitAll();
132}
133
134TEST(FileDescriptorSet, DontClose) {
135 scoped_refptr<FileDescriptorSet> set = new FileDescriptorSet;
136
137 const int fd = open("/dev/null", O_RDONLY);
138 ASSERT_TRUE(set->Add(fd));
139 set->CommitAll();
140
141 const int duped = dup(fd);
142 ASSERT_GE(duped, 0);
143 close(duped);
144 close(fd);
145}
146
147TEST(FileDescriptorSet, DoClose) {
148 scoped_refptr<FileDescriptorSet> set = new FileDescriptorSet;
149
150 const int fd = open("/dev/null", O_RDONLY);
151 ASSERT_TRUE(set->AddAndAutoClose(fd));
152 set->CommitAll();
153
154 const int duped = dup(fd);
155 ASSERT_EQ(duped, -1);
156 close(fd);
157}