Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(25)

Side by Side Diff: base/files/scoped_platform_handle_unittest.cc

Issue 2705743002: Introduce base::ScopedPlatformHandle (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 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 #include "base/files/scoped_platform_handle.h"
6 #include "base/files/file.h"
7 #include "base/files/scoped_temp_dir.h"
8 #include "base/macros.h"
9 #include "base/strings/stringprintf.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11
12 #if defined(OS_WIN)
13 #include <windows.h>
14
15 #include "base/win/scoped_handle.h"
16 #elif defined(OS_POSIX)
17 #include "base/files/scoped_file.h"
18 #endif
19
20 #if defined(OS_MACOSX) && !defined(OS_IOS)
21 #include <mach/mach.h>
22
23 #include "base/mac/scoped_mach_port.h"
24 #endif // defined(OS_MACOSX) && !defined(OS_IOS)
25
26 namespace base {
27 namespace {
28
29 class ScopedPlatformHandleTest : public testing::Test {
30 public:
31 ScopedPlatformHandleTest() { CHECK(temp_dir_.CreateUniqueTempDir()); }
32
33 protected:
34 #if defined(OS_WIN)
35 win::ScopedHandle CreateValidWindowsHandle() {
36 return win::ScopedHandle(OpenTempFile().TakePlatformFile());
37 }
38 #elif defined(OS_POSIX)
39 ScopedFD CreateValidFileDescriptor() {
40 return ScopedFD(OpenTempFile().TakePlatformFile());
41 }
42 #endif
43
44 #if defined(OS_MACOSX) && !defined(OS_IOS)
45 void CreateValidMachPort(mac::ScopedMachReceiveRight* receive,
46 mac::ScopedMachSendRight* send) {
47 mach_port_t port;
48 kern_return_t error =
49 mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port);
50 CHECK_EQ(error, KERN_SUCCESS);
51
52 error = mach_port_insert_right(mach_task_self(), port, port,
53 MACH_MSG_TYPE_MAKE_SEND);
54 CHECK_EQ(error, KERN_SUCCESS);
55
56 receive->reset(port);
57 send->reset(port);
58 }
59 #endif // defined(OS_MACOSX) && !defined(OS_IOS)
60
61 private:
62 base::File OpenTempFile() {
63 base::File temp_file(temp_dir_.GetPath().AppendASCII(
64 base::StringPrintf("file_%d", next_file_id_)),
65 base::File::FLAG_CREATE | base::File::FLAG_WRITE);
66 ++next_file_id_;
67 return temp_file;
68 }
69
70 ScopedTempDir temp_dir_;
71 int next_file_id_ = 1;
72
73 DISALLOW_COPY_AND_ASSIGN(ScopedPlatformHandleTest);
74 };
75
76 TEST_F(ScopedPlatformHandleTest, Invalid) {
77 ScopedPlatformHandle default_value;
78 EXPECT_TRUE(!default_value.is_valid());
79
80 ScopedPlatformHandle null_value(nullptr);
81 EXPECT_TRUE(!null_value.is_valid());
82
83 default_value.reset();
84 null_value.reset();
85 EXPECT_TRUE(!default_value.is_valid());
86 EXPECT_TRUE(!null_value.is_valid());
87 }
88
89 #if defined(OS_WIN)
90
91 TEST_F(ScopedPlatformHandleTest, WindowsHandles) {
92 win::ScopedHandle scoped_handle = CreateValidWindowsHandle();
93 HANDLE raw_handle = CreateValidWindowsHandle().Take();
94
95 ScopedPlatformHandle handle_a(std::move(scoped_handle));
96 ScopedPlatformHandle handle_b(raw_handle);
97
98 EXPECT_TRUE(handle_a.is_valid());
99 EXPECT_EQ(ScopedPlatformHandle::Type::WINDOWS_HANDLE, handle_a.type());
100 EXPECT_TRUE(handle_b.is_valid());
101 EXPECT_EQ(ScopedPlatformHandle::Type::WINDOWS_HANDLE, handle_b.type());
102
103 HANDLE h;
104 ASSERT_TRUE(handle_b.GetAsWindowsHandle(&h));
105 EXPECT_EQ(raw_handle, h);
106
107 ASSERT_TRUE(handle_b.TakeWindowsHandle(&scoped_handle));
108 EXPECT_FALSE(handle_b.is_valid());
109 EXPECT_EQ(ScopedPlatformHandle::Type::INVALID, handle_b.type());
110 EXPECT_TRUE(scoped_handle.IsValid());
111
112 EXPECT_EQ(scoped_handle.Get(), raw_handle);
113 EXPECT_FALSE(handle_b.GetAsWindowsHandle(&h));
114 EXPECT_FALSE(handle_b.ReleaseAsWindowsHandle(&h));
115
116 handle_b = ScopedPlatformHandle(std::move(scoped_handle));
117 EXPECT_EQ(ScopedPlatformHandle::Type::WINDOWS_HANDLE, handle_b.type());
118 EXPECT_TRUE(handle_b.ReleaseAsWindowsHandle(&h));
119 EXPECT_FALSE(handle_b.is_valid());
120 EXPECT_EQ(ScopedPlatformHandle::Type::INVALID, handle_b.type());
121
122 handle_b = ScopedPlatformHandle(h);
123 handle_a = std::move(handle_b);
124 EXPECT_FALSE(handle_b.is_valid());
125 EXPECT_EQ(ScopedPlatformHandle::Type::INVALID, handle_b.type());
126
127 EXPECT_TRUE(handle_a.is_valid());
128 EXPECT_EQ(ScopedPlatformHandle::Type::WINDOWS_HANDLE, handle_a.type());
129
130 HANDLE h2;
131 EXPECT_TRUE(handle_a.GetAsWindowsHandle(&h2));
132 EXPECT_EQ(h, h2);
133
134 handle_a = nullptr;
135 EXPECT_EQ(ScopedPlatformHandle::Type::INVALID, handle_a.type());
136 EXPECT_FALSE(handle_a.is_valid());
137 }
138
139 #elif defined(OS_POSIX)
140
141 TEST_F(ScopedPlatformHandleTest, FileDescriptors) {
142 ScopedFD scoped_fd = CreateValidFileDescriptor();
143 int raw_fd = CreateValidFileDescriptor().release();
144
145 ScopedPlatformHandle fd_a(std::move(scoped_fd));
146 ScopedPlatformHandle fd_b(raw_fd);
147
148 EXPECT_TRUE(fd_a.is_valid());
149 EXPECT_EQ(ScopedPlatformHandle::Type::FILE_DESCRIPTOR, fd_a.type());
150 EXPECT_TRUE(fd_b.is_valid());
151 EXPECT_EQ(ScopedPlatformHandle::Type::FILE_DESCRIPTOR, fd_b.type());
152
153 int fd;
154 ASSERT_TRUE(fd_b.GetAsFileDescriptor(&fd));
155 EXPECT_EQ(raw_fd, fd);
156
157 ASSERT_TRUE(fd_b.TakeFileDescriptor(&scoped_fd));
158 EXPECT_FALSE(fd_b.is_valid());
159 EXPECT_EQ(ScopedPlatformHandle::Type::INVALID, fd_b.type());
160 EXPECT_TRUE(scoped_fd.is_valid());
161
162 EXPECT_EQ(scoped_fd.get(), raw_fd);
163 EXPECT_FALSE(fd_b.GetAsFileDescriptor(&fd));
164 EXPECT_FALSE(fd_b.ReleaseAsFileDescriptor(&fd));
165
166 fd_b = ScopedPlatformHandle(std::move(scoped_fd));
167 EXPECT_EQ(ScopedPlatformHandle::Type::FILE_DESCRIPTOR, fd_b.type());
168 EXPECT_TRUE(fd_b.ReleaseAsFileDescriptor(&fd));
169 EXPECT_FALSE(fd_b.is_valid());
170 EXPECT_EQ(ScopedPlatformHandle::Type::INVALID, fd_b.type());
171
172 fd_b = ScopedPlatformHandle(fd);
173 fd_a = std::move(fd_b);
174 EXPECT_FALSE(fd_b.is_valid());
175 EXPECT_EQ(ScopedPlatformHandle::Type::INVALID, fd_b.type());
176
177 EXPECT_TRUE(fd_a.is_valid());
178 EXPECT_EQ(ScopedPlatformHandle::Type::FILE_DESCRIPTOR, fd_a.type());
179
180 int fd2;
181 EXPECT_TRUE(fd_a.GetAsFileDescriptor(&fd2));
182 EXPECT_EQ(fd, fd2);
183
184 fd_a = nullptr;
185 EXPECT_EQ(ScopedPlatformHandle::Type::INVALID, fd_a.type());
186 EXPECT_FALSE(fd_a.is_valid());
187 }
188
189 #endif // defined(OS_WIN)
190
191 #if defined(OS_MACOSX) && !defined(OS_IOS)
192
193 TEST_F(ScopedPlatformHandleTest, MachPorts) {
194 // TODO
195 }
196
197 #endif // defined(OS_MACOSX) && !defined(OS_IOS)
198
199 } // namespace
200 } // namespace base
OLDNEW
« base/files/scoped_platform_handle.h ('K') | « base/files/scoped_platform_handle.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698