blob: 5ebed84070ce3748485a231c040839ff9a5c7755 [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
morrita4b5c28e22015-01-14 21:17:067#include "ipc/ipc_message_attachment_set.h"
[email protected]22b42c592010-12-20 06:59:238
[email protected]56dacae2009-02-13 02:45:489#include <fcntl.h>
avi246998d82015-12-22 02:39:0410#include <stddef.h>
morrita4b5c28e22015-01-14 21:17:0611#include <unistd.h>
[email protected]89a104d2009-02-13 02:40:4612
[email protected]2025d002012-11-14 20:54:3513#include "base/posix/eintr_wrapper.h"
avi246998d82015-12-22 02:39:0414#include "build/build_config.h"
morrita1aa788c2015-01-31 05:45:4215#include "ipc/ipc_platform_file_attachment_posix.h"
[email protected]c792d812009-02-13 02:36:0816#include "testing/gtest/include/gtest/gtest.h"
17
morrita4b5c28e22015-01-14 21:17:0618namespace IPC {
[email protected]042070d2009-05-13 23:30:2019namespace {
20
21// Get a safe file descriptor for test purposes.
22int GetSafeFd() {
23 return open("/dev/null", O_RDONLY);
24}
25
26// Returns true if fd was already closed. Closes fd if not closed.
27bool VerifyClosed(int fd) {
28 const int duped = dup(fd);
29 if (duped != -1) {
[email protected]d89eec82013-12-03 14:10:5930 EXPECT_NE(IGNORE_EINTR(close(duped)), -1);
31 EXPECT_NE(IGNORE_EINTR(close(fd)), -1);
[email protected]042070d2009-05-13 23:30:2032 return false;
33 }
34 return true;
35}
36
morrita4b5c28e22015-01-14 21:17:0637// The MessageAttachmentSet will try and close some of the descriptor numbers
[email protected]c792d812009-02-13 02:36:0838// which we given it. This is the base descriptor value. It's great enough such
39// that no real descriptor will accidently be closed.
40static const int kFDBase = 50000;
41
morrita4b5c28e22015-01-14 21:17:0642TEST(MessageAttachmentSet, BasicAdd) {
43 scoped_refptr<MessageAttachmentSet> set(new MessageAttachmentSet);
[email protected]c792d812009-02-13 02:36:0844
45 ASSERT_EQ(set->size(), 0u);
46 ASSERT_TRUE(set->empty());
morrita1aa788c2015-01-31 05:45:4247 ASSERT_TRUE(
48 set->AddAttachment(new internal::PlatformFileAttachment(kFDBase)));
[email protected]c792d812009-02-13 02:36:0849 ASSERT_EQ(set->size(), 1u);
50 ASSERT_TRUE(!set->empty());
51
52 // Empties the set and stops a warning about deleting a set with unconsumed
53 // descriptors
erikchenae6d3212015-10-10 02:43:4954 set->CommitAllDescriptors();
[email protected]c792d812009-02-13 02:36:0855}
56
morrita4b5c28e22015-01-14 21:17:0657TEST(MessageAttachmentSet, BasicAddAndClose) {
58 scoped_refptr<MessageAttachmentSet> set(new MessageAttachmentSet);
[email protected]c792d812009-02-13 02:36:0859
60 ASSERT_EQ(set->size(), 0u);
61 ASSERT_TRUE(set->empty());
[email protected]042070d2009-05-13 23:30:2062 const int fd = GetSafeFd();
morrita1aa788c2015-01-31 05:45:4263 ASSERT_TRUE(set->AddAttachment(
64 new internal::PlatformFileAttachment(base::ScopedFD(fd))));
[email protected]c792d812009-02-13 02:36:0865 ASSERT_EQ(set->size(), 1u);
66 ASSERT_TRUE(!set->empty());
67
erikchenae6d3212015-10-10 02:43:4968 set->CommitAllDescriptors();
[email protected]c792d812009-02-13 02:36:0869
[email protected]042070d2009-05-13 23:30:2070 ASSERT_TRUE(VerifyClosed(fd));
71}
morrita4b5c28e22015-01-14 21:17:0672TEST(MessageAttachmentSet, MaxSize) {
73 scoped_refptr<MessageAttachmentSet> set(new MessageAttachmentSet);
[email protected]c792d812009-02-13 02:36:0874
morrita4b5c28e22015-01-14 21:17:0675 for (size_t i = 0; i < MessageAttachmentSet::kMaxDescriptorsPerMessage; ++i)
morrita1aa788c2015-01-31 05:45:4276 ASSERT_TRUE(set->AddAttachment(
77 new internal::PlatformFileAttachment(kFDBase + 1 + i)));
[email protected]c792d812009-02-13 02:36:0878
morrita1aa788c2015-01-31 05:45:4279 ASSERT_TRUE(
80 !set->AddAttachment(new internal::PlatformFileAttachment(kFDBase)));
[email protected]c792d812009-02-13 02:36:0881
erikchenae6d3212015-10-10 02:43:4982 set->CommitAllDescriptors();
[email protected]c792d812009-02-13 02:36:0883}
84
tfarina8514f0d2015-07-28 14:41:4785#if defined(OS_ANDROID)
86#define MAYBE_SetDescriptors DISABLED_SetDescriptors
87#else
88#define MAYBE_SetDescriptors SetDescriptors
89#endif
90TEST(MessageAttachmentSet, MAYBE_SetDescriptors) {
morrita4b5c28e22015-01-14 21:17:0691 scoped_refptr<MessageAttachmentSet> set(new MessageAttachmentSet);
[email protected]c792d812009-02-13 02:36:0892
93 ASSERT_TRUE(set->empty());
morrita96693852014-09-24 20:11:4594 set->AddDescriptorsToOwn(NULL, 0);
[email protected]c792d812009-02-13 02:36:0895 ASSERT_TRUE(set->empty());
96
[email protected]042070d2009-05-13 23:30:2097 const int fd = GetSafeFd();
98 static const int fds[] = {fd};
morrita96693852014-09-24 20:11:4599 set->AddDescriptorsToOwn(fds, 1);
[email protected]c792d812009-02-13 02:36:08100 ASSERT_TRUE(!set->empty());
101 ASSERT_EQ(set->size(), 1u);
102
erikchenae6d3212015-10-10 02:43:49103 set->CommitAllDescriptors();
[email protected]042070d2009-05-13 23:30:20104
105 ASSERT_TRUE(VerifyClosed(fd));
[email protected]c792d812009-02-13 02:36:08106}
107
morrita4b5c28e22015-01-14 21:17:06108TEST(MessageAttachmentSet, PeekDescriptors) {
109 scoped_refptr<MessageAttachmentSet> set(new MessageAttachmentSet);
[email protected]c792d812009-02-13 02:36:08110
morrita96693852014-09-24 20:11:45111 set->PeekDescriptors(NULL);
morrita1aa788c2015-01-31 05:45:42112 ASSERT_TRUE(
113 set->AddAttachment(new internal::PlatformFileAttachment(kFDBase)));
[email protected]c792d812009-02-13 02:36:08114
115 int fds[1];
116 fds[0] = 0;
morrita96693852014-09-24 20:11:45117 set->PeekDescriptors(fds);
[email protected]c792d812009-02-13 02:36:08118 ASSERT_EQ(fds[0], kFDBase);
erikchenae6d3212015-10-10 02:43:49119 set->CommitAllDescriptors();
[email protected]c792d812009-02-13 02:36:08120 ASSERT_TRUE(set->empty());
121}
122
morrita4b5c28e22015-01-14 21:17:06123TEST(MessageAttachmentSet, WalkInOrder) {
124 scoped_refptr<MessageAttachmentSet> set(new MessageAttachmentSet);
[email protected]c792d812009-02-13 02:36:08125
morrita96693852014-09-24 20:11:45126 // TODO(morrita): This test is wrong. TakeDescriptorAt() shouldn't be
127 // used to retrieve borrowed descriptors. That never happens in production.
morrita1aa788c2015-01-31 05:45:42128 ASSERT_TRUE(
129 set->AddAttachment(new internal::PlatformFileAttachment(kFDBase)));
130 ASSERT_TRUE(
131 set->AddAttachment(new internal::PlatformFileAttachment(kFDBase + 1)));
132 ASSERT_TRUE(
133 set->AddAttachment(new internal::PlatformFileAttachment(kFDBase + 2)));
[email protected]c792d812009-02-13 02:36:08134
erikchenae6d3212015-10-10 02:43:49135 ASSERT_EQ(set->GetNonBrokerableAttachmentAt(0)->TakePlatformFile(), kFDBase);
136 ASSERT_EQ(set->GetNonBrokerableAttachmentAt(1)->TakePlatformFile(),
137 kFDBase + 1);
138 ASSERT_EQ(set->GetNonBrokerableAttachmentAt(2)->TakePlatformFile(),
139 kFDBase + 2);
[email protected]c792d812009-02-13 02:36:08140
erikchenae6d3212015-10-10 02:43:49141 set->CommitAllDescriptors();
[email protected]c792d812009-02-13 02:36:08142}
143
morrita4b5c28e22015-01-14 21:17:06144TEST(MessageAttachmentSet, WalkWrongOrder) {
145 scoped_refptr<MessageAttachmentSet> set(new MessageAttachmentSet);
[email protected]c792d812009-02-13 02:36:08146
morrita96693852014-09-24 20:11:45147 // TODO(morrita): This test is wrong. TakeDescriptorAt() shouldn't be
148 // used to retrieve borrowed descriptors. That never happens in production.
morrita1aa788c2015-01-31 05:45:42149 ASSERT_TRUE(
150 set->AddAttachment(new internal::PlatformFileAttachment(kFDBase)));
151 ASSERT_TRUE(
152 set->AddAttachment(new internal::PlatformFileAttachment(kFDBase + 1)));
153 ASSERT_TRUE(
154 set->AddAttachment(new internal::PlatformFileAttachment(kFDBase + 2)));
[email protected]c792d812009-02-13 02:36:08155
erikchenae6d3212015-10-10 02:43:49156 ASSERT_EQ(set->GetNonBrokerableAttachmentAt(0)->TakePlatformFile(), kFDBase);
scheib4dac7f02016-05-12 00:55:03157 ASSERT_FALSE(set->GetNonBrokerableAttachmentAt(2));
[email protected]c792d812009-02-13 02:36:08158
erikchenae6d3212015-10-10 02:43:49159 set->CommitAllDescriptors();
[email protected]c792d812009-02-13 02:36:08160}
161
morrita4b5c28e22015-01-14 21:17:06162TEST(MessageAttachmentSet, WalkCycle) {
163 scoped_refptr<MessageAttachmentSet> set(new MessageAttachmentSet);
[email protected]c792d812009-02-13 02:36:08164
morrita96693852014-09-24 20:11:45165 // TODO(morrita): This test is wrong. TakeDescriptorAt() shouldn't be
166 // used to retrieve borrowed descriptors. That never happens in production.
morrita1aa788c2015-01-31 05:45:42167 ASSERT_TRUE(
168 set->AddAttachment(new internal::PlatformFileAttachment(kFDBase)));
169 ASSERT_TRUE(
170 set->AddAttachment(new internal::PlatformFileAttachment(kFDBase + 1)));
171 ASSERT_TRUE(
172 set->AddAttachment(new internal::PlatformFileAttachment(kFDBase + 2)));
[email protected]c792d812009-02-13 02:36:08173
erikchenae6d3212015-10-10 02:43:49174 ASSERT_EQ(set->GetNonBrokerableAttachmentAt(0)->TakePlatformFile(), kFDBase);
175 ASSERT_EQ(set->GetNonBrokerableAttachmentAt(1)->TakePlatformFile(),
176 kFDBase + 1);
177 ASSERT_EQ(set->GetNonBrokerableAttachmentAt(2)->TakePlatformFile(),
178 kFDBase + 2);
179 ASSERT_EQ(set->GetNonBrokerableAttachmentAt(0)->TakePlatformFile(), kFDBase);
180 ASSERT_EQ(set->GetNonBrokerableAttachmentAt(1)->TakePlatformFile(),
181 kFDBase + 1);
182 ASSERT_EQ(set->GetNonBrokerableAttachmentAt(2)->TakePlatformFile(),
183 kFDBase + 2);
184 ASSERT_EQ(set->GetNonBrokerableAttachmentAt(0)->TakePlatformFile(), kFDBase);
185 ASSERT_EQ(set->GetNonBrokerableAttachmentAt(1)->TakePlatformFile(),
186 kFDBase + 1);
187 ASSERT_EQ(set->GetNonBrokerableAttachmentAt(2)->TakePlatformFile(),
188 kFDBase + 2);
[email protected]c792d812009-02-13 02:36:08189
erikchenae6d3212015-10-10 02:43:49190 set->CommitAllDescriptors();
[email protected]c792d812009-02-13 02:36:08191}
192
tfarina8514f0d2015-07-28 14:41:47193#if defined(OS_ANDROID)
194#define MAYBE_DontClose DISABLED_DontClose
195#else
196#define MAYBE_DontClose DontClose
197#endif
198TEST(MessageAttachmentSet, MAYBE_DontClose) {
morrita4b5c28e22015-01-14 21:17:06199 scoped_refptr<MessageAttachmentSet> set(new MessageAttachmentSet);
[email protected]c792d812009-02-13 02:36:08200
[email protected]042070d2009-05-13 23:30:20201 const int fd = GetSafeFd();
morrita1aa788c2015-01-31 05:45:42202 ASSERT_TRUE(set->AddAttachment(new internal::PlatformFileAttachment(fd)));
erikchenae6d3212015-10-10 02:43:49203 set->CommitAllDescriptors();
[email protected]c792d812009-02-13 02:36:08204
[email protected]042070d2009-05-13 23:30:20205 ASSERT_FALSE(VerifyClosed(fd));
[email protected]c792d812009-02-13 02:36:08206}
207
morrita4b5c28e22015-01-14 21:17:06208TEST(MessageAttachmentSet, DoClose) {
209 scoped_refptr<MessageAttachmentSet> set(new MessageAttachmentSet);
[email protected]c792d812009-02-13 02:36:08210
[email protected]042070d2009-05-13 23:30:20211 const int fd = GetSafeFd();
morrita1aa788c2015-01-31 05:45:42212 ASSERT_TRUE(set->AddAttachment(
213 new internal::PlatformFileAttachment(base::ScopedFD(fd))));
erikchenae6d3212015-10-10 02:43:49214 set->CommitAllDescriptors();
[email protected]c792d812009-02-13 02:36:08215
[email protected]042070d2009-05-13 23:30:20216 ASSERT_TRUE(VerifyClosed(fd));
[email protected]c792d812009-02-13 02:36:08217}
[email protected]042070d2009-05-13 23:30:20218
219} // namespace
morrita4b5c28e22015-01-14 21:17:06220} // namespace IPC