blob: 9fd318a8ba2423068eccdef3a9b62e01e2446dfa [file] [log] [blame]
pkasting@chromium.org9687a8f2011-09-01 09:50:13 +09001// Copyright (c) 2011 The Chromium Authors. All rights reserved.
agl@chromium.org1c6dcf22009-07-23 08:57:21 +09002// 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
morrita33a35902015-01-15 06:17:06 +09007#include "ipc/ipc_message_attachment_set.h"
dmaclach@chromium.orgc1d3d422010-12-20 15:59:23 +09008
agl@chromium.org1c6dcf22009-07-23 08:57:21 +09009#include <fcntl.h>
avi42ebda42015-12-22 11:39:04 +090010#include <stddef.h>
morrita33a35902015-01-15 06:17:06 +090011#include <unistd.h>
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090012
brettw@chromium.orgb1788fb2012-11-15 05:54:35 +090013#include "base/posix/eintr_wrapper.h"
avi42ebda42015-12-22 11:39:04 +090014#include "build/build_config.h"
morrita7d1bfcc2015-01-31 14:45:42 +090015#include "ipc/ipc_platform_file_attachment_posix.h"
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090016#include "testing/gtest/include/gtest/gtest.h"
17
morrita33a35902015-01-15 06:17:06 +090018namespace IPC {
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090019namespace {
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) {
Dale Curtis56733a02017-08-30 06:53:23 +090028 const int duped = HANDLE_EINTR(dup(fd));
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090029 if (duped != -1) {
mark@chromium.orgfa5a0f92013-12-03 23:10:59 +090030 EXPECT_NE(IGNORE_EINTR(close(duped)), -1);
31 EXPECT_NE(IGNORE_EINTR(close(fd)), -1);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090032 return false;
33 }
34 return true;
35}
36
sammc14583362016-11-23 12:17:35 +090037int GetFdAt(MessageAttachmentSet* set, int id) {
38 return static_cast<internal::PlatformFileAttachment&>(
39 *set->GetAttachmentAt(id))
40 .TakePlatformFile();
41}
42
morrita33a35902015-01-15 06:17:06 +090043// The MessageAttachmentSet will try and close some of the descriptor numbers
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090044// which we given it. This is the base descriptor value. It's great enough such
45// that no real descriptor will accidently be closed.
46static const int kFDBase = 50000;
47
morrita33a35902015-01-15 06:17:06 +090048TEST(MessageAttachmentSet, BasicAdd) {
49 scoped_refptr<MessageAttachmentSet> set(new MessageAttachmentSet);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090050
51 ASSERT_EQ(set->size(), 0u);
52 ASSERT_TRUE(set->empty());
morrita7d1bfcc2015-01-31 14:45:42 +090053 ASSERT_TRUE(
54 set->AddAttachment(new internal::PlatformFileAttachment(kFDBase)));
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090055 ASSERT_EQ(set->size(), 1u);
56 ASSERT_TRUE(!set->empty());
57
58 // Empties the set and stops a warning about deleting a set with unconsumed
59 // descriptors
erikchenc8fa4212015-10-10 11:43:49 +090060 set->CommitAllDescriptors();
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090061}
62
morrita33a35902015-01-15 06:17:06 +090063TEST(MessageAttachmentSet, BasicAddAndClose) {
64 scoped_refptr<MessageAttachmentSet> set(new MessageAttachmentSet);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090065
66 ASSERT_EQ(set->size(), 0u);
67 ASSERT_TRUE(set->empty());
68 const int fd = GetSafeFd();
morrita7d1bfcc2015-01-31 14:45:42 +090069 ASSERT_TRUE(set->AddAttachment(
70 new internal::PlatformFileAttachment(base::ScopedFD(fd))));
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090071 ASSERT_EQ(set->size(), 1u);
72 ASSERT_TRUE(!set->empty());
73
erikchenc8fa4212015-10-10 11:43:49 +090074 set->CommitAllDescriptors();
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090075
76 ASSERT_TRUE(VerifyClosed(fd));
77}
morrita33a35902015-01-15 06:17:06 +090078TEST(MessageAttachmentSet, MaxSize) {
79 scoped_refptr<MessageAttachmentSet> set(new MessageAttachmentSet);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090080
morrita33a35902015-01-15 06:17:06 +090081 for (size_t i = 0; i < MessageAttachmentSet::kMaxDescriptorsPerMessage; ++i)
morrita7d1bfcc2015-01-31 14:45:42 +090082 ASSERT_TRUE(set->AddAttachment(
83 new internal::PlatformFileAttachment(kFDBase + 1 + i)));
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090084
morrita7d1bfcc2015-01-31 14:45:42 +090085 ASSERT_TRUE(
86 !set->AddAttachment(new internal::PlatformFileAttachment(kFDBase)));
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090087
erikchenc8fa4212015-10-10 11:43:49 +090088 set->CommitAllDescriptors();
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090089}
90
morrita33a35902015-01-15 06:17:06 +090091TEST(MessageAttachmentSet, WalkInOrder) {
92 scoped_refptr<MessageAttachmentSet> set(new MessageAttachmentSet);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +090093
morritaab207252014-09-25 05:11:45 +090094 // TODO(morrita): This test is wrong. TakeDescriptorAt() shouldn't be
95 // used to retrieve borrowed descriptors. That never happens in production.
morrita7d1bfcc2015-01-31 14:45:42 +090096 ASSERT_TRUE(
97 set->AddAttachment(new internal::PlatformFileAttachment(kFDBase)));
98 ASSERT_TRUE(
99 set->AddAttachment(new internal::PlatformFileAttachment(kFDBase + 1)));
100 ASSERT_TRUE(
101 set->AddAttachment(new internal::PlatformFileAttachment(kFDBase + 2)));
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900102
sammc14583362016-11-23 12:17:35 +0900103 ASSERT_EQ(GetFdAt(set.get(), 0), kFDBase);
104 ASSERT_EQ(GetFdAt(set.get(), 1), kFDBase + 1);
105 ASSERT_EQ(GetFdAt(set.get(), 2), kFDBase + 2);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900106
erikchenc8fa4212015-10-10 11:43:49 +0900107 set->CommitAllDescriptors();
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900108}
109
morrita33a35902015-01-15 06:17:06 +0900110TEST(MessageAttachmentSet, WalkWrongOrder) {
111 scoped_refptr<MessageAttachmentSet> set(new MessageAttachmentSet);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900112
morritaab207252014-09-25 05:11:45 +0900113 // TODO(morrita): This test is wrong. TakeDescriptorAt() shouldn't be
114 // used to retrieve borrowed descriptors. That never happens in production.
morrita7d1bfcc2015-01-31 14:45:42 +0900115 ASSERT_TRUE(
116 set->AddAttachment(new internal::PlatformFileAttachment(kFDBase)));
117 ASSERT_TRUE(
118 set->AddAttachment(new internal::PlatformFileAttachment(kFDBase + 1)));
119 ASSERT_TRUE(
120 set->AddAttachment(new internal::PlatformFileAttachment(kFDBase + 2)));
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900121
sammc14583362016-11-23 12:17:35 +0900122 ASSERT_EQ(GetFdAt(set.get(), 0), kFDBase);
123 ASSERT_FALSE(set->GetAttachmentAt(2));
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900124
erikchenc8fa4212015-10-10 11:43:49 +0900125 set->CommitAllDescriptors();
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900126}
127
morrita33a35902015-01-15 06:17:06 +0900128TEST(MessageAttachmentSet, WalkCycle) {
129 scoped_refptr<MessageAttachmentSet> set(new MessageAttachmentSet);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900130
morritaab207252014-09-25 05:11:45 +0900131 // TODO(morrita): This test is wrong. TakeDescriptorAt() shouldn't be
132 // used to retrieve borrowed descriptors. That never happens in production.
morrita7d1bfcc2015-01-31 14:45:42 +0900133 ASSERT_TRUE(
134 set->AddAttachment(new internal::PlatformFileAttachment(kFDBase)));
135 ASSERT_TRUE(
136 set->AddAttachment(new internal::PlatformFileAttachment(kFDBase + 1)));
137 ASSERT_TRUE(
138 set->AddAttachment(new internal::PlatformFileAttachment(kFDBase + 2)));
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900139
sammc14583362016-11-23 12:17:35 +0900140 ASSERT_EQ(GetFdAt(set.get(), 0), kFDBase);
141 ASSERT_EQ(GetFdAt(set.get(), 1), kFDBase + 1);
142 ASSERT_EQ(GetFdAt(set.get(), 2), kFDBase + 2);
143 ASSERT_EQ(GetFdAt(set.get(), 0), kFDBase);
144 ASSERT_EQ(GetFdAt(set.get(), 1), kFDBase + 1);
145 ASSERT_EQ(GetFdAt(set.get(), 2), kFDBase + 2);
146 ASSERT_EQ(GetFdAt(set.get(), 0), kFDBase);
147 ASSERT_EQ(GetFdAt(set.get(), 1), kFDBase + 1);
148 ASSERT_EQ(GetFdAt(set.get(), 2), kFDBase + 2);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900149
erikchenc8fa4212015-10-10 11:43:49 +0900150 set->CommitAllDescriptors();
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900151}
152
tfarinad66bf112015-07-28 23:41:47 +0900153#if defined(OS_ANDROID)
154#define MAYBE_DontClose DISABLED_DontClose
155#else
156#define MAYBE_DontClose DontClose
157#endif
158TEST(MessageAttachmentSet, MAYBE_DontClose) {
morrita33a35902015-01-15 06:17:06 +0900159 scoped_refptr<MessageAttachmentSet> set(new MessageAttachmentSet);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900160
161 const int fd = GetSafeFd();
morrita7d1bfcc2015-01-31 14:45:42 +0900162 ASSERT_TRUE(set->AddAttachment(new internal::PlatformFileAttachment(fd)));
erikchenc8fa4212015-10-10 11:43:49 +0900163 set->CommitAllDescriptors();
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900164
165 ASSERT_FALSE(VerifyClosed(fd));
166}
167
morrita33a35902015-01-15 06:17:06 +0900168TEST(MessageAttachmentSet, DoClose) {
169 scoped_refptr<MessageAttachmentSet> set(new MessageAttachmentSet);
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900170
171 const int fd = GetSafeFd();
morrita7d1bfcc2015-01-31 14:45:42 +0900172 ASSERT_TRUE(set->AddAttachment(
173 new internal::PlatformFileAttachment(base::ScopedFD(fd))));
erikchenc8fa4212015-10-10 11:43:49 +0900174 set->CommitAllDescriptors();
agl@chromium.org1c6dcf22009-07-23 08:57:21 +0900175
176 ASSERT_TRUE(VerifyClosed(fd));
177}
178
179} // namespace
morrita33a35902015-01-15 06:17:06 +0900180} // namespace IPC