Index: base/files/scoped_platform_handle_unittest.cc |
diff --git a/base/files/scoped_platform_handle_unittest.cc b/base/files/scoped_platform_handle_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f212f35374f6fd3d3d69f6a6d456e8f20f64f4cc |
--- /dev/null |
+++ b/base/files/scoped_platform_handle_unittest.cc |
@@ -0,0 +1,200 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/files/scoped_platform_handle.h" |
+#include "base/files/file.h" |
+#include "base/files/scoped_temp_dir.h" |
+#include "base/macros.h" |
+#include "base/strings/stringprintf.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+#if defined(OS_WIN) |
+#include <windows.h> |
+ |
+#include "base/win/scoped_handle.h" |
+#elif defined(OS_POSIX) |
+#include "base/files/scoped_file.h" |
+#endif |
+ |
+#if defined(OS_MACOSX) && !defined(OS_IOS) |
+#include <mach/mach.h> |
+ |
+#include "base/mac/scoped_mach_port.h" |
+#endif // defined(OS_MACOSX) && !defined(OS_IOS) |
+ |
+namespace base { |
+namespace { |
+ |
+class ScopedPlatformHandleTest : public testing::Test { |
+ public: |
+ ScopedPlatformHandleTest() { CHECK(temp_dir_.CreateUniqueTempDir()); } |
+ |
+ protected: |
+#if defined(OS_WIN) |
+ win::ScopedHandle CreateValidWindowsHandle() { |
+ return win::ScopedHandle(OpenTempFile().TakePlatformFile()); |
+ } |
+#elif defined(OS_POSIX) |
+ ScopedFD CreateValidFileDescriptor() { |
+ return ScopedFD(OpenTempFile().TakePlatformFile()); |
+ } |
+#endif |
+ |
+#if defined(OS_MACOSX) && !defined(OS_IOS) |
+ void CreateValidMachPort(mac::ScopedMachReceiveRight* receive, |
+ mac::ScopedMachSendRight* send) { |
+ mach_port_t port; |
+ kern_return_t error = |
+ mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port); |
+ CHECK_EQ(error, KERN_SUCCESS); |
+ |
+ error = mach_port_insert_right(mach_task_self(), port, port, |
+ MACH_MSG_TYPE_MAKE_SEND); |
+ CHECK_EQ(error, KERN_SUCCESS); |
+ |
+ receive->reset(port); |
+ send->reset(port); |
+ } |
+#endif // defined(OS_MACOSX) && !defined(OS_IOS) |
+ |
+ private: |
+ base::File OpenTempFile() { |
+ base::File temp_file(temp_dir_.GetPath().AppendASCII( |
+ base::StringPrintf("file_%d", next_file_id_)), |
+ base::File::FLAG_CREATE | base::File::FLAG_WRITE); |
+ ++next_file_id_; |
+ return temp_file; |
+ } |
+ |
+ ScopedTempDir temp_dir_; |
+ int next_file_id_ = 1; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ScopedPlatformHandleTest); |
+}; |
+ |
+TEST_F(ScopedPlatformHandleTest, Invalid) { |
+ ScopedPlatformHandle default_value; |
+ EXPECT_TRUE(!default_value.is_valid()); |
+ |
+ ScopedPlatformHandle null_value(nullptr); |
+ EXPECT_TRUE(!null_value.is_valid()); |
+ |
+ default_value.reset(); |
+ null_value.reset(); |
+ EXPECT_TRUE(!default_value.is_valid()); |
+ EXPECT_TRUE(!null_value.is_valid()); |
+} |
+ |
+#if defined(OS_WIN) |
+ |
+TEST_F(ScopedPlatformHandleTest, WindowsHandles) { |
+ win::ScopedHandle scoped_handle = CreateValidWindowsHandle(); |
+ HANDLE raw_handle = CreateValidWindowsHandle().Take(); |
+ |
+ ScopedPlatformHandle handle_a(std::move(scoped_handle)); |
+ ScopedPlatformHandle handle_b(raw_handle); |
+ |
+ EXPECT_TRUE(handle_a.is_valid()); |
+ EXPECT_EQ(ScopedPlatformHandle::Type::WINDOWS_HANDLE, handle_a.type()); |
+ EXPECT_TRUE(handle_b.is_valid()); |
+ EXPECT_EQ(ScopedPlatformHandle::Type::WINDOWS_HANDLE, handle_b.type()); |
+ |
+ HANDLE h; |
+ ASSERT_TRUE(handle_b.GetAsWindowsHandle(&h)); |
+ EXPECT_EQ(raw_handle, h); |
+ |
+ ASSERT_TRUE(handle_b.TakeWindowsHandle(&scoped_handle)); |
+ EXPECT_FALSE(handle_b.is_valid()); |
+ EXPECT_EQ(ScopedPlatformHandle::Type::INVALID, handle_b.type()); |
+ EXPECT_TRUE(scoped_handle.IsValid()); |
+ |
+ EXPECT_EQ(scoped_handle.Get(), raw_handle); |
+ EXPECT_FALSE(handle_b.GetAsWindowsHandle(&h)); |
+ EXPECT_FALSE(handle_b.ReleaseAsWindowsHandle(&h)); |
+ |
+ handle_b = ScopedPlatformHandle(std::move(scoped_handle)); |
+ EXPECT_EQ(ScopedPlatformHandle::Type::WINDOWS_HANDLE, handle_b.type()); |
+ EXPECT_TRUE(handle_b.ReleaseAsWindowsHandle(&h)); |
+ EXPECT_FALSE(handle_b.is_valid()); |
+ EXPECT_EQ(ScopedPlatformHandle::Type::INVALID, handle_b.type()); |
+ |
+ handle_b = ScopedPlatformHandle(h); |
+ handle_a = std::move(handle_b); |
+ EXPECT_FALSE(handle_b.is_valid()); |
+ EXPECT_EQ(ScopedPlatformHandle::Type::INVALID, handle_b.type()); |
+ |
+ EXPECT_TRUE(handle_a.is_valid()); |
+ EXPECT_EQ(ScopedPlatformHandle::Type::WINDOWS_HANDLE, handle_a.type()); |
+ |
+ HANDLE h2; |
+ EXPECT_TRUE(handle_a.GetAsWindowsHandle(&h2)); |
+ EXPECT_EQ(h, h2); |
+ |
+ handle_a = nullptr; |
+ EXPECT_EQ(ScopedPlatformHandle::Type::INVALID, handle_a.type()); |
+ EXPECT_FALSE(handle_a.is_valid()); |
+} |
+ |
+#elif defined(OS_POSIX) |
+ |
+TEST_F(ScopedPlatformHandleTest, FileDescriptors) { |
+ ScopedFD scoped_fd = CreateValidFileDescriptor(); |
+ int raw_fd = CreateValidFileDescriptor().release(); |
+ |
+ ScopedPlatformHandle fd_a(std::move(scoped_fd)); |
+ ScopedPlatformHandle fd_b(raw_fd); |
+ |
+ EXPECT_TRUE(fd_a.is_valid()); |
+ EXPECT_EQ(ScopedPlatformHandle::Type::FILE_DESCRIPTOR, fd_a.type()); |
+ EXPECT_TRUE(fd_b.is_valid()); |
+ EXPECT_EQ(ScopedPlatformHandle::Type::FILE_DESCRIPTOR, fd_b.type()); |
+ |
+ int fd; |
+ ASSERT_TRUE(fd_b.GetAsFileDescriptor(&fd)); |
+ EXPECT_EQ(raw_fd, fd); |
+ |
+ ASSERT_TRUE(fd_b.TakeFileDescriptor(&scoped_fd)); |
+ EXPECT_FALSE(fd_b.is_valid()); |
+ EXPECT_EQ(ScopedPlatformHandle::Type::INVALID, fd_b.type()); |
+ EXPECT_TRUE(scoped_fd.is_valid()); |
+ |
+ EXPECT_EQ(scoped_fd.get(), raw_fd); |
+ EXPECT_FALSE(fd_b.GetAsFileDescriptor(&fd)); |
+ EXPECT_FALSE(fd_b.ReleaseAsFileDescriptor(&fd)); |
+ |
+ fd_b = ScopedPlatformHandle(std::move(scoped_fd)); |
+ EXPECT_EQ(ScopedPlatformHandle::Type::FILE_DESCRIPTOR, fd_b.type()); |
+ EXPECT_TRUE(fd_b.ReleaseAsFileDescriptor(&fd)); |
+ EXPECT_FALSE(fd_b.is_valid()); |
+ EXPECT_EQ(ScopedPlatformHandle::Type::INVALID, fd_b.type()); |
+ |
+ fd_b = ScopedPlatformHandle(fd); |
+ fd_a = std::move(fd_b); |
+ EXPECT_FALSE(fd_b.is_valid()); |
+ EXPECT_EQ(ScopedPlatformHandle::Type::INVALID, fd_b.type()); |
+ |
+ EXPECT_TRUE(fd_a.is_valid()); |
+ EXPECT_EQ(ScopedPlatformHandle::Type::FILE_DESCRIPTOR, fd_a.type()); |
+ |
+ int fd2; |
+ EXPECT_TRUE(fd_a.GetAsFileDescriptor(&fd2)); |
+ EXPECT_EQ(fd, fd2); |
+ |
+ fd_a = nullptr; |
+ EXPECT_EQ(ScopedPlatformHandle::Type::INVALID, fd_a.type()); |
+ EXPECT_FALSE(fd_a.is_valid()); |
+} |
+ |
+#endif // defined(OS_WIN) |
+ |
+#if defined(OS_MACOSX) && !defined(OS_IOS) |
+ |
+TEST_F(ScopedPlatformHandleTest, MachPorts) { |
+ // TODO |
+} |
+ |
+#endif // defined(OS_MACOSX) && !defined(OS_IOS) |
+ |
+} // namespace |
+} // namespace base |